通常mov暫存器之間的 s 是非常便宜的操作,但我想知道為什么GP 和 SIMD 暫存器之間的movd/有相當高的延遲。movq
查看來自uops.infomovd r32, xmm的最新 CPU 的延遲,
Alder Lake-P | ≤3
Alder Lake-E | ≤9
Zen 3 | ≤5
對于 Pentium 4,Agner Fog 的指令表顯示延遲movd r32, xmm為10。這甚至高于pextrw r32, xmm, i同一處理器上的延遲,即 9。
uj5u.com熱心網友回復:
它可能不如 Alder Lake-E 或 Zen 3 上的 9 或 5 個周期那么糟糕。但是,在 Intel CPU 上,movdXMM<->GP 往返的一個方向可能是 3 個周期,另一個可能是 1 個周期。
CPU 的物理和邏輯分離區域
GP-integer 和 SIMD/FP 位于不同的暫存器檔案和不同的轉發網路中。這些是 CPU 的物理獨立區域,因此這種延遲的一部分只是傳播/線路延遲,而不是計算的門延遲。與 SIMD-integer 到 SIMD-FP 的額外旁路延遲不同,資料必須通過一個執行單元才能從一個域到達另一個域,并且該執行單元必須在某個地方。
盡管如此,主流的英特爾內核在這方面做得非常好。 Haswell 及更高版本和 Nehalem的總往返延遲為 4 個周期。(可能是 3:1 的拆分)(來源:uops.info 的延遲測驗中的 Alder Lake P 實驗 5)。Sandy/Ivy 橋嘗試將往返延遲降低到總共 2 個周期,因此每個方向 1 個,但似乎他們為 Haswell 放松了這一點。movd r8d, xmm0movd xmm0, r8d
AMD CPU 對 FP 與整數具有單獨的調度域,而 Intel 在整數和 FP 執行單元之間共享執行埠。(例如,參見Zen 2與Skylake的框圖,或 Kanter 的Haswell 文章。)這可能會導致 GP<->XMM 中的一些延遲,例如可能無法喚醒依賴的微指令以在同一周期中轉發到另一個執行單元將其置于旁路轉發網路上。(或者不實用,在權力和保持調度分離方面)。
Bulldozer 系列更糟糕,2 個弱整數核心集群共享一個 SIMD/FP 單元,導致 XMM<->integer 的延遲非常高,尤其是在 Steamroller 之前。
像 Alder Lake E-cores (Gracemont) 這樣的英特爾低功耗內核可能會有所不同。Wikichip 沒有它的框圖,但上一代Tremont可能是類似的。統一 ROB 對于通程序式順序退出(如 Zen 2 的退出佇列)支持精確例外非常必要,但為每個整數埠和兩個 FP 埠單獨的 RS。(Gracemont 顯著增強了 SIMD 部分,但關鍵是它們可能不像在源自 Sandybridge 的微架構上那樣緊密耦合,后者本身源自 P6,受到一些 Netburst 影響)。
Alder Lake-E 上的實際movd往返延遲總共為 10 個周期。
回復:常規mov很便宜:
顯然-mov重命名時的消除不起作用,因為 GP 和 XMM 暫存器不在同一個暫存器檔案中,但即使在此之前mov,movdqa, 或movaps相同型別的暫存器之間也可以在任何執行單元上運行,因為域之間沒有轉發,只是一個微不足道的執行單元。
測量挑戰:提高往返延遲
您只能輕松測量形成回圈承載依賴鏈的序列的延遲。(你把它放在一個回圈中以創建具有該關鍵路徑長度的瓶頸。)不同暫存器型別之間的單向傳輸使這變得更加困難。
https://uops.info/非常保守,假設 dep 鏈中的每條其他指令都有 1 個周期延遲。這就是為什么他們將延遲列為<= 9,而不是9。如前所述,Alder Lake E 的往返延遲總共為 10 個周期。那可能是5和5。
如果您可以對(地址到資料)的負載使用延遲做出一些估計movq xmm0, [rax],您可以使用它來構建一個往返行程,其中涉及在一個方向上的一些已知延遲的負載,從而縮小movq rax, xmm0.
InstLatx64 / AIDA64只是在這些情況下放棄,例如在 Ice Lake 上MOVD r32, xmm列為L: [diff. reg. set]/ 。T: 0.50ns= 1.00c
Agner Fog 測量往返行程,并在某種程度上任意劃分各部分之間的延遲以加起來總往返行程。我認為這pextrw r,x,i實際上不太可能比 P4 上的延遲更低movd r32, xmm,盡管在 P4 上總是可能發生奇怪的事情。
但請注意,Agner Fog 的延遲數字mov reg, mem不是加載使用延遲(例如mov rax, [rax]),它們是存盤/重新加載延遲的任意分數,因此加載延遲 存盤延遲加起來就是總往返行程。這是 Agner Fog 資料的最大問題之一,與偶爾的人為錯誤(復制/粘貼錯誤的數字,或它的倒數,或缺少對 CPU 支持的某些指令的測驗)分開。
Agner 資料的另一個弱點是僅測量一種延遲,而不是單獨測量每個輸入。這是一項非常有價值的作業,而且總比沒有好,但是像https://uops.info/這樣的自動化測驗已被證明有助于更多地了解事物,以及消除拼寫錯誤。Agner 的表格仍然適用于 uops.info 未測驗的舊 CPU 的歷史資訊,但我通常不會查看 uops.info 測驗過的 CPU。
(另一方面, Agner 的微架構指南仍然是一座金礦,正在研究除 uop 性能之外的各種影響。)
有關的:
- 多個值或范圍作為單個指令的延遲意味著什么?
- 如何解釋 uops.info?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489740.html
