Я учусь на радиотехническом факультете. Для диплома понадобилось использовать технологию CUDA. Пытаюсь выполнить БПФ с помощью библиотеки cuFFT. но результат неправильный.
Заранее спасибо за любую помощь))
Код:
#include<iostream>
#include <cufft.h>
#include <cuda_runtime.h>
#define SIGNAL_SIZE 8
typedef float2 Complex;
using std::cout;
using std::endl;
unsigned int timer=0;
__host__ int main()
{
// Allocate host memory for the signal
Complex *h_signal = (Complex *)malloc(sizeof(Complex) * SIGNAL_SIZE);
Complex *h_result_signal = (Complex *)malloc(sizeof(Complex) * SIGNAL_SIZE);
// Initalize the memory for the signal
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i)
{
h_signal[i].x = rand()/(float)RAND_MAX;
h_signal[i].y = rand()/(float)RAND_MAX;
cout<<"<"<< h_signal[i].x<<","<<h_signal[i].y<<">"<<"\n";
}
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i)
{
h_result_signal[i].x = 0;
h_result_signal[i].y = 0;
cout<<"<"<< h_result_signal[i].x<<","<<h_result_signal[i].y<<">"<<"\n";
}
// Allocate device memory for signal
cufftComplex *d_signal;
cudaError_t cuerr=cudaMalloc((void **)&d_signal,sizeof(float)*SIGNAL_SIZE);
if(cuerr!=cudaSuccess)
cout<<"Cannot create GPU memory buffer for d_signal"<<endl;
// Copy host memory to device
cudaError_t cudaResult=cudaMemcpy(d_signal,h_signal,sizeof(float) *SIGNAL_SIZE,cudaMemcpyHostToDevice);
if(cudaResult!=cudaSuccess)
cout<<"Could not copy data from device to host"<<endl;
// CUFFT plan
cufftHandle plan;
cufftPlan1d(&plan,sizeof(float) *SIGNAL_SIZE, CUFFT_C2C, 1);
// Transform signal
cufftExecC2C(plan, d_signal, d_signal, CUFFT_FORWARD);
// Copy device memory to host
//Хендл event’а
cudaEvent_t syncEvent;
cudaEventCreate(&syncEvent); //Создаем event
cudaEventRecord(syncEvent, 0); //Записываем event
cudaEventSynchronize(syncEvent); //Синхронизируем event
cudaResult=cudaMemcpy(h_result_signal, d_signal, sizeof(float) *SIGNAL_SIZE,cudaMemcpyDeviceToHost);
if(cudaResult!=cudaSuccess)
cout<<"Could not copy data from device to host"<<endl;
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i)
{
cout<<"<"<< h_result_signal[i].x<<","<<h_result_signal[i].y<<">"<<"\n";
}
//Destroy CUFFT context
cufftDestroy(plan);
// cleanup memory
free(h_signal);
free(h_result_signal);
cudaFree(d_signal);
cudaDeviceReset();
system("pause");
}
Результат работы(причем каждый раз разный, хотя входные данные одинаковы) и правильный результат.
Снимок.jpgСнимок2.jpg