我在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个字节边界上对齐。 –