2011-10-01 116 views
14

我曾在几个项目上与OpenCL合作过,但一直将内核编写为一个(有时很大)的函数。现在我正在研究一个更复杂的项目,并希望在多个内核之间共享函数。如何构建大型OpenCL内核?

但我能找到的所有例子都显示内核为单个文件(很少有甚至调用辅助函数)。似乎应该可以使用多个文件 - clCreateProgramWithSource()接受多个字符串(并且将它们结合起来,我假设) - 虽然pyopencl的Program()只接受单一来源。

所以我想从别人听到有经验的这样:

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

谢谢。

+2

您可以创建一个包含#include“part1.cl”#include“part2.cl”的并置文件。这适用于我(NVidia编译器),尽管可能每次应用程序运行时编译所有内容。 我认为有一个预编译函数库有点科幻,因为函数代码被内联到每个内核中(这就是为什么你不能写递归函数)。 –

回答

6

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

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

任何未使用的代码 - 函数或任何静态已知无法访问的内容 - 可以假定在编译过程中被消除,编译时间花费很小。

+0

谢谢。这是我正在做的。但令人沮丧的是,pyopencl在缓存内核时没有考虑到#include的内容。所以更改“库”文件不会影响已编译的内核,而无需手动删除缓存。无论如何,我会等到看到有人有更好的主意,然后再将您标为最好(也是唯一的!)。干杯。 –

+0

如果这是真的,那么clCreateProgramWithSource的语法就很尴尬,不是吗?它明确需要多个字符串和每个字符串的长度。我不确定它实际上是否有效(我在这里试图让它工作),但它听起来很奇怪,因为它的语法不能工作... – user1111929

5

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

+0

谢谢;将尝试这一点,当我回到顶级opencl工作。 –