如何防止OpenCL信号量中的死锁?

如何防止OpenCL信号量中的死锁?,opencl,concurrent-programming,Opencl,Concurrent Programming,我遵循的教程非常棒,除了最后一个关于如何创建信号量的例子对我不起作用之外。逻辑相当简单,但我不明白为什么这个内核会导致无限循环 myKernel.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);

我遵循的教程非常棒,除了最后一个关于如何创建信号量的例子对我不起作用之外。逻辑相当简单,但我不明白为什么这个内核会导致无限循环

myKernel.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]);
}
#pragma OPENCL扩展cl_khr_global_int32_base_atomics:启用
void GetSemaphor(_global int*信号量,_global int*数据){
int=atom_xchg(信号量,1);
int realityCheck=0;
while(占用==1&&realityCheck++<100000)
占用=原子xchg(信号量,1);
}
无效释放信号量(uu全局int*信号量)
{
int-prevVal=atom_xchg(信号量,0);
}
__kernel void myKernel(_global int*数据,_global int*信号量)
{
//主机上的信号量[0]设置为0。
获取信号量(&信号量[0],数据);
数据[0]++;
释放信号量(&信号量[0]);
}
这与:

OpenCL1.2

完整配置文件

在Quadro NVS 290上


*cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics

您参考的教程是错误的,永远不会在GPU设备上工作。由于硬件架构

任何类型的同步机制,阻止工作组内的工作项,都将无法工作。因为阻塞状态将影响整个工作组,从而产生无限循环


您只能在工作组大小为1的情况下执行此类操作。或跨工作组。

同意。问题是,第一个工作项获得信号量,然后其他工作项都不能继续,除了在大多数架构中,许多工作项被绑定到一个扭曲或波前中,并且必须以锁定的步调继续,因此通过阻塞其他工作项,您已经锁定了整个扭曲/波前,它使工作组死锁,使内核死锁。