Я учусь на радиотехническом факультете. Для диплома понадобилось использовать технологию 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");
}
|
Результат работы(причем каждый раз разный, хотя входные данные одинаковы) и правильный результат.
|