首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUFFT双精度

CUFFT双精度
EN

Stack Overflow用户
提问于 2013-09-10 13:17:07
回答 1查看 843关注 0票数 0

我知道asked before也有类似的问题,但我在这方面遇到了麻烦。下面是我编写的代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-10 15:42:53

您的代码没有输出的原因是没有运行-您的GPU是一个计算1.1设备,它不支持双精度浮点操作。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18720011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档