核心驅動 fam15h_power

支援的晶片

  • AMD Family 15h 處理器

  • AMD Family 16h 處理器

    字首:‘fam15h_power’

    掃描地址:PCI 空間

    資料手冊

    • AMD Family 15h 處理器 BIOS 和核心開發者指南 (BKDG)

    • AMD Family 16h 處理器 BIOS 和核心開發者指南 (BKDG)

    • AMD64 架構程式設計師手冊第 2 卷:系統程式設計

作者:Andreas Herrmann <herrmann.der.user@googlemail.com>

描述

  1. 處理器 TDP(散熱設計功耗)

在固定頻率和電壓下,處理器的功耗根據正在執行的工作負載而變化。降額功耗是在執行特定應用程式時消耗的功率。散熱設計功耗 (TDP) 是降額功耗的一個例子。

此驅動程式允許透過 TDP 演算法讀取提供 AMD Family 15h 和 16h 處理器功耗資訊的暫存器。

對於 AMD Family 15h 和 16h 處理器,可以使用不同的處理器北橋功能暫存器計算以下功耗值

  • BasePwrWatts

    指定處理器 NB 和核心外部邏輯消耗的最大功率(瓦)。

  • ProcessorPwrWatts

    指定處理器可以支援的最大功率(瓦)。

  • CurrPwrWatts

    指定處理器當前消耗的功率(瓦)。

此驅動程式提供 ProcessorPwrWatts 和 CurrPwrWatts

  • power1_crit (ProcessorPwrWatts)

  • power1_input (CurrPwrWatts)

在多節點處理器上,計算值適用於整個封裝,而不適用於單個節點。 因此,驅動程式僅為多節點處理器的內部 node0 建立 sysfs 屬性。

  1. 累計功耗機制

此驅動程式還引入了一種演算法,該演算法應用於計算在測量間隔 Tm 內處理器消耗的平均功率。 累計功耗機制的特性由 CPUID Fn8000_0007_EDX[12] 指示。

  • Tsample

    計算單元功耗累加器取樣週期

  • Tref

    PTSC 計數器週期

  • PTSC

    效能時間戳計數器

  • N

    計算單元功耗累加器取樣週期與 PTSC 週期的比率

  • Jmax

    最大計算單元累計功率,由 MaxCpuSwPwrAcc MSR C001007b 指示

  • Jx/Jy

    計算單元累計功率,由 CpuSwPwrAcc MSR C001007a 指示

  • Tx/Ty

    效能時間戳計數器的值,由 CU_PTSC MSR C0010280 指示

  • PwrCPUave

    CPU 平均功率

  1. 透過執行 CPUID Fn8000_0007 確定 Tsample 與 Tref 的比率。

    N = CPUID Fn8000_0007_ECX[CpuPwrSampleTimeRatio[15:0]] 的值。

  2. 從新的 MSR MaxCpuSwPwrAcc 讀取累積能量值的完整範圍。

    Jmax = 返回值。

  3. 在時間 x,SW 讀取 CpuSwPwrAcc MSR 並採樣 PTSC。

    Jx = 從 CpuSwPwrAcc 讀取的值,Tx = 從 PTSC 讀取的值。

  4. 在時間 y,SW 讀取 CpuSwPwrAcc MSR 並採樣 PTSC。

    Jy = 從 CpuSwPwrAcc 讀取的值,Ty = 從 PTSC 讀取的值。

  5. 計算在時間段 (y-x) 內計算單元的平均功耗。結果單位為 uWatt

    if (Jy < Jx) // Rollover has occurred
            Jdelta = (Jy + Jmax) - Jx
    else
            Jdelta = Jy - Jx
    PwrCPUave = N * Jdelta * 1000 / (Ty - Tx)
    

此驅動程式提供 PwrCPUave 和 interval(預設為 10 毫秒,最大為 1 秒)

  • power1_average (PwrCPUave)

  • power1_average_interval (Interval)

可以在 /etc/sensors3.conf 檔案中更新 power1_average_interval,如下所示

chip fam15h_power-*

set power1_average_interval 0.01

然後使用 “sensors -s” 儲存它。