2013-10-05 18 views
1

我在amd平臺的opencl程序中觀察到我們需要構建兩次程序。一旦使用clBuildProgram ...();另一個是我們構建整個代碼的時候。爲什麼我們這樣做兩次?爲什麼我們構建opencl程序兩次?

+0

這個Q被刪除,就像你修正它一樣(http://stackoverflow.com/questions/20519090/why-the-structure-size-is-being-reported-different-on-linux-and-windows)答案在於,在針對x86時,Linux機器上的編譯器在4個字節的邊界上對齊雙打。但是你的Windows編譯器在8個字節邊界上對齊。 –

回答

9

在OpenCL主機代碼編譯和內核代碼編譯是兩個獨立的步驟。

當您編譯引用的整個代碼時,您基本上只是編譯主機代碼,即將編排和控制OpenCL內核執行的代碼。

,將在OpenCL能力的設備上執行的內核代碼(CPU,GPU,DSP,FPGA,加速...)然後有兩個主要的編譯選項:

  • 您可以包括實際的OpenCL內核在程序中作爲單獨的.cl文件來源或將其作爲字符串嵌入主機代碼中。使用此編譯路徑時,您將創建program對象,並使用clCreateProgramWithSource傳遞給clBuildProgram。主機代碼然後可以使用在線編譯器在運行時,編譯內核以獲得想要運行內核的所需OpenCL設備的體系結構。這樣做的好處是,您不需要事先知道(在創建主機程序時)OpenCL設備的體系結構(Intel,AMD,Nvidia,...)。你甚至可能沒有該架構的編譯器。缺點是你的內核源代碼是可見的,如果你嵌入了有價值的IP,這是不可取的。
  • 您可能會決定先爲所有您希望支持的OpenCL設備體系結構編譯內核,然後將這些內核的二進制文件與您的主機代碼一起發佈,而不是內核源代碼。使用此編譯路徑時,您將創建program對象,並使用clCreateProgramWithBinary傳遞給clBuildProgram

您可能還需要有一個看看SPIR specification,它結合了這兩種方法的優點,並允許您裝運內核的中間表示,所以你不必知道所有的目標的OpenCL編譯器您也不需要發送內核的簡單源代碼。

+0

+1,絕佳的解釋。謝謝。 (不幸的是我不能upvote,也許沒有足夠的分數..) – user25108

相關問題