1
我试图做一个简单的fft并比较MATLAB和CUDA之间的结果。CUDA fft与MATLAB的不同结果fft
MATLAB: 矢量9号1-9
I = [1 2 3 4 5 6 7 8 9];
,并使用此代码:
fft(I)
给出了结果:
45.0000 + 0.0000i
-4.5000 +12.3636i
-4.5000 + 5.3629i
-4.5000 + 2.5981i
-4.5000 + 0.7935i
-4.5000 - 0.7935i
-4.5000 - 2.5981i
-4.5000 - 5.3629i
-4.5000 -12.3636i
和CUDA代码:
int FFT_Test_Function() {
int n = 9;
double* in = new double[n];
Complex* out = new Complex[n];
for (int i = 0; i<n; i++)
{
in[i] = i + 1;
}
// Allocate the buffer
cufftDoubleReal *d_in;
cufftDoubleComplex *d_out;
unsigned int out_mem_size = sizeof(cufftDoubleComplex)*n;
unsigned int in_mem_size = sizeof(cufftDoubleReal)*n;
cudaMalloc((void **)&d_in, in_mem_size);
cudaMalloc((void **)&d_out, out_mem_size);
// Save time stamp
milliseconds timeStart = getCurrentTimeStamp();
cufftHandle plan;
cufftResult res = cufftPlan1d(&plan, n, CUFFT_D2Z, 1);
if (res != CUFFT_SUCCESS) { cout << "cufft plan error: " << res << endl; return 1; }
cudaCheckErrors("cuda malloc fail");
cudaMemcpy(d_in, in, in_mem_size, cudaMemcpyHostToDevice);
cudaCheckErrors("cuda memcpy H2D fail");
res = cufftExecD2Z(plan, d_in, d_out);
if (res != CUFFT_SUCCESS) { cout << "cufft exec error: " << res << endl; return 1; }
cudaMemcpy(out, d_out, out_mem_size, cudaMemcpyDeviceToHost);
cudaCheckErrors("cuda memcpy D2H fail");
milliseconds timeEnd = getCurrentTimeStamp();
milliseconds totalTime = timeEnd - timeStart;
std::cout << "Total time: " << totalTime.count() << std::endl;
return 0;
}
在此CUDA代码我得到的结果是:
你可以看到,CUDA给4个零(单元5-9)。
我错过了什么?
非常感谢您的关注!
好的,很高兴知道!谢谢Paul,我很感激。 –
仅供参考,这在http://docs.nvidia.com/cuda/cufft/index.html#fft-types记录:“cuFFT利用这种冗余,只适用于埃尔米特矢量的前半部分” – Tom
PLEASE if你也可以回答我相同的问题(但在二维数组 - - 结果只是不正确,我认为): https://stackoverflow.com/questions/44436155/cuda-fft-2d-different-results-from-matlab -FFT上-2D –