我应该用什么来代替cl::KernelFunctor

What should I use instead of cl::KernelFunctor?

本文关键字:cl KernelFunctor 什么 我应该      更新时间:2023-10-16

我正在跟随一些关于OpenCL的教程,他们提到了一种称为cl::KernelFunctor的类型。但是,该类型没有找到,当我查看AMD APP SDK的头文件时,我看到cl::KernelFunctor类的声明被注释掉了。

我应该用什么来代替这段代码来运行内核?

//run the kernel
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);
cl::Kernel simple_add(program, "simple_add");
simple_add.setArg(0, buffer_A);
simple_add.setArg(1, buffer_B);
simple_add.setArg(2, buffer_C);
queue.enqueueNDRangeKernel(simple_add,cl::NullRange,cl::NDRange(10),cl::NullRange);
queue.finish();

正如@Michael Dorner所说,您可以用一步一步的方法替换代码。创建内核,设置参数,然后排队。


KernelFunctor用于将内核代码函数化,以便您可以将其作为函数调用。由于通常情况下并非如此,因此在实际应用程序中很少使用,但在某些情况下可能很有用。

你的意思是:

cl::KernelFunctor simple_add(cl::Kernel(program, "simple_add"), queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
  • 创建内核"simple_add"的函子。
  • 在队列"queue"中启动

当调用函子时,传递剩下的东西,即实参:

simple_add(buffer_A, buffer_B, buffer_C);

的好处是,您可以稍后以一种简单的方式使用不同的参数启动它,只需:

simple_add(buffer_B, buffer_C, buffer_D);

您可能和我一样正在学习本教程。基于此,我发现OpenCL 1.1的文件CL/CL .hpp和OpenCL 1.2的文件CL/CL .hpp的不同之处在于CL::KernelFunctor在后面被删除。

解决方案是使用函数cl::make_kernel,它接受函数函数的模板参数类型。在这种特殊情况下,模板形参是cl::Buffer。使用OpenCL 1.2头为我编译的代码是:

cl::make_kernel<cl::Buffer, cl::Buffer, cl::Buffer> 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();
cl::KernelFunctor<cl::Buffer, cl::Buffer, cl::Buffer> simple_add(program, simple_add);
cl::EnqueueArgs eargs(queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
// call func
simple_add(eargs, buffer_A, buffer_B, buffer_C);