我应该使用什么而不是cl :: KernelFunctor?

时间:2014-06-02 10:27:08

标签: c++ opencl

我正在关注OpenCL的一些教程,他们提到了一个名为cl::KernelFunctor的类型。但是,找不到那种类型,当我查看AMD APP SDK的标题时,我看到cl::KernelFunctor类的声明被注释掉了。

我应该使用什么代替此代码来运行内核?

//run the kernel
cl::KernelFunctor simple_add(cl::Kernel(program, "simple_add"), queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
simple_add(buffer_A, buffer_B, buffer_C);

3 个答案:

答案 0 :(得分:12)

cl::Kernel simple_add(program, "simple_add");
simple_add.setArg(0, buffer_A);
simple_add.setArg(1, buffer_B);
simple_add.setArg(2, buffer_C);
commandQueue.enqueueNDRangeKernel(simple_add, ...);

答案 1 :(得分:3)

正如@Michael Dorner所说,您可以通过一步一步的方法替换代码。创建内核,设置args,然后对其进行排队。


KernelFunctor是功能内核代码,因此您可以将其作为函数调用。由于通常情况并非如此,很少在实际应用中使用,但在某些情况下可能会有用。

使用此代码,您说:

cl::KernelFunctor simple_add(cl::Kernel(program, "simple_add"), queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
  • 创建内核“simple_add”的仿函数。
  • 在队列“队列”中启动
  • 使用这些NDRanges。

然后,当你调用函子时,你传递了唯一剩下的东西,参数:

simple_add(buffer_A, buffer_B, buffer_C);

好消息是,您可以稍后通过简单的方式使用不同的参数启动它:

simple_add(buffer_B, buffer_C, buffer_D);

答案 2 :(得分:0)

您可能像我一样关注this tutorial。我根据this得出结论,OpenCL 1.1的文件CL / cl.hpp和OpenCL 1.2的文件CL / cl.hpp的不同之处在于,稍后会删除cl :: KernelFunctor。

解决方案是使用功能cl :: make_kernel,该功能将仿函数用作模板参数类型。因此,在该特定情况下,模板参数为cl :: Buffer。使用OpenCL 1.2标头为我编译的代码是:

cl::make_kernel<cl::Buffer, cl::Buffer, cl::Buffer> simple_add(cl::Kernel(program, "simple_add"));
cl::EnqueueArgs eargs(queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
simple_add(eargs, buffer_A, buffer_B, buffer_C).wait();