我一直在关注本教程,除了最后一个关于如何创建信号量的示例对我不起作用之外,它一直都很棒。逻辑相当简单,但我无法弄清楚为什么这个内核会导致无限循环。
我的内核.cl
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
void GetSemaphor(__global int * semaphor, __global int * data) {
int occupied = atom_xchg(semaphor, 1);
int realityCheck = 0;
while(occupied == 1 && realityCheck++ < 100000)
occupied = atom_xchg(semaphor, 1);
}
void ReleaseSemaphor(__global int * semaphor)
{
int prevVal = atom_xchg(semaphor, 0);
}
__kernel void myKernel(__global int* data, __global int* semaphor)
{
// semaphor[0] is set to 0 on the host.
GetSemaphor(&semaphor[0], data);
data[0]++;
ReleaseSemaphor(&semaphor[0]);
}
这是与:
OpenCL 1.2
FULL_PROFILE
在 Quadro NVS 290 上
*cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics