OpenCL
目錄
1基本信息
2歷史發(fā)展
3支持現(xiàn)狀
4組織成員
5使用介紹
6框架組成
1基本信息編輯
OpenCL是一個(gè)為異構(gòu)平臺編寫程序的框架,此異構(gòu)平臺可由CPU,GPU或其他類型的處理器組成。OpenCL由一門用于編寫kernels (在OpenCL設(shè)備上運(yùn)行的函數(shù))的語言(基于C99)和一組用于定義并控制平臺的API組成。OpenCL提供了基于任務(wù)分割和數(shù)據(jù)分割的并行計(jì)算機(jī)制。 OpenCL類似于另外兩個(gè)開放的工業(yè)標(biāo)準(zhǔn)OpenGL和OpenAL,這兩個(gè)標(biāo)準(zhǔn)分別用于三維圖形和計(jì)算機(jī)音頻方面。OpenCL擴(kuò)展了GPU用于圖形生成之外的能力。OpenCL由非盈利性技術(shù)組織Khronos Group掌管。2歷史發(fā)展編輯
OpenCL最初蘋果公司開發(fā),擁有其商標(biāo)權(quán),并在與AMD,IBM,英特爾和nVIDIA技術(shù)團(tuán)隊(duì)的合作之下初步完善。隨后,蘋果將這一草案提交至Khronos Group。 2008年6月的WWDC大會上,蘋果提出了OpenCL規(guī)范,旨在提供一個(gè)通用的開放API,在此基礎(chǔ)上開發(fā)GPU通用計(jì)算軟件。隨后,Khronos Group宣布成立GPU通用計(jì)算開放行業(yè)標(biāo)準(zhǔn)工作組,以蘋果的提案為基礎(chǔ)創(chuàng)立OpenCL行業(yè)規(guī)范。5個(gè)月后的2008年11月18日,該工作組完成了OpenCL 1.0規(guī)范的技術(shù)細(xì)節(jié)。2010年6月14日,OpenCL 1.1 發(fā)布。2011年11月15日,OpenCL 1.2 發(fā)布。2013年11月19日,OpenCL 2.0發(fā)布。3支持現(xiàn)狀編輯
2009年6月NVIDIA首家發(fā)布了支持OpenCL 1.0通用計(jì)算規(guī)范的驅(qū)動(dòng)程序,支持Windows和Linux操作系統(tǒng)。 2009年8月初AMD首次發(fā)布了可支持IA處理器(x86和amd64/x64)的OpenCL SDK——ATI Stream SDK v2.0Beta,立即交由業(yè)界標(biāo)準(zhǔn)組織KHRONOS進(jìn)行審核。目前,該SDK更名為AMD APP SDK。 2012年2月,intel發(fā)布了The Intel® SDK for OpenCL* Applications 2012,支持OpenCL 1.1基于帶HD4000/2500的顯示核心的第三代酷睿CPU(i3,i5,i7).和GPU。 2013年6月,intel發(fā)布了第四代酷睿CPU haswell 其內(nèi)置的HD4600/4400/4200 Iris(銳矩)5000/5100/pro 5200(自帶eDRAM緩存)支持OpenCL 1.2(未來可能升級到OpenCL 2.0) NVIDIA顯卡方面 Geforce 8000\9000\100\200\300\400\500\600\700\800(即將發(fā)布)均支持OpenCL 1.0-1.2 AMD顯卡方面 Radeon HD 4000\5000\6000\7000\Rx 200 均支持OpenCL 1.0-1.2,除Radeon HD4000系列外,其余均會支持OpenCL 2.0 移動(dòng)平臺方面目前高通adreno320/330提供了Android上的OpenCL1.1支持,NVIDIA的Tegra K1也提供了OpenCL 支持。4組織成員編輯
OpenCL工作組的成員包括:3Dlabs、AMD、蘋果、ARM、Codeplay、愛立信、飛思卡爾、華為、HSA基金會、GraphicRemedy、IBM、Imagination Technologies、Intel、諾基亞、NVIDIA、摩托羅拉、QNX、高通,三星、Seaweed、德州儀器、布里斯托爾大學(xué)、瑞典Ume大學(xué)。[1] 像Intel、NVIDIA和AMD都是這個(gè)標(biāo)準(zhǔn)的支持者,不過微軟并不在其列。5使用介紹編輯
目前,NVIDIA顯卡對OpenCL技術(shù)支持得比較到位,所以這里僅用NVIDIA的Geforce(精視)系列顯卡作解釋。 中國用戶可以登錄英偉達(dá)中文官方網(wǎng)站上下載到最新的驅(qū)動(dòng)程序,只要您下載的驅(qū)動(dòng)是195.62版本或更高,就可以在Geforce(精視)8系列或更高級的顯卡中開啟OpenCL,在安裝好新版本的顯卡驅(qū)動(dòng)程序并重新啟動(dòng)后,OpenCL就自動(dòng)開啟了。當(dāng)有需要使用CPU來完成的工作如轉(zhuǎn)換視頻時(shí),GPU就會幫助CPU進(jìn)行運(yùn)算,以提高轉(zhuǎn)換速度。但是在3D游戲中應(yīng)該是不會調(diào)用OpenCL的,因?yàn)轱@卡有自己的硬件加速功能以及物理引擎,所以Geforce(精視)8系列及以上的顯卡就不需要CPU輔助進(jìn)行渲染了。這時(shí)候,您就可以一邊玩游戲,一邊進(jìn)行消耗CPU的工作了。 當(dāng)然同樣,在NVIDIA的Quadro系列專業(yè)顯卡中,同樣能夠使用OpenCL技術(shù)。只要您的顯卡能夠達(dá)到CUDA的要求,就能夠正常使用OpenCL,以獲得優(yōu)異的CPU運(yùn)算效率。、 在AMD-ATI的Stream技術(shù)中(現(xiàn)已經(jīng)改名為AMD APP并行加速技術(shù)),已經(jīng)為日常使用、辦公、游戲等提供物理加速。基于OpenCL標(biāo)準(zhǔn)開發(fā),其中,ATI Radeon HD 4000-5000、AMD Radeon HD 6000系列同時(shí)支持ATI Stream和AMD APP(由于Stream基于CAL和Brook+語言開發(fā),更適合VLIW5和VLIW4這樣的SIMD架構(gòu)),AMD Radeon HD7000和Radeon Rx 200系列支持AMD APP,運(yùn)算效率較老架構(gòu)提升十分明顯。 OpenCL 1.0 OpenCL 1.0主要由一個(gè)并行計(jì)算API和一種針對此類計(jì)算的編程語言組成,此外還特別定義了: 1、C99編程語言并行擴(kuò)展子集; 2、適用于各種類型異構(gòu)處理器的坐標(biāo)數(shù)據(jù)和基于任務(wù)并行計(jì)算API; 3、基于IEEE 754標(biāo)準(zhǔn)的數(shù)字條件; 4、與OpenGL、OpenGL ES和其他圖形類API高效互通。 OpenCL 1.1 Khronos Group2010年6月15日宣布,OpenCL通用計(jì)算標(biāo)準(zhǔn)的1.1版本已經(jīng)發(fā)放,開發(fā)者可以免費(fèi)下載,并依照新標(biāo)準(zhǔn)開始進(jìn)行編程。 OpenCL 1.1標(biāo)準(zhǔn)向下兼容1.0版,提供了更多的新功能,并對性能進(jìn)行了改善。主要新特性包括: - 支持新數(shù)據(jù)類型,如3維矢量和新增圖像格式。 - 支持處理多Host指令以及跨設(shè)備Buffer處理。 - Buffer區(qū)域操作,包括對1D、2D、3D三角形區(qū)域的讀、寫和拷貝操作。 - 改進(jìn)驅(qū)動(dòng)和控制指令執(zhí)行的事件應(yīng)用。 - 增加OpenCL內(nèi)建C功能。 - 通過鏈接OpenCL和OpenGL事件,高效共享圖像和Buffer,改進(jìn)與OpenGL的互操作性。 OpenCL標(biāo)準(zhǔn)由Khronos Group的OpenCL工作組制定,完全開放,任何開發(fā)者都可免費(fèi)使用。OpenCL工作組成員包括(英文首字母排序):3DLABS、動(dòng)視暴雪、AMD、蘋果、ARM、Broadcom、CodePlay、EA、愛立信、飛思卡爾、富士通、通用電氣、GraphicRemedy、HI、IBM、Intel、Imagination Technologies、美國Los Alamos國家實(shí)驗(yàn)室、摩托羅拉、Movidia、諾基亞、NVIDIA、Petapath、QNX、高通、RapidMind、三星、Seaweed、S3、意法半導(dǎo)體、Takumi、德州儀器、東芝和Vivante。 OpenCL 2.0 Khronos Group2013年11月19日宣布了OpenCL通用計(jì)算標(biāo)準(zhǔn)的2.0版本特性,其中對共享虛擬內(nèi)存的支持是一大亮點(diǎn)(此前NVIDIA發(fā)布了CUDA 6規(guī)范也同樣支持共享虛擬內(nèi)存,但目前僅限Kepler和Maxwell架構(gòu)的N卡。此外,AMD的GCN架構(gòu)顯卡同樣支持。AMD的Kaveri APU支持HSA異構(gòu)計(jì)算和hUMA統(tǒng)一物理尋址,較虛擬共享更加先進(jìn)。)[2] 1、共享虛擬內(nèi)存 主機(jī)和設(shè)備內(nèi)核可以直接共享復(fù)雜的、包含指針的數(shù)據(jù)結(jié)構(gòu),大大提高編程靈活性,避免冗余的數(shù)據(jù)轉(zhuǎn)移。 2、動(dòng)態(tài)并行 設(shè)備內(nèi)核可以在無需主機(jī)交互的情況下進(jìn)行內(nèi)核排隊(duì),實(shí)現(xiàn)靈活的工作調(diào)度,避免數(shù)據(jù)轉(zhuǎn)移,大大減輕主處理器的負(fù)擔(dān)。 3、通用內(nèi)存空間 無需指定地址空間名稱即可為引數(shù)(argument)編寫函數(shù),不用再為程序里的每一個(gè)地址空間名稱編寫函數(shù)。 4、圖像 改進(jìn)圖像支持,包括sRGB、3D,內(nèi)核可以讀寫同一圖像。 5、C11原子操作 新的C11原子和同步操作子集,分配在同一工作組內(nèi) 6、Pipes 以FIFO格式組織數(shù)據(jù)的內(nèi)存對象,可以直接讀寫,數(shù)據(jù)結(jié)構(gòu)可簡單編程、高度優(yōu)化。 7、安卓可安裝客戶端驅(qū)動(dòng)擴(kuò)展 安卓系統(tǒng)上可將OpenCL作為共享對象進(jìn)行載入6框架組成編輯
OpenCL平臺API:平臺API定義了宿主機(jī)程序發(fā)現(xiàn)OpenCL設(shè)備所用的函數(shù)以及這些函數(shù)的功能,另外還定義了為OpenCL應(yīng)用創(chuàng)建上下文的函數(shù)。 OpenCL運(yùn)行時(shí)API:這個(gè)API管理上下文來創(chuàng)建命令隊(duì)列以及運(yùn)行時(shí)發(fā)生的其他操作。例如,將命令提交到命令隊(duì)列的函數(shù)就來自O(shè)penCL運(yùn)行時(shí)API。 OpenCL編程語言:這是用來編寫內(nèi)核代碼的編程語言。它基于ISO C99標(biāo)準(zhǔn)的一個(gè)擴(kuò)展子集,因此通常稱為OpenCL C編程語言。[3] 把上述單獨(dú)的部分匯集起來,形成OpenCL的一個(gè)全景圖,如下圖所示:OpenCL全景圖
首先是一個(gè)定義上下文的宿主機(jī)程序。如上圖中中的上下文包含兩個(gè)OpenCL設(shè)備、一個(gè)CPU和一個(gè)GPU。接下來定義了命令隊(duì)列。這里有兩個(gè)隊(duì)列,一個(gè)是面向GPU的有序命令隊(duì)列,另一個(gè)是面向CPU的亂序命令隊(duì)列。然后宿主機(jī)程序定義一個(gè)程序?qū)ο?#xff0c;這個(gè)程序?qū)ο缶幾g后將為兩個(gè)OpenCL設(shè)備(CPU和GPU)生成內(nèi)核。接下來宿主機(jī)程序定義程序所需的內(nèi)存對象,并把它們映射到內(nèi)核的參數(shù)。最后,宿主機(jī)程序?qū)⒚罘湃朊铌?duì)列來執(zhí)行這些內(nèi)核。 參考資料-
1.??圖形硬件處理標(biāo)準(zhǔn) OpenCL ? .開源社區(qū)網(wǎng) [引用日期2012-08-16] .
-
2.??Khronos OpenCL Registry? .Khronos [引用日期2014-03-8] .
-
3.??OpenCL框架組成?.CSDN [引用日期2013-01-8] .
OpenCL (Open Computing Language,開放計(jì)算語言) 是一個(gè)為異構(gòu)平臺編寫程序的框架,此異構(gòu)平臺可由CPU,GPU或其他類型的處理器組成。OpenCL由一門用于編寫kernels (在OpenCL設(shè)備上運(yùn)行的函數(shù))的語言(基于C99)和一組用于定義并控制平臺的API組成。OpenCL提供了基于任務(wù)分區(qū)和數(shù)據(jù)分區(qū)的并行計(jì)算機(jī)制。
OpenCL類似于另外兩個(gè)開放的工業(yè)標(biāo)準(zhǔn)OpenGL和OpenAL,這兩個(gè)標(biāo)準(zhǔn)分別用于三維圖形和計(jì)算機(jī)音頻方面。OpenCL擴(kuò)充了GPU圖形生成之外的能力。OpenCL由非盈利性技術(shù)組織Khronos Group掌管。
目錄
- 1歷史
- 2示例
- 3參考文獻(xiàn)
- 4相關(guān)
- 5外部鏈接
歷史
OpenCL最初蘋果公司開發(fā),擁有其商標(biāo)權(quán),并在與AMD,IBM,英特爾和nVIDIA技術(shù)團(tuán)隊(duì)的合作之下初步完善。隨后,蘋果將這一草案提交至Khronos Group。
2008年6月16日,Khronos的通用計(jì)算工作小組成立[1]。5個(gè)月后的2008年11月18日,該工作組完成了OpenCL 1.0規(guī)范的技術(shù)細(xì)節(jié)[2]。該技術(shù)規(guī)范在由Khronos成員進(jìn)行審查之后,于2008年12月8日公開發(fā)表[3]。2010年6月14日,OpenCL 1.1 發(fā)布[4]。
示例
一個(gè)快速傅立葉變換的式子:[5]
// create a compute context with GPU devicecontext = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);// create a command queuequeue = clCreateCommandQueue(context, NULL, 0, NULL);// allocate the buffer memory objectsmemobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL);memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL);// create the compute programprogram = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);// build the compute program executableclBuildProgram(program, 0, NULL, NULL, NULL, NULL);// create the compute kernelkernel = clCreateKernel(program, "fft1D_1024", NULL);// set the args valuesclSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL);clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL);// create N-D range object with work-item dimensions and execute kernelglobal_work_size[0] = num_entries;local_work_size[0] = 64;clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);真正的運(yùn)算: (基于 Fitting FFT onto the G80 Architecture)[6]
// This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into// calls to a radix 16 function, another radix 16 function and then a radix 4 function__kernel void fft1D_1024 (__global float2 *in, __global float2 *out,__local float *sMemx, __local float *sMemy) {int tid = get_local_id(0);int blockIdx = get_group_id(0) * 1024 + tid;float2 data[16];// starting index of data to/from global memoryin = in + blockIdx; out = out + blockIdx;globalLoads(data, in, 64); // coalesced global readsfftRadix16Pass(data); // in-place radix-16 passtwiddleFactorMul(data, tid, 1024, 0);// local shuffle using local memorylocalShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));fftRadix16Pass(data); // in-place radix-16 passtwiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplicationlocalShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));// four radix-4 function callsfftRadix4Pass(data); // radix-4 function number 1fftRadix4Pass(data + 4); // radix-4 function number 2fftRadix4Pass(data + 8); // radix-4 function number 3fftRadix4Pass(data + 12); // radix-4 function number 4// coalesced global writesglobalStores(data, out, 64);}Apple的網(wǎng)站上可以發(fā)現(xiàn)傅立葉變換的例子[7]
參考文獻(xiàn)
相關(guān)
- GPGPU
- CUDA
- DirectCompute
- 比特幣的挖礦
外部鏈接
- 開源GPU社區(qū)(簡體中文)
總結(jié)
- 上一篇: ListView用法总结
- 下一篇: 程序员赚大钱