2012-11-25 85 views
0

設備GeForce GTX 680哪個更好?循環內核或循環內核的CUDA GPU

在程序中,我有很長的數組在內核中處理(約1 GB的整數)。根據需要,我的數組被分開按順序重疊成塊,並有一些重疊(塊之間的重疊爲k)。每個塊的固定大小(塊大小爲m)。現在,數組將依次分爲(0,m)(mk,(mk)+ m),....)

按照上面的計算,我的程序中所需的塊數將大約爲(1GB/m) 由於GPU中塊的總數量是有限的,我該如何有效地做到這一點? 我應該從主機迭代方式調用內核,而內核中沒有任何循環? 或者我應該調用內核一次,然後在內核循環多次迭代? 或者我應該只調用內核一次,總塊數=(1 GB/m)?

什麼可以作爲這個程序的塊數和什麼方法的最佳值?

回答

1

我建議您的應用的第一個版本的以下序列:

初始化:

  • 分配在GPU間,兩個非重疊GPU上的陣列的塊(時隙1和2)
  • 拷貝所述第一非重疊塊到插槽1

循環:

  • 複製下一非重疊塊到時隙2
  • 運行,關於時隙1和部分地進入槽槽2的2
  • 拷貝內容運行到時隙1(GPU到GPU存儲器複製)內核

在以後的版本中,您可以通過交替複製到插槽1和插槽2中並避免將GPU複製到GPU,並將尋址包裝在內核中,以便代替溢出插槽2,從插槽1的開始處開始。將它看作插槽1和插槽2被排列成環形緩衝區。您還可以通過添加更多插槽並在內核在先前插槽上運行時將陣列的塊異步複製到新插槽來提高性能。

+0

那麼對於每個內核,理想的內核調用和塊數應該是多少? – GoT

+0

我認爲一個好的經驗法則是至少有一個線程來填充每個核心中管道中的每個插槽。比這更多的線程不會傷害性能,但也無濟於事。在那個時候,這對你來說是最方便的。據我所知,NVIDIA並沒有透露管道延遲,但可能在10個鐘左右。如果是這樣,您應該嘗試安排至少1536個內核* 10個時鐘延遲=每個內核15360個線程。 –

+1

很難說每塊應該有多少個線程。您可以使用CUDA佔用率計算器(包含在CUDA中)獲取有關此號碼的建議。但是,與計算器提供的數量和計算結果的時間相比,您還應該嘗試對其進行上下調整。通常使用128和256。你希望這個數字可以被32整除。 –