OpenCL工作项排序

OpenCL工作项排序,opencl,gpu,cpu,nvidia,atomicity,Opencl,Gpu,Cpu,Nvidia,Atomicity,在OpenCL1.1中,是否可以强制工作项按顺序执行,以便它们等待更高优先级的项完成 我尝试过各种实现,在GPU(Nvidia OpenCL 1.1)上执行我的内核时,似乎总是遇到困难;虽然在CPU上运行也不错 我在下面的最新尝试将挂在GPU上。我的怀疑是,GPU正在将全球工作组拆分为被暂停的本地组,从而造成僵局。我通常运行的全局大小是本地大小的几倍,这对于扩大我的计算很重要 kernel void ordered_workitem_kernel( global uint *min_ac

在OpenCL1.1中,是否可以强制工作项按顺序执行,以便它们等待更高优先级的项完成

我尝试过各种实现,在GPU(Nvidia OpenCL 1.1)上执行我的内核时,似乎总是遇到困难;虽然在CPU上运行也不错

我在下面的最新尝试将挂在GPU上。我的怀疑是,GPU正在将全球工作组拆分为被暂停的本地组,从而造成僵局。我通常运行的全局大小是本地大小的几倍,这对于扩大我的计算很重要

kernel void ordered_workitem_kernel(
    global uint *min_active_id_g
) {
    uint i = get_global_id(0);
    min_active_id_g[0] = 0;
    barrier(CLK_GLOBAL_MEM_FENCE);

    while (i >= min_active_id_g[0]) {

        // do something interesting here

        if (i == min_active_id_g[0])
            atomic_inc(&min_active_id_g[0]);
    }
}

也许有更好的办法?有什么建议吗?

工作项的执行没有顺序。也没有办法强迫它。否则你就完全违背了并行系统的目的。基本上,你有一个不可并行的算法,你告诉OpenCL:“同时运行所有东西,但要按顺序运行”。高优先级的项目会改变其他项目的输入吗?也许你的算法可以扫描成并行版本?@huseyintugrulbuyukisik是的,他们可以。从某种意义上说,每个线程都在其负责的全局数据块的一部分上工作。另一个线程可以自动添加到该数据中。我知道我可以通过对全局索引变量调用atomic_inc来创建工作项排序,但这不会暂停其他工作项。您需要了解的另一件事是,并不是所有工作项都同时被处理。运行时可以完全执行工作项的一个子集,然后执行另一个批处理等,直到完成整个全局大小。因此,您不能在一个工作项中等待尚未执行的工作项。