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