作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] OpenCL的問題
時間Tue Mar 13 13:39:47 2012
※ 引述《nptek (賣大魯閣幣)》之銘言:
: 最近在自學OpenCL
: 不過對程式的有些運作不太清楚
: 我有下面兩個問題 :
: 1. OpenCL有分成 Host Code 跟 Kernel Code
: Host Code是像一般的C/C++語言編譯完後執行即可
: 在編譯 Host Code 的時候 Kernel Code 是否也有作編譯?
: 還是要等到執行"編譯完的Host Code的執行檔"後
: 才會把 Kernel Code 作編譯
: 把編譯完的機器代碼傳給 OpenCL 裝置執行
: 假如我寫一個 OpenCL 的程式
: 從寫完 編譯 執行 的流程
: 以及要如何運作?
編譯 host code 的時候並不會編譯 kernel code
一般流程是這樣:
source → compile host code → host executable
↓
run kernel code ← read & compile kernel code
kernel code 是執行 host executable 的時候讀取並編譯
然後傳到 device 上執行
你也可以在編譯完成後,把編譯過的 kernel code 取出來存放
下次要執行時就可以省略編譯的過程直接執行
(透過 clGetProgramInfo 及 clCreateProgramWithBinary)
不過 OpenCL 並不保證編譯過的 binary 可以在不同的 device 上執行
: 2. 因為上面那個問題,所以有了第二個問題 @@"
: 我之前看到的程式幾乎都是把工作傳到 GPU 上運行
: 那我可不可以寫一個程式 (kernel code)
: 同時給 GPU 與 CPU 來平行處理:
: 例如 : 我有一個GPU跟一個四核心的CPU
: 把一部份工作給GPU來執行
: 另一部分工作給CPU上的某兩個核心來執行
: 假如這樣可行的話
: 那在編譯的過程中要怎麼知道這個程式要同時給 GPU 與 CPU 執行
: 並且要分開來編譯?
可以!
不過前提是你要安裝的 opencl driver 有提供 CPU device
據我很久以前的印象...
AMD 的 opencl driver 就同時提供 GPU 與 CPU device
當你用 clGetDeviceIDs 就會得到兩個不同的 device 分別代表 GPU 與 CPU
不過一個 command queue 只能綁一個 device
所以若要同時利用兩個 device
你需要有兩個 command queue
然後把不同的工作丟進這兩個 command queue 中
同樣地,kernel code 要分別為這兩個 device 進行編譯
所以你會得到兩個 program object 一個給 GPU 另一個給 CPU
不過需要注意的是,AMD 的 opencl driver 當然只支援他們自家的 GPU
假如你用的是 nvidia 的 GPU 情況會比較複雜
你會發現系統中有兩個 platform
其中一個是 AMD 的 opencl driver 所提供 (但上面只有 CPU device)
另一個是 nvidia 的 opencl driver 提供 (上面只有 GPU device)
只要你產生兩個 opencl context
你還是可以同時利用 CPU 與 GPU 進行運算
但是兩者會無法共享資料
比如說 GPU 算完的結果若要傳給 CPU 處理
你需要把 buffer object 中的資料讀回 host 端
然後再把它傳進另一個 context 中的 buffer object
以上是多年前的回憶
也許現在 nvidia 的 opencl driver 已經支援 CPU device
那你就不需要這麼麻煩了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.3.139
推 nptek:感謝回答! 03/13 14:43
→ nptek:想再針對第二點問一個問題 03/13 14:44
→ nptek:例如我寫一個test.cl的kernel code 03/13 14:45
→ nptek:前半部分給CPU執行,後半部分給GPU執行 03/13 14:47
→ nptek:那我這個kernel code是不是就也要編譯兩次? 03/13 14:49
→ nptek:如果在編譯成要給GPU執行的機器碼的編譯過程中 03/13 14:55
→ nptek:compiler要如何知道前面的部份是要給CPU執行的 03/13 14:57
→ nptek:compiler可以就不必編譯 03/13 14:58
→ littleshan:不行吧 你要拆成兩個檔案 03/13 16:23
推 nptek:好的,改天我試一下,謝謝~ 03/13 16:42