0
나는 세마포어를 만드는 방법에 대한 마지막 예제를 제외하고는 위의 모든 튜토리얼을 수행하고있다. 논리는 꽤 간단하지만 왜이 커널이 무한 루프를 일으키는 지 알 수 없습니다.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]);
}
이 함께 :
* cl_khr_global_int32_base_atomics CL을 갖는 쿼드 NVS (290)에
오픈 CL 1.2
FULL_PROFILE
_khr_global_int32_extended_atomics
좋은 답변, 감사합니다! – user1873073
동의. 문제는 첫 번째 작업 항목이 세마포어를 가져오고 나머지 작업 항목이 진행될 수 없다는 것입니다. 단, 대부분의 아키텍처에서 여러 작업 항목이 워프 또는 파면으로 함께 묶여 있고 잠금 단계로 진행되어야합니다 , 작업 그룹을 교착 상태로 만드는 전체 워프/파면을 교착 상태로 만든 다른 작업 항목을 차단함으로써 커널을 교착 상태로 만듭니다. – Dithermaster