在 3d fft 的情况下,袖口计划配置的正确方法是什么?



假设我有一个三维(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_C2Rtype

如果你打算使用 cufftplanMany ,您将需要做这样的事情。

int dims[] = {z, y, x}; // reversed order
cufftPlanMany(&plan, 3, dims, NULL, 1, 0, NULL, 1, 0, type, batch);

如果要执行批处理操作,或者使用不连续的数据,则cufftPlanMany非常有用。

最新更新