在编写简单的OpenCL内核时,我试图使用信号量,它破坏了我的GPU驱动程序(AMD 12.10)。在查看我发现的示例之后,只有在本地工作大小不等于1时才会发生崩溃。
此代码取自example:
#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