OpenCL簡介-----OpenCL學習(一)

OpenCL Open Computing Language,開放計算機語言)是一個爲異構平臺編寫程序的框架,此異構平臺可由CPUGPU或其他類型的處理器組成。OpenCL由一門用於編寫kernel函數(在OpenCL設備上運行的函數)的語言(基於C99)和一組用於定義並控制平臺的API組成。OpenCL提供了基於任務分區和數據分區的並行計算機制。

 

 OpenCL類似與另外兩個開放的工業標準OpenGLOpenAL,這兩個標準分別用於三維圖形和計算機音頻方面。OpenCL擴充了GPU圖形生成之外的能力,OpenCL由非盈利性技術組織khronos Group掌管。

 

由於CPU本身適合做邏輯運算,而GPU則適合做“簡單暴力運算,所以自然想到利用GPU來進行運算功能,而讓CPU主要進行邏輯運算,這個思想最早由NVIDIA公司提出來。

 

現在各種CPUGPU都是支持OpenCL的,OpenCL沒有特定的SDKkhronos Group只是制定標準(可以理解爲頭文件),而具體的實現則是由參與的不同公司自己來實現,所以NVIDIAOpenCL做了實現後集成到了本身的CUDA SDK中,而AMD則是將其實現後放在所謂的AMD APP SDK 中,而intel當然也做了實現,目前主流的CUDAGPU都是支持OpenCL架構的。

 

同時由於不同公司的SDK都遵照OpenCL規範,所以原則上如果你用標準OpenCL中定義的藉口的花,使用NVIDIASDK編寫的程序是可以在AMD顯卡上運行的,不同的SDK可能會針對特定的芯片進行特定的擴展。由於NVIDIA自身有CUDA,所以他與AMDINTEL相比對OpenCL做的擴展會比較少一些。


由於OpenCL ICD的出現,開發人員可以在NVIDIA SDK上編譯一個OpenCL標準的程序,然後在AMD硬件上運行,不過,你必須注意OpenCL的版本,如果你在OPenCL 1.2 SDK上編譯的程序,在OpenCL 1.1 平臺上運行可能會產生一些問題。


 對於各大廠商的SDK以及OpenCL的關係可以這樣概述:OpenCL提供了一個上層標準,比如頭文件,定義了一個標準,一個所有的OpenCL語言都是一樣的,語法什麼的都是一樣的。所以OpenCL完全能夠跨平臺,那麼SDK的作用是什麼呢?各大廠商的SDK就是爲了讓OpenCL的kernel函數能夠在各自的特定硬件平臺上運行,就像一個API,比如說有一個OpenCL kernel函數,它可以在各個平臺編譯運行,但是它要在NVIDIA的顯卡上運行時必須先讓它變成可以在NVIDIA上的可執行程序,SDK就提供了從標準OpenCL語言到NVIDIA上可以運行的可執行程序這個過程的橋樑而已,大概就是提供了一個runtime吧。所以OpenCL是真正的跨平臺語言,而NVIDIA的CUDA C語言則不能跨平臺了。


ICD 的原理是這樣的ICDinstallable client driver)允許在同一個系統中安裝安裝多廠商驅動,這個程序通過ICD layer來訪問各個驅動廠商的驅動,詳細介紹可以看這裏。

http://www.khronos.org/registry/cl/extensions/khr/cl_khr_icd.txt  

 

  • OpenCL 1.2 Installable Client Driver (ICD) Loader. The related cl_khr_icd extension allows multiple implementations of OpenCL to co-exist on the same system. The ICD Loader allows applications to choose a platform from the list of installed platforms and dispatches OpenCL API calls to the underlying implementation. Consult LICENSE.txt in the tarball for full terms and conditions.
這裏簡單介紹了一下icd的功能


下面摘抄一點過來

 

    This extension defines a simple mechanism through which the Khronos

    installable client driver loader (ICD Loader) may expose multiple 

    separate vendor installable client drivers (Vendor ICDs) for

    OpenCL.  An application written against the ICD Loader will be able to 

    access all cl_platform_ids exposed by all vendor implementations 

    with the ICD Loader acting as a demultiplexor


ICD loader通過一個結構體參數來推斷某個函數是哪一個平臺的,這樣就可以實現多平臺SDK在同一個系統上實現了。

 

並且,你也可以在runtime同時在一個平臺上使用以上提到的,包括別的SDK,比如說,你可以使用Intel OpenCL CPU設備同時使用AMD OpenCL GPU設備,他們可以通用的,不過NVIDIA的可能兼容性不太好。因爲NVIDIA SDK僅僅支持OpenCL 1.1 標準

 

要注意的是,Intel SDK寫出的程序,對NVIDIA AMD Intel 三者的支持可能是最好的。並且,1.2 C++1.1 C++並不是100%兼容的,如果要在NVIDIAAMD GPU上都能使用,那麼可以這樣 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS

 

所有的不同SDK僅僅是提供給你特定廠商的extesions,所以實際上各個SDK編寫出的程序都是可以通用的。Runtime是由特定的硬件廠商,compiler,以及操作系統提供,OpenCL並不是提供runtime的。

 


總結:

 

總之OpenCL是一個跨平臺的標準,使用OpenCL,你可以在不同平臺上編寫能夠在別的平臺上能夠運行的程序。不用過於擔心各個OpenCL實現廠商的SDK,在不同SDK中編寫的kernels都是可以通用的,除非你用到了這個廠商提供的特定擴展,並且注意OpenCL 1.2 1.1並不是完全兼容的,NVIDIA目前只支持1.1而且NVIDIAOpenCL的支持也不是很好,最好選擇AMD或者Intel進行開發。

 

如果想了解關於OpenCL在多平臺上運行的信息可以看看這裏

http://stackoverflow.com/questions/14834403/how-to-use-2-opencl-runtimes   

 

http://www.91r.net/ask/15050043.html  

 

knronos官方網站

http://www.khronos.org/  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章