Re: [問題] OpenCL的問題

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間14年前 (2012/03/13 13:39), 編輯推噓2(208)
留言10則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

03/13 14:43, , 1F
感謝回答!
03/13 14:43, 1F

03/13 14:44, , 2F
想再針對第二點問一個問題
03/13 14:44, 2F

03/13 14:45, , 3F
例如我寫一個test.cl的kernel code
03/13 14:45, 3F

03/13 14:47, , 4F
前半部分給CPU執行,後半部分給GPU執行
03/13 14:47, 4F

03/13 14:49, , 5F
那我這個kernel code是不是就也要編譯兩次?
03/13 14:49, 5F

03/13 14:55, , 6F
如果在編譯成要給GPU執行的機器碼的編譯過程中
03/13 14:55, 6F

03/13 14:57, , 7F
compiler要如何知道前面的部份是要給CPU執行的
03/13 14:57, 7F

03/13 14:58, , 8F
compiler可以就不必編譯
03/13 14:58, 8F

03/13 16:23, , 9F
不行吧 你要拆成兩個檔案
03/13 16:23, 9F

03/13 16:42, , 10F
好的,改天我試一下,謝謝~
03/13 16:42, 10F
文章代碼(AID): #1FNjscYK (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1FNjscYK (C_and_CPP)