2013-07-19 17 views
2

作爲更大代碼的一部分,我有一個CUDA RK4求解器,它可以並行地集成大量ODE(可以是1000+)。這個操作的一個步驟是計算'xdot',它對於每個方程(或數據元素)是不同的。到目前爲止,我有一個switch-case分支設置來計算內核中每個數據元素的值。所有不同的線程使用相同的3-6個數據元素來計算它們的輸出,但以不同的方式。例如,對於線程1,它可能是爲MISD類型操作避免CUDA線程發散

xdot = data [0] * data [0] + data [1];

而螺紋2也可以是,

XDOT = -2 *數據[0] +數據[2];

等等。 所以如果我有一百個數據元素,每個人的執行路徑是不同的。

在這種情況下,是否有任何方法可以避免/減少線索分歧懲罰? 每塊只運行一個線程會有幫助嗎?

回答

3

每塊運行一個線程只會在啓動的單個warp中消除31/32個線程,浪費很多週期並隱藏延遲。我絕不會推薦它,不管你的代碼發生多少分支分歧。

您的應用程序聽起來與CUDA的基本編程範例非常正交,並且確實沒有太多的工作可以避免分支分歧處罰。一種可以稍微改進的方法是對每個方程的表達式進行一些事先分析,並將具有共同算術術語的那些分組在一起。最近的硬件可以同時運行多個內核,因此將計算共享的條目分組到不同的內核並同時啓動它們可能是有益的,而不是一個大的內核。 CUDA支持C++模板,可以從相對較窄的基礎中生成大量內核代碼,並且可以對許多邏輯進行靜態評估,這可以幫助編譯器。但不要期待奇蹟 - 你的問題更適合不同於GPU的體系結構(例如Intel的Xeon Phi)。

+0

謝謝!我會研究這一點。至於使用其他體系結構,這只是問題的一部分。其餘部分在本質上是高度平行的,並且使用CUDA可以很好地擴展。我試圖看看在這個特定部分是否有任何優化的機會。 –