簡體   English   中英

與原子變量相同的高速緩存行的非原子加載會導致原子變量失敗嗎?

[英]Will a non-atomic load to the same cache line as an atomic variable cause the atomic variable to fail?

在ARMv8 CPU上給出類似的東西(盡管這可能也適用於許多其他CPU):

class abcxzy 
{
  // Pragma align to cacheline to ensure they exist on same line.
  unit32_t atomic_data;
  uint32_t data;

  void foo()
  {
    volatile asm (
      "   ldr w0, [address of data]\n"
      "# Do stuff with data in w0..."
      "   str w0, [address of data]\n"

      "1: ldaxr w0, [address of atomic_data]\n"
      "   add w1, w0, #0x1\n"
      "   stxr w2,w1, [address of atomic_data]\n"
      "   cbnz w2, 1b\n"
    );
  }
}

在Asm內聯中使用適當的clobbers和這樣的設置,以便C和Asm可以在彩虹小馬和陽光的世界中愉快地共存。

在多CPU的情況下,所有在同一時間運行此代碼,將門店data引起的原子加載/存儲到atomic_data失敗? 從我所讀到的,ARM原子的東西在緩存行的基礎上工作,但不清楚非原子存儲是否會影響原子。 我希望它不會(並假設它確實...),但我希望看看是否有其他人可以證實這一點。

好的,終於找到了我需要的東西,雖然我不喜歡它:

根據ARM文檔,實現定義是否與專用存儲區相同的高速緩存行的非獨占存儲導致專用存儲失敗。 謝謝ARM。 欣賞那些精彩的非定論信息。


編輯:

失敗,我的意思是stxr命令沒有寫入內存並在狀態寄存器中返回“1”。 “您的原子數據已更新,需要新的RMW”狀態。

回答其他陳述:

  • 是的,原子臨界區應該盡可能小。 docs事件給出的數字有多小,而且確實非常合理。 我希望我的部分永遠不會超過1k或更多......

  • 是的,任何你需要擔心這種爭用殺戮性能或更糟糕的情況意味着你的代碼“做錯了”。 ARM文檔以一種方式陳述這種方式:)

  • 至於將非原子載荷和存儲放在原子中 - 我上面的偽測試只是演示了對同一緩存行的隨機訪問作為一個例子。 在實際代碼中,你顯然應該避免這種情況。 我只是試圖了解一下,如果高速硬件定時器存儲器與鎖相同的高速緩存行,可能會有多么糟糕。 再說一次,不要這樣做......

暫無
暫無

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

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