我在amd平臺的opencl程序中觀察到我們需要構建兩次程序。一旦使用clBuildProgram ...();另一個是我們構建整個代碼的時候。爲什麼我們這樣做兩次?爲什麼我們構建opencl程序兩次?
1
A
回答
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
相關問題
- 1. 爲什麼我們在應用程序中獲得兩次currentsession?
- 2. 爲什麼我們每次增加構建編號,即使是每晚構建?
- 3. 爲什麼我們需要兩次在tomcat logging.properties中編寫處理程序?
- 4. 我們爲什麼要爲C++應用程序構建64位目標?
- 5. 爲什麼在我的程序中調用兩次構造函數?
- 6. 爲什麼應用程序對象在android上創建兩次?
- 7. 爲什麼我的程序打印兩次相同的語句?
- 8. 爲什麼我的python程序最後兩次打印語句?
- 9. 爲什麼我的路由處理程序會觸發兩次?
- 10. 爲什麼我的信號處理程序執行兩次?
- 11. 爲什麼我的angular2應用程序初始化兩次?
- 12. 爲什麼我的程序循環兩次?
- 13. 爲什麼我的程序執行掃描和打印兩次?
- 14. 我們是否需要在opencl中構建從clcreatewithbinary獲得的程序?
- 15. 無法在Windows上構建OpenCL程序
- 16. 爲什麼我們在angularjs中兩次注入我們的依賴關係?
- 17. 爲什麼我們每一次
- 18. 爲什麼我們不能稱Twisted延遲兩次?
- 19. 爲什麼我們需要提供兩次通用信息?
- 20. 爲什麼我們要使用invalidat()兩次?
- 21. 爲什麼我們說OpenCL是標準的
- 22. 爲什麼我只能執行一次存儲過程兩次?
- 23. 爲什麼控制器創建兩次?
- 24. 爲什麼我的onclick處理程序被調用兩次/三次?
- 25. 爲什麼我無法在xcode中構建iPhone應用程序?
- 26. C++:爲什麼我的析構函數運行兩次?
- 27. 爲什麼我必須點擊兩次?
- 28. 爲什麼我有兩次使用Sequelize
- 29. 爲什麼我的CRON運行兩次?
- 30. 爲什麼我的mousePressEvent調用兩次?
這個Q被刪除,就像你修正它一樣(http://stackoverflow.com/questions/20519090/why-the-structure-size-is-being-reported-different-on-linux-and-windows)答案在於,在針對x86時,Linux機器上的編譯器在4個字節的邊界上對齊雙打。但是你的Windows編譯器在8個字節邊界上對齊。 –