在OpenCL中找到早期退出

时间:2012-11-06 00:56:39

标签: opencl

我正在尝试编写memchr的OpenCL实现,以帮助我了解OpenCL的工作原理。我打算做的是为每个工作项分配一大块内存来搜索。然后,在每个工作项中,它遍历搜索角色的块。

特别是如果缓冲区很大,我不希望其他线程在找到事件后继续搜索(假设任何给定缓冲区中只出现一次字符)。

我所坚持的是,当找到角色时,工作项如何向主机和其他线程指示?

谢谢,

1 个答案:

答案 0 :(得分:1)

您可以这样做的一种方法是使用全局标志变量。当您找到值时,它会以原子方式将其设置为1,而其他线程将在它们正在工作时检查该值。

例如:

__kernel test(__global int* buffer, __global volatile int* flag)
{
    int tid = get_global_id(0);
    int sx = get_global_size(0);
    int i = tid;
    while(buffer[i] != 8) //Whatever value we're trying to find.
    {
        int stop = atomic_add(&flag, 0);  //Read the atomic value
        if(stop) 
            break;
        i = i + sx;
    } 
    atomic_xchg(&flag, 1);  //Set the atomic value
}

这可能会增加开销,而不仅仅是运行整个内核(除非你在每次迭代时都做了很多工作)。此外,如果每个线程只是检查数组中的单个值,则此方法将不起作用。每个线程必须有多次迭代工作。

最后,我已经看到写入原子变量的实例没有立即提交,所以你需要检查一下这个代码是否会在你的系统上死锁,因为写操作没有提交。