OpenCL架構(gòu)

1. 簡(jiǎn)介

官網(wǎng)在這里

OpenCL(Open Computing Language)立宜,即開放運(yùn)算語言,是一個(gè)統(tǒng)一的開放式的開發(fā)平臺(tái)薯酝。OpenCL是首個(gè)提出的并行開發(fā)的開放式的扔嵌、兼容的、免費(fèi)的標(biāo)準(zhǔn),它的目的是為異構(gòu)系統(tǒng)通用提供統(tǒng)一開發(fā)平臺(tái)。OpenCL最初是由蘋果公司設(shè)想和開發(fā),并在與AMD灾馒,IBM,英特爾和NVIDIA技術(shù)團(tuán)隊(duì)的合作之下初步完善遣总。隨后睬罗,蘋果將這一草案提交至Khronos Group轨功。

OpenCL歷史版本

2.框架組成

OpenCL的框架組成可以劃分為三個(gè)部分,分別為OpenCL平臺(tái)API傅物、OpenCL運(yùn)行時(shí)API夯辖,以及OpenCL內(nèi)核編程語言。

2.1 平臺(tái)API

平臺(tái)(Platform)這個(gè)詞在OpenCL中擁有非常特定的含義董饰,它表示的是宿主機(jī)蒿褂、OpenCL設(shè)備和OpenCL框架的組合。多個(gè)OpenCL平臺(tái)可以共存于一臺(tái)異構(gòu)計(jì)算機(jī)卒暂。舉個(gè)例子啄栓,CPU開發(fā)人員和GPU開發(fā)人員可以在同一個(gè)系統(tǒng)上分別定義自己的OpenCL框架。這時(shí)就需要一種方法來查詢系統(tǒng)中可用的OpenCL 框架也祠,哪些OpenCL設(shè)備是可用的昙楚,以及這些OpenCL設(shè)備的特性。相當(dāng)于CUDA的主機(jī)和設(shè)備之間的關(guān)系诈嘿。

此外堪旧,為了形成一個(gè)給定的OpenCL應(yīng)用平臺(tái),還需要對(duì)這些框架和設(shè)備所屬的子集進(jìn)行控制奖亚。這些功能都是由OpenCL平臺(tái)API中的函數(shù)來解決的淳梦。此外,平臺(tái)API還提供了為OpenCL創(chuàng)建上下文的函數(shù)昔字。OpenCL的上下文規(guī)定了OpenCL應(yīng)用程序的打開方式(相當(dāng)是CUDA中核函數(shù)的調(diào)用)爆袍,這可以在宿主機(jī)程序代碼中得到驗(yàn)證。

2.2 運(yùn)行時(shí)API

平臺(tái)API提供函數(shù)創(chuàng)建好上下文之后作郭,運(yùn)行時(shí)API主要提供使用上下文提供的功能滿足各種應(yīng)用需求的函數(shù)陨囊。這是一個(gè)規(guī)模龐大且內(nèi)容十分復(fù)雜的函數(shù)集。運(yùn)行時(shí)API的第一個(gè)任務(wù)是創(chuàng)建一個(gè)命令隊(duì)列夹攒。命令隊(duì)列與設(shè)備相關(guān)聯(lián)蜘醋,而且一個(gè)上下文中可以同時(shí)存在多個(gè)活動(dòng)的命令隊(duì)列。有了命令隊(duì)列咏尝,就可以通過調(diào)用運(yùn)行時(shí)API提供的函數(shù)來進(jìn)行內(nèi)存對(duì)象的定義以及管理內(nèi)存中的對(duì)象所依賴的所有其他對(duì)象堂湖。以上是內(nèi)存對(duì)象的持有操作,另外還有釋放操作状土,也是由運(yùn)行時(shí)API提供的。

此外伺糠,運(yùn)行時(shí)API還提供了創(chuàng)建動(dòng)態(tài)庫(kù)所需要的程序?qū)ο蟮暮瘮?shù)蒙谓,正是這些動(dòng)態(tài)庫(kù)實(shí)現(xiàn)了Kernel的定義。最后训桶,運(yùn)行時(shí)層的函數(shù)會(huì)發(fā)出與命令隊(duì)列交互的命令累驮。此外酣倾,管理數(shù)據(jù)共享和對(duì)內(nèi)核的執(zhí)行加以限制同步點(diǎn)也是由運(yùn)行時(shí)API處理的。

2.3 內(nèi)核編程語言

內(nèi)核編程語言是用于編寫OpenCL內(nèi)核代碼的谤专。除了宿主機(jī)程序之外躁锡,內(nèi)核程序也十分重要,它負(fù)責(zé)完成OpenCL中的實(shí)際工作置侍。在部分OpenCL實(shí)現(xiàn)中用戶可以跟其他語言編寫的原生內(nèi)核實(shí)現(xiàn)交互映之,但多數(shù)情況下內(nèi)核是需要用戶使用內(nèi)核編程語言編寫實(shí)現(xiàn)的。OpenCL C編程語言就是OpenCL中的內(nèi)核編程語言蜡坊,該編程語言是"ISO C99 標(biāo)準(zhǔn)"的一個(gè)擴(kuò)展子集杠输,也就是說它是由 ISO C99語言派生而來的。現(xiàn)在的OpenCL2.1還支持C++秕衙,是基于eISO/IEC JTC1 SC22 WG21 N 3690(C++14)蠢甲。

2.4 適合平臺(tái)

1)AMD

根據(jù)AMD官網(wǎng)所提供的內(nèi)容,OpenCL在AMD顯卡中只能適用X86核心的CPU架構(gòu)据忘,而對(duì)其他PowerPC和ARM架構(gòu)則不適用鹦牛;并且也不是所有的AMD顯卡都能運(yùn)行OpenCL,按其官網(wǎng)介紹只能是AMD Radeon勇吊、AMD FirePro和AMD Firestream三種類型的顯卡曼追;但對(duì)于操作系統(tǒng)則可以是Linux或Windows的系統(tǒng)。

2)NVIDIA

NVIDIA OpenCL是一種運(yùn)行于具有CUDA能力GPU上的一種底層API萧福,即OpenCL是運(yùn)行于CUDA之上的一種API拉鹃,從而若適用CUDA的平臺(tái),也同樣適用OpenCL鲫忍。根據(jù)NVIDIA官網(wǎng)最新版本的CUDA 7.5適合的平臺(tái)膏燕。

3.計(jì)算架構(gòu)

OpenCL 的設(shè)計(jì)目標(biāo)是為開發(fā)人員提供一套移植性強(qiáng)且高效運(yùn)行的解決方案。為了更好的描述OpenCL設(shè)計(jì)的核心理念悟民,Khronos Group官方將OpenCL的計(jì)算架構(gòu)分解成四個(gè)模型坝辫,分別平臺(tái)模型(Platform Model)、內(nèi)存模型(Memory Model)射亏、執(zhí)行模型(Execution Model)以及編程模型(Programming Model)近忙。

3.1 平臺(tái)模型(Platform Model)

從整體上來看,主機(jī)(host)端是負(fù)責(zé)掌管整個(gè)運(yùn)算的所有計(jì)算資源智润,因此OpenCL 應(yīng)用程序首先是由主機(jī)端開始及舍,然后由程序?qū)⒏鱾€(gè)計(jì)算命令從主機(jī)端發(fā)送給每個(gè) GPU 設(shè)備處理單元,運(yùn)行完畢之后最后由主機(jī)端結(jié)束窟绷。

OpenCL架構(gòu)的平臺(tái)模型

從圖中可以直觀的看到锯玛,最基本處理單位是Processing Element,簡(jiǎn)稱PE(處理單元),而一個(gè)或多個(gè)PE組成了Compute Unit攘残,簡(jiǎn)稱CU(計(jì)算單元)拙友,進(jìn)而一個(gè)或多個(gè)CU就組成了Compute Device,即OpenCL設(shè)備歼郭。最后遗契,一個(gè)或多個(gè)OpenCL設(shè)備連接到主機(jī),并等待著處理主機(jī)發(fā)送的計(jì)算指令病曾,由于PE是最基本處理單位牍蜂,因此每條計(jì)算指令最終都?xì)wPE進(jìn)行處理,而PE是在CU中的知态。

3.2 內(nèi)存模型(Memory Model)

OpenCL將內(nèi)核程序中用到的內(nèi)存分為圖示的四種不同的類型捷兰。

OpenCL內(nèi)存模型

其中它們的讀寫特性分別為:

  • Global memory:工作區(qū)內(nèi)的所有工作節(jié)點(diǎn)都可以自由的讀寫其中的任何數(shù)據(jù)。OpenCL C語言提供了全局緩存(Global buffer)的內(nèi)建函數(shù)负敏。
  • Constant memory: 工作區(qū)內(nèi)的所有工作節(jié)點(diǎn)可以讀取其中的任何數(shù)據(jù)但不可以對(duì)數(shù)據(jù)內(nèi)容進(jìn)行更改贡茅,在內(nèi)核程序的執(zhí)行過程中保持不變。主機(jī)端負(fù)責(zé)分配和初始化常量緩存(Constant buffer)其做。
  • Local memory: 只有同一工作組中的工作節(jié)點(diǎn)才可以對(duì)該類內(nèi)存進(jìn)行讀寫操作顶考。它既可以為 OpenCL 的執(zhí)行分配一塊私有內(nèi)存空間,也可以直接將其映射到一塊全局緩存(Global buffer)上妖泄。特點(diǎn)是運(yùn)行速度快驹沿。
  • Private memory: 只有當(dāng)前的工作節(jié)點(diǎn)能對(duì)該內(nèi)存進(jìn)行訪問和讀寫操作。一個(gè)工作節(jié)點(diǎn)內(nèi)部的私有緩存(Private buffer)對(duì)其他節(jié)點(diǎn)來說是不可見的蹈胡。
OpenCL各種存儲(chǔ)器的分配方式和訪問權(quán)限

3.3 執(zhí)行模型(Execution Model)

OpenCL的執(zhí)行模型是應(yīng)用程序通過主機(jī)端對(duì)OpenCL設(shè)備端上的內(nèi)核程序進(jìn)行管理渊季,該模型分為兩個(gè)模塊:一個(gè)是在主機(jī)端執(zhí)行的管理程序,也稱為Hostprogram罚渐,另一個(gè)是主機(jī)端的Hostprogram所管理的在OpenCL上執(zhí)行的程序却汉,也被稱作Kernels。在執(zhí)行Kernels前荷并,先要建立一個(gè)索引空間合砂,來對(duì)設(shè)備里的每個(gè)節(jié)點(diǎn)進(jìn)行標(biāo)識(shí),每個(gè)節(jié)點(diǎn)都將執(zhí)行相同的kernel程序源织。在每個(gè)工作組中翩伪,都有一個(gè)局部ID,每個(gè)節(jié)點(diǎn)在全局里還有個(gè)全局 ID谈息,OpenCL使用NDRange來定義這個(gè)索引空間缘屹。

OpenCL執(zhí)行模型

如圖示的OpenCL執(zhí)行模型,其過程可以細(xì)分為如下的步驟完成:

  • 查詢連接主機(jī)上的OpenCL設(shè)備侠仇;
  • 創(chuàng)建一個(gè)關(guān)聯(lián)到OpenCL設(shè)備的context囊颅;
  • 在關(guān)聯(lián)的設(shè)備上創(chuàng)建可執(zhí)行程序;
  • 從程序池中選擇kernel程序;
  • 從主機(jī)或設(shè)備上創(chuàng)建存儲(chǔ)單元踢代;
  • 如果需要將主機(jī)的數(shù)據(jù)復(fù)制到OpenCL設(shè)備上的存儲(chǔ)單元上;
  • 執(zhí)行kernel程序執(zhí)行嗅骄;
  • 從OpenCL設(shè)備上復(fù)制結(jié)果到主機(jī)上

3.4 編程模型(Programming Model)

OpenCL支持兩種編程模型胳挎,分別為數(shù)據(jù)并行編程模型和任務(wù)并行編程模型,并支持上面由這兩種編程模型混合的混合編程模型溺森。

  • 數(shù)據(jù)并行編程模型
    OpenCL提供一個(gè)分層的數(shù)據(jù)并行編程模型慕爬,即典型的SIMD計(jì)算模型,其特點(diǎn)是每個(gè)數(shù)據(jù)經(jīng)由同樣的指令序列處理屏积,而處理數(shù)據(jù)的次序是不確定的医窿,并且每個(gè)數(shù)據(jù)的處理是不相干的,即任一線程的計(jì)算不得依賴于其它線程的結(jié)果(包括中間結(jié)果)炊林。

  • 任務(wù)并行編程模型
    任務(wù)并行模型中的每個(gè)內(nèi)核是在一個(gè)獨(dú)立的索引空間中執(zhí)行的姥卢,也就是說,執(zhí)行內(nèi)核的計(jì)算機(jī)單元內(nèi)只有一個(gè)工作組渣聚,其中只有一個(gè)工作項(xiàng)独榴。在這樣的模型中,每個(gè)線程都可以執(zhí)行不同的帶啊奕枝,著相當(dāng)于MIMD的計(jì)算模型棺榔,適合多核心CPU。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隘道,一起剝皮案震驚了整個(gè)濱河市症歇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谭梗,老刑警劉巖忘晤,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異默辨,居然都是意外死亡德频,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門缩幸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壹置,“玉大人,你說我怎么就攤上這事表谊〕ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵爆办,是天一觀的道長(zhǎng)难咕。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么余佃? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任暮刃,我火速辦了婚禮,結(jié)果婚禮上爆土,老公的妹妹穿的比我還像新娘椭懊。我一直安慰自己,他們只是感情好步势,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布氧猬。 她就那樣靜靜地躺著,像睡著了一般坏瘩。 火紅的嫁衣襯著肌膚如雪盅抚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天倔矾,我揣著相機(jī)與錄音妄均,去河邊找鬼。 笑死破讨,一個(gè)胖子當(dāng)著我的面吹牛丛晦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播提陶,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烫沙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了隙笆?” 一聲冷哼從身側(cè)響起锌蓄,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撑柔,沒想到半個(gè)月后瘸爽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铅忿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年剪决,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檀训。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柑潦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峻凫,到底是詐尸還是另有隱情渗鬼,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布荧琼,位于F島的核電站譬胎,受9級(jí)特大地震影響差牛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堰乔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一偏化、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浩考,春花似錦夹孔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽只怎。三九已至袜瞬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間身堡,已是汗流浹背邓尤。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贴谎,地道東北人汞扎。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像擅这,于是被迫代替她去往敵國(guó)和親澈魄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 OpenCL(Open Computing Language)仲翎,即開放運(yùn)算語言痹扇,是一個(gè)統(tǒng)一的開放式的開...
    ai領(lǐng)域閱讀 6,558評(píng)論 2 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)溯香,斷路器鲫构,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • 想你的時(shí)候 我會(huì)忘記一切 世界從喧囂回歸靜謐 鏡像回到初識(shí)的日子 那時(shí)的青春一片荒蕪 你雙目如流星 在我雜草叢生的...
    云妮yunni閱讀 272評(píng)論 2 6
  • 這是一個(gè)關(guān)于理科生结笨,宅男的故事。 回想起8月湿镀,第一次被你搭話炕吸,那時(shí)我還沒有任何想法, 你說:“你為什么加入這個(gè)群肠骆,...
    簡(jiǎn)單過0_0閱讀 192評(píng)論 0 1