CUDA FFT DEMO

 1 #include "cuda_runtime.h"
 2 #include "device_launch_parameters.h"
 3 #include <stdio.h>
 4 #include "cufft.h"
 5 
 6 #define Nx 29        // FFT
 7 #define Ny 1         // FFT̄Κ
 8 
 9 
10 int main(int argc, char* argv[])
11 {
12     float *h_fk;
13     h_fk =(float*)malloc(sizeof(float)*Nx*Ny); 
14     for (int j=0; j< Nx; j++)
15     {
16           h_fk[j] = j;
17     }
18 
19     /////cufft
20     int i,j;
21 
22     cufftComplex *h_hatCH;
23     h_hatCH=(cufftComplex*)malloc(sizeof(cufftComplex)*(Nx/2+1)*Ny);
24 
25     cufftReal *d_fk;
26     cufftComplex *d_cufft_CH;
27     //float *d_hatrvector;
28 
29     cudaMalloc((void**)&d_fk, Nx * Ny * sizeof(cufftReal));
30     cudaMalloc((void**)&d_cufft_CH, (Nx/2+1) * Ny * sizeof(cufftComplex));
31     //cudaMalloc((void**)&d_hatrvector, (Nx/2+1) * Ny * sizeof(float)); 
32 
33      cudaMemcpy(d_fk, h_fk, Nx * Ny * sizeof(cufftReal), cudaMemcpyHostToDevice);
34     
35     cufftHandle plan;
36 
37     cufftPlan1d(&plan, Nx, CUFFT_R2C,Ny);             // Real float To Complex
38 
39     cufftExecR2C(plan, (cufftReal*)d_fk, (cufftComplex*)d_cufft_CH);
40 
41     cudaMemcpy(h_hatCH, d_cufft_CH, sizeof(cufftComplex)*(Nx/2+1)*Ny, cudaMemcpyDeviceToHost);   
42   
43     FILE *fid_h_hatCH;
44     fid_h_hatCH = fopen("h_hatCH.txt","wt");
45     if(fid_h_hatCH==NULL)
46     {
47         printf( "Error : file open failed \n " );
48         system("pause");
49     }
50 
51     for (int j = 0; j < (Nx/2+1)*Ny; j++)
52     {
53        if (h_hatCH[j].y == 0)
54        {
55            fprintf(fid_h_hatCH, "%f\n" , h_hatCH[j].x);
56        }
57        else if (h_hatCH[j].y > 0)
58        {
59            fprintf(fid_h_hatCH, "%f+%fi\n" , h_hatCH[j].x ,h_hatCH[j].y );
60        }
61        else
62        {
63            fprintf(fid_h_hatCH, "%f%fi\n" , h_hatCH[j].x ,h_hatCH[j].y );
64        }
65     }
66 
67 
68     fclose(fid_h_hatCH);
69 
70     cufftDestroy(plan);
71 
72     cudaFree(d_fk);
73     cudaFree(d_cufft_CH);
74 
75     free(h_hatCH);
76     free(h_fk);
77     return 0;
78 
79 }

 

 1 CUDA_PATH ?=/usr/local/cuda-7.0
 2 NVCC      :=$(CUDA_PATH)/bin/nvcc -ccbin g++
 3 INCLUDE   :=-I/usr/local/cuda/include/\
 4            -I/usr/local/cuda/samples/common/inc\
 5         -I/usr/include/c++\
 6         -I./
 7 
 8 LIBRARIES :=-L/usr/local/cuda/lib64 -lcudart -lcufft
 9 TARGETS   :=kernel
10 OBJECTS   :=kernel.o
11 
12 .SUFFIXES:.o .cu .cpp
13 .cu.o: 
14     $(NVCC) -arch=sm_20  $(INCLUDE) -c -o $@  $< $(LIBRARIES)
15 .cpp.o:
16     $(CXX) $(INCLUDE) -c -o $@ $< $(LIBRARIES)
17 
18 all: $(TARGETS)
19 
20 $(TARGETS): $(OBJECTS)
21     #sudo cp /usr/local/cuda/lib64/libcufft.so.7.0 /usr/lib
22     ln -s libcudart.so.7.0  libcudart.so
23     ln -s libcudart.so.7.0  libcudart.so.7
24     ln -s libcufft.so.7.0 libcufft.so
25     ln -s libcufft.so.7.0 libcufft.so.7
26     g++    $(INCLUDE) -o $@ $^ $(LIBRARIES)
27 run:
28     ./$(TARGETS)
29 clean:
30     rm -rf *.o kernel libcudart.so libcudart.so.7\
31         libcufft.so libcufft.so.7 h_hatCH1.txt

 

$h_hatCH.txt

406.000000+0.000003i
-14.499996+133.325287i
-14.499996+65.874161i
-14.499991+43.034470i
-14.500006+31.341248i
-14.500005+24.099192i
-14.499995+19.074436i
-14.500012+15.307473i
-14.499988+12.316420i
-14.499991+9.831238i
-14.500005+7.687408i
-14.500007+5.777329i
-14.500010+4.025898i
-14.499996+2.377148i
-14.499995+0.786158i

 

posted @ 2017-03-21 21:49  souwang  阅读(391)  评论(0编辑  收藏  举报