首頁 >後端開發 >C++ >為什麼由於錯誤的資料依賴性,64 位元 Popcount 在 Intel CPU 上比 32 位元慢?

為什麼由於錯誤的資料依賴性,64 位元 Popcount 在 Intel CPU 上比 32 位元慢?

Susan Sarandon
Susan Sarandon原創
2024-12-09 22:19:11860瀏覽

Why is 64-bit Popcount Slower Than 32-bit on Intel CPUs Due to False Data Dependencies?

虛假數據依賴性影響Intel CPU 上的Popcount 性能

問題:

您觀察到顯著使用32 位元和64 位元循環計數器進行popcount操作之間的效能偏差英特爾 CPU。使用 64 位元計數器時效能下降 50%,最初歸因於編譯器錯誤。

說明:假資料依賴

Intel CPU 存在錯誤依賴於 popcnt 指令中的目標暫存器上,這會影響緊密循環的多次迭代。這種依賴性會暫停指令,直到目標暫存器可用。受此依賴關係影響的指令數量取決於循環的位置,從而導致效能變化。

依賴關係的後果:

  • 不同的暫存器: 當循環使用不同的暫存器進行連續的popcnt 運算時,依賴性會分佈在循環迭代中,顯著影響性能。
  • 相同的暫存器:如果所有 popcnt 運算都使用相同的暫存器,則依賴關係保留在單一迭代中,從而減少效能影響。
  • 已損壞依賴鏈: 透過引入不相關的指令(例如異或)來打破依賴關係,透過允許處理器並行化循環來提高效能

編譯器行為:

GCC 與Visual Studio都沒有意識到這種錯誤的依賴關係,從而導致基於寄存器分配的不可預測的性能。其他編譯器,例如 Clang 和 ICC,也缺乏這方面的知識。

AMD 效能:

AMD處理器似乎沒有這種錯誤的依賴關係,這有助於其更高的性能流行計數中的表現

緩解措施:

  • 內聯彙編:使用內聯彙編手動優化彙編程式碼可以繞過編譯器對依賴關係的無意識.
  • 打破依賴鏈:在每個 popcnt 操作後插入不相關的指令,打破了錯誤的依賴關係並提高了效能。
  • 使用不同的暫存器: 為連續的 popcnt 操作分配不同的暫存器可以緩解該問題,但可能會導致問題。並不總是可能的。

以上是為什麼由於錯誤的資料依賴性,64 位元 Popcount 在 Intel CPU 上比 32 位元慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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