在编写简单的 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