[英]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.