从CUDA开始读OpenCL
就像大一學(xué)C++,大二學(xué)匯編一樣,我也寫弄了些個(gè)月的CUDA,然后,想想,應(yīng)該開始刨根問底地,去學(xué)點(diǎn)在CUDA之下層的東西,可能會(huì)對(duì)異構(gòu)這個(gè)編程了解的多。
1 簡介
OpenCL全稱:開發(fā)計(jì)算語言,是并行程序的開發(fā)標(biāo)準(zhǔn),使用與任何異構(gòu)平臺(tái)——包括多CPU、GPU、CPU與GPU結(jié)合等。OpenCL由Khronos Group維護(hù)。
OpenCL是一個(gè)用于異構(gòu)平臺(tái)上編程的開放性行業(yè)標(biāo)準(zhǔn)。這個(gè)平臺(tái)可以包括 CPU GPU和其他各類計(jì)算設(shè)備,例如 DSP和Cell/B.E.等等。
OpenCL和CUDA的關(guān)系很和諧,前者是異構(gòu)編程規(guī)范標(biāo)準(zhǔn),后者是英偉達(dá)基于OpenCL之上開發(fā)的一個(gè)更面向程序員的GPUAPI。所以,OpenCL適合于包括英偉達(dá)和AMD等的顯卡
程序開發(fā)。
2 認(rèn)識(shí)OpenCL的框架
2.1 平臺(tái)模型
[1個(gè)host]-[1..N個(gè)device] (主機(jī):host;設(shè)備:device)
[1個(gè)device]-[1..N個(gè)CU] (計(jì)算單元:CU)
[1個(gè)CU]-[1..N個(gè)PE] (處理單元:PU)
host端管理者整個(gè)平臺(tái)的所有計(jì)算資源,應(yīng)用程序會(huì)從host端向各個(gè) OpenCL設(shè)備的處理單元發(fā)送計(jì)算命令。在一個(gè)計(jì)算單元內(nèi)的所有處理單元會(huì)執(zhí)行完全相同的一套指令
流程。指令流可以是 SIMD模式或者SPMD模式。所有由OpenCL編寫的應(yīng)用程序都是從Host啟動(dòng)并結(jié)束,最終的計(jì)算都發(fā)生在PE中。
2.2 內(nèi)存模型
內(nèi)存介紹:
全局內(nèi)存 (global memory):工作空間內(nèi)所有的工作節(jié)點(diǎn)都可以讀寫此類內(nèi)存中的任意元素。OpenCL C提供了緩存global buer的內(nèi)建函數(shù)。
常量內(nèi)存 (constant memory):工作空間內(nèi)所有的工作節(jié)點(diǎn)可以只讀此類內(nèi)存中的任意元素。 host負(fù)責(zé)分配和初始化 constant buer,在內(nèi)核執(zhí)行過程中保持不變。
局部內(nèi)存 (local memory):從屬于一個(gè)工作組的內(nèi)存,同一個(gè)工作組中所有的工作節(jié)點(diǎn)都可以共享使用該類內(nèi)存。其實(shí)現(xiàn)既可以為 OpenCL執(zhí)行為其分配一塊專有內(nèi)存空間,
也有可能直接將其映射到一塊global buer上。
私有內(nèi)存 (private memory):只從屬于當(dāng)前的工作節(jié)點(diǎn)。一個(gè)工作節(jié)點(diǎn)內(nèi)部的private buer其他節(jié)點(diǎn)是完全不可見的。
在這點(diǎn)上,基本上和CUDA介紹的內(nèi)存是一樣的。這里的局部內(nèi)存和CUDA的私有變量差不多一個(gè)概念。
內(nèi)存使用:
在內(nèi)存的使用上,有兩種方式:內(nèi)存拷貝和內(nèi)存映射。
拷貝數(shù)據(jù)是指host通過相應(yīng)的OpenCL API將數(shù)據(jù)從host寫入到OpenCL設(shè)備的內(nèi)存中或者從 OpenCL設(shè)備內(nèi)存讀出數(shù)據(jù)到 host內(nèi)存中。
內(nèi)存映射方法允許用戶通過相應(yīng) OpenCLAPI將OpenCL的內(nèi)存對(duì)象映射到 host端可見的內(nèi)存地址空間中。映射之后用戶就可以在 host端的映
射地址讀寫該內(nèi)存了,在讀寫完成之后用戶必須使用對(duì)應(yīng) API解除這種映射關(guān)系。同拷貝內(nèi)存方式一樣,映射內(nèi)存也分block和non-block模式。
2.3 執(zhí)行模型
OpenCL的執(zhí)行模型可以分為兩部分,一部分是在 host上執(zhí)行的主程序(host program),另一部分是在 OpenCL設(shè)備上執(zhí)行的內(nèi)核程序(kernels),OpenCL通過主程序來
定義上下文并管理內(nèi)核程序在OpenCL設(shè)備的執(zhí)行。
執(zhí)行模式最重要的是分配線程網(wǎng)絡(luò),這點(diǎn)和CUDA是一回事,可以引用。
2.4 編程模型
OpenCL支持按數(shù)據(jù)并行的編程模型和按任務(wù)并行的編程模型。
數(shù)據(jù)并行模型是指同一系的列指令會(huì)作用在內(nèi)存對(duì)象的不同元素上,即在不同內(nèi)存元素上按這個(gè)指令序列定義了統(tǒng)一的運(yùn)算。
在任務(wù)并行編程模型是指工作空間內(nèi)的每個(gè)工作節(jié)點(diǎn)在執(zhí)行 kernel程序時(shí)相對(duì)于其他節(jié)點(diǎn)是絕對(duì)獨(dú)立的。在這種模式下對(duì)每個(gè)工作節(jié)點(diǎn)都相當(dāng)于工作在一個(gè)單一的計(jì)算單
元內(nèi),該單元內(nèi)只有單一工作組,該工作組中只有該節(jié)點(diǎn)本身在執(zhí)行。用戶可以通過如下方法實(shí)現(xiàn)按任務(wù)并行:
-使用OpenCL設(shè)備支持的向量類型數(shù)據(jù)結(jié)構(gòu)
-同時(shí)執(zhí)行或選擇性執(zhí)行多個(gè)kernels
-在執(zhí)行kernels同時(shí)交叉性執(zhí)行一些native kernels程序
OpenCL提供了兩個(gè)領(lǐng)域的同步:
-在同一個(gè)工作組中所有的工作節(jié)點(diǎn)之間的同步
-同一個(gè)上下文中不同的 command queues之間和同一個(gè) command queue的不同commands之間的同步
從CUDA了解openCL是在閱讀和理解相關(guān)CUDA編程知識(shí)后,在讀《OpenCL中文教程》的一個(gè)第一章和第二章的知識(shí)匯總,去掉了CUDA編程指南中講解的雷同知識(shí)。在了解和
明白OpenCL是怎么一回事兒后,我將開始o(jì)penCL的Hello world了,雖然,僅僅一個(gè)helloword可能沒什么意義,但是,象征性的程序必須寫起來。
轉(zhuǎn)載于:https://www.cnblogs.com/viviman/archive/2012/12/24/2830610.html
總結(jié)
以上是生活随笔為你收集整理的从CUDA开始读OpenCL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用数据库的方式编辑上一页 下一页
- 下一篇: java经验积累