簡體   English   中英

CUFFT雙精度

[英]CUFFT Double Precision

我知道以前也曾問過類似的問題,但是我對此很麻煩。 這是我編寫的代碼:

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數組相同-它沒有做任何事情。

因此,如果任何人都可以發現我做錯了什么,那就太好了!

小號

您的代碼未產生任何輸出的原因是因為沒有任何內容在運行-您的GPU是計算1.1設備,不支持雙精度浮點運算。

您應該能夠通過檢查cufftExecZ2Z調用的返回狀態來檢查此情況,我希望該返回狀態返回CUFFT_EXEC_FAILED因為您的GPU不支持雙精度,並且雙精度FFT內核將不會啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM