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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenCL入门(一):简单概念

發(fā)布時(shí)間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCL入门(一):简单概念 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這段時(shí)間一直在進(jìn)行OpenCL方面的學(xué)習(xí)。感覺OpenCL是一個(gè)非常厲害的程序開發(fā)體系,他的作用就是使用同一套語言開發(fā)出來的程序在不同的平臺(tái)上都可以跑。

OpenCL現(xiàn)在主要用于并行開發(fā),并行的意義就是很多處理器拿著不同的原材料做完全相同的處理得到不同的結(jié)果。這個(gè)“同時(shí)”的好處在于,由于處理過程完全相同,那么我直接將任務(wù)分發(fā)給所有可以執(zhí)行這項(xiàng)任務(wù)的單元,這樣所有人都可以獨(dú)立地進(jìn)行處理。背景理解可以參考這邊文章:鏈接

OpenCL運(yùn)行包含2個(gè)環(huán)境(也叫2個(gè)端):主機(jī)端(host)和設(shè)備端(device)。

host端絕大部分情況就是我們所說的CPU;設(shè)備端則是那些支持OpenCL的設(shè)備,比如顯卡、FPGA等。他們的作用分別是:主機(jī)端負(fù)責(zé)調(diào)度任務(wù),是指揮的角色;設(shè)備則負(fù)責(zé)具體的并行處理,是勞動(dòng)者的角色。

下面,我通過梳理OpenCL通用的開發(fā)流程來說明上面這些東西的意義:

(1)找平臺(tái)Platform(在Host端執(zhí)行)

找平臺(tái)Platform基本等同于找當(dāng)前Host端(裝CPU的那臺(tái)電腦上)有幾個(gè)OpenCL開發(fā)環(huán)境,比如你有NVIDIA的CUDA環(huán)境就算一個(gè)CUDA的Platform,你有Altera的OpenCL環(huán)境就算Altera的platform。換句話說,找Platform就是找你那個(gè)支持OpenCL的設(shè)備是哪家公司的產(chǎn)品,基本上一家公司就算一個(gè)platform(當(dāng)然也不排除1家公司多個(gè)platform的情況)。

(2)找設(shè)備Device(在Host端執(zhí)行)

找到平臺(tái)Platform后,你確定了主機(jī)上有哪些公司提供的OpenCL開發(fā)環(huán)境了,接下來,你需要確定你電腦上可以用于并行處理的設(shè)備有哪些,比如安裝好的顯卡和安裝好的FPGA板(當(dāng)然驅(qū)動(dòng)配置好是前提)。

(3)創(chuàng)建上下文Context(在Host端運(yùn)行)

在我看來,上下文這個(gè)東西就像是你召集小伙伴開會(huì)需要一個(gè)名目一樣,比如以煮飯為目的召集一幫人來干活,一部分人負(fù)責(zé)買菜,一部分做菜。這個(gè)煮飯的名目就算是一個(gè)上下文,在這個(gè)上下文內(nèi)(名目下)不同設(shè)備(負(fù)責(zé)不同大任務(wù)的人群)才有相互協(xié)作的理由。

(4)創(chuàng)建命令隊(duì)列Command_queue(在Host端運(yùn)行)

依照煮飯的那個(gè)例子,有一個(gè)協(xié)同工作的名目之后,每一個(gè)部分的人就要開始自己的工作了(相當(dāng)于設(shè)備準(zhǔn)備開始處理了)。此時(shí),這些人就需要為自己負(fù)責(zé)的部分列一個(gè)任務(wù)清單,比如做菜的那部分人列的清單是先做什么菜,先炒什么配料等,這些小任務(wù)的先后順序在這個(gè)清單中有先后規(guī)定。命令隊(duì)列就是這樣的清單,它里面說明了設(shè)備執(zhí)行任務(wù)處理的先后順序。

(5)創(chuàng)建3大對(duì)象(在Host端運(yùn)行)

OpenCL開發(fā)是面向?qū)ο蟮某绦蜷_發(fā),所以接下來需要搞定3大對(duì)象:創(chuàng)建內(nèi)存對(duì)象、創(chuàng)建并編譯程序?qū)ο蟆?chuàng)建內(nèi)核對(duì)象。

創(chuàng)建內(nèi)存對(duì)象就相當(dāng)于你煮飯需要準(zhǔn)備原料一樣,進(jìn)行任務(wù)處理之前你需要把要用到的數(shù)據(jù)準(zhǔn)備好(并放置到相應(yīng)的位置),數(shù)據(jù)就是以內(nèi)存對(duì)象的形式進(jìn)行準(zhǔn)備和放置。

創(chuàng)建和編譯程序?qū)ο笾荒芡ㄟ^程序開發(fā)的角度進(jìn)行理解。以編寫helloWorld程序?yàn)槔?#xff0c;你需要先寫一份cpp代碼,然后編譯成exe文件再執(zhí)行。那么創(chuàng)建和編譯程序?qū)ο缶褪沁@樣一個(gè)過程,只是面向?qū)ο蟮腛penCL編程將程序?qū)ο蠡恕?/p>

創(chuàng)建內(nèi)核對(duì)象則是從編譯好的程序?qū)ο笾袑为?dú)的編譯好的OpenCL內(nèi)核函數(shù)拿出來。這樣看來,一個(gè).cl文件里面可以包含很多kernel函數(shù)(也就是內(nèi)核函數(shù)),那么由這個(gè).cl文件編譯而成的就是程序?qū)ο?#xff0c;里面每一個(gè)kernel函數(shù)都被編譯成單獨(dú)的kernel對(duì)象。

(6)設(shè)置內(nèi)核參數(shù)(在Host端運(yùn)行)

現(xiàn)在內(nèi)核函數(shù)已經(jīng)編譯好了,但是此時(shí)的內(nèi)核函數(shù)是外部的文件,這個(gè)文件在運(yùn)行時(shí)可能需要傳參數(shù)進(jìn)去(與執(zhí)行含參數(shù)的函數(shù)原理一樣,需要傳外部參數(shù)進(jìn)去)。所以你需要在主機(jī)上指定這些kernel函數(shù)在運(yùn)行時(shí)需要傳哪些參數(shù)進(jìn)去。

(7)執(zhí)行內(nèi)核參數(shù)(在Device端運(yùn)行)

一切準(zhǔn)備就緒,設(shè)備就開始按照命令隊(duì)列里面的順序開始給具體的處理單元分發(fā)任務(wù)了。在煮飯的例子中,負(fù)責(zé)一個(gè)具體任務(wù)的人群(對(duì)應(yīng)一個(gè)設(shè)備)開始給下面每一個(gè)人都分配任務(wù),如果此時(shí)任務(wù)清單(對(duì)應(yīng)命令隊(duì)列)上說此時(shí)的任務(wù)時(shí)切菜,那么每一個(gè)人(對(duì)應(yīng)每一個(gè)處理單元)就從準(zhǔn)備好的材料(對(duì)應(yīng)內(nèi)存對(duì)象)中拿出一份菜(對(duì)應(yīng)具體數(shù)據(jù))出來同時(shí)做同樣的切菜過程(對(duì)應(yīng)執(zhí)行同一份kernel函數(shù))。



上述就是OpenCL程序開發(fā)中最基本的7個(gè)流程。可以看出準(zhǔn)備工作都是在Host主機(jī)端完成的,只有具體的并行任務(wù)才交給了設(shè)備來運(yùn)行。


總結(jié)

以上是生活随笔為你收集整理的OpenCL入门(一):简单概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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