在其檔案std::hint中有一個spin_loop具有以下定義的函式:
發出機器指令以通知處理器它正在忙等待自旋回圈(“自旋鎖”)中運行。
在接收到自旋回圈信號后,處理器可以通過例如節能或切換超執行緒來優化其行為。
根據目標架構,這可以編譯為:
_mm_pause, 又名x86 上的pause內在函式yield32位arm指令ISB SY在 64 位 arm (aarch64) 上
最后一個讓我有點頭暈(??)。我認為這ISB是一個冗長的操作,這意味著,如果在自旋鎖中使用,執行緒在嘗試檢測鎖是否再次打開時會有點滯后,但否則幾乎沒有任何好處。
在 aarch64 的自旋回圈中使用ISB SY而不是使用aNOP有什么好處?
uj5u.com熱心網友回復:
我不得不深入研究 Rust 存盤庫的歷史才能得到這個答案:
將yield已被替換isb的c064b6560b7c:
在 arm64 上,我們在幾個資料庫上看到 ISB(指令同步屏障)比自旋回圈中的 yield 更好用。yield 指令是一個 nop。isb 指令使處理器休眠一段時間。isb 很好地等效于 x86 上的暫停指令。
[...]
因此,從本質上講,它使用ISB完成 a所需的時間來暫停處理器,從而減少功耗。
Peter Cordes 在他的評論中很好地解釋了這一點:
ISB SY 不會長時間停頓,與緊密回圈中的垃圾郵件負載相比,它只是節省了一點功率。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/421104.html
標籤:
