OpenCL

OpenCL(全稱Open Computing Language,開放運算語言)是第一個面向異構系統通用目的并行編程的開放式、免費標準,也是一個統一的編程環境,便于軟件開發人員為高性能計算服務器、桌面計算系統、手持設備編寫高效輕便的代碼,而且廣泛適用于多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其他并行處理器,在游戲、娛樂、科研、醫療等各種領域都有廣闊的發展前景。

目錄

1基本信息

2歷史發展

3支持現狀

4組織成員

5使用介紹

6框架組成

1基本信息編輯

OpenCL是一個為異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其他類型的處理器組成。OpenCL由一門用于編寫kernels (在OpenCL設備上運行的函數)的語言(基于C99)和一組用于定義并控制平臺的API組成。OpenCL提供了基于任務分割和數據分割的并行計算機制。
OpenCL類似于另外兩個開放的工業標準OpenGL和OpenAL,這兩個標準分別用于三維圖形和計算機音頻方面。OpenCL擴展了GPU用于圖形生成之外的能力。OpenCL由非盈利性技術組織Khronos Group掌管。

2歷史發展編輯

OpenCL最初蘋果公司開發,擁有其商標權,并在與AMD,IBM,英特爾和nVIDIA技術團隊的合作之下初步完善。隨后,蘋果將這一草案提交至Khronos Group。
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發布。

3支持現狀編輯

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\200\300\400\500\600\700\800(即將發布)均支持OpenCL 1.0-1.2
AMD顯卡方面 Radeon HD 4000\5000\6000\7000\Rx 200 均支持OpenCL 1.0-1.2,除Radeon HD4000系列外,其余均會支持OpenCL 2.0
移動平臺方面目前高通adreno320/330提供了Android上的OpenCL1.1支持,NVIDIA的Tegra K1也提供了OpenCL 支持。

4組織成員編輯

像Intel、NVIDIA和AMD都是這個標準的支持者,不過微軟并不在其列。

5使用介紹編輯

目前,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版,提供了更多的新功能,并對性能進行了改善。主要新特性包括:
- 支持新數據類型,如3維矢量和新增圖像格式。
- 支持處理多Host指令以及跨設備Buffer處理。
- Buffer區域操作,包括對1D、2D、3D三角形區域的讀、寫和拷貝操作。
- 改進驅動和控制指令執行的事件應用。
- 增加OpenCL內建C功能。
- 通過鏈接OpenCL和OpenGL事件,高效共享圖像和Buffer,改進與OpenGL的互操作性。
OpenCL標準由Khronos Group的OpenCL工作組制定,完全開放,任何開發者都可免費使用。OpenCL工作組成員包括(英文首字母排序):3DLABS、動視暴雪、AMD、蘋果、ARM、Broadcom、CodePlay、EA、愛立信、飛思卡爾、富士通、通用電氣、GraphicRemedy、HI、IBM、Intel、Imagination Technologies、美國Los Alamos國家實驗室、摩托羅拉、Movidia、諾基亞、NVIDIA、Petapath、QNX、高通、RapidMind、三星、Seaweed、S3、意法半導體、Takumi、德州儀器、東芝和Vivante。
OpenCL 2.0
1、共享虛擬內存
主機和設備內核可以直接共享復雜的、包含指針的數據結構,大大提高編程靈活性,避免冗余的數據轉移。
2、動態并行
設備內核可以在無需主機交互的情況下進行內核排隊,實現靈活的工作調度,避免數據轉移,大大減輕主處理器的負擔。
3、通用內存空間
無需指定地址空間名稱即可為引數(argument)編寫函數,不用再為程序里的每一個地址空間名稱編寫函數。
4、圖像
改進圖像支持,包括sRGB、3D,內核可以讀寫同一圖像。
5、C11原子操作
新的C11原子和同步操作子集,分配在同一工作組內
6、Pipes
以FIFO格式組織數據的內存對象,可以直接讀寫,數據結構可簡單編程、高度優化。
7、安卓可安裝客戶端驅動擴展
安卓系統上可將OpenCL作為共享對象進行載入

6框架組成編輯

OpenCL平臺API:平臺API定義了宿主機程序發現OpenCL設備所用的函數以及這些函數的功能,另外還定義了為OpenCL應用創建上下文的函數。
OpenCL運行時API:這個API管理上下文來創建命令隊列以及運行時發生的其他操作。例如,將命令提交到命令隊列的函數就來自OpenCL運行時API。
把上述單獨的部分匯集起來,形成OpenCL的一個全景圖,如下圖所示:

OpenCL全景圖

首先是一個定義上下文的宿主機程序。如上圖中中的上下文包含兩個OpenCL設備、一個CPU和一個GPU。接下來定義了命令隊列。這里有兩個隊列,一個是面向GPU的有序命令隊列,另一個是面向CPU的亂序命令隊列。然后宿主機程序定義一個程序對象,這個程序對象編譯后將為兩個OpenCL設備(CPU和GPU)生成內核。接下來宿主機程序定義程序所需的內存對象,并把它們映射到內核的參數。最后,宿主機程序將命令放入命令隊列來執行這些內核。
參考資料
  • 1.??圖形硬件處理標準 OpenCL ? .開源社區網 [引用日期2012-08-16] .

  • 2.??Khronos OpenCL Registry? .Khronos [引用日期2014-03-8] .

  • 3.??OpenCL框架組成?.CSDN [引用日期2013-01-8] .

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

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

目錄

  • 1歷史
  • 2示例
  • 3參考文獻
  • 4相關
  • 5外部鏈接

歷史

OpenCL最初蘋果公司開發,擁有其商標權,并在與AMD,IBM,英特爾和nVIDIA技術團隊的合作之下初步完善。隨后,蘋果將這一草案提交至Khronos Group。

2008年6月16日,Khronos的通用計算工作小組成立[1]。5個月后的2008年11月18日,該工作組完成了OpenCL 1.0規范的技術細節[2]。該技術規范在由Khronos成員進行審查之后,于2008年12月8日公開發表[3]。2010年6月14日,OpenCL 1.1 發布[4]

示例

一個快速傅立葉變換的式子:[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);

真正的運算: (基于 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的網站上可以發現傅立葉變換的例子[7]

參考文獻

  1. ^Khronos Launches Heterogeneous Computing Initiative, 新聞稿. Khronos Group. 2008-06-16 [2008-06-18].
  2. ^OpenCL gets touted in Texas. MacWorld. 2008-11-20[2009-06-12].
  3. ^The Khronos Group Releases OpenCL 1.0 Specification, 新聞稿. Khronos Group. 2008-12-08[2009-06-12].
  4. ^Khronos Drives Momentum of Parallel Computing Standard with Release of OpenCL 1.1 Specification, 新聞稿. Khronos Group. 2010-06-14[2010-10-13].
  5. ^OpenCL. SIGGRAPH2008. 2008-08-14[2008-08-14].
  6. ^Fitting FFT onto G80 Architecture (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. May 2008[2008-11-14].
  7. ^.OpenCL on FFT. Apple. 16 Nov 2009[2009-12-07].

相關

  • GPGPU
  • CUDA
  • DirectCompute
  • 比特幣的挖礦

外部鏈接

  • 開源GPU社區(簡體中文)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448648.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dubbo的底層原理

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、Duboo基本概念解釋 Dubbo是一種分布式服務框架。 Webservice也是一種服務框架,但是webservice并不是分布式的服務框架&…

BOM屬性對象方法

本文原鏈接:https://cloud.tencent.com/developer/article/1018747 BOM 1.window對象 2.location對象 3.history對象 BOM也叫瀏覽器對象模型,它提供了很多對象,用于訪問瀏覽器的功能。BOM缺少規范,每個瀏覽器提供商又按照自己想法…

nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress

實現LNMP 實現環境: 服務版本系統CentOS7.6Mysql5.6.34Nginx1.14.2PHP7.1.30HAProxy1.8.20Keepalived1.3.5NFS1.3.0主機IPMysql_master192.168.37.108Mysql_slave192.168.37.105NginxPHP192.168.37.103NginxPHP192.168.37.104HAProxyKeepalived192.168.37.101HAPro…

OpenCL “速成”沖刺【第一天】

話說軟件開發從來沒有速成一說,一門語言你學的越快,說明你在別的語言上下個功夫越多,所以這次加了引號,只不過幾周之后可能會有一個公司內部OpenCL的考核,雖然本人不需要考核,不過也正好借機整理下之前Open…

Java8函數式編程

最近使用lambda表達式,感覺使用起來非常舒服,箭頭函數極大增強了代碼的表達能力。于是決心花點時間深入地去研究一下java8的函數式。 一、lambda表達式 先po一個最經典的例子——線程 public static void main(String[] args) {// Java7new Thread(new R…

電腦如何獲得管理員權限

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 我只是記錄下,方便以后查看。 參見: https://jingyan.baidu.com/article/ab69b270ff426e2ca6189f54.html

.NET混淆器 Dotfuscator如何保護應用程序?控制流了解一下!

Dotfuscator是一個.NET的Obfuscator。它提供企業級的應用程序保護,大大降低了盜版、知識產權盜竊和篡改的風險。Dotfuscator的分層混淆、加密、水印、自動失效、防調試、防篡改、報警和防御技術,為世界各地成千上萬的應用程序提供保護。 Dotfuscator提供…

到底什么才是人生最大的投資

不是房子,不是股票, 是人,跟什么人交往,跟隨什么人, 交什么樣的朋友,其實就是你投資什么人, 而這,是對人生影響最大的。 錢不會給人機會,房子也不會, 只有人會…

tcpdump抓包命令

目錄: 命令格式選項expression表達式示例【命令格式】 man手冊顯示如下 1 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]2 [ -c count ]3 [ -C file_size ] [ -G rotate_seconds ] [ -F file ]4 [ -i …

百度Ueditor編輯器wordimage踩坑

背景 改造公司老項目后臺編輯器,使用百度的Ueditor做替換。 發現問題 1、ue編輯器初始化后部分參數無法覆蓋ueditor.config.js中的選項。2、wordimage(word圖片轉存)始終是灰色,無法使用。解決辦法 1、將ueditor.config.js中的inp…

IntelliJ IDEA 配置JDK

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 IDEA配置JDK 1、點擊File -->Project Structure; 2、點擊左側標簽頁SDKs選項,再點擊左上角“”,…

get和post 兩種基本請求方式的區別

GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。 你可能自己寫過無數個GET和POST請求,或者已經看過很多權威網站總結出…

無論是工作還是生活都要記住這些話

1.如果你不喜歡現在的工作,要么辭職不干,要么就閉嘴不言。初出茅廬,往往眼高手低,心高氣傲,大事做不了,小事不愿做。不要養成挑三揀四的習慣。不要雨天煩打傘,不帶傘又怕淋雨,處處表…

蘇嵌第一天,shell中一些基礎知識

一、常用環境變量 1、HOME變量 Linux系統中的每個用戶都有一個相關的稱作HOME的目錄。 2、PATH變量 包含一列用冒號定界的目錄的路徑名字,便于可執行程序的搜索。 3、PS1變量 PS1變量包含了shell提示符,$符號 4、LOGNAME變量 包含用戶的注冊名字…

Java異常處理001:Maven clean package時Failed to clean project: Failed to delete

Java異常處理001:Maven打包時Failed to clean project: Failed to delete 異常日志: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) on project fmk-web: Failed to clean project: Failed …

Weekly Contest 141

做了第一道后,看了下中間兩道題目,沒怎么看懂就先放著,做完最后一道,然后就沒時間了。 1089. Duplicate Zeros Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the remaining element…

IntelliJ IDEA 中配置、使用 SVN

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.配置svn 如下圖: file -- setting -- version control -- subversion -- 選擇 SVN安裝路徑 -- apply -- OK 2.直接檢出…

切記!職場郵件需注意的細節

電子郵件是如今工作場所重要的通信工具之一,但不是每個人都知道如何很好地使用這個工具。工作郵件也是人際溝通的一種方式,和打電話、面談一樣,有很多學問講究,所以在發送郵件之前一定要深思熟慮。 【發送,抄送&…

李洋瘋狂C語言之初

1.sizeof 是看數據類型所占空間大小,這個大小是以 字節(B)為單位 char 是C語言的字符數據類型 %d 用在printf 中表示往屏幕打印一個數字 printf ("char: %d\n", sizeof(char)); 數據類型之間的關系,shor…

時時流量查看工具-ifsta,nload,iftop

為什么80%的碼農都做不了架構師?>>> 1、ifstat 是一個網絡流量監測程序。能查看網卡的流出和流入的字節. 概要:ifstat就像iostat/vmstat描述其它的系統狀況一樣,是一個統計網絡接口活動狀態的工具。 參數: -l 監測環路…