OpenCL 1.2で問題があります。 私は__global
という配列をカーネルに持っており、グループサイズは1000です。 問題は、atomic_add()
関数が正しく機能しないということです。OpenCL atomic_add()関数が間違った値を返します
私のカーネルのコードは次のとおりです。
__kernel void kernelfunction(__global uint32_t* buffer){
buffer[3] = 100;
atomic_add(&buffer[3], 1);
...
}
私は1000個のスレッドを作成した場合、私は右だ、buffer[3]
の値は1100になります期待して? ですが、プログラムの動作は未定義です。 いつかそれは1100年、時には1064、時には1093と...私が試してみました何
次のようになります。
私はまた、以下のようなOpenCLの拡張機能を有効にします。
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
が、問題まだ存在する。 別のプロジェクトでは単純なopenclプロジェクトを作成し、atomic_add
は正しく動作しています。ほとんどのプロジェクト構成を確認しましたが、どこに問題があるか分かりません。
お手伝いできますか? ありがとう
いいえ、あなたは正しくありません。また、コードを適切にフォーマットする方法も検討する必要があります。私はあなたの最初の行が「楽しい時を過す」という理由を知りません。 –