您提到了批次和一维,所以我假设您想要进行按行的 1D 变换或按列的 1D 变换。
在这种情况下,批次数等于行数情况下的行数或列数情况下的列数。
对于一维变换,inembed 和 onembed 并不重要,但它们不能设置为 NULL。
idist、istride、odist 和 ostride 参数是此示例中要更改的关键参数(以及 batch)。使用 CUFFT advanced data layout 信息。
这是一个工作示例,显示了按行和按列的转换:
$ cat t1620.cu
#include <cufft.h>
#include <iostream>
int main(){
cufftComplex data[] = {
{1.0f, 0}, {2.0f, 0}, {3.0f, 0}, {4.0f, 0},
{1.0f, 0}, {2.0f, 0}, {3.0f, 0}, {4.0f, 0},
{1.0f, 0}, {2.0f, 0}, {3.0f, 0}, {4.0f, 0},
{1.0f, 0}, {2.0f, 0}, {3.0f, 0}, {4.0f, 0}};
cufftComplex *d_data;
int ds = sizeof(data)/sizeof(data[0]);
cudaMalloc(&d_data, ds*sizeof(data[0]));
cudaMemcpy(d_data, data, ds*sizeof(data[0]), cudaMemcpyHostToDevice);
cufftHandle plan;
int dim = 4;
int rank = 1;
int nx = dim;
int ny = dim;
#ifdef ROW_WISE
int batch = ny;
int inembed[rank] = {nx};
int onembed[rank] = {nx};
int istride = 1;
int idist = nx;
int ostride = 1;
int odist = nx;
int n[] = {nx};
#else
int batch = nx;
int inembed[rank] = {ny};
int onembed[rank] = {ny};
int istride = nx;
int idist = 1;
int ostride = nx;
int odist = 1;
int n[] = {ny};
#endif
cufftResult err = cufftPlanMany(&plan, rank, n, inembed,
istride, idist, onembed, ostride,
odist, CUFFT_C2C, batch);
std::cout << "plan :" << (int)err << std::endl;
err = cufftExecC2C(plan, d_data, d_data, CUFFT_FORWARD);
std::cout << "exec :" << (int)err << std::endl;
cudaMemcpy(data, d_data, ds*sizeof(data[0]), cudaMemcpyDeviceToHost);
for (int i = 0; i < ds; i++) std::cout << data[i].x << "," << data[i].y << std::endl;
return 0;
}
$ nvcc -o t1620 t1620.cu -lcufft -DROW_WISE
$ ./t1620
plan :0
exec :0
10,0
-2,2
-2,0
-2,-2
10,0
-2,2
-2,0
-2,-2
10,0
-2,2
-2,0
-2,-2
10,0
-2,2
-2,0
-2,-2
$ nvcc -o t1620 t1620.cu -lcufft
$ ./t1620
plan :0
exec :0
4,0
8,0
12,0
16,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
$