我正在使用JavaCL API,我需要执行需要多次启动一个内核的操作。为了描述我编写算法的原则:
for(int k = 0; k < n; k++){
CLEvent calculation = kernels.calculation(queue, d_in2, d_in1, d_out, n, k, new int[] {n,n}, null);
(wait till the end of the "calculation" kernel)
(take d_out and give as an input to "calculation" kernel)
(launch calculation kernel again)
}
在启动下一个&#34;计算之前#34;内核,第一个应该等到第一个内核结束,第一个内核的结果需要传递给下一个内核。
如何在JavaCL的主机代码中实现此算法? 我认为使用任何OpenCl API以及C ++中的OpenCL主机代码的示例都会有所帮助。
答案 0 :(得分:0)
OpenCL基于队列。假设你有一个队列,你把3个内核放入其中,A,B,C。在A完成之前,B将不执行,保证(除非你特别要求一个乱序命令在B完成之前,C都不会执行。
这意味着如果你有2个缓冲区,你可以简单地做这样的事情(伪代码)
for(int i=0; i<iterations/2; i++)
{
clSetKernelArg(kernelA, 0, in)
clSetKernelArg(kernelA, 1, out)
launchkernelA
clSetKernelArg(kernelA, 1, in)
clSetKernelArg(kernelA, 0, out)
launchkernelA
}
这将ping两个缓冲区之间的数据,确保每个内核都以前一个内核启动的输出作为其输入启动
在您的情况下,您的数据看起来有点复杂,但原则仍然适用