看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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