首頁  >  文章  >  後端開發  >  `std::hardware_delta_interference_size` 和 `std::hardware_constructive_interference_size` 與 L1 快取行大小有何關係,對跨平台程式碼有何影響?

`std::hardware_delta_interference_size` 和 `std::hardware_constructive_interference_size` 與 L1 快取行大小有何關係,對跨平台程式碼有何影響?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-17 14:17:02729瀏覽

How do `std::hardware_destructive_interference_size` and `std::hardware_constructive_interference_size` relate to L1 cache line size, and what are the implications for cross-platform code?

理解std::hardware_delta_interference_size 和std::hardware_constructive_interference_size

這些量是在C 17 中引入大小的常數的可移植方法L1 快取線路。然而,它們與快取行大小的關係比這更微妙。

這些常數與 L1 快取行大小有何關係?

理論上,這些常數應該等於或大於 L1 快取行大小。這是因為破壞性幹擾大小是不同執行緒存取的兩個物件之間的最小偏移量,以避免錯誤共享,而建設性幹擾大小是可以在記憶體中放置在一起以促進真正共享的兩個物件的最大大小。

然而,在實務上,由於多種原因,這些常數的值可能與 L1 快取行大小不完全匹配。首先,編譯器可能使用啟發式或環境提示來估計快取行大小,這可能並不在所有情況下都是準確的。其次,快取行大小可能會根據執行程式碼的特定機器的體系結構而有所不同。

有一個很好的範例來示範它們的用例嗎?

當兩個或多個執行緒存取相同快取行的不同部分時,就會發生錯誤共享,導致快取行失效並頻繁重新載入。這可能會導致效能顯著下降。為了避免錯誤共享,不同執行緒存取的物件在記憶體中應至少間隔一個快取行。

真正的共享發生在兩個或多個執行緒存取相同快取行時,允許快取行一次載入到快取中並由所有執行緒共用。這可以顯著提高效能。為了促進真正的共享,應將同一執行緒存取的物件一起放置在記憶體中,以便它們適合單一快取行。

兩者都定義為 static constexpr。如果您建立一個二進位檔案並在具有不同快取行大小的其他電腦上執行它,這不是問題嗎?當您不確定程式碼將在哪台機器上運行時,如何防止錯誤共用?

這些常數的靜態 constexpr 性質確實會在運行程式碼時帶來潛在問題不同的機器具有不同的快取行大小。如前所述,這些常數的值可能與 L1 快取行大小不完全匹配,這可能會導致錯誤共享或錯過真正共享的機會。

為了緩解此問題,您可以為目標架構定義具有特定快取行大小的自己的常數。或者,您可以使用 std::hardware_delta_interference_size 和 std::hardware_constructive_interference_size 常數作為後備值,並使用特定於平台的方法在運行時檢查實際快取行大小。

以上是`std::hardware_delta_interference_size` 和 `std::hardware_constructive_interference_size` 與 L1 快取行大小有何關係,對跨平台程式碼有何影響?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn