簡體   English   中英

每個 x86 指令的能耗?

[英]Energy consumption per x86 instruction?

我知道一些測量程序功耗的工具,例如powerTOP,RAPL等。

但是,我想知道是否存在某種基准,例如 Agner Fog 的 CPU 基准: https://www.agner.org/optimize/instruction_tables.pdf

哪個測量每條指令的能耗?

可以說我有以下說明:

    movq    %rdi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    movq    -8(%rbp), %rdx
    movq    -16(%rbp), %rax
    cmpq    %rax, %rdx
    setb    %al

而我只希望看movq、cmpq和setb等指令來估計程序的功耗。 我使用的是 Intel i-5 10400 處理器,但我可能正在尋找不同微架構的更廣泛的基准測試。 這甚至可能嗎?

亂序執行和緩存訪問與存儲轉發可能需要很大的功率。 您不能通過為每個操作碼和尋址模式分配 1 個數字來有效地使用 model 電源。 CPU 不休眠的每個周期都比 integer ALU 執行單元消耗更多的功率,因此您需要 model 性能。

還有許多其他因素,例如 uop 緩存命中減少了前端的能源使用。 (舊版解碼會消耗電力。)IDK ROB 或 RS 接近滿還是接近空有多重要; 我可以想象一個幾乎空的 RS 掃描准備執行的指令更便宜。 請參閱https://www.realworldtech.com/haswell-cpu/6/中的單核框圖,並注意除了執行單元之外還有多少東西。

“Race to sleep”是一個關鍵概念:更高效的代碼可以更快地完成,讓整個核心 go 重新進入睡眠 state。

有關的:

但是,這並不意味着不可能說任何話

每個周期的能量確實隨着 IPC 的增加而增加(更多的執行單元處於活動狀態,更多的邏輯將微指令分派到執行單元,並將結果繞過轉發到物理寄存器)。

但是在不同的指令之間,不同的 ALU 微指令(如setccsubcmp )之間可能幾乎沒有區別。 subcmp實際上是相同的 ALU 操作,只是cmp只寫 FLAGS 而sub也寫一個 integer 寄存器。 An integer physical register-file entry can hold both an integer reg value and the FLAGS produced by the same instruction, which makes sense as a design choice because most x86 integer instructions write FLAGS.

一些標量 integer ALU 指令可能會使用更多的能量,例如imul以及其他一些僅在端口 1 上運行的 3 周期延遲指令( popcntpdep ,可能lzcnt / tzcnt )。 IDK 桶式移位器與加減法器相比效率如何,但 64 位移位可能會使用更多。

當您執行更多后端微指令時,我預計會有所不同,例如,內存源將解碼添加到前端和 ROB 的微融合微指令,但在 RS 中,它是單獨加載並為執行端口添加微指令. 微融合和尋址模式

mov (加載、存儲、reg-to-reg)的不同 forms 顯然非常不同, mov-elimination幫助一些人在 32 位或 64 位的 reg-reg 移動中發揮作用。

SIMD 是一些指令真正開始消耗更多能量的地方

特別是當 SIMD乘法器處於活動狀態時。 像您這樣的 Skylake 系列 CPU 上的最高功率工作負載是每個時鍾 2 個 256 位 FMA,可能會發生一些緩存命中加載/存儲,例如 memory 源操作數。 (例如 Prime95 壓力測試)。

在不同的 1 周期延遲 integer ALU 指令之間,可能差異很小,如果每個周期執行相同數量的指令,則可能無法測量。 當然,像您展示的反優化調試版本充滿了殺死 IPC 的存儲/重新加載瓶頸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM