運行腳本
基于gem5提供的腳本,啟動功耗仿真。實際工作中應該不會用gem5進行功耗的仿真吧,Cadence和Synopsys好像都有配套的的功耗建模工具。
事先要配置好 IMG_ROOT的環境變量
./build/ARM/gem5.opt configs/example/arm/fs_power.py \--caches \--bootloader="$IMG_ROOT/binaries/boot.arm" \--kernel="$IMG_ROOT/binaries/vmlinux.arm" \--disk="$IMG_ROOT/disks/m5_exit.squashfs.arm" \--bootscript=./util/dist/test/simple_bootscript.rcS
腳本分析
下面是對fs_power.py 腳本的解讀。
# 導入命令行參數解析模塊,用于處理腳本運行時的輸入參數
import argparse
# 導入操作系統相關功能模塊,用于處理文件路徑等系統操作
import os# 導入自定義的 big.LITTLE 架構配置模塊(假設為封裝了ARM大小核架構的配置邏輯)
import fs_bigLITTLE as bL# 導入gem5的核心模塊m5,用于控制仿真流程
import m5
# 從gem5的objects模塊導入功耗建模相關的基礎類
from m5.objects import (MathExprPowerModel, # 支持數學表達式的功耗模型基類PowerModel, # 功耗模型基類
)# 定義CPU在"ON"狀態下的功耗模型(繼承自支持數學表達式的功耗模型)
class CpuPowerOn(MathExprPowerModel):def __init__(self, cpu_path, **kwargs):# 調用父類構造函數,傳遞額外參數super().__init__(** kwargs)# 動態功耗計算公式:# 基于CPU的IPC(每周期指令數)和數據緩存缺失率,結合電壓計算# 公式含義:電壓 × (2×IPC + 3×1e-9×(數據緩存總缺失數/仿真時間))# 注:3×1e-9將緩存缺失的單位轉換為與IPC匹配的量級,最終結果單位為瓦特self.dyn = ("voltage * (2 * {}.ipc + 3 * 0.000000001 * ""{}.dcache.overallMisses / simSeconds)".format(cpu_path, cpu_path))# 靜態功耗計算公式:與溫度成正比(4×溫度)self.st = "4 * temp"# 定義CPU在非"ON"狀態(如關閉、時鐘門控)的功耗模型
class CpuPowerOff(MathExprPowerModel):# 動態功耗為0(無開關活動)dyn = "0"# 靜態功耗為0(理想狀態下無漏電)st = "0"# 定義CPU的完整功耗模型(管理不同狀態下的功耗模型切換)
class CpuPowerModel(PowerModel):def __init__(self, cpu_path, **kwargs):# 調用父類構造函數super().__init__(** kwargs)# 定義功耗狀態列表,與gem5的4種功耗狀態對應:# [ON, CLK_GATED(時鐘門控), SRAM_RETENTION(SRAM保持), OFF(關閉)]self.pm = [CpuPowerOn(cpu_path), # ON狀態使用CpuPowerOn模型CpuPowerOff(), # 時鐘門控狀態使用CpuPowerOff模型CpuPowerOff(), # SRAM保持狀態使用CpuPowerOff模型CpuPowerOff(), # 關閉狀態使用CpuPowerOff模型]# 定義L2緩存在"ON"狀態下的功耗模型
class L2PowerOn(MathExprPowerModel):def __init__(self, l2_path, **kwargs):super().__init__(** kwargs)# 動態功耗計算公式:基于L2緩存的總訪問次數,每次訪問貢獻0.000018瓦特# 注:0.000018為示例系數,實際需根據緩存大小、工藝參數校準self.dyn = f"{l2_path}.overallAccesses * 0.000018000"# 靜態功耗計算公式:與電壓相關((電壓×3)/10)self.st = "(voltage * 3)/10"# 定義L2緩存在非"ON"狀態的功耗模型
class L2PowerOff(MathExprPowerModel):dyn = "0" # 動態功耗為0st = "0" # 靜態功耗為0# 定義L2緩存的完整功耗模型(管理不同狀態下的模型切換)
class L2PowerModel(PowerModel):def __init__(self, l2_path, **kwargs):super().__init__(** kwargs)# 定義L2緩存的功耗狀態列表,對應4種狀態self.pm = [L2PowerOn(l2_path), # ON狀態使用L2PowerOn模型L2PowerOff(), # 時鐘門控狀態使用L2PowerOff模型L2PowerOff(), # SRAM保持狀態使用L2PowerOff模型L2PowerOff(), # 關閉狀態使用L2PowerOff模型]# 主函數:配置仿真環境、綁定功耗模型并啟動仿真
def main():# 創建命令行參數解析器,描述腳本功能為"帶示例功耗模型的通用ARM big.LITTLE配置"parser = argparse.ArgumentParser(description="Generic ARM big.LITTLE configuration with ""example power models")# 從fs_bigLITTLE模塊添加big.LITTLE架構相關的命令行參數(如核數、頻率等)bL.addOptions(parser)# 解析命令行參數options = parser.parse_args()# 檢查CPU類型是否為"timing",因為功耗模型需要時序仿真支持if options.cpu_type != "timing":# 若不是timing類型,拋出致命錯誤并終止仿真m5.fatal("The power example script requires 'timing' CPUs.")# 調用fs_bigLITTLE模塊的build函數,構建big.LITTLE系統的根對象root = bL.build(options)# 為系統中的所有CPU綁定功耗模型# 遍歷系統中所有組件(通過descendants()獲取所有子對象)for cpu in root.system.descendants():# 篩選出BaseCPU類型的對象(即CPU核心)if not isinstance(cpu, m5.objects.BaseCPU):continue# 設置CPU的默認功耗狀態為"ON"cpu.power_state.default_state = "ON"# 為CPU綁定自定義的功耗模型,傳入CPU在系統中的路徑(用于引用統計量)cpu.power_model = CpuPowerModel(cpu.path())# 為bigCluster的L2緩存綁定功耗模型# 遍歷bigCluster中L2緩存的所有子組件for l2 in root.system.bigCluster.l2.descendants():# 篩選出Cache類型的對象(即L2緩存)if not isinstance(l2, m5.objects.Cache):continue# 設置L2緩存的默認功耗狀態為"ON"l2.power_state.default_state = "ON"# 為L2緩存綁定自定義的功耗模型,傳入L2在系統中的路徑l2.power_model = L2PowerModel(l2.path())# 實例化仿真系統(根據配置創建具體的仿真對象)bL.instantiate(options)# 打印警告信息:說明本腳本的功耗數值僅為示例,不代表實際硬件print("*" * 70)print("WARNING: The power numbers generated by this script are ""examples. They are not representative of any particular ""implementation or process.")print("*" * 70)# 配置統計信息的輸出周期:每0.1毫秒(0.1e-3秒)輸出一次統計數據m5.stats.periodicStatDump(m5.ticks.fromSeconds(0.1e-3))# 啟動仿真運行(調用fs_bigLITTLE模塊的run函數)bL.run()# 若腳本作為gem5主程序運行,則調用main函數
if __name__ == "__m5_main__":main()
main函數解析
main 函數是整個腳本的核心執行入口,負責串聯 “參數解析、系統構建、功耗模型綁定、仿真啟動” 等關鍵流程,最終實現帶功耗建模的 big.LITTLE 架構仿真。其流程可分為?7 個核心部分,各部分的作用和邏輯如下:
1.?參數解析與配置驗證
parser = argparse.ArgumentParser(description="...") # 創建參數解析器
bL.addOptions(parser) # 添加big.LITTLE架構相關參數(如核數、頻率等)
options = parser.parse_args() # 解析命令行輸入參數if options.cpu_type != "timing": # 驗證CPU類型是否符合功耗建模要求m5.fatal("The power example script requires 'timing' CPUs.")
作用:
通過?
argparse
?處理用戶輸入的命令行參數(如仿真時長、CPU 類型等),確保參數符合腳本運行要求。關鍵驗證:強制要求 CPU 類型為?
timing
(時序模型),因為功耗模型依賴時序仿真的統計數據(如 IPC、緩存訪問等)。
2.?構建 big.LITTLE 系統架構
root = bL.build(options) # 調用自定義模塊構建系統根對象
作用:
基于解析后的參數(
options
),通過?fs_bigLITTLE
?模塊的?build
?函數創建 big.LITTLE 架構的系統根對象(root
)。系統根對象包含仿真所需的全部硬件組件(如 big 核集群、LITTLE 核集群、緩存、內存、總線等),是后續配置的基礎。
3.?為 CPU 綁定功耗模型
for cpu in root.system.descendants(): # 遍歷系統中所有組件if not isinstance(cpu, m5.objects.BaseCPU): # 篩選出CPU核心continuecpu.power_state.default_state = "ON" # 設置默認功耗狀態為"運行中"cpu.power_model = CpuPowerModel(cpu.path()) # 綁定自定義的CPU功耗模型
作用:
遍歷系統中的所有組件,篩選出 CPU 核心(
BaseCPU
?類型)。為每個 CPU 配置默認功耗狀態(
ON
),并綁定之前定義的?CpuPowerModel
(包含不同狀態下的功耗計算公式),使 CPU 的運行數據(如 IPC、緩存缺失)能被功耗模型引用。
4.?為 L2 緩存綁定功耗模型
for l2 in root.system.bigCluster.l2.descendants(): # 遍歷big集群的L2緩存組件if not isinstance(l2, m5.objects.Cache): # 篩選出緩存組件continuel2.power_state.default_state = "ON" # 設置默認功耗狀態為"運行中"l2.power_model = L2PowerModel(l2.path()) # 綁定自定義的L2功耗模型
作用:
針對 big 核集群的 L2 緩存,篩選出緩存組件(
Cache
?類型)。配置默認功耗狀態(
ON
),并綁定?L2PowerModel
,使 L2 緩存的訪問數據(如?overallAccesses
)能用于計算緩存的動態 / 靜態功耗。
5.?實例化仿真系統
bL.instantiate(options) # 實例化仿真對象
作用:
將之前定義的系統架構(
root
)、功耗模型等配置 “實例化” 為 gem5 可執行的仿真對象。這一步會完成硬件組件的底層映射(如內存地址分配、總線連接等),是從 “配置描述” 到 “可運行仿真” 的關鍵轉換。
6.?輸出警告信息
print("*" * 70)
print("WARNING: The power numbers generated by this script are examples...")
print("*" * 70)
作用:
提示用戶當前腳本的功耗數據是示例值(系數如?
2
、3
?未經過實際硬件校準),不代表真實芯片的功耗特性,避免誤用仿真結果。
7.?配置統計輸出與啟動仿真
m5.stats.periodicStatDump(m5.ticks.fromSeconds(0.1e-3)) # 每0.1毫秒輸出一次統計數據
bL.run() # 啟動仿真
作用:
配置統計信息的輸出周期(每 0.1 毫秒一次),確保能實時記錄功耗、性能等關鍵指標(如動態功耗、IPC、緩存缺失率等)。
調用?
bL.run()
?啟動仿真流程,執行預設的工作負載(如應用程序、基準測試等),并在仿真過程中根據功耗模型實時計算功耗。
總結:main 函數的核心邏輯
main 函數通過 “參數解析→系統構建→功耗模型綁定→實例化→啟動仿真” 的流程,將 “big.LITTLE 硬件架構” 與 “自定義功耗模型” 結合,最終實現帶功耗統計的仿真。其核心價值是將抽象的功耗計算公式與具體的硬件組件關聯,并通過 gem5 的仿真引擎輸出量化的功耗數據,為芯片功耗優化提供參考。