我正在嘗試使用原子,特別是__sync_fetch_and_add實現旋轉線程屏障。 https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Builtins.html使用Atomic Builtins旋轉線程屏障
我基本上想要一個替代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
這並不是出於顯而易見的原因工作(一個線程可以設置欄= 0,而另一個線程卡在無限while循環等)。我在這裏看到一個實現:使用C++ 11 atomics編寫一個(旋轉)線程屏障,但看起來太複雜了,我認爲它的性能可能比pthread屏障更差。
由於酒吧的高速緩存線在線程之間進行了ping操作,因此該實現還預計會在內存層次結構內產生更多流量。
有關如何使用這些原子指令來製造簡單障礙的任何想法?通信優化方案也會有所幫助。
好的謝謝,這工作得很好! – masab