Coding style 如何构造大型OpenCL内核?

Coding style 如何构造大型OpenCL内核?,coding-style,opencl,gpgpu,pyopencl,Coding Style,Opencl,Gpgpu,Pyopencl,我曾在几个项目上与OpenCL合作,但总是将内核作为一个函数(有时相当大)编写。现在我正在做一个更复杂的项目,我想在几个内核之间共享函数 但我能找到的示例都将内核显示为单个文件(很少有人甚至调用辅助函数)。似乎应该可以使用多个文件-clCreateProgramWithSource()接受多个字符串(我假设它们是组合的)-尽管pyopencl的Program()只接受一个源 因此,我希望听到任何有这方面经验的人: 是否存在与多个源文件相关的任何问题 对于pyopencl来说,简单地连接文件是最

我曾在几个项目上与OpenCL合作,但总是将内核作为一个函数(有时相当大)编写。现在我正在做一个更复杂的项目,我想在几个内核之间共享函数

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

因此,我希望听到任何有这方面经验的人:

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

谢谢。

我认为OpenCL没有在一个程序中包含多个源文件的概念——一个程序就是一个编译单元。但是,您可以在编译时使用#include和pull-in头文件或其他.cl文件

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


任何未使用的代码(函数或任何静态已知无法访问的代码)都可以假定在编译过程中被删除,而编译时的成本很小。

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

您可以创建一个包含“part1.cl”和“part2.cl”的连接文件。这对我(NVidia编译器)是有效的,尽管每次应用程序运行时可能都会编译所有内容。我认为拥有一个预编译函数库有点科幻,因为函数代码内联到每个内核中(这就是为什么你不能编写递归函数)。谢谢。这就是我正在做的。但是,令人沮丧的是,pyopencl在缓存内核时没有考虑#include内容。因此,如果不手动删除缓存,更改“库”文件不会影响已编译内核。无论如何,我会等着看是否有人有更好的想法,然后再把你评为最好的(也是唯一的!)。干杯。如果这是真的,那么clCreateProgramWithSource的语法就相当笨拙了,不是吗?它显式地需要多个字符串以及每个字符串的长度。我不确定它是否真的能工作(我来这里是想让它工作),但考虑到语法,它不能工作听起来很奇怪。。。