アトミック、特に __sync_fetch_and_add を使用して、回転するスレッド バリアを実装しようとしています。https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Builtins.html
私は基本的に、pthread バリアに代わるものを求めています。約100のスレッドを並行して実行できるシステムでUbuntuを使用しています。
int bar = 0; //global variable
int P = MAX_THREADS; //number of threads
__sync_fetch_and_add(&bar,1); //each thread comes and adds atomically
while(bar<P){} //threads spin until bar increments to P
bar=0; //a thread sets bar=0 to be used in the next spinning barrier
これは明らかな理由で機能しません (スレッドが bar=0 を設定する可能性があり、別のスレッドが無限の while ループに陥るなど)。ここで実装を見ました: C++11 アトミックを使用して (スピニング) スレッド バリアを記述しますが、複雑すぎるようで、pthread バリアよりもパフォーマンスが悪いと思います。
この実装では、バーのキャッシュ ラインがスレッド間でピンポンされるため、メモリ階層内でより多くのトラフィックが生成されることも予想されます。
これらのアトミック命令を使用して単純なバリアを作成する方法についてのアイデアはありますか? さらに、通信に最適なスキームも役立ちます。