2013-07-04 14 views
5

Quali intestazioni CUDA dovrei includere nel mio programma se voglio lavorare con numeri complessi e fare semplici operazioni matematiche (addizione e moltiplicazione) a questi numeri doppi complessi all'interno del kernel stesso?CUDA - Come lavorare con numeri complessi?

In C++ posso moltiplicare un numero costante con un doppio complesso> purché siano entrambi doppi. Tuttavia in CUDA ho molti errori quando provo a fare semplici operazioni matematiche a complessi double> s ogni volta che non è con un altro doppio complesso>. Cosa mi manca?

Grazie!

risposta

10

L'intestazione da includere è:

#include <cuComplex.h> 

Su una CUDA Linux installazione standard, si trova in:

/usr/local/cuda/include 

Sarà necessario esaminare il file di intestazione e utilizzare le funzioni definite in per manipolare numeri complessi sul dispositivo.

per moltiplicare una (doppia) numero complesso da un numero reale, avrei:

#include <cuComplex.h> 
... 
double cr = 1; 
double ci = 2; 
double r = 3; 
cuDoubleComplex c = make_cuDoubleComplex(cr, ci); 
cuDoubleComplex result = cuCmul(c, make_cuDoubleComplex(r, 0)); 

EDIT: Con la spinta v1.8 recentemente rilasciato in CUDA 7 RC, è possibile utilizzare spinta :: complesso con codice di spinta o Codice dispositivo CUDA. Ciò rende possibile scrivere più operazioni dall'aspetto naturale come:

#include <thrust/complex.h> 
... 
thrust::complex<float> c = thrust::complex<float>(2.0f, 5.0f); 
thrust::complex<float> c2 = c*c; 
float r = c2.real(); 
+0

Grazie per la risposta rapida. Sto ancora cercando di capire come funziona. Questa è probabilmente una domanda davvero stupida, ma dove posso trovare maggiori informazioni sulle funzioni per le diverse intestazioni? Ad esempio, se non avessi citato cuCmul, non sarei stato in grado di capire che cosa fa semplicemente passando attraverso il file di riferimento cuComplex.h in http://graphics.im.ntu.edu.tw/~bossliaw /nvCuda_doxygen/html/cu_complex_8h.html#ace9e79c66b2bfc9a8adeb1d641b12df4 – user2550888

+0

Non so che ci sia documentazione aggiuntiva per quell'intestazione o forse altre intestazioni. Non ne sono a conoscenza, comunque. La funzione 'cuCmul' è in realtà piuttosto semplice e duplica la moltiplicazione complessa come [definita nei principi di base della matematica] (http://en.wikipedia.org/wiki/Complex_numbers#Multiplication_and_division). Se non sei in grado di seguire la conversione di quella formula in codice C come in cuCmul, allora ti suggerirei di imparare di più sulla programmazione di base del computer incluso il linguaggio C. –

+0

Capisco la funzione cuCmul ora, ma quello che intendevo dire era, se non mi avessi detto che cuCmul è la funzione per la moltiplicazione di numeri complessi di base che non avrei conosciuto solo guardando il file di riferimento come dato nessuna indicazione su quello che fa .. O forse non sto usando in modo corretto in quanto non riesco a capire veramente che cosa mostra il grafico della chiamata? In futuro, come posso sapere se una determinata operazione di cui potrei aver bisogno ha già una funzione? – user2550888