9
有兩種方法可以運行內核,另一個在評論中提到:
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.?
只是關於make_kernel的一個說明,像KernelFunctor這樣的功能比setArg更有可能改變。如果你的目標是在使用函數時使代碼庫的壽命更長,那麼將setArg函數包裝到你自己的函子類中可能會有用。 –