0
我正在關注this教程,除了關於如何創建信號燈的最後一個例子,我一直都很贊。邏輯非常簡單,但我無法弄清楚爲什麼這個內核導致無限循環。如何防止OpenCL信號中的死鎖?
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]);
}
這是:
的OpenCL 1.2
FULL_PROFILE
上的Quadro NVS 290具有
* cl_khr_global_int32_base_atomics CL _khr_global_int32_extended_atomics
很好的答案,謝謝! – user1873073
同意。問題是第一個工作項獲得信號量,然後其餘工作項都不能繼續執行,除了在大多數體系結構中,許多工作項都綁在一起成爲warp或wavefront,並且必須以鎖步,所以通過阻止其他工作項目,您會使整個warp/wavefront發生死鎖,從而導致工作組發生死鎖,從而導致內核死鎖。 – Dithermaster