制作内核的不同方法

时间:2014-01-25 15:02:29

标签: c++ opencl

在此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.?

1 个答案:

答案 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编写相同的代码。您使用哪种方法完全取决于个人偏好。