1. 程式人生 > >OpenCL和CUDA簡單比較

OpenCL和CUDA簡單比較

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

  1.  在device (也就是GPU) 上申請記憶體
  2.  將host (也就是CPU) 上的資料拷貝到device
  3.  執行CUDA kernel function
  4.  將device上的計算結果傳回host
  5.  釋放device上的記憶體

記住這5大步,也就掌握了CUDA的基本思路。

來看看OpenCL

  1. 檢測申請計算資源
    • 檢測platform
    • 檢測platform對應的device
    • 建立context
    • 建立command queue
    • 在context內申請儲存空間
  2. 將host (也就是CPU) 上的資料拷貝到device
  3. OpenCL程式碼編譯
    • 讀入OpenCL (kernel function) 原始碼
    • 編譯創立program 控制代碼
    • 創立一個 OpenCL kernel 控制代碼
    • 申明設定 kernel 的 引數
    • 設定NDRange
  4. 執行kernel 
  5. 將device上的計算結果傳回host
  6. 釋放計算資源
    • 釋放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在很多方面是非常類似的。