OpenCL多次调用同一个内核

时间:2016-01-05 19:13:11

标签: java c++ opencl gpu-programming

我正在使用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主机代码的示例都会有所帮助。

1 个答案:

答案 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两个缓冲区之间的数据,确保每个内核都以前一个内核启动的输出作为其输入启动

在您的情况下,您的数据看起来有点复杂,但原则仍然适用