傅立葉變換—FFT(cuda實現)


背景:

無意間看到cuda解決FFT有一個cufft函數庫,大體查看了有關cufft有關知識,寫了一個解決一維情況的cuda代碼,據調查知道cufft在解決1D,2D,3D的情況時間復雜度都為O(nlogn),附上解決一維情況的代碼,准備后面找一些詳細的資料去學習一下cuda的函數庫。

#include "stdio.h"
#include "cuda_runtime.h"
#include "cufft.h"
#include "device_launch_parameters.h"


#define LENGTH 4
int main()
{

float Data[LENGTH] = {1,2,3,4}; cufftComplex *CompData=(cufftComplex*)malloc(LENGTH*sizeof(cufftComplex)); int i; for(i=0;i<LENGTH;i++) { CompData[i].x=Data[i]; CompData[i].y=0; } cufftComplex *d_fftData; cudaMalloc((void**)&d_fftData,LENGTH*sizeof(cufftComplex)); cudaMemcpy(d_fftData,CompData,LENGTH*sizeof(cufftComplex),cudaMemcpyHostToDevice); cufftHandle plan; cufftPlan1d(&plan,LENGTH,CUFFT_C2C,1); cufftExecC2C(plan,(cufftComplex*)d_fftData,(cufftComplex*)d_fftData,CUFFT_FORWARD); cudaDeviceSynchronize(); cudaMemcpy(CompData,d_fftData,LENGTH*sizeof(cufftComplex),cudaMemcpyDeviceToHost); for(i=0;i<LENGTH;i++) { if(CompData[i].x != 0) { printf("%3.1f",CompData[i].x); } if(CompData[i].y != 0 ) { printf("+%3.1fi",CompData[i].y); } printf("\n"); } cufftDestroy(plan); free(CompData); cudaFree(d_fftData); }

在Linux下運行的這段代碼:

編譯命令:nvcc -o fftcu FFT.cu -I /usr/local/cuda/include  -L /usr/local/cuda/lib64 -lcufft

運行命令:./fftcu

注:/usr/local/cuda/include中有cufft.h頭文件,/usr/local/cuda/lib64中有libcufft.so庫文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM