簡體   English   中英

為什么CompareAndSwap指令被認為是昂貴的?

[英]Why is CompareAndSwap instruction considered expensive?

為什么CompareAndSwap指令被認為是昂貴的?

我讀了一本書:

“內存障礙很昂貴,與原子compareAndSet()指令一樣昂貴。”

謝謝!

“CAS與正常商店的區別並不明顯。有關CAS的一些錯誤信息可能源於英特爾處理器上最初的lock:cmpxchg(CAS)實現.lock:前綴導致LOCK#信號被置位,獲得獨占權訪問總線。這當然沒有擴展。隨后的鎖實現:cmpxchg利用緩存一致性協議 - 通常是基於snoop的MESI - 並且不會斷言LOCK#。 - David Dice, HotSpot中的偏向鎖定

“內存障礙很昂貴,與原子compareAndSet()指令一樣昂貴。”

這是真的。
例如,在x86上,多處理器系統上的正確CAS具有鎖定前綴。
鎖定前綴會導致完整的內存屏障:

“...鎖定操作序列化所有未完成的加載和存儲操作(即等待它們完成)。” ......“鎖定操作相對於所有其他內存操作和所有外部可見事件都是原子操作。只有指令獲取和頁表訪問才能傳遞鎖定指令。鎖定指令可用於同步由一個處理器寫入的數據並由另一個處理器讀取“。 - 英特爾®64和IA-32架構軟件開發人員手冊 ,第8.1.2章。

事實上LOCK AND在x86 / x64上的.NETJAVA JIT中 ,內存屏障實現為虛擬LOCK ORLOCK AND
在x86上,CAS會產生完整的內存屏障。

在PPC上,它是不同的。 LL / SC對 - lwarxstwcx - 可用於將內存操作數加載到寄存器中,然后在目標位置沒有其他存儲時將其寫回,或者如果存在則重試整個循環。 LL / SC可以被中斷。
它也不意味着自動全柵欄。
不同體系結構的性能特征和行為可能會有很大差異。
但話說回來 - 弱LL / SC不是CAS。

那是因為它們為操作原子引入了額外的開銷。 底層平台必須抑制優化(如緩存)並暫停線程執行以促進障礙,這需要大量額外的工作。 當額外的活動正在進行時,線程無法執行,因此整個程序會產生時間延遲。

“昂貴”在這里非常相對。 與硬盤訪問相比,這絕對是微不足道的。 但是RAM總線速度跟不上現代CPU的速度,並且與CPU內部的算術運算相比,直接訪問RAM(即非緩存)非常昂貴。 從RAM中獲取int可以輕松地花費50倍的時間而不是添加兩個寄存器。

因此,由於內存屏障基本上強制直接RAM訪問(可能用於多個CPU),因此它們相對昂貴。

我想我在書中找到了答案:

每個getAndSet()都廣播到總線。 因為所有線程都必須使用總線與內存通信,這些getAndSet()調用會延遲所有線程(核心),甚至是那些不等待鎖定的線程。

更糟糕的是,getAndSet()調用強制其他處理器丟棄它們自己的鎖緩存副本,因此每個旋轉線程幾乎每次都會遇到緩存未命中,並且必須使用總線來獲取新的但未更改的值。

通常,原子操作很昂貴,因為它們需要跨CPU同步。 允許“正常”操作對緩存數據進行操作,從而允許額外的速度。 例如,在2個CPU系統上:

線程1

while (1) x++;

線程2

while (1) x++;

因為增量不是原子操作或受內存屏障保護,所以結果幾乎沒有定義。 你不知道x將如何遞增,或者它甚至可能被破壞。

線程1

while (1) atomicIncrement(&x);

線程2

while (1) atomicIncrement(&x);

現在,您正在嘗試獲得良好定義的行為 - 無論順序如何,x必須逐個增加。 如果兩個線程在不同的CPU上運行,則它們必須減少允許的緩存量或以其他方式“比較注釋”以確保發生合理的事情。

這種額外的開銷可能非常昂貴,並且這是聲稱原子操作很慢的一般原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM