2014-05-06 965 views
11

我使用的是CUDA 6.0和與CUDA SDK捆綁在一起的OpenCL實現。我爲每個平臺有兩個相同的內核(它們在平臺特定的關鍵字中有所不同)。他們只能讀寫全局內存,每個線程都有不同的位置。 CUDA的啓動配置爲200 blocks of 250 threads (1D),它直接對應於OpenCL的配置 - 50,000 global work size and 250 local work sizeCUDA vs OpenCL性能對比

OpenCL代碼運行速度更快。這是可能的還是我計時錯了?我的理解是NVIDIA的OpenCL實現基於CUDA的實現。與OpenCL相比,我的性能提高了15%左右。

如果你能提出爲什麼我可能會看到這一點,並且可能與NVIDIA實施的CUDA和OpenCL之間的某些差異,那將是很棒的事情。

+0

結果在問題和案例中不一致。但你的也許是對的。 OpenCL在默認情況下是異步的,因此,如果您使用CUDA(非異步),那麼性能可能會略微低於OpenCL。 – DarkZeros

+0

我已經聽說NVIDIA的OCL實現是基於CUDA的。然而,每次我試圖找到一些消息來源時,我從來沒有找到任何證據。我的結論是,基於CUDA被錯誤地用作語言名稱的事實是錯誤的,而實際上它是根據維基百科的「並行計算平臺和編程模型」(Compute Unified Device Architecture)。因此,當你看到NVIDIA的幻燈片顯示在OCL下有一個稱爲CUDA的GPU,這是一個CUDA芯片。如果你有任何問題,你可以發佈你的來源嗎?我很想知道。 – CaptainObvious

+1

OpenCL和CUDA完全不同。他們最終都使用相同的硬件。但是就像OpenGL和DirectX一樣,其他人也不在其他人之下。要說明這一點,要點是庫不同,編譯器不同,執行模型也不同。有些部分可能很常見,但大多數不是。 – DarkZeros

回答

13

在現代GPU上執行的內核幾乎不會受到計算限制,並且幾乎總是受內存帶寬限制。 (因爲與可用的內存路徑相比運行的計算內核太多了)。

這意味着給定內核的性能通常很大程度上取決於給定算法展現的內存訪問模式。

實際上,這使得很難預測(甚至理解)提前期望的性能。

您觀察到的差異可能是由於OpenCL與CUDA工具鏈進行的不同優化所導致的兩個內核之間的內存訪問模式的細微差異。

要了解如何優化GPU內核,您需要了解可用的內存緩存硬件的詳細信息,以及如何充分利用它。 (例如,戰略性地使用「本地」內存緩存而不是直接訪問OpenCL中的「全局」內存。)