我知道类似的问题是asked before,但我遇到了麻烦。这是我写的代码:
void fft(const double *indata_real, const double *indata_imag, double *outdata_real, double *outdata_imag, int x, int y)
{
int size = sizeof(cufftDoubleComplex)*x*y;
// allocate data on host
cufftDoubleComplex* host_data = (cufftDoubleComplex*)malloc(size);
for (int i = 0; i < x*y; ++i) {
host_data[i].x = indata_real[i];
host_data[i].y = indata_imag[i];
}
// allocate data on device
cufftDoubleComplex* device_data;
cudaMalloc((void**)&device_data, size);
// copy data from host to device
cudaMemcpy(device_data, host_data, size, cudaMemcpyHostToDevice);
// create plan
cufftHandle plan;
cufftPlan2d(&plan, x, y, CUFFT_Z2Z);
// perform transform
cufftExecZ2Z(plan, (cufftDoubleComplex *)device_data, (cufftDoubleComplex *)device_data, CUFFT_FORWARD);
// copy data back from device to host
cudaMemcpy(host_data, device_data, size, cudaMemcpyDeviceToHost);
// copy transform to outdata
for (int i = 0; i < x*y; ++i) {
outdata_real[i] = host_data[i].x;
outdata_imag[i] = host_data[i].y;
}
// clean up
cufftDestroy(plan);
free(host_data);
cudaFree(device_data);
}
上述方法适用于单精度,即当我更换所有&#39; cufftDoubleComplex&#39;与&#39; cufftComplex&#39;,替换&#39; CUFFT_Z2Z&#39;使用&#39; CUFFT_C2C&#39;,并替换&#39; cufftExecZ2Z&#39;用cufftExecC2C
基于我在其他页面上找到的内容,我认为这样可以正常运行并具有双精度。但目前outdata数组与indata数组相同 - 它没有做任何事情。
所以如果有人能发现我做错了什么就会很棒!
取值
答案 0 :(得分:4)
你的代码没有产生输出的原因是因为没有运行 - 你的GPU是一个不支持双精度浮点运算的计算1.1设备。
您应该能够通过检查cufftExecZ2Z
调用的返回状态来检查这一点,我希望返回CUFFT_EXEC_FAILED
,因为您的GPU不支持双精度和双精度FFT内核不会启动。