簡體   English   中英

制作內核的不同方法

[英]Different ways to make kernel

在本教程中

有兩種方法可以運行內核,另一種方法在評論中提到:

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 已經消失了

所以我嘗試了另一種方式:

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

您可以查看OpenCL C ++綁定規范以獲取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編寫相同的代碼。 您使用哪種方法完全取決於個人偏好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM