假设我有一个三维(x=256+2,y=256,z=128)数组,我想用cuFFT计算FFT(正向和反向)。我有一个 fftw 兼容的数据布局,假设填充在 x 方向上,如上面的大小(+2)所示。我的计划应该如何?
//forward
cufftPlan3d(&plan, z, y, x, CUFFT_R2C)
//or
cufftPlan3d(&plan, x, y, z, CUFFT_R2C)
而对于反向?
//Inverse
cufftPlan3d(&plan, x, y, z, CUFFT_C2R)
//or
cufftPlan3d(&plan, z, y, x, CUFFT_C2R)
如果数据以列主顺序存储,这将如何影响计划的创建?
如果您使用的是 cufftPlan3d
,正确的方法是使用
cufftplan3d(&plan, x, y, z, type);
这里x
表示第一个维度,y
表示第二个维度,z
表示第三个维度。在您的情况下,您可以按原样使用它们,没有任何问题。
正向和反向的所有参数都相同,除了从CUFFT_R2C
更改为CUFFT_C2R
的type
。
如果你打算使用 cufftplanMany
,您将需要做这样的事情。
int dims[] = {z, y, x}; // reversed order
cufftPlanMany(&plan, 3, dims, NULL, 1, 0, NULL, 1, 0, type, batch);
如果要执行批处理操作,或者使用不连续的数据,则cufftPlanMany
非常有用。