c++ - 制作内核的不同方法

标签 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.

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/

相关文章:

performance - OpenCL 内核上的 GPU 性能缓慢

optimization - OpenCL 性能优化

构建 opencl 内核失败

c++ - 以下哪项关于对象的陈述是正确的?

xcode - 如何设置 Xcode 以运行 OpenCL 代码,以及如何在构建前验证内核

c++ - 如何内存映射一个巨大的矩阵?

c++ - 在 C++ 中为 filesystem::copy 使用多个复制选项

c++ - 使用调试信息编译 OpenCL 内核?

c++ - 无法获得状态为 JOB_STATUS_DELETED 的打印作业通知

c++ - 如何防止 WTL CSplitterWindow 调整大小?