2


 在编写简单的 OpenCL 内核时,我尝试使用信号量,但它破坏了我的 GPU 驱动程序(AMD 12.10)。在查看了我发现的示例后,仅当本地工作大小不等于 1 时才会发生崩溃。此代码取自示例

    #pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
    #pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
    #pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable
    #pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable

    void GetSemaphor(__global int * semaphor)
    {
      int occupied = atom_xchg(semaphor, 1);
      while(occupied > 0)
      {
          occupied = atom_xchg(semaphor, 1);
      }
    }

    void ReleaseSemaphor(__global int * semaphor)
    {
       int prevVal = atom_xchg(semaphor, 0);
    }

    __kernel void kernelNoAtomInc(__global int * num,
                __global int * semaphor)
    {
      int i = get_global_id(0);
      GetSemaphor(&semaphor[0]);
      {
        num[0]++;
      }
      ReleaseSemaphor(&semaphor[0]);
    }

在示例作者使用

CQ.Execute(kernelNoAtomInc, null, new long[1] { N }, new long[1] { 1 }, null);

其中 N = global_work_size 和 local_work_size = 1
现在,如果我将 1 更改为 null 或 2 或 4 或我尝试过的任何其他数字 - AMD 驱动程序将会崩溃。

CQ.Execute(kernelNoAtomInc, null, new long[1] { N }, new long[1] { 2 }, null);

我目前没有其他 PC 可以对其进行测试。然而,作者故意离开 local_group_size = 1 似乎很奇怪,这就是为什么我认为我在这里遗漏了一些东西。有人可以向我解释一下吗?另外,据我了解,将 local_group_size 保留为 1 会极大地影响性能,还是不会?谢谢。

主机:Win8 x64、HD6870

4

1 回答 1

1

您的问题不可重现,而且我无法从链接中找到您的来源,但这里有一些关于它为什么会崩溃的想法,这应该会有所帮助(过去 9 年)。

它可能会崩溃,因为...

  • ...驱动程序认为您希望atom_xchg()执行该功能的本地版本,而您却想要全局版本。
  • ...您的循环大大减慢了该内核在旧机器上的执行速度,以至于超过了执行时间的内部限制,导致驱动程序终止内核。

我可以建议一个可能的修复:

  • 不要在内核中激活本地版本的 atom 函数
  • 尝试在 CPU 上运行它

除非我们可以访问您的计算机并在其上进行调试,否则无法解决此问题。


您还问,为什么作者选择 local_group_size 之一。这是因为全局工作大小需要能被局部工作大小整除,这样除以得到一个自然数。自然数除以一总是自然数,因此这非常适合实验。您说它会极大地影响性能是完全正确的。(只是也许数学没有加起来,也没有崩溃,但甚至没有开始)


不同的注释:

  • 为了使增量在功能上正确,您应该atom_inc()num缓冲区上使用 an 。我不明白这会如何导致崩溃,但它肯定会让你的程序无法按预期工作
  • 我会去使用 2.0 标准中的原子函数,因为它们已经具有类似信号量的函数:bool atomic_flag_test_and_set(volatile atomic_flag *object)void atomic_flag_clear(volatile atomic_flag *object)
于 2022-02-09T22:08:49.443 回答