gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:02:17 27 4
gpt4 key购买 nike

在此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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com