我有以下OpenCL代码定义内核函数:
kernel void test_print(global char* src)
{
printf("%c\t", src[0]);
src[0]++;
printf("%c\n", src[0]);
}
src
是一个包含一个元素{'0'};
输出
0 0 0 0 1
1
1
1
我认为这是因为每个线程都没有互斥锁。但是如何在OpenCL中添加互斥?有人可以提供任何简单的例子吗?
答案 0 :(得分:1)
__kernel void test_print(__global char* src, __global int* increment)
{
printf("%c\t", src[0]);
if(atomic_add(increment, 1)==get_global_id(0))
{
src[0]++;
}
printf("%c\n", src[0]);
}
这应该适用于一维问题但实际上它非常慢。可以通过在块内使用障碍而不是对每个线程使用原子操作来改进它。不过,我建议你重新考虑将你的工作分成几个内核的可能性,试图避免这些原子操作。