如何构建大型OpenCL内核?

and*_*oke 14 coding-style gpgpu opencl pyopencl

我曾在几个项目中使用OpenCL,但始终将内核编写为一个(有时候相当大)的函数.现在我正在开发一个更复杂的项目,并希望在几个内核之间共享功能.

但是我可以找到的示例都将内核显示为单个文件(甚至很少调用辅助函数).似乎应该可以使用多个文件 - clCreateProgramWithSource()接受多个字符串(并假设它们结合起来) - 尽管pyopencl Program()只需要一个源.

所以我希望听到任何有这方面经验的人:

  • 是否存在与多个源文件相关的任何问题?
  • pyopencl最好的解决方法是简单地连接文件吗?
  • 有没有办法编译函数库(而不是使用每个内核传入库源,即使不是全部都使用)?
  • 如果每次都需要传入库源,是否丢弃了未使用的函数(没有开销)?
  • 还有其他最佳做法/建议吗?

谢谢.

grr*_*sel 6

我不认为OpenCL在程序中有多个源文件的概念 - 程序是一个编译单元.但是,您可以在编译时使用#include并引入头文件或其他.cl文件.

您可以在OpenCL程序中拥有多个内核 - 因此,在一次编译之后,您可以调用任何已编译的内核集.

任何未使用的代码 - 函数或任何静态知道无法访问的代码 - 都可以假设在编译期间被消除,编译时间成本较低.


Ben*_*Uri 5

在OpenCL 1.2中,您将不同的目标文件链接在一起.