2015-12-15 106 views
3

我對這個架構感到沮喪,因爲沒有明顯的解釋爲什麼工作組應該是三維的,或者我還沒有找到解釋。由於任何維度都可以從一個維度的工作組中模擬出來,它似乎會增加額外的複雜性,並且比現在理解將工作劃分爲工作組的最佳方式更難。爲什麼OpenCL工作組3維?

For example, this person discovered that switching axis sped up his execution with a factor of two.

一個假設我是想OpenCL的工作項ID和存儲器查找之間的關係,瑣碎,讓預見的存儲操作,可以是I/O優化。

回答

7

如果您的應用程序/算法不需要它,工作組不必是三維的。您可以指定1維,2維或3維 - 並且將來無疑更多。因此,使用更少的尺寸當然很適合您的應用程序。

那麼爲什麼規範允許更多的維度?就像您指出的那樣,可以使用單個維度模擬較高的維度。一個例子是用於物理/分子模擬的3維N體模擬。

選擇使用3D工作組的一個巨大優勢是將代碼複雜性降低了一點點。在引擎蓋下,你運行openCL的SDK可能會爲你做仿真。

至於在您的示例中的性能提升2倍:這種提升是內存訪問模式更好的結果,而不是在2D工作組上運行的硬件固有的可怕性。這個問題的答案解釋了進一步優化內核的方法,這對當今的gpu硬件來說是很好的策略。

使用3D工作組的更微妙的好處是未來的硬件可能不需要模擬額外的維度。也許內存,處理器等將適合3D工作組,並減少或消除對不良內存訪問模式的損失。如果您使用1D組編寫代碼,那麼您將錯過這些平臺上的潛在性能提升。即使在今天,也可以創建FPGA/ASIC芯片來比GPU更好地處理3D工作組。

+4

TL; DR-3維工作組純粹是一種便利功能。 –

2

真的告訴你只有3個維度是允許的嗎?

clEnqueueNDRangeKernel()使用無符號整數指定維數,併爲每個維度大小使用無符號整數數組。

OpenCL規範指出尺寸的最大數量是實現定義的作爲常量CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS,實際上它常常是3,但可以是任何東西。這只是一個方便的問題,因爲大多數計算問題都是基於1到3維的「現實世界」數據。

此外,沒有人強迫你使用3.大多數應用程序使用1和2,並且工作得很好。


如果你想爲什麼N而不是總是1,當你必須使用本地存儲器時,你會明白它。工作組爲2D時,在圖像中使用本地內存非常容易,因爲工作項會覆蓋圖像的一個小矩形區域,而不是一行。

您可以通過巧妙的索引轉換來模擬它,但是使用它作爲API的設計時,它更容易和更具可讀性。

+1

對不起,我被劫持的答案是:D –