2014-09-18 160 views
1

我們正在試驗CUDA CFD代碼,其中3D字段被分解爲1D或2D線程塊(來自3D字段的水平切片)。在許多情況下,一個塊內的所有線程共享一個僅取決於高度的循環計算,即它對於線程塊內的所有線程都是相似的。優化這種情況的最佳方式是什麼(特別是如果重複計算是整個內核中最昂貴的計算)?是否有可能讓一個線程進行計算,並與其餘線程共享結果?cuda:線程塊之間共享'常量'

由於我有限的CUDA知識,我能想到的最好的東西是這樣的:if(threadIdx x和y是0)計算循環值,放入共享內存(?),所有線程都使用共享內存中的此值在他們的計算中。那會很有效率,還是有更好的方法?

回答

1

有很多方法可以做你想做的事情,但沒有更多的信息就不可能說哪個最好。

有些選項,來自「昂貴的calcualation不是很複雜」到「貴caluclation極其複雜」大致下令:

  1. 什麼也不做。只需在每個線程上計算它。如果計算不是很複雜,這可能是最快的,因爲它允許編譯器在整個同步過程中進行優化。
  2. 照你想象的那樣做。在一個線程上計算,存儲在共享內存中,同步,然後從該共享內存值中讀取數據。一個線程中的計算效率不高,並且會受到延遲限制,所以您可能需要相當多的塊/多處理器來隱藏此延遲。
  3. 並行複雜計算。也許在這個複雜的計算過程中有一些平行的,你利用這個。例如,如果您需要對少量值進行求和,則可以選擇並行求和而不是連續求和。
  4. 預先計算。根據情況,在單獨的內核中預先計算昂貴的數據可能會更好。如果昂貴的計算非常昂貴,這個選項可能只是很好。這可能會更快,因爲內核的昂貴部分可能使用了很多寄存器,這可能會限制內核其餘部分的佔用。

這一切都歸結爲您昂貴的計算實際上是什麼。理想情況下,你會提供更多的信息在這個問題上!