2012-03-25 6 views
1

Q0:cuComplex.h und exp()

Wird exp() von cuComplex.h unterstützt?

Q1:

Wie A = B * exp (i * C) schreiben, wobei A, B, C gleiche Größe Arrays von reellen Zahlen ist? Ist das richtig?

main:

cuComplex A; 
float B; 
cuComplex c; 

kernel:

c[idx] = (0, C[idx]); 

A[idx] = B[idx] * exp(c[idx]); 

Q2:

cuComplex enthält 2 Floatzahlen, die bedeutet, dass ich dann für die ursprüngliche Matrix 2 mal mehr Speicher zuzuweisen. Gibt es eine Möglichkeit, eine reine imaginäre Zahl zu erzeugen?

+0

Was ist "gibt es eine Möglichkeit, reine imaginäre Zahl zu reate?" bedeuten? – talonmies

+0

Hier sind so viele Dinge falsch - versuchen Sie, cuComplex.h zu betrachten und verwenden Sie die Funktionen für komplexe Arithmetik. –

+0

Talonmies: sry, "create pure imaginäre Zahl" wie: a = i * 4, wo ich imaginäre Einheit – user1281071

Antwort

7

cuComplex.h bietet nur einige grundlegende Operationen auf cuComplex (hauptsächlich solche, die in den CUBLAS- und CUFFT-Bibliotheken verwendet werden), die Exponentialfunktion wird nicht unterstützt.

Sie können das Exponential selbst mit Komponentenarithmetik implementieren. cuComplex speichert den reellen Teil einer komplexen Zahl in der x-Komponente und den imaginären Teil in der y-Komponente. Bei einer komplexen Zahl z = x + i * y kann der Exponent berechnet werden als:

exp (z) = exp (x) * (cos (y) + i * sin (y))

Dies führt zu dem folgenden CUDA-Code (ungetestet):

cuComplex my_complex_exp (cuComplex arg) 
{ 
    cuComplex res; 
    float s, c; 
    float e = expf(arg.x); 
    sincosf(arg.y, &s, &c); 
    res.x = c * e; 
    res.y = s * e; 
    return res; 
} 
+1

Beachten Sie, dass das OP nicht 'float e = expf (cuCrealf (arg))' da es sich um rein imaginäre Exponenten handelt. +1 für 'sincosf', es kann tatsächlich ziemlich viel schneller sein als ein' sinf' und ein 'cosf' zusammen; Fast so schnell wie jeder von ihnen auf meinem GT540M. – leftaroundabout

Verwandte Themen