CUFFT双精度

时间:2013-09-10 13:17:07

标签: c cuda double fft

我知道类似的问题是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数组相同 - 它没有做任何事情。

所以如果有人能发现我做错了什么就会很棒!

取值

1 个答案:

答案 0 :(得分:4)

你的代码没有产生输出的原因是因为没有运行 - 你的GPU是一个不支持双精度浮点运算的计算1.1设备。

您应该能够通过检查cufftExecZ2Z调用的返回状态来检查这一点,我希望返回CUFFT_EXEC_FAILED,因为您的GPU不支持双精度和双精度FFT内核不会启动。