CUDA和OpenCL有什麼區別?


從很多方面來看,CUDA和OpenCL的關係都和DirectX與OpenGL的關係很相像。如同DirectX和OpenGL一樣,CUDA和OpenCL中,前者是配備完整工具包、針對單一供應商(NVIDIA)的成熟的開發平台,後者是一個開放的標準。

雖然兩者抱著相同的目標:通用並行計算。但是CUDA僅僅能夠在NVIDIA的GPU硬體上運行,而OpenCL的目標是面向任何一種Massively Parallel Processor,期望能夠對不同種類的硬體給出一個相同的編程模型。由於這一根本區別,二者在很多方面都存在不同:

1)開發者友好程度。CUDA在這方面顯然受更多開發者青睞。原因在於其統一的開發套件(CUDA Toolkit, NVIDIA GPU Computing SDK以及NSight等等)、非常豐富的庫(cuFFT, cuBLAS, cuSPARSE, cuRAND, NPP, Thrust)以及NVCC(NVIDIA的CUDA編譯器)所具備的PTX(一種SSA中間表示,為不同的NVIDIA GPU設備提供一套統一的靜態ISA)代碼生成、離線編譯等更成熟的編譯器特性。相比之下,使用OpenCL進行開發,只有AMD對OpenCL的驅動相對成熟。

2)跨平台性和通用性。這一點上OpenCL佔有很大優勢(這也是很多National Laboratory使用OpenCL進行科學計算的最主要原因)。OpenCL支持包括ATI,NVIDIA,Intel,ARM在內的多類處理器,並能支持運行在CPU的並行代碼,同時還獨有Task-Parallel Execution Mode,能夠更好的支持Heterogeneous Computing。這一點是僅僅支持數據級並行並僅能在NVIDIA眾核處理器上運行的CUDA無法做到的。

3)市場佔有率。作為一個開放標準,缺少背後公司的推動,OpenCL顯然沒有佔據通用並行計算的主流市場。NVIDIA則憑藉CUDA在科學計算、生物、金融等領域的推廣牢牢把握著主流市場。再次想到OpenGL和DirectX的對比,不難發現公司推廣的高效和非盈利機構/標準委員會的低效(抑或謹慎,想想C++0x)。

我接觸的很多開發者(包括我本人)都認為,由於目前獨立顯卡市場的萎縮、新一代處理器架構(AMD的Graphics Core Next (GCN)、Intel的Sandy Bridge以及Ivy Bridge)以及新的SIMD編程模型(Intel的ISPC等)的出現,未來的通用並行計算市場會有很多不確定因素,CUDA和OpenCL都不是終點,我期待未來會有更好的並行編程模型的出現(當然也包括CUDA和OpenCL,如果它們能夠持續發展下去)。


1. CUDA有遠好於OpenCL的生態系統,更易用,對程序員更友好。OpenCL的API設計怪異,缺乏一致性,功能亦不正交,很不直觀,遠未成熟。

2. OpenCL的portability被誇大了,事實上根據我的經驗,AMD和NV的OpenCL實現,組合行為是有差異的,並且有些十分隱蔽,難於調試。而且同樣的代碼在AMD和NV是有性能差異的,有時候差異非常大,為了一致的性能不得不寫兩套代碼。如果有更多的vendor呢?

3.OpenCL作為開放的標準,完全依賴於廠商的實現,不同廠商支持標準不同。如果NV放棄支持OpenCL,那它還是通用的開放的標準嗎?

4. 即使NV倒閉,會有OpenCUDA出現的。

現在AMD在推新的HSA,其IL類似NV的PTX,不知是何用意。Java會在未來(JAVA 9? 2015?)支持NV/AMD GPU 加速。OpenCL的美好只存在於未來,問題是這個未來有多遠。


我轉貼一個答案,希望可以幫到樓主

原文作者是Babyfacer,是資深高性能計算達人

http://blog.csdn.net/babyfacer/article/details/6863572

根據網站資料,簡單地彙編一下CUDA與OpenCL的區別。如有錯誤請指出。

題外話: 美國Sandia國家實驗室一項模擬測試證明:由於存儲機制和內存帶寬的限制,16核、32核甚至64核處理器對於超級計算機來說,不僅不能帶來性能提升,甚至可能導致效率的大幅度下降。

什麼是OpenCL?

是由蘋果(Apple)公司發起,業界眾多著名廠商共同製作的面向異構系統通用目的並行編程的開放式、免費標準,也是一個統一的編程環境。便於軟體開發人員為高性能計算伺服器、桌面計算系統、手持設備編寫高效輕便的代碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其他並行處理器,在遊戲、娛樂、科研、醫療等各種領域都有廣闊的發展前景。

什麼是CUDA?

CUDA是一個基於Nvidia GPU的並行計算的架構。CUDA最主要的包含兩個方面:一個是ISA指令集架構;第二硬體計算引擎;實際上是硬體和指令集。 也就是說我們可以把CUDA看做是與X86或者cell類似的架構,但是是基於是GPU,而不是傳統的CPU。

OpenCL實際上是什麼?

  • OpenCL實際上是針對異構系統進行並行編程的一個全新的API,OpenCL可以利用GPU進行一些並行計算的工作。
  • OpenGL是針對圖形的,而OpenCL則是針對並行計算的API。
  • OpenCL開發的過程中,技術平台均為NVIDIA的GPU,實際上OpenCL是基於NVIDIA GPU的平台進行開發的。另外OpenCL的第一次演示也是運行在NVIDIA的GPU上。
  • 從本質上來說,OpenCL就是一個相當於Windows平台中DirectX那樣的技術。或者說,它是一個連接硬體和軟體的API介面。在這一點上,它和OpenGL類似,不過OpenCL的涉及範圍要比OpenGL大得多,它不僅是用來作用於3D圖形。如果用一句話描述,OpenCL的作用就是通過調用處理器和GPU的計算資源,釋放硬體潛力,讓程序運行得更快更好。

CUDA實際上是什麼?

  • CUDA架構是原生的,專門為計算介面而建造的這樣的一個架構,這種硬體架構包括指令集都是非常適合於這種並行計算,為異構計算而設計的一整套的架構。CUDA架構可以支持API,包括OpenCL或者DirectX,同時CUDA還支持C、C++語言,還包括Fortran、Java、Python等各種各樣的語言。

OpenCL與CUDA的關係是什麼?

  • CUDA和OpenCL的關係並不是衝突關係,而是包容關係。OpenCL是一個API,在第一個級別,CUDA架構是更高一個級別,在這個架構上不管是OpenCL還是DX11這樣的API,還是像C語言、Fortran、DX11計算,都可以支持。作為程序開發員來講,一般他們只懂這些語言或者API,可以採用多種語言開發自己的程序,不管他選擇什麼語言,只要是希望調用GPU的計算能,在這個架構上都可以用CUDA來編程。
  • 關於OpenCL與CUDA之間的技術區別,主要體現在實現方法上。基於C語言的CUDA被包裝成一種容易編寫的代碼,因此即使是不熟悉晶元構造的科研人員,也可能利用CUDA工具編寫出實用的程序。而OpenCL雖然句法上與CUDA接近,但是它更加強調底層操作,因此難度較高,但正因為如此,OpenCL才能跨平台運行。
  • CUDA是一個並行計算的架構,包含有一個指令集架構和相應的硬體引擎。OpenCL是一個並行計算的應用程序編程介面(API),在NVIDIA CUDA架構上OpenCL是除了C for CUDA外新增的一個CUDA程序開發途徑。
  • 如果你想獲得更多的對硬體上的控制權的話,你可以使用OpenCL這個API來進行編程,如果對API不是太了解,也可以用CUDA C語言來編程,這是兩種不同編程的方式,他們有他們相同點和不同點。但是有一點OpenCL和CUDA C語言進行開發的時候,在並行計算這塊,他們的概念是差不多的,這兩種程序在程序上是有很大的相似度,所以程序之間的相互移植相對來說也是比較容易。

  • CUDA C語言與OpenCL的定位不同,或者說是用人群不同。CUDA C是一種高級語言,那些對硬體了解不多的非專業人士也能輕鬆上手;而OpenCL則是針對硬體的應用程序開發介面,它能給程序員更多對硬體的控制權,相應的上手及開發會比較難一些。
  • 程序員的使用習慣也是非常重要的一方面,那些在X86 CPU平台使用C語言的人員,會很容易接受基於CUDA GPU平台的C語言;而習慣於使用OpenGL圖形開發的人員,看到OpenCL會更加親切一些,在其基礎上開發與圖形、視頻有關的計算程序會非常容易。

給點實例看看?

  • OpenCL 教學: http://www.kimicat.com/opencl-1/opencl-jiao-xue-yi

    • 在 Windows 下使用 OpenCL: http://www.kimicat.com/opencl-1/zai-windows-xia-shi-yong-opencl

    • 在 Xcode 中使用 OpenCL: http://www.kimicat.com/opencl-1/zai-xcode-zhong-shi-yong-opencl
  • CUDA 教學: http://www2.kimicat.com/cuda%E7%B0%A1%E4%BB%8B

參考鏈接:

  • http://nvidia.e-works.net.cn/document/200901/article7313.htm
  • http://nvidia.e-works.net.cn/document/200909/article9195.htm
  • http://nvidia.e-works.net.cn/document/200901/article7305.htm


梳理的內容 OpenCL/OpenGL/DirectX/CUDA

https://www.zybuluo.com/johntian/note/673607


推薦閱讀:

亞馬遜、阿里雲等提供的GPU計算服務,底層是個什麼樣的原理?
如何配一台深度學習工作站,主要用於CNN圖像分類,預算2W以下。

?
有沒有雙顯卡筆記本在Ubuntu下使用cuda的解決方案?
有哪些適用於個人或小型團隊開發者的物理引擎?
IOS 並行編程 是學習 OpenCL還是 CUDA?

TAG:OpenCL | 圖形處理器GPU | CUDA |