将互斥锁添加到OpenCL内核

时间:2016-05-10 13:36:30

标签: opencl mutex

我有以下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中添加互斥?有人可以提供任何简单的例子吗?

1 个答案:

答案 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]);
}

这应该适用于一维问题但实际上它非常慢。可以通过在块内使用障碍而不是对每个线程使用原子操作来改进它。不过,我建议你重新考虑将你的工作分成几个内核的可能性,试图避免这些原子操作。