2012-06-21 42 views
0

作爲OpenCL的新手,我想知道以下情況是否可行。OpenCL - 主內核填充緩衝區並在子內核上運行

在內存中,創建了10個長度爲10000的緩衝區,或者一個10xN圖像緩衝區作爲緩存。

第一個內核將在緩存中填充一行,並查詢另一個內核在該行上執行一些操作。當第二個內核完成後,第一個內核可以計算一個新行並替換舊行,同樣的過程繼續,直到第一個內核沒有更多的任務。

這個場景是否合理,在GPU編程中是否有用?

回答

1

OpenCL不允許內核調用其他內核。但你有一些選擇。

  1. 讓第一個內核調用另一個非內核函數。工作項目之間的工作分配在這裏不會改變 - 所以如果你有10個並行工作項(線程)正在執行,每行有一個工作項,那麼每個線程將對非內核函數中的相同數據進行操作。

  2. 多個內核可以一個接一個地強化,但這是由主機協調的。這確實允許線程間工作的重新分配,但可以更復雜得多,選項1

一個關鍵創建快速的OpenCL代碼是區分你的工作納入工作項目,通常越多越好做。如果你的第一個填充行的內核只能分成10個工作項目,但你的第二個內核在這一行上處理可以分解成1000個工作項目,那麼你一定要使用選項2作爲第二個部分在具有大量內核的設備(如現代GPU)上更有效地分割。少數工作項目(如10)只能使用這些可用處理能力的一小部分。

(增補)

OpenCL內核在GPU上執行的是數據並行的,這意味着只有一個內核可以同時執行,但每個線程的工作原理與不同的數據片段。爲了適應這個模型,可能需要重新思考你的算法。

從您在評論中所寫的內容來看,聽起來像是由於內存限制,一次只能運行10個項目。但請注意,OpenCL中沒有動態內存分配。所有緩衝區都在前面聲明。所以主機應該確定有多少任務可以放入可用內存並運行批量的工作項目(通過適當的緩衝區傳輸)。

又如何填充緩衝區?從文件? OpenCL內核無法讀取文件,網絡等,因此如果這是原始數據如何加載,則必須在主機上完成。但是,如果這些圖像緩衝區是從其他源創建的(例如通過算法或其他內存源),那麼應該可以正常工作(儘管您還需要將任何其他內存源也複製到GPU中) 。

+0

這就是我的情況。上述第一個和第二個任務的工作項目比例爲1:2000。所以選項2是我的問題的答案。我在我的例子中提到了10行,因爲我需要一些緩衝區來保存第二個任務的數據,而且如果它開始執行所有任務,內存需求會很大。因此,如果第一個內核有N個任務,是否可以告訴只同時運行10個工作項,並且只有在第二個任務完成時才繼續新的工作項? –

+0

我也在考慮只在主機上保留第一個任務,並將輸入數據寫入gpu並將第二個任務排入隊列,並在完成後讀取結果並向gpu寫入一組新輸入並再次入隊。但是如果第一個任務也可以在GPU上完成,我不需要從主機寫入gpu那麼多。 –

+0

@ s093294不同的GPU硬件會有不同的表現。在主機上保留第一項任務可能會變得更快,具體取決於將內存從主機複製到設備需要多長時間,這取決於需要複製的設備,主機和內存量。您可能想要嘗試兩種方法,並選擇最終使用硬件最快的方案。 – prunge