OpenCL には、すべてのスレッドを停止するグローバル バリアがないため、次のコードで回避策を作成しようとしています。
void barrier(__global uint* scratch) {
uint nThreads = get_global_size(0);
atom_inc(scratch);
/* this loop never terminates */
while(scratch[0] < nThreads) {
continue;
}
}
アイデアは、すべてのスレッドがその 1 つのメモリをインクリメントするまで、各スレッドがループするというものです。
ただし、scratch[0] から読み取られた値は、一度読み取られるとスレッドで変更されることはなく、永久にループします。ホストに読み戻したときに正しい値であるため、インクリメントされていることがわかります。
グローバル メモリはローカルにキャッシュされていますか? 何が起きてる?