日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从CUDA开始读OpenCL

發(fā)布時(shí)間:2025/3/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从CUDA开始读OpenCL 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

就像大一學(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。