CUDA與openCL的比較

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在很多方面是非常類似的。

 


發佈了9 篇原創文章 · 獲贊 58 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章