2011-08-19 181 views
0

我在OpenMP,TBB和OpenCL中實現了很少的正常循環應用程序。在所有這些應用程序中,當我僅在CPU上運行Operate時,Operate的性能遠遠優於其他應用程序,而在內核中沒有進行特定的優化。 OpenMP和TBB也有很好的性能,但遠低於OpenCL,可能是因爲這些都是CPU專用框架,並且至少應該提供與OpenMP/TBB相同的性能。OpenCL,TBB,OpenMP

我的第二個問題是,當涉及到OpenMP和TBB時,OpenMP在性能上總是比TBB好,因爲在我的實現中,我沒有對它進行優化,因爲我並不那麼專業。 OpenMP性能通常比TBB更好嗎?因爲我認爲他們兩個甚至是OpenCL都會在低層使用相同類型的線程池......任何專家意見?謝謝

+2

你的算法是什麼?什麼是您的操作系統和編譯器? – osgx

回答

0

OpenCL內核針對給定的硬件進行編譯。供應商/硬件特定優化的潛力是巨大的。

3

OpenCL優於TBB和OpenMP的一個優點是它可以在硬件中更好地利用SIMD並行性。一些OpenCL實現將運行您的代碼,使得每個工作項都在機器的SIMD向量通道中運行,並且在單獨的核心上運行。根據算法,這可以提供很多性能優勢。

C編譯器也可以利用SIMD並行機制的一些優勢,使用自動矢量化,但是C中的內存別名規則使得它在某些情況下很難工作。由於OpenCL要求程序員明確地調出工作項目並隔離內存訪問,所以OpenCL編譯器可能更具侵略性。

最後,這取決於你的代碼。我們可以找到OpenCL,OpenMP或TBB都是最好的算法。

+0

我在所有情況下都使用了intel編譯器,因此我使用「icc -O0」選項編譯了我的所有應用程序以禁用編譯器的自動優化。所以我想我停止了像SIMD等自動優化的編譯器,但是有人告訴我OpenCL需要在clBuildProgram函數中使用「-cl-opt-disable」選項來禁用OpenCL自動優化;但是當我嘗試的時候,它給了我錯誤爲「undefined -cl-opt-disable」,我正在使用最新的AMD OpenCL SDK,爲什麼我會遇到這個問題?英特爾的-O0選項有助於禁用OpenCL自動優化? –

+1

如果您在C代碼上使用-O0,編譯器當然不會嘗試進行矢量化。實際上,我不會花時間擔心-O0代碼編譯器的性能。在-O3比較代碼的性能和編譯器優化更有趣。 – boiler96

+1

@AkhtarAli,您將OpenCL代碼與OpenMP和TBB進行了比較,沒有進行優化。真是太傻了! –

1

Intel提供的CPU和MIC的OpenCL運行時使用TBB。它遠不僅僅是'低級別的線程池',因爲它利用了TBB提供的複雜的調度和分區算法,以實現更好的負載均衡和更好的CPU利用率。

至於TBB與OpenMP。通常,這歸結於不正確的測量。例如,TBB沒有像OpenMP那樣的隱含障礙,所以預熱循環是不夠的。您必須確保所有線程都已創建,並且此開銷不包含在您的測量中。另一個例子:有時候,編譯器不能使用向量化爲OpenMP的TBB向量化相同的代碼。

+0

我考慮使用TBB而不是OpenMP。我一直在尋找的主要特徵是定義線程拓撲(核心,套接字,邏輯處理器......)的一種方法,因爲OpenMP沒有直接的支持,但TBB似乎也不是。此外,TBB是基於任務的而不是基於線程的,所以不是給我更少的低級控制。我不是要批評。我想知道我是否誤解了TBB,應該再考慮TBB。 –

+1

TBB提供task_arena和task_scheduler_observer。在編程中擁有這些和黑帶,您可以根據需要固定工作線程,並根據需要限制工作分配。實際上,這些功能是由OpenCL的裂變功能驅動的。基於線程的編程不可組合,這對嵌套算法不利,對庫不好。由於更好的負載平衡,TBB經常擊敗OpenMP。 – Anton

+1

更好的負載平衡是一個非常誘人的功能。我想我會再看看TBB。 –