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