2013-09-27 6 views
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

답변

2

본 튜토리얼은 틀렸고 GPU 장치에서는 작동하지 않습니다. HW arquitecture로 인해.

작업 그룹 내의 작업 항목을 차단하는 모든 종류의 동기화 메커니즘이 작동하지 않습니다. 블로킹 상태는 전체 작업 그룹에 영향을 미치므로 무한 루프가 발생합니다.

작업 그룹 크기가 1 인 경우에만 또는 작업 그룹을 통해 수행 할 수 있습니다.

+0

좋은 답변, 감사합니다! – user1873073

+1

동의. 문제는 첫 번째 작업 항목이 세마포어를 가져오고 나머지 작업 항목이 진행될 수 없다는 것입니다. 단, 대부분의 아키텍처에서 여러 작업 항목이 워프 또는 파면으로 함께 묶여 있고 잠금 단계로 진행되어야합니다 , 작업 그룹을 교착 상태로 만드는 전체 워프/파면을 교착 상태로 만든 다른 작업 항목을 차단함으로써 커널을 교착 상태로 만듭니다. – Dithermaster