OpenCL和CUDA簡單比較
阿新 • • 發佈:2019-02-13
OpenCL和CUDA是兩種異構計算的程式設計模型。
NVIDIA在2007年正式釋出CUDA之後,一直大力推廣這種程式設計模型,主要集中在科學計算這一塊,原因是這個領域的很多應用程式屬於資料並行型別,因此利用CUDA在NVIDIA自家的GPU上加速原來單執行緒的程式一般都能取得滿意的加速效果。
OpenCL最早是由Apple提出,後來交給了Khronos這個開放標準組織。OpenCL 1.0 在2008年底正式由Khronos釋出,比CUDA晚了整整一年。由於NVIDIA的CUDA取得了先機,OpenCL則不那麼流行,玩的人比較少。
這兩種異構計算模型,基本思想其實是非常接近的。我個人的觀點是這兩東東差別不大,所以學會其中一個,另一個則能觸類旁通。網上有不少爭論到底是CUDA還是OpenCL好,各種觀點都有,其實是肥環瘦燕,各有所好。對初學者來說,可能CUDA可能更簡單點,需要關注的東西相對少一點;OpenCL由於要考慮不同平臺,要注意的方面多一點,個人覺得比較羅嗦,但目前又不可少。
本人背景不是搞計算機的,所以硬體軟體的底層並不是太關心,關注的是這兩種程式設計模型的具體實現,所以比較了一下兩種模型的實施步驟
先來CUDA
- 在device (也就是GPU) 上申請記憶體
- 將host (也就是CPU) 上的資料拷貝到device
- 執行CUDA kernel function
- 將device上的計算結果傳回host
- 釋放device上的記憶體
記住這5大步,也就掌握了CUDA的基本思路。
來看看OpenCL
- 檢測申請計算資源
- 檢測platform
- 檢測platform對應的device
- 建立context
- 建立command queue
- 在context內申請儲存空間
- 將host (也就是CPU) 上的資料拷貝到device
- OpenCL程式碼編譯
- 讀入OpenCL (kernel function) 原始碼
- 編譯創立program 控制代碼
- 創立一個 OpenCL kernel 控制代碼
- 申明設定 kernel 的 引數
- 設定NDRange
- 執行kernel
- 將device上的計算結果傳回host
- 釋放計算資源
- 釋放kernel
- 釋放program
- 釋放device memory
- 釋放command queue
- 釋放context
6大步驟,共10幾個小步。
用OpenCL C的話,一個都不能少;用C++ wrapper的話可以稍微簡單點,第6步不用程式設計師自己寫了,C++的destructor會自動釋放這些資源。
NIVIDIA在介紹OpenCL的時候,把它當作一種類似與CUDA driver API 的底層實現,將CUDA runtime API 稱為一種高層實現。其實OpenCL和CUDA在很多方面是非常類似的。