我整天都在苦苦挣扎,试图让一个基本的 CUFFT 示例正常工作。但是我遇到了一个我无法识别的小问题。基本上我有一个带有 x 和 y 坐标的线性二维数组 vx 。然后我只计算一个向前然后向后的 CUFFT(就地),就这么简单。然后我复制回数组 vx,通过 NX*NY 对其进行标准化,然后显示。
#define NX 32
#define NY 32
#define LX (2*M_PI)
#define LY (2*M_PI)
float *x = new float[NX*NY];
float *y = new float[NX*NY];
float *vx = new float[NX*NY];
for(int j = 0; j < NY; j++){
for(int i = 0; i < NX; i++){
x[j*NX + i] = i * LX/NX;
y[j*NX + i] = j * LY/NY;
vx[j*NX + i] = cos(x[j*NX + i]);
}
}
float *d_vx;
CUDA_CHECK(cudaMalloc(&d_vx, NX*NY*sizeof(float)));
CUDA_CHECK(cudaMemcpy(d_vx, vx, NX*NY*sizeof(float), cudaMemcpyHostToDevice));
cufftHandle planr2c;
cufftHandle planc2r;
CUFFT_CHECK(cufftPlan2d(&planr2c, NY, NX, CUFFT_R2C));
CUFFT_CHECK(cufftPlan2d(&planc2r, NY, NX, CUFFT_C2R));
CUFFT_CHECK(cufftSetCompatibilityMode(planr2c, CUFFT_COMPATIBILITY_NATIVE));
CUFFT_CHECK(cufftSetCompatibilityMode(planc2r, CUFFT_COMPATIBILITY_NATIVE));
CUFFT_CHECK(cufftExecR2C(planr2c, (cufftReal *)d_vx, (cufftComplex *)d_vx));
CUFFT_CHECK(cufftExecC2R(planc2r, (cufftComplex *)d_vx, (cufftReal *)d_vx));
CUDA_CHECK(cudaMemcpy(vx, d_vx, NX*NY*sizeof(cufftReal), cudaMemcpyDeviceToHost));
for (int j = 0; j < NY; j++){
for (int i = 0; i < NX; i++){
printf("%.3f ", vx[j*NX + i]/(NX*NY));
}
printf("\n");
}
当 vx 被定义为 cos(x) 或 sin(x) 时,它可以正常工作,但是当使用 sin(y) 或 cos(y) 时,它会返回正确的函数(sin 或 cos),但幅度只有一半(即也就是说,在 0.5 和 -0.5 之间而不是 1 和 -1) 之间振荡!请注意,使用 sin(2*y) 或 cos(2*y)(或 sin(4*y)、cos(4*y)、...)可以正常工作。任何想法?