0

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

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

4

1 に答える 1

2

あなたが参照しているそのチュートリアルは間違っており、GPU デバイスでは動作しません。HW アーキテクチャが原因です。

ワークグループ内のワークアイテムをブロックする同期メカニズムは、まったく機能しません。ブロッキング状態はワークグループ全体に影響を与えるため、無限ループが発生します。

この種のことは、ワークグループ サイズが 1 の場合にのみ実行できます。またはワークグループ全体で実行できます。

于 2013-09-28T07:58:19.817 に答える