2010-05-10 59 views
0

因此,我讀了一些關於CUDA和GPU編程的內容。我注意到一些事情,例如訪問全局內存很慢(因此應該使用共享內存),並且變形中線程的執行路徑不應該偏離。用CUDA解決涉及更復雜數據結構的問題

我也看了一下(密集)矩陣乘法的例子,在程序員手冊和nbody problem中描述過。實施的竅門似乎是一樣的:將計算排列在一個網格中(它已經在矩陣mul的情況下);然後將網格細分爲更小的圖塊;將磁貼獲取到共享內存中,並讓線程儘可能長的計算,直到它需要將數據從全局內存重新加載到共享內存中。

在N體問題計算每個體體相互作用的情況下,是完全相同的(頁682):

bodyBodyInteraction(float4 bi, float4 bj, float3 ai) 

它需要兩個機構和加速度矢量。身體矢量有四個組成部分,它的位置和重量。閱讀紙張時,計算可以很容易理解。

但是,如果我們有一個更復雜的對象,動態數據結構呢?現在假設我們有一個對象(類似於紙上的正文對象),它有一個附加的其他對象的列表,並且每個線程中附加的對象的數量是不同的。我怎麼能夠實現這一點,而不必讓線程的執行路徑發生分歧?

我還在尋找能夠解釋如何在CUDA中有效實現涉及更復雜數據結構的不同算法的文獻。

回答

2

你的問題是有點一般,所以這裏幾個常用的方法:

  • 墊數據,以便在相同尺寸的所有對象(例如零)

  • 重新組織你的類似數據適合經線,發散只發生在經線內,不跨越多線經線

  • 經線線始終同步。如果可能且必要的話,將數據劃分爲小於33的2的冪,以避免明確的同步。

  • 也沒關係有一些分歧

  • 使用C++模板,如果有幫助,幫助指導內核流程。

+0

那麼我想只是去sciencedirect.com和輸入cuda是一個好的開始。至少我在提出這些問題之後閱讀了一些有趣的論文。 Thx爲您的答案。 – Nils 2010-05-20 15:03:49