OpenCL通用异构开放环境
OpenCL通用異構(gòu)開放環(huán)境
OpenCL全稱Open Computing Language,第一個(gè)面向異構(gòu)系統(tǒng)通用目的并行編程的開放式、免費(fèi)標(biāo)準(zhǔn),一個(gè)統(tǒng)一的編程環(huán)境,便于軟件開發(fā)人員為高性能計(jì)算服務(wù)器、桌面計(jì)算系統(tǒng)、手持設(shè)備編寫高效輕便的代碼,廣泛適用于多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構(gòu)以及數(shù)字信號(hào)處理器(DSP)等其他并行處理器,在游戲、娛樂、科研、醫(yī)療等各種領(lǐng)域都有廣闊的發(fā)展前景。
OpenCL 1.0主要由一個(gè)并行計(jì)算API和一種針對(duì)此類計(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是由蘋果首次提出的,隨后Khronos Group成立相關(guān)工作組,以蘋果草案為基礎(chǔ),聯(lián)合業(yè)界各大企業(yè)共同完成了標(biāo)準(zhǔn)制定工作。工作組的26個(gè)成員來自各行各業(yè),且都是各自領(lǐng)域的領(lǐng)導(dǎo)者,具體包括3DLABS、 Activision Blizzard、AMD、蘋果、ARM、Barco、博通、Codeplay、EA、愛立信、飛思卡爾、HI、IBM、Intel、 Imagination、Kestrel Institute、摩托羅拉、Movidia、諾基亞、NVIDIA、QNX、RapidMind、三星、Seaweed、TAKUMI、德州儀器、瑞典于默奧大學(xué)。
標(biāo)準(zhǔn)倡導(dǎo)者蘋果將是最先應(yīng)用OpenCL技術(shù)的廠商之一,代號(hào)Snow Leopard的新版操作系統(tǒng)Mac OS X 10.6就會(huì)集成該標(biāo)準(zhǔn)。相比之下,微軟沒有參與OpenCL的制定工作,Windows自然也不會(huì)提供支持,不過DirectX 11有類似的Computer Shader技術(shù),很可能會(huì)重演DirectX與OpenGL之戰(zhàn)。
同時(shí),AMD Stream SDK、Codeplay Sieve C++等進(jìn)行改革,適配OpenCL 1.0標(biāo)準(zhǔn),NVIDIA的CUDA技術(shù)也借機(jī)大展拳腳。
OpenCL 3.0 的 C++ 內(nèi)核
在 OpenCL 3.0 中,OpenCL 工作組已經(jīng)從最初在 OpenCL 2.1 中定義的原始 OpenCL C++ 內(nèi)核語言過渡,推薦社區(qū) OpenCL開源前端編譯器開發(fā)C++,提供改進(jìn)的功能和與 OpenCL C 兼容性的開發(fā)人員,使用 C++17 編寫內(nèi)核程序。
C++ for OpenCL 結(jié)合了 OpenCL 和 C++17 的功能
C ++針對(duì)OpenCL是支持和使用LLVM編譯器基礎(chǔ)設(shè)施。在 Clang 中的實(shí)現(xiàn),通過OpenCL 支持進(jìn)行跟蹤。使開發(fā)人員能夠使用 OpenCL 內(nèi)核中的大多數(shù) C++17 功能,通過離線編譯越來越多的 OpenCL,實(shí)現(xiàn)攝取的 SPIR-V 中間表示形式生成代碼。
基本概念
OpenCL程序分為兩部分。
? 在主機(jī)(以CPU為核心)上運(yùn)行
? 在設(shè)備(以GPU為核心)上運(yùn)行
設(shè)備有一個(gè)或多個(gè)計(jì)算單元,計(jì)算單元又包含一個(gè)或多個(gè)處理單元。在設(shè)備上運(yùn)行的程序被稱為核函數(shù)。但是對(duì)于核函數(shù)的編寫,CUDA一般直接寫在程序內(nèi),OpenCL是寫在一個(gè)獨(dú)立的文件中,并且文件后綴是.cl,由主機(jī)代碼讀入后執(zhí)行,這一點(diǎn)OpenCL跟OpenGL中的渲染程序很像。
OpenCL平臺(tái)由兩部分組成,宿主機(jī)和OpenCL設(shè)備:
宿主機(jī)Host: CPU,扮演組織者的角色。包括kernel、kernel上下文、NDRange和隊(duì)列等;隊(duì)列控制著kernel如何執(zhí)行,以及何時(shí)執(zhí)行等。
設(shè)備Device:計(jì)算設(shè)備,可以是CPU、GPU、DSP或硬件提供以及OpenCL開發(fā)商支持的任何處理器。
SIMT(Single Instruction Multi Thread): 單指令多線程,GPU并行運(yùn)算的主要方式,很多線程同時(shí)執(zhí)行相同的運(yùn)算指令,每個(gè)線程的數(shù)據(jù)有所不同,但執(zhí)行的操作一致。
核函數(shù)(Kernel):在設(shè)備程序上執(zhí)行運(yùn)算的入口函數(shù),在主機(jī)上調(diào)用。
工作項(xiàng)(Work-item): 類似于CUDA中的線程(Threads),多個(gè)工作項(xiàng)(線程)執(zhí)行同樣的核函數(shù),每個(gè)Work-item都有一個(gè)ID號(hào),通過ID號(hào)來區(qū)分處理數(shù)據(jù)。
工作組(Work-group):類似于CUDA中的線程塊(Block),多個(gè)工作項(xiàng)組成一個(gè)工作組,Work-group內(nèi)Work-item可以通信和協(xié)作。
ND-Range: 類似于CUDA中的網(wǎng)格,定義了Work-group的組織形式。
上下文(Context):整個(gè)OpenCL的運(yùn)行環(huán)境,包括Kernel、Device、程序和內(nèi)存。
設(shè)備:OpenCL程序調(diào)用的計(jì)算設(shè)備。
內(nèi)核:在計(jì)算設(shè)備上執(zhí)行的并行程序。
程序:內(nèi)核程序的源代碼(.cl文件)和可執(zhí)行文件。
內(nèi)存:計(jì)算設(shè)備執(zhí)行OpenCL程序所需的變量。
總結(jié)
以上是生活随笔為你收集整理的OpenCL通用异构开放环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LLVM IR 理解
- 下一篇: TVM/Relay 的 Partitio