2012-12-02 10 views
7

Thrust è un incredibile wrapper per iniziare a programmare CUDA. Mi chiedo che ci sia qualche cosa da incapsulare con NVIDIA CUFFT o che dobbiamo implementare noi stessi?Esecuzione di Fourier Transform with Thrust

+2

Perché non utilizzare ArrayFire che ha tutto in una libreria? –

+0

Un altro post era su come calcolare il prodotto esterno usando la spinta .. Mi aspetto che il prossimo sia come implementare l'algoritmo di Dijkstra in spinta)) perché la gente continua a chiederglielo? –

+0

Voglio anche usare ArrayFire e in realtà devo usarlo per confrontarlo con altre librerie. C'è qualche approccio? –

risposta

6

Questa è una risposta molto tarda, solo per rimuovere questa domanda dalla lista senza risposta.

L'uso di cuFFT con la spinta dovrebbe essere molto semplice e l'unica cosa da fare dovrebbe essere il cast di thrust::device_vector in un puntatore raw. Un esempio molto semplice è riportato di seguito:

#include <iostream> 
#include <cufft.h> 
#include <stdlib.h> 
#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 
#include <thrust/generate.h> 
#include <thrust/transform.h> 

int main(void){ 

    int N=4; 

    // --- Setting up input device vector  
    thrust::device_vector<cuFloatComplex> d_in(N,make_cuComplex(1.f,2.f)), d_out(N); 

    cufftHandle plan; 
    cufftPlan1d(&plan, N, CUFFT_C2C, 1); 

    cufftExecC2C(plan, thrust::raw_pointer_cast(d_in.data()), thrust::raw_pointer_cast(d_out.data()), CUFFT_FORWARD); 

    // --- Setting up output host vector  
    thrust::host_vector<cuFloatComplex> h_out(d_out); 

    for (int i=0; i<N; i++) printf("Element #%i; Real part = %f; Imaginary part: %f\n",i,h_out[i].x,h_out[i].y); 

    getchar(); 
}