2012-03-25 38 views
1

Q0:cuComplex.h和exp()

exp()是否支持cuComplex.h?

Q1:

如何寫A = B * EXP(I * C),其中A,B,C是實數的相同的尺寸數組?這是正確的嗎?

主:

cuComplex A; 
float B; 
cuComplex c; 

內核:

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

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

Q2:

cuComplex包含2個浮點數這意味着我不得不分配2倍以上的存儲器然後原始矩陣。有什麼辦法可以創建純虛數?

+0

「是否有任何方法可以恢復純虛數?」意思? – talonmies 2012-03-25 15:27:37

+0

這裏有很多錯誤 - 嘗試查看cuComplex.h並使用那裏的函數進行復雜的算術運算。 – 2012-03-25 15:32:50

+0

talonmies:sry,「創建純虛數」,如:a = i * 4,其中我虛構單元 – user1281071 2012-03-25 15:44:12

回答

7

cuComplex.h只提供cuComplex上的一些基本操作(主要是在CUBLAS和CUFFT庫中使用的那些操作),不支持指數函數。

您可以使用組件式算法自己實現指數。 cuComplex在x分量中存儲複數的實部,在y分量中存儲虛部。給定複數z = X + I * Y,指數可以被計算爲:

EXP(Z)= EXP(X)*(COS(Y)+ I * SIN(Y))

這導致以下CUDA代碼(未經測試):

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

請注意,OP不需要'float e = expf(cuCrealf(arg))'因爲他們正在處理純粹的虛構指數。 +1'sincosf',它的確可以比'sinf'和'cosf'快一倍;幾乎和我的GT540M一樣快。 – leftaroundabout 2012-03-25 20:53:05