[英]False Sharing and Atomic Variables
當不同的變量位於同一個緩存行中時,您可能會遇到錯誤共享 ,這意味着即使兩個不同的線程(在不同的核心上運行)正在訪問兩個不同的變量,如果這兩個變量位於同一個緩存行中,您將擁有性能命中,因為每次都會觸發緩存一致性。
現在說這些變量是原子變量(原子我指的是引入內存柵欄的變量,比如C ++的atomic<t>
),會在那里進行虛假共享,或者原子變量是否在同一個緩存行中並不重要或者不是,據說他們無論如何都會引入緩存一致性。 換句話說,將原子變量放在同一個緩存行中會使應用程序變慢而不是將它們放在同一個緩存行中嗎?
澄清:對於負面后果,至少應該寫入“錯誤共享”變量的一些訪問。 如果寫入很少,則虛假共享對性能的影響可以忽略不計; 寫入越多(以及高速緩存行使消息無效)性能越差。
即使使用原子,緩存行共享(虛假或真實)仍然很重要。 在這里尋找一些證據: http : //www.1024cores.net/home/lock-free-algorithms/first-things-first 。 因此,答案是 - 是的,將不同線程使用的原子變量放在同一個緩存行上可能會使應用程序比將它們放到兩個不同的行上更慢。 但是,我認為除非應用程序花費大部分時間更新這些原子變量,否則它將被忽視。
如果您使用具有最強一致性要求的原子變量,一個完整的內存屏障,則錯誤共享的效果可能不會明顯。 對於這種訪問,原子操作的性能基本上受到存儲器訪問等待時間的限制。 所以事情總是很慢,我不認為他們會在虛假分享的情況下變慢。
如果你有其他較少侵入性的內存排序,原子本身所遭受的性能可能會更低,因此錯誤共享的影響可能會很大。
總之,在擔心這種操作的錯誤共享之前,我首先會看一下原子操作本身的性能。
將原子變量放在同一個緩存行中會使應用程序變慢而不是將它們放在同一個緩存行中嗎?
虛假地共享“原子”變量可能會導致性能問題(無論是否會導致此類問題取決於很多事情)。
假設你有兩個核心, A
和B
,每個核心都有自己的變量。 我們分別稱這些變量為a
和b
。
A
在其緩存中有a
,而B
在其緩存中有b
。
考慮A
增加a
時會發生什么。
a
和b
共享一個緩存行,則 B
的b
副本將失效,並且其對b
下一次訪問將導致緩存未命中。 a
和b
不共享緩存行,則就其緩存的b
副本而言,對B
沒有影響。 無論a
和b
是否為“原子”,都會發生這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.