0

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

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

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

谢谢,

4

1 回答 1

2

一种方法是使用全局标志变量。当您找到该值时,您自动将其设置为 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
}

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

最后,我看到了写入原子变量不会立即提交的实例,因此您需要检查此代码是否会因为写入未提交而在您的系统上死锁。

于 2012-11-06T03:16:47.633 回答