2011-08-17 88 views
2

我想了解在使用CUDA的GPU上執行以下操作的一般方法。cuda算法結構

我有一個算法,可能是這個樣子:

void DoStuff(int[,] inputMatrix, int[,] outputMatrix) 
{ 
    forloop { 
    forloop { 
     if (something) { 
       DoStuffA(inputMatrix,a,b,c,outputMatrix) 
     } 
     else { 
       DoStuffB(inputMatrix,a,b,c,outputMatrix) 
     } 
    } 
    } 
} 

DoStuffA和DoStuffB簡單paralleizable功能(例如做一個矩陣行操作)的CUDA的例子有很多。

我想要做的是知道如何將主要算法「DoStuff」放到GPU上,然後在需要時(並且它們並行執行)調用DoStuffA和DoStuffB。即外部環路部分是單線程的,但內部調用不是。

我看到的例子似乎從一開始就是多線程的。我假設有一種方法可以從外部世界調用單個基於GPU的方法,並讓它自己控制所有的並行位?

+0

什麼是forloops?它們是簡單的迭代器,還是更復雜的東西。 DoStuff的單個調用的條件(某些)是常量還是取決於輸出矩陣的狀態? – talonmies

+0

沒有forloops不是簡單的迭代器,條件也很複雜。總之,我意識到我可以在CPU上運行「DoStuff」方法,然後多次爲DoStuffA和DoStuffB調用GPU,但是我希望避免從CPU到GPU的矩陣重複複製 - 即將DoStuff放在GPU上。 –

+3

你可以編輯你的問題的細節?這是一個非常抽象的問題,建設性地回答將非常困難。不要考慮線程,思考數據並行工作。運行在GPU上的內核只能執行數據並行工作,不能派發新工作或運行其他內核。因此,通常情況下,「內部」foreach循環會在GPU上運行,而「外部」循環包含主機上的收斂測試或類似內容。嘗試在提煉問題時記住這一點,現在您對執行模型的理解聽起來有點粗略。 – talonmies

回答

1

這取決於數據間如何與對方在for循環,但大致我會

  1. 包所有的輸入矩陣轉換成一個內存塊
  2. 上傳輸入矩陣
  3. 做環上的CPU,呼籲DoStuffA和DoStuffB
  4. 下載輸出矩陣內核在一個塊

這樣,最大的問題是調用每個內核的開銷。如果你的輸入數據很大,那麼它不會那麼糟糕。