2011-08-31 139 views
28

是否有任何研究將OpenCL與OpenMP性能進行比較?具體來說,我感興趣的是使用OpenCL啓動線程的開銷成本,例如,如果將域分解成大量單個工作項(每個線程執行一項小工作)與OpenMP中較重的線程分別爲該域被分解成數量等於核心數量的子域。OpenCL vs OpenMP性能

看來,OpenCL的編程模型更有針對性的向具有更少但功能更強大核心大規模並行芯片(GPU的,例如),而不是CPU的。

OpenCL能否成爲OpenMP的有效替代品?

+1

我也很想知道是否/何時一起使用OpenMP和OpenCL是有效的。 OpenCL是線程安全的(除了clSetKernelArg()方法),所以看起來好像還有空間可以利用這兩種技術。 –

+0

如果你對「有效」的定義包括可讀性和進化性,那麼答案必須是「否」。不能像OpenMP那樣將OpenCL固定在現有代碼上,並且與OpenMP相比,OpenCL具有大量的語法膨脹。另一方面,編寫有效利用內存層次結構的OpenMP代碼通常比OpenCL中的代碼更不可讀。 – Jeff

+0

你的問題需要縮小一點。您是否在尋找GPU與多線程CPU,OpenMP與OpenCL的比較?爲了比較兩種語言,他們確實需要在同一架構上運行。否則,它是蘋果和橘子。 – orodbhen

回答

24

我見過的基準測試表明,OpenCL和OpenMP的在同一硬件上運行,通常可比的性能,或OpenMP的具有表現略好。但是,我還沒有看到任何我認爲是確定性的基準,因爲他們大多缺乏對其方法的詳細解釋。但是,有幾件有用的事情需要考慮:

  • 在運行時編譯內核時,OpenCL總會有一些額外的開銷。任何基準測試都需要單獨列出這些時間,使用預編譯的本機內核,或者運行足夠長的內核編譯是微不足道的。

  • OpenCL的實施方式將發生變化。像NVidia這樣的GPU供應商沒有動力來確保他們的基於CPU的OpenCL實施儘可能快。沒有一個OpenCL實現可能像一個好的OpenMP實現那樣成熟。

  • OpenCL規範基本上沒有提到基於CPU的實現如何在引擎下使用線程,所以關於線程是相對輕量還是重量級的任何討論都必須是特定於實現的。

  • 當你在CPU上運行的OpenCL代碼,你的工作項目不必是微小的和無數。您可以按照與OpenMP相同的方式來分解問題。

即使OpenCL有更多的開銷,也可能有其他原因偏好它。

  • 很明顯,如果你的代碼可以很好地利用GPU,你會想要一個OpenCL實現。 CPU上的OpenCL性能可能已經足夠好,因此對於沒有強大GPU的用戶來說,維護OpenMP後備代碼路徑也是不值得的。

  • 良好的基於​​CPU的OpenCL實現意味着您將自動獲得任何指令集擴展的利益,CPU和OpenCL實現支持。使用OpenMP,您必須做額外的工作來確保您的可執行文件包含SSEx和AVX代碼路徑。

  • 的OpenCL,基矢量可以幫助你表達不便攜性和可讀性的犧牲你使用SSE內部函數得到一些明確的並行性。

+0

我想知道用戶無GPU的情況是否真的如此。由於CPU不支持2D本地工作大小,存在__本地內存問題等等,而不是維護OpenMP後備代碼,您必須維護OpenCL後備代碼。如果您已經優化了GPU內核,那麼在那裏沒有太多收穫。 –

+2

爲什麼你認爲基於CPU的實現不能支持2D本地工作組大小或本地內存?在CPU上,高速緩存由硬件而不是軟件管理,因此全局和本地內存之間唯一的區別在於是否需要使用鎖定來訪問它。工作組大小將相當於NUMA系統的調度程序提示。是的,爲了使它在GPU上運行良好而投入OpenCL代碼的很多優化工作不會影響CPU的性能,但它也不會破壞代碼。任何將在GPU上運行的內核都可以在兼容的CPU實施上運行。 – user57368

+0

@ user57368:此外,優化的使用(如顯式使用本地內存對GPU有意義)。在CPU上,如果對x86 CPU採用英特爾OpenCL實現,則至少有這種優化「可能會負面」影響性能。 – usman

6

我有一個程序可以選擇在某些關鍵瓶頸上使用openCL或openMP,基本上增加了向量和執行減少。

在我的情況下,openMP需要13秒,其中openCL在CPU上需要10秒。英特爾I5。

到目前爲止,我的最快配置是使用openCL GPU添加矢量,並在openMP上縮小到7秒。當我在GPU上對openCL內核進行縮減時,總共需要8秒。

所以根據我的經驗,我會說可能它取決於使用,並且你可以優化你的openCL內核。

+0

你在這裏意味着什麼,完全是由「減少」? – nbro

+0

@nbro「減少」是指當你需要大量的元素(比如10,000長度的數組,a [0]到[9999]),然後將數據處理到更小的元素。例如:計算出數組中的「最大」數字或a [0] + a [1] + a [2] + ... a [9999]的值。最常見的減少是「最大」,「最小」和「添加」,但是並行處理大量和大量數據以輸出單個數字(或者至少是少數代表整個數字)的概念是並行編程中常見的「模式」。 – Dragontamer5788