OpenCL入门(一):简单概念
這段時間一直在進(jìn)行OpenCL方面的學(xué)習(xí)。感覺OpenCL是一個非常厲害的程序開發(fā)體系,他的作用就是使用同一套語言開發(fā)出來的程序在不同的平臺上都可以跑。
OpenCL現(xiàn)在主要用于并行開發(fā),并行的意義就是很多處理器拿著不同的原材料做完全相同的處理得到不同的結(jié)果。這個“同時”的好處在于,由于處理過程完全相同,那么我直接將任務(wù)分發(fā)給所有可以執(zhí)行這項任務(wù)的單元,這樣所有人都可以獨(dú)立地進(jìn)行處理。背景理解可以參考這邊文章:鏈接
OpenCL運(yùn)行包含2個環(huán)境(也叫2個端):主機(jī)端(host)和設(shè)備端(device)。
host端絕大部分情況就是我們所說的CPU;設(shè)備端則是那些支持OpenCL的設(shè)備,比如顯卡、FPGA等。他們的作用分別是:主機(jī)端負(fù)責(zé)調(diào)度任務(wù),是指揮的角色;設(shè)備則負(fù)責(zé)具體的并行處理,是勞動者的角色。
下面,我通過梳理OpenCL通用的開發(fā)流程來說明上面這些東西的意義:
(1)找平臺Platform(在Host端執(zhí)行)
找平臺Platform基本等同于找當(dāng)前Host端(裝CPU的那臺電腦上)有幾個OpenCL開發(fā)環(huán)境,比如你有NVIDIA的CUDA環(huán)境就算一個CUDA的Platform,你有Altera的OpenCL環(huán)境就算Altera的platform。換句話說,找Platform就是找你那個支持OpenCL的設(shè)備是哪家公司的產(chǎn)品,基本上一家公司就算一個platform(當(dāng)然也不排除1家公司多個platform的情況)。
(2)找設(shè)備Device(在Host端執(zhí)行)
找到平臺Platform后,你確定了主機(jī)上有哪些公司提供的OpenCL開發(fā)環(huán)境了,接下來,你需要確定你電腦上可以用于并行處理的設(shè)備有哪些,比如安裝好的顯卡和安裝好的FPGA板(當(dāng)然驅(qū)動配置好是前提)。
(3)創(chuàng)建上下文Context(在Host端運(yùn)行)
在我看來,上下文這個東西就像是你召集小伙伴開會需要一個名目一樣,比如以煮飯為目的召集一幫人來干活,一部分人負(fù)責(zé)買菜,一部分做菜。這個煮飯的名目就算是一個上下文,在這個上下文內(nèi)(名目下)不同設(shè)備(負(fù)責(zé)不同大任務(wù)的人群)才有相互協(xié)作的理由。
(4)創(chuàng)建命令隊列Command_queue(在Host端運(yùn)行)
依照煮飯的那個例子,有一個協(xié)同工作的名目之后,每一個部分的人就要開始自己的工作了(相當(dāng)于設(shè)備準(zhǔn)備開始處理了)。此時,這些人就需要為自己負(fù)責(zé)的部分列一個任務(wù)清單,比如做菜的那部分人列的清單是先做什么菜,先炒什么配料等,這些小任務(wù)的先后順序在這個清單中有先后規(guī)定。命令隊列就是這樣的清單,它里面說明了設(shè)備執(zhí)行任務(wù)處理的先后順序。
(5)創(chuàng)建3大對象(在Host端運(yùn)行)
OpenCL開發(fā)是面向?qū)ο蟮某绦蜷_發(fā),所以接下來需要搞定3大對象:創(chuàng)建內(nèi)存對象、創(chuàng)建并編譯程序?qū)ο蟆?chuàng)建內(nèi)核對象。
創(chuàng)建內(nèi)存對象就相當(dāng)于你煮飯需要準(zhǔn)備原料一樣,進(jìn)行任務(wù)處理之前你需要把要用到的數(shù)據(jù)準(zhǔn)備好(并放置到相應(yīng)的位置),數(shù)據(jù)就是以內(nèi)存對象的形式進(jìn)行準(zhǔn)備和放置。
創(chuàng)建和編譯程序?qū)ο笾荒芡ㄟ^程序開發(fā)的角度進(jìn)行理解。以編寫helloWorld程序為例,你需要先寫一份cpp代碼,然后編譯成exe文件再執(zhí)行。那么創(chuàng)建和編譯程序?qū)ο缶褪沁@樣一個過程,只是面向?qū)ο蟮腛penCL編程將程序?qū)ο蠡恕?/p>
創(chuàng)建內(nèi)核對象則是從編譯好的程序?qū)ο笾袑为?dú)的編譯好的OpenCL內(nèi)核函數(shù)拿出來。這樣看來,一個.cl文件里面可以包含很多kernel函數(shù)(也就是內(nèi)核函數(shù)),那么由這個.cl文件編譯而成的就是程序?qū)ο?#xff0c;里面每一個kernel函數(shù)都被編譯成單獨(dú)的kernel對象。
(6)設(shè)置內(nèi)核參數(shù)(在Host端運(yùn)行)
現(xiàn)在內(nèi)核函數(shù)已經(jīng)編譯好了,但是此時的內(nèi)核函數(shù)是外部的文件,這個文件在運(yùn)行時可能需要傳參數(shù)進(jìn)去(與執(zhí)行含參數(shù)的函數(shù)原理一樣,需要傳外部參數(shù)進(jìn)去)。所以你需要在主機(jī)上指定這些kernel函數(shù)在運(yùn)行時需要傳哪些參數(shù)進(jìn)去。
(7)執(zhí)行內(nèi)核參數(shù)(在Device端運(yùn)行)
一切準(zhǔn)備就緒,設(shè)備就開始按照命令隊列里面的順序開始給具體的處理單元分發(fā)任務(wù)了。在煮飯的例子中,負(fù)責(zé)一個具體任務(wù)的人群(對應(yīng)一個設(shè)備)開始給下面每一個人都分配任務(wù),如果此時任務(wù)清單(對應(yīng)命令隊列)上說此時的任務(wù)時切菜,那么每一個人(對應(yīng)每一個處理單元)就從準(zhǔn)備好的材料(對應(yīng)內(nèi)存對象)中拿出一份菜(對應(yīng)具體數(shù)據(jù))出來同時做同樣的切菜過程(對應(yīng)執(zhí)行同一份kernel函數(shù))。
上述就是OpenCL程序開發(fā)中最基本的7個流程。可以看出準(zhǔn)備工作都是在Host主機(jī)端完成的,只有具體的并行任務(wù)才交給了設(shè)備來運(yùn)行。
總結(jié)
以上是生活随笔為你收集整理的OpenCL入门(一):简单概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件操作的小tips
- 下一篇: Xmemcached学习笔记一(安装me