単純な OpenCL カーネルを作成しているときに、セマフォを使用しようとしたところ、GPU ドライバー (AMD 12.10) がクラッシュしました。私が見つけた例をチェックした後、そのクラッシュはローカル作業サイズが 1 に等しくない場合にのみ発生します。このコードは例から取得されます:
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable
void GetSemaphor(__global int * semaphor)
{
int occupied = atom_xchg(semaphor, 1);
while(occupied > 0)
{
occupied = atom_xchg(semaphor, 1);
}
}
void ReleaseSemaphor(__global int * semaphor)
{
int prevVal = atom_xchg(semaphor, 0);
}
__kernel void kernelNoAtomInc(__global int * num,
__global int * semaphor)
{
int i = get_global_id(0);
GetSemaphor(&semaphor[0]);
{
num[0]++;
}
ReleaseSemaphor(&semaphor[0]);
}
著者が使用する例では
CQ.Execute(kernelNoAtomInc, null, new long[1] { N }, new long[1] { 1 }, null);
ここで、N = global_work_size および local_work_size = 1
ここで、1 を null または 2 または 4 またはその他の数値に変更すると、AMD ドライバーがクラッシュします。
CQ.Execute(kernelNoAtomInc, null, new long[1] { N }, new long[1] { 2 }, null);
現時点でテストする他の PC はありません。しかし、作者が意図的に local_group_size = 1 のままにしたのは奇妙に思えます。誰かが私にこれを説明してもらえますか? また、私が理解している限り、local_group_size を 1 のままにすると、パフォーマンスに大きな影響がありますか? ありがとう。
ホスト: Win8 x64、HD6870