我正在关注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);
答案 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(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();