在此tutorial
中运行内核有两种方法,另外一种方法在评论中提到:
1
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);
然而,我发现了KernelFunctor has gone。
所以我尝试了另一种方式:
2
cl::Kernel kernel_add=cl::Kernel(program,"simple_add");
kernel_add.setArg(0,buffer_A);
kernel_add.setArg(1,buffer_B);
kernel_add.setArg(2,buffer_C);
queue.enqueueNDRangeKernel(kernel_add,cl::NullRange,cl::NDRange(10),cl::NullRange);
queue.finish();
它可以编辑和运行。
但是,评论中有第3个选项:
第3
cl::make_kernel 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();
哪个不编译,我认为make_kernel需要模板参数。 我是OpenCl的新手,并没有设法修复代码。
我的问题是:
1. 我应该如何修改3.代码进行编译?
2. 哪种方式更好,为什么? 2.对阵3.?
答案 0 :(得分:4)
您可以查看OpenCL C++ Bindings Specification以获取cl::make_kernel
API的详细说明(在第3.6.1节中),其中包含使用示例。
在你的情况下,你可以写这样的东西来创建内核仿函数:
auto simple_add = cl::make_kernel<cl::Buffer&, cl::Buffer&, cl::Buffer&>(program, "simple_add");
您的第二个问题主要是基于意见的,因此难以回答。有人可能会认为内核函子方法更简单,因为它允许你“调用”内核,就像它只是一个函数一样,并以熟悉的方式传递参数。替代方法(问题中的选项2)更明确地设置参数和排队内核,但更接近地表示如何使用OpenCL C API编写相同的代码。您使用哪种方法完全取决于个人偏好。