【问题标题】:Adding mutex onto OpenCL kernel将互斥锁添加到 OpenCL 内核
【发布时间】:2016-05-11 15:42:03
【问题描述】:

我有以下定义内核函数的 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 中添加互斥锁?谁能举个简单的例子?

【问题讨论】:

  • 没有办法在 OpenCL 中添加互斥锁。在 SIMD 中,所有线程都需要同时处理每条指令。阻塞一个线程,阻塞整个线程组。有一些使用全局/本地内存 + 原子的解决方法,但速度非常慢,所以我不想鼓励人们使用它们。

标签: opencl mutex


【解决方案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]);
}

这应该可以解决一维问题,但实际上速度非常慢。它可以通过在块内使用屏障而不是对每个线程使用原子操作来改进。不过,我建议您重新考虑将工作拆分为多个内核的可能性,尽量避免这些原子操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2021-03-08
    • 2010-09-16
    相关资源
    最近更新 更多