簡體   English   中英

CPU如何提供memory_order_acquire保證的內容?

[英]How does CPU provides what memory_order_acquire guarantees?

我一直在研究C ++ 11中的內存順序語義,並且在理解memory_order_acquire如何在CPU級別工作方面有些困難。

根據cppreference;

帶有此內存順序的加載操作在受影響的內存位置上執行獲取操作:在此加載之前,無法對當前線程中的任何讀取或寫入進行重新排序。 其他線程中釋放相同原子變量的所有寫操作在當前線程中都是可見的(請參閱下面的Release-Acquire順序)

我真正無法理解的部分是;

在此加載之前,無法重新排序當前線程中的讀取或寫入。

如果CPU在到達“ memory_order_acquire”部分之前已經對命令進行了重新排序,會發生什么情況? CPU是否還原所有已完成的工作? 如何保證這一點?

謝謝。

CPU不會“到達” memory_order_acquire部分。 這些是針對編譯器的指令。 編譯器必須使用其對CPU內存模型的知識來進行翻譯。

例如,如果一個CPU最多只能對2條指令進行重新排序,那么插入2條NOP指令將是實現語義部分的一種相當簡單的方法。

隨着第二段指出這里

只要最終結果正確,程序的指令就可能無法以正確的順序運行。

OoOE不僅盲目執行任何可用的操作。 CPU將包含明確禁止跨邊界重新排序這些訪問的邏輯。 如該文章其他部分所述,OoOE的硅成本非常昂貴,很可能是由於此類問題。

正如本SO中所指出的,記憶障礙確實帶來了成本-鑒於上述情況,這很有道理。 基本上,它們確實會導致普通的OoOE管道遭受打擊。

暫無
暫無

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

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