【问题标题】:CUFFT Double PrecisionCUFFT 双精度
【发布时间】:2013-09-10 23:42:53
【问题描述】:

我知道类似的问题是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);

}

以上方法适用于单精度,即当我将所有“cufftDoubleComplex”替换为“cufftComplex”时,将“CUFFT_Z2Z”替换为“CUFFT_C2C”,并将“cufftExecZ2Z”替换为cufftExecC2C

根据我在其他页面上找到的内容,我认为这可以在双精度下正常运行。但是目前 outdata 数组和 indata 数组是一样的——它什么也没做。

所以,如果有人能发现我做错了什么,那就太好了!

S

【问题讨论】:

  • 你在哪个 GPU 上运行它?您是否正在检查 API 错误(CUDA 和 CUFFT)?有人举报吗?
  • 没有看到任何 API 错误 - 抱歉,我将如何明确检查它们?我实际上是从我正在编写的 python 包装器中调用这个函数。 GPU 是 GeForce GTS 250。

标签: c cuda double fft


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多