Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > БПФ с помощью CUDA


Автор: Vadim290692 10.4.2014, 10:00
Я учусь на радиотехническом факультете. Для диплома понадобилось использовать технологию 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");

}

Результат работы(причем каждый раз разный, хотя входные данные одинаковы) и правильный результат.

Автор: borisbn 10.4.2014, 13:25
Цитата(Vadim290692 @  10.4.2014,  10:00 Найти цитируемый пост)
 cufftPlan1d(&plan,sizeof(float) *SIGNAL_SIZE, CUFFT_C2C, 1);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)