Advertisement
Guest User

fourier.cu

a guest
Sep 20th, 2014
479
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <WolframLibrary.h>
  4.  
  5. #include <cuda_runtime.h>
  6. #include <cufft.h>
  7.  
  8. //#include <helper_cuda.h>
  9.  
  10. typedef float2 Complex;
  11. typedef double2 doubleComplex;
  12.  
  13. extern "C"
  14. DLLEXPORT mint WolframLibrary_getVersion( ) {
  15.         return WolframLibraryVersion;
  16. }
  17.  
  18. extern "C"
  19. DLLEXPORT int WolframLibrary_initialize( WolframLibraryData libData) {
  20.         return 0;
  21. }
  22.  
  23. extern "C"
  24. DLLEXPORT void WolframLibrary_uninitialize( WolframLibraryData libData) {
  25.         return;
  26. }
  27.  
  28. extern "C"
  29. DLLEXPORT int fourier(WolframLibraryData libData, mint argc, MArgument *args, MArgument res)
  30. {
  31.     MTensor signal  = MArgument_getMTensor(args[0]);
  32.     int N = libData->MTensor_getDimensions(signal)[0];
  33.     int mem_size = N*sizeof(doubleComplex);
  34.    
  35.     doubleComplex *h_signal = (doubleComplex*) libData->MTensor_getComplexData(signal);
  36.  
  37.     doubleComplex *d_signal;
  38.     cudaMalloc((void **)&d_signal, mem_size);
  39.     cudaMemcpy(d_signal, h_signal, mem_size, cudaMemcpyHostToDevice);
  40.  
  41.     cufftHandle plan;
  42.     (cufftPlan1d(&plan, N, CUFFT_Z2Z, 1));
  43.  
  44.     cufftExecZ2Z(plan, (cufftDoubleComplex *)d_signal, (cufftDoubleComplex *)d_signal, CUFFT_INVERSE);
  45.  
  46.     cudaMemcpy(h_signal, d_signal, mem_size, cudaMemcpyDeviceToHost);
  47.  
  48.     cufftDestroy(plan);
  49.     cudaFree(d_signal);
  50.    
  51.     MArgument_setMTensor(res, signal);
  52.     return 0;
  53. }
  54.  
  55. extern "C"
  56. DLLEXPORT int fourier_single(WolframLibraryData libData, mint argc, MArgument *args, MArgument res)
  57. {
  58.     MTensor signal  = MArgument_getMTensor(args[0]);
  59.     int N = libData->MTensor_getDimensions(signal)[0];
  60.     int mem_size = N*sizeof(Complex);
  61.  
  62.     doubleComplex *h_signal_double = (doubleComplex*) libData->MTensor_getComplexData(signal);
  63.    
  64.     Complex *h_signal = (Complex*) malloc(mem_size);
  65.     for (int i=0; i<N; ++i)
  66.     {
  67.         h_signal[i].x=h_signal_double[i].x;
  68.         h_signal[i].y=h_signal_double[i].y;
  69.     }
  70.  
  71.     doubleComplex *d_signal;
  72.     cudaMalloc((void **)&d_signal, mem_size);
  73.     cudaMemcpy(d_signal, h_signal, mem_size, cudaMemcpyHostToDevice);
  74.  
  75.     cufftHandle plan;
  76.     cufftPlan1d(&plan, N, CUFFT_C2C, 1);
  77.  
  78.     cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_INVERSE);
  79.  
  80.     cudaMemcpy(h_signal, d_signal, mem_size, cudaMemcpyDeviceToHost);
  81.  
  82.     for (int i=0; i<N; ++i)
  83.     {
  84.         h_signal_double[i].x=h_signal[i].x;
  85.         h_signal_double[i].y=h_signal[i].y;
  86.     }
  87.    
  88.     cufftDestroy(plan);
  89.     cudaFree(d_signal);
  90.    
  91.     MArgument_setMTensor(res, signal);
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement