基本信息
OpenCL是一個為異構平台編寫程式的框架,此異構平台可由
CPU,
GPU或其他類型的處理器組成。OpenCL由一門用於編寫kernels (在OpenCL設備上運行的函式)的語言(基於
C99)和一組用於定義並控制平台的API組成。OpenCL提供了基於任務分割和
數據分割的
並行計算機制。
歷史發展
2008年6月的WWDC大會上,蘋果提出了OpenCL規範,旨在提供一個通用的開放API,在此基礎上開發GPU通用計算軟體。隨後,Khronos Group宣布成立GPU通用計算開放行業標準工作組,以蘋果的提案為基礎創立OpenCL行業規範。5個月後的2008年11月18日,該工作組完成了OpenCL 1.0規範的技術細節。2010年6月14日,OpenCL 1.1 發布。2011年11月15日,OpenCL 1.2 發布。2013年11月19日,OpenCL 2.0發布。
支持現狀
2009年6月NVIDIA首家發布了支持OpenCL 1.0通用計算規範的驅動程式,支持Windows和
Linux作業系統。
2009年8月初AMD首次發布了可支持IA處理器(x86和amd64/x64)的OpenCL SDK——ATI Stream SDK v2.0Beta,立即交由業界標準組織KHRONOS進行審核。目前,該SDK更名為AMD APP SDK。
2012年2月,intel發布了The Intel® SDK for OpenCL* Applications 2012,支持OpenCL 1.1基於帶HD4000/2500的
顯示核心的第三代
酷睿CPU(i3,i5,i7).和GPU。
2013年6月,intel發布了第四代酷睿CPU haswell 其內置的HD4600/4400/4200 Iris(銳矩)5000/5100/pro 5200(自帶eDRAM快取)支持OpenCL 1.2(未來可能升級到OpenCL 2.0)
NVIDIA顯示卡方面 Geforce 8000\9000\100、GTX200-1000,RTX2000均支持OpenCL 1.0-1.2
AMD顯示卡方面 Radeon HD 4000-7000\Rx 200\Rx 300\RX 400-500/Fury系列,Vega系列 均支持OpenCL 1.0-1.2,除Radeon HD4000-6000系列外,其餘均會支持OpenCL 2.0
移動平台方面目前高通adreno320/330/400系列/500系列提供了Android上的OpenCL1.2或者2.0支持,NVIDIA的Tegra K1也提供了OpenCL 支持。
組織成員
OpenCL工作組的成員包括:3Dlabs、AMD、蘋果、ARM、Codeplay、愛立信、飛思卡爾、華為、HSA基金會、Graphic
Remedy、IBM、Imagination Technologies、Intel、諾基亞、NVIDIA、摩托羅拉、QNX、高通,三星、Seaweed、德州儀器、布里斯托大學、瑞典Ume大學。
像Intel、NVIDIA和AMD都是這個標準的支持者,不過微軟並不在其列。
使用介紹
目前,NVIDIA顯示卡對OpenCL技術支持得比較到位,所以這裡僅用NVIDIA的Geforce(精視)系列顯示卡作解釋。
中國用戶可以登錄英偉達中文官方網站上下載到最新的
驅動程式,只要您下載的驅動是195.62版本或更高,就可以在Geforce(精視)8系列或更高級的顯示卡中開啟OpenCL,在安裝好新版本的顯示卡驅動程式並重新啟動後,OpenCL就自動開啟了。當有需要使用CPU來完成的工作如轉換視頻時,GPU就會幫助CPU進行運算,以提高轉換速度。但是在3D遊戲中應該是不會調用OpenCL的,因為顯示卡有自己的
硬體加速功能以及物理引擎,所以Geforce(精視)8系列及以上的顯示卡就不需要CPU輔助進行渲染了。這時候,您就可以一邊玩遊戲,一邊進行消耗CPU的工作了。
當然同樣,在NVIDIA的Quadro系列專業顯示卡中,同樣能夠使用OpenCL技術。只要您的顯示卡能夠達到CUDA的要求,就能夠正常使用OpenCL,以獲得優異的CPU運算效率。
在AMD-ATI的Stream技術中(現已經改名為AMD APP並行加速技術),已經為日常使用、辦公、遊戲等提供物理加速。基於OpenCL標準開發,其中,ATI Radeon HD 4000-5000、AMD Radeon HD 6000系列同時支持ATI Stream和AMD APP(由於Stream基於CAL和Brook+語言開發,更適合VLIW5和VLIW4這樣的SIMD架構),AMD Radeon HD7000和Radeon Rx 200系列支持AMD APP,運算效率較老架構提升十分明顯。
OpenCL 1.0
OpenCL 1.0主要由一個
並行計算API和一種針對此類計算的程式語言組成,此外還特別定義了:
1、C99程式語言並行擴展子集;
2、適用於各種類型異構處理器的坐標數據和基於任務並行計算API;
3、基於IEEE 754標準的數字條件;
4、與OpenGL、OpenGL ES和其他圖形類API高效互通。
OpenCL 1.1
Khronos Group2010年6月15日宣布,OpenCL通用計算標準的1.1版本已經發放,開發者可以免費下載,並依照新標準開始進行編程。
OpenCL 1.1標準向下兼容1.0版,提供了更多的新功能,並對性能進行了改善。主要新特性包括:
- 支持處理多Host指令以及跨設備Buffer處理。
- Buffer區域操作,包括對1D、2D、3D三角形區域的讀、寫和拷貝操作。
- 改進驅動和控制指令執行的事件套用。
- 增加OpenCL內建C功能。
- 通過連結OpenCL和OpenGL事件,高效共享圖像和Buffer,改進與OpenGL的互操作性。
OpenCL標準由Khronos Group的OpenCL工作組制定,完全開放,任何開發者都可免費使用。OpenCL工作組成員包括(英文首字母排序):3DLABS、動視暴雪、AMD、蘋果、ARM、Broadcom、CodePlay、EA、愛立信、飛思卡爾、富士通、通用電氣、Graphic
Remedy、HI、IBM、Intel、Imagination Technologies、美國Los Alamos國家實驗室、摩托羅拉、Movidia、諾基亞、NVIDIA、Petapath、QNX、高通、RapidMind、三星、Seaweed、S3、意法半導體、Takumi、德州儀器、東芝和Vivante。
OpenCL 2.0
Khronos Group2013年11月19日宣布了OpenCL通用計算標準的2.0版本特性,其中對共享虛擬記憶體的支持是一大亮點(此前NVIDIA發布了CUDA 6規範也同樣支持共享虛擬記憶體,但目前僅限Kepler和Maxwell架構的N卡。此外,AMD的GCN架構顯示卡同樣支持。AMD的Kaveri APU支持HSA異構計算和hUMA統一物理定址,較虛擬共享更加先進。)
1、共享虛擬記憶體
主機和設備核心可以直接共享複雜的、包含指針的數據結構,大大提高編程靈活性,避免冗餘的數據轉移。
2、動態並行
設備核心可以在無需主機互動的情況下進行核心排隊,實現靈活的工作調度,避免數據轉移,大大減輕主處理器的負擔。
3、通用記憶體空間
無需指定地址空間名稱即可為引數(argument)編寫函式,不用再為程式里的每一個地址空間名稱編寫函式。
4、圖像
改進圖像支持,包括sRGB、3D,核心可以讀寫同一圖像。
5、C11原子操作
新的C11原子和同步操作子集,分配在同一工作組內
6、Pipes
以FIFO格式組織數據的記憶體對象,可以直接讀寫,數據結構可簡單編程、高度最佳化。
7、安卓可安裝客戶端驅動擴展
安卓系統上可將OpenCL作為共享對象進行載入。
框架組成
OpenCL平台API:平台API定義了宿主機程式發現OpenCL設備所用的函式以及這些函式的功能,另外還定義了為OpenCL套用創建上下文的函式。
OpenCL運行時API:這個API管理上下文來創建命令佇列以及運行時發生的其他操作。例如,將命令提交到命令佇列的函式就來自OpenCL運行時API。
OpenCL程式語言:這是用來編寫核心代碼的程式語言。它基於ISO C99標準的一個擴展子集,因此通常稱為OpenCL C程式語言。
把上述單獨的部分匯集起來,形成OpenCL的一個全景圖,如下圖所示:
首先是一個定義上下文的宿主機程式。如上圖中中的上下文包含兩個OpenCL設備、一個CPU和一個GPU。接下來定義了命令佇列。這裡有兩個佇列,一個是面向GPU的有序命令佇列,另一個是面向CPU的亂序命令佇列。然後宿主機程式定義一個程式對象,這個程式對象編譯後將為兩個OpenCL設備(CPU和GPU)生成核心。接下來宿主機程式定義程式所需的記憶體對象,並把它們映射到核心的參數。最後,宿主機程式將命令放入命令佇列來執行這些核心。