我正在尝试编写一个 OpenCL 实现memchr
来帮助我了解 OpenCL 的工作原理。我打算做的是为每个工作项分配一块内存来搜索。然后,在每个工作项中,它循环搜索字符的块。
特别是如果缓冲区很大,我不希望其他线程在已经找到一个事件之后继续搜索(假设在任何给定的缓冲区中只有一个字符出现)。
我坚持的是,当工作项找到角色时,它如何向主机和其他线程指示?
谢谢,
我正在尝试编写一个 OpenCL 实现memchr
来帮助我了解 OpenCL 的工作原理。我打算做的是为每个工作项分配一块内存来搜索。然后,在每个工作项中,它循环搜索字符的块。
特别是如果缓冲区很大,我不希望其他线程在已经找到一个事件之后继续搜索(假设在任何给定的缓冲区中只有一个字符出现)。
我坚持的是,当工作项找到角色时,它如何向主机和其他线程指示?
谢谢,
一种方法是使用全局标志变量。当您找到该值时,您自动将其设置为 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
}
这可能会比仅运行整个内核增加更多开销(除非您在每次迭代中都做大量工作)。此外,如果每个线程只检查数组中的单个值,则此方法将不起作用。每个线程必须有多个工作迭代。
最后,我看到了写入原子变量不会立即提交的实例,因此您需要检查此代码是否会因为写入未提交而在您的系统上死锁。