如何构建大型OpenCL内核?

时间:2011-10-01 18:57:50

标签: coding-style opencl gpgpu pyopencl

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

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