[英]Atomic operation propagation/visibility (atomic load vs atomic RMW load)
[英]What's the compative cost of an atomic RMW operation and a function call?
我的理解是原子機器指令可能比非原子操作慢兩個數量級。 例如,給定
int x;
x++
和
std::atomic<int> y;
y++;
我的理解是x++
通常比y++
運行得快得多。 (我假設增量操作映射到底層機器指令。我確信確切的比較成本因架構而異,但我說的是經驗法則。)
作為一般經驗法則,我再次對原子 RMW 操作和非內聯函數調用的相對成本感興趣。 例如,給定這個非內聯函數,
void f(){}
與執行非內聯調用f
的成本相比,我們通常可以說y++
的成本(即原子增量)?
我的動機是試圖正確看待“原子操作比非原子操作昂貴得多”的普遍主張。 一種方法是嘗試了解與調用和從非內聯函數返回相比,原子 RMW 操作的開銷有多大。
請不要回復“唯一知道的方法就是測量”。 我不是在詢問原子 RMW 操作與特定架構上特定上下文中的函數調用。 我問的是一個一般的經驗法則,可以用作討論基礎的人,他們可能會認為,“我們永遠不能使用原子指令,因為它們太貴了”,但他們不會三思而后行函數調用。
問的問題有問題。
一是您使用的偽代碼語法沒有明確的存儲類並且似乎對本地對象進行操作。 局部原子對象是沒有意義的。 原子操作是針對不同線程共享的對象。
編譯器很可能會注意到非易失性局部變量僅在函數中使用,並且不會生成任何特殊的原子操作(我不知道目前有任何編譯器會這樣做)。
我們必須假設對象不是本地的(或者是易失的)。
任何存儲器操作的成本取決於緩存很多。 如果該位置不在我們的緩存中,則操作成本會高得多。
堆棧的所有末端(最近的部分)幾乎總是在我們的緩存中。
根據定義,共享對象的值必須在緩存之間傳輸(它們被多個線程修改或讀取)。
那么你在這里真正比較的是什么? 除非你說得准確,否則這個問題是無法回答的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.