為什麼編譯器避免合併冗餘原子寫入
簡介
簡介std::atomic<int> y(0); void f() { auto order = std::memory_order_relaxed; y.store(1, order); y.store(1, order); y.store(1, order); }編譯器通常編譯器堅持「 as-if」規則,讓他們在可觀察到的情況下重新排序操作行為保持一致。然而,在連續儲存具有相同值的原子變數的情況下,例如:
編譯器傾向於單獨發出寫入。
C 的限制標準雖然C 11 和C 14 標準在技術上允許合併三個商店,它們不保證觀察者會看到2 的中間值。因此,透過將儲存摺疊到單一操作中進行最佳化將違反標準允許任何有效排序的意圖。
編譯器注意事項編譯器優先考慮最佳化效能而不是可預測性,這導致了保守的方法。儘管標準允許,但編譯器選擇不合併原子寫入以避免潛在問題,例如當多個儲存錯誤合併時進度條會卡住。
最小驚喜原則程式設計師通常期望原子儲存依序發生,每個儲存都以寫入的方式執行。如果編譯器要合併這些操作,則可能會引入意外行為並違反最小意外原則。
即將推出的 API 增強C 工作小組正在進行討論使用額外的最佳化控制來擴展 std::atomic API。這將允許編譯器在不違反排序要求的情況下最佳化原子寫入。
替代解決方案同時,程式設計師可以使用易失性原子變數來防止商店最佳化。雖然此方法主要解決進度條問題,但它不是理想的長期解決方案。
結論編譯器通常不會將連續的原子寫入與相同的原子寫入合併值以確保與C 標準的一致性,避免潛在的性能問題,並堅持最少意外原則。然而,未來的 API 增強可能使編譯器能夠在未來安全地實現此最佳化。以上是為什麼編譯器不合併相同值的冗餘原子寫入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!