复制OpenCL内核的正确方法是什么?

复制OpenCL内核的正确方法是什么?,opencl,Opencl,似乎我可以通过从内核中获取程序对象和内核名称来复制内核。然后我可以创建一个新的 这条路对吗?不过,它看起来不太好。编辑:要正确回答这个问题:是的,这是正确的方法,在CL 2.0或更早版本中没有其他方法 CL代码创建的编译(因此是缓慢的步骤)是在“程序”创建(clProgramBuild+clProgramLink)中进行的 当您创建内核时。您正在创建一个对象,该对象包含: 程序代码中函数的入口点 该函数的输入+输出参数 一些内存用于在调用之间记住上述所有数据 这是一项几乎免费的简单任务。

似乎我可以通过从内核中获取程序对象和内核名称来复制内核。然后我可以创建一个新的

这条路对吗?不过,它看起来不太好。

编辑:要正确回答这个问题:是的,这是正确的方法,在CL 2.0或更早版本中没有其他方法


CL代码创建的编译(因此是缓慢的步骤)是在“程序”创建(clProgramBuild+clProgramLink)中进行的

当您创建内核时。您正在创建一个对象,该对象包含:

  • 程序代码中函数的入口点
  • 该函数的输入+输出参数
  • 一些内存用于在调用之间记住上述所有数据
这是一项几乎免费的简单任务。


这就是为什么它更喜欢具有不同输入参数的多个内核。而不是一个内核,并在每个循环中更改参数。

但是我是否必须一次又一次地查找多个内核的名称?与编译相比,名称查找应该是便宜的。不管怎么说,创造只发生在CL项目最需要的时候。这完全取决于生成多少内核以及生成多少次。但通常这应该是整个链条中最便宜的部分。我想这里没有更好的解决方案了。这可以完成任务,但很可疑。也许这不太麻烦,但也可以很容易避免。复制似乎明显比从头开始创建一个新的要便宜…不幸的是,我们在早期的规范中忽略了这一点。OpenCL2.1正在添加clCloneKernel来实现这一点。在2.1之前,您必须按名称从程序中获取内核对象。这应该足够便宜,而且您当然应该至少在每个线程上这样做(因为内核对象携带状态),但是没有办法将其推迟到以后的复制构造函数样式,也没有办法复制它,包括当前参数状态。