2014-01-25 53 views
9

在這種tutorial不同的方法進行內核

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

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(); 

它編譯和運行succussfully。

然而,在評論一個第三選擇:根本不能編譯

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

回答

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編寫相同的代碼。您使用哪種方法完全取決於個人偏好。

+0

只是關於make_kernel的一個說明,像KernelFunctor這樣的功能比setArg更有可能改變。如果你的目標是在使用函數時使代碼庫的壽命更長,那麼將setArg函數包裝到你自己的函子類中可能會有用。 –

相關問題