セマフォの作成方法に関する最後の例がうまくいかないことを除いて、私はこのチュートリアルに従っています。ロジックは非常に単純ですが、このカーネルが無限ループになる理由がわかりません。
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