Я пытаюсь реализовать барьер вращающегося потока с помощью атомики, в частности __sync_fetch_and_add. https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Builtins.html
Я в основном хочу альтернативу барьеру pthread. Я использую 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 и т. Д.). Я видел здесь реализацию: Написание (вращающегося) барьера потока с использованием атомики С ++ 11, однако это кажется слишком сложным, и я думаю, что его производительность может быть хуже, чем барьер pthread.
Ожидается, что эта реализация будет производить больше трафика в иерархии памяти из-за того, что строка кеш-памяти бара переходит в пинг-понг между потоками.
Есть идеи, как использовать эти атомарные инструкции, чтобы создать простой барьер? Также будет полезна оптимальная схема коммуникации.