当前位置:  开发笔记 > 编程语言 > 正文

如何在OpenCL内核中按顺序执行函数?

如何解决《如何在OpenCL内核中按顺序执行函数?》经验,为你挑选了1个好方法。

我有一个OpenCL内核,它从设备中调用某些函数并提供一些输出.我正在处理一个图像,使得首先执行垂直传递,然后完成水平传递.目前,我通过修改每个调用中的参数值,从主机端调用内核两次.

kernel void image_filter(a, b, c, d)
{
    func1(a, b, c, d);
    if()
        func2(a, b, c, d);
}

现在我想修改内核,使其只能调用一次,同时执行水平和垂直传递.

kernel void image_filter(a, b, c, d)
{
    // Vertical pass
    func1(a, b, c, d);
    if()
        func2(a, b, c, d);

    // When execution of the above functions is complete
    // Horizontal pass
    // Some computation
    func1(a, b, c, d);
    if()
        func2(a, b, c, d);
}

请注意,垂直和水平通道之间存在数据依赖性.



1> Dithermaster..:

对于单个内核入队,这是不可能的,您必须使用两个内核入队.

为什么?因为不是所有的工作项目启动他人之前完成.你无法控制它(它取决于运行时).并且由于您指出垂直和水平传递之间存在数据相关性,因此您需要在第二组开始之前完成所有第一组工作项.因此,两个内核入队.

TL; DR:内核中没有全局同步(仅工作组同步).使用两个队列.


不,你不能使用`障碍'.这是工作组同步.您需要全局同步,唯一的方法是将多个内核排入队列.
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有