CUFFT

Постой пример комилируется и выдает результат, однако он не зависит от того включить в нем: cufftExecC2C(plan, a_d,a_d, CUFFT_FORWARD);

или выключить его. То есть он осуществляет в любом случае тождественное преобразование.

  1. #include <math.h>
  2. #include <cuda_runtime.h>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <string>
  6. #include <cufft.h>
  7. #include <cuda.h>
  8. #include <stdio.h>
  9. #include <cutil_inline.h>
  10.  
  11. using namespace std;
  12. int main(int argc, char *argv[])
  13. {
  14. ofstream output("D:\\2012\\cuda\\test_write\\file.dat");
  15. cufftComplex *a_h, *a_d;
  16. cufftHandle plan;
  17. int N = 8, batchSize = 1;
  18. int i, nBytes;
  19. float rad1;
  20. nBytes = sizeof(cufftComplex)*N*batchSize;
  21. a_h = (cufftComplex *)malloc(nBytes);
  22. for (i=0; i < N*batchSize; i++) {
  23.        
  24. rad1=(i-N*batchSize*0.5)*0.01;
  25. a_h[i].x = 1.0f;
  26. a_h[i].y = 0.0f;
  27.  }
  28. cudaMalloc((void **)&a_d, nBytes);
  29.  
  30. cudaMemcpy(a_d, a_h, nBytes,
  31. cudaMemcpyHostToDevice);
  32. cufftPlan1d(&plan, N, CUFFT_C2C, batchSize);
  33.  
  34. cufftExecC2C(plan, a_d,a_d, CUFFT_FORWARD);
  35.  
  36. cudaMemcpy(a_h, a_d, nBytes,
  37. cudaMemcpyDeviceToHost);
  38.  
  39. for (maxError = 0.0, i=0; i < N*batchSize; i++) {
  40.  
  41.   output <<i<<" "<<" "<<" "<<" "<<" "<< a_h[i].x<<endl;
  42. }
  43.  output.close();
  44. cufftDestroy(plan);
  45. free(a_h);cudaFree(a_d);
  46.     return 0;
  47. }

Кто нибудь может подсказать что это значит, и как с этим бороться?

Forums: 

Мне кажется проблеиа в том,

Мне кажется проблеиа в том, что batchSize = 1, то есть онн преобразует 8 групп по одному элементу, а так преобразования эквивалентны (не уверена, но должны быть). Попробуйте наоборот batchSize 8, а N 1

cufftPlan1d(&plan, N,

cufftPlan1d(&plan, N, CUFFT_C2C, batchSize); - это для FFT 1D. Для FFT 2D будет так cufftPlan2d(&plan, nx, ny, CUFFT_C2C)

и еще ошибочка в 30, 31 и 36,37 строках должно быть cudaMemcpy(a_h, a_d, nBytes, HostToDevice); cudaMemcpy(a_h, a_d, nBytes, DeviceToHost); соответственно в вашем случае