我對CUDA相當陌生,想了解更多關於複數算術及其速度的信息。CUDA中的複數/ cuComplex算術
我需要解決所有元素下面的複數公式中的「f] []」陣列和存儲在「答[]」的答案:
Ans [0] = (2.0/((20.5*(j[0]*j[0]))+(5.55*j[0])+20));
Ans [1] = (2.0/((20.5*(j[1]*j[1]))+(5.55*j[1])+20));
...
...
...
Ans [n] = (2.0/((20.5*(j[n]*j[n]))+(5.55*j[n])+20));
由於我需要執行相同的計算到'j'的所有元素,我可以並行化這些代碼,並讓每個線程/塊處理每個計算(blockIdx.x = 0 - > Ans [0]等)。 根據我的理解,如果我這樣做平行的很多元素我應該能夠看到速度的增加。但是,可以用一行C++代碼編寫的代碼需要幾行代碼才能在GPU中執行。
我的問題是,所有額外的代碼行意味着更長的處理時間,因爲它涉及到將許多臨時值保存在中間值。如果是這樣,當元素數量少於1000時,在GPU中進行這種計算還是有意義的嗎? (任意數)
的公式:
C++ -> Ans [0] = (2.0/((20.5*(j[0]*j[0]))+(5.55*j[0])+20));
我對它的GPU版本:
int tid = blockIdx.x;
temp1[tid] = cuCmul(j[tid], j[tid]);
temp2[tid] = cuCmul(temp1[tid], make_cuDoubleComplex(20.5, 0));
temp3[tid] = cuCmul(j[tid], make_cuDoubleComplex(5.55, 0));
temp4[tid] = cuCadd(temp2[tid], temp3[tid]);
temp5[tid] = cuCadd(temp4[tid], make_cuDoubleComplex(20, 0));
Ans[tid] = cuCdiv(make_cuDoubleComplex(2.0, 0), temp5[tid]);
另外,請讓我知道是否有寫這爲GPU更有效的方法
再次感謝!首先將整個代碼轉換爲CUDA,然後按照您的說法對其進行優化。 A(稍微無關)後續問題:我說1000個值的原因是因爲我在考慮GPU內存限制。 GPU能夠存儲和執行1000個複數雙精度和其他常量的算術函數嗎? – user2550888
也許吧。在某種程度上它取決於GPU,但現在大多數現代GPU至少有1 GB的內存(並且我們可以構造不受此內存大小限制的流水線複製/計算算法),我可以存儲相當多的數字在那個數量的內存中。如果即使只有一半數據可用於數據存儲,那也足夠存儲大約3300萬'cuDoubleComplex'數量。如果每個線程最終處理/需要100個唯一數量,則仍可處理超過300,000個線程。 –