2017-09-16 65 views
0

我在NVIDIA上使用OpenCL 2.0的測試版支持,並針對像1080ti這樣的高端GPU。在我的計算管道中,我需要有時派遣工作來獨立處理相對較小的圖像。理論上,我認爲這些圖像應該能夠在單個GPU上並行處理,因爲單個圖像的工作組數量不會使GPU的所有計算單元飽和。OpenCL Parallel Dispatch

  1. 這在OpenCL中可能嗎?這在OpenCL中有一個名字嗎?

  2. 如果可能的話,爲單個設備使用多個隊列是唯一的方法嗎?或者驅動程序會查看「waitEventList」並決定哪些內核可以並行處理?

  3. 我需要CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE嗎?

回答

2

1-是的,這是實現計算單元佔用率高的方法之一。通用名稱可以是「流水線」(藉助異步入隊和/或動態並行)。有不同的方法,一種是讀取1個隊列,在另一個隊列上進行寫操作,在具有3個隊列的第三個隊列上進行計算,並等待事件;第二種方式可能是讓M個隊列中的每一個都做不同事件的不同圖像的讀計算寫入工作。

2-你甚至可以使用單個隊列,但是一個亂序類型,所以內核是獨立調度的。但至少對於某些amd卡,甚至有序隊列可以優化獨立內核(根據amd的codexl)並行執行(這可能超出opencl規範)。等待事件可能會阻止這種類型的驅動程序端優化(至少在amd上)

從2.x開始,就有設備端排隊功能,因此您可以從主機排入1個內核,並且內核可以排隊N個內核,與主機干預無關(如果所有數據已經​​上傳到卡),這可能不會像使用多個主機端隊列(如果需要從主機到設備的數據)那樣延遲隱藏。

3-供應商不強制執行亂序執行,所以這可能不起作用。

+1

如果您不想使用亂序命令隊列的麻煩,而是使用多個按序命令隊列。如果您的設備一次能夠處理多個內核,則每個命令隊列中都有一個內核。比處理亂序隊列要容易得多。 – Dithermaster

+0

是的,由於明確的主機端控制,多個有序隊列也具有可預測的性能。 –