在此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.
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. vs. 3.?
最佳答案
您可以查看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 编写相同的代码。您使用哪种方法完全取决于个人喜好。
关于c++ - 制作内核的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352167/