GEM5學習(5): ARM 架構功耗仿真

運行腳本

基于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)

作用

  • 提示用戶當前腳本的功耗數據是示例值(系數如?23?未經過實際硬件校準),不代表真實芯片的功耗特性,避免誤用仿真結果。

7.?配置統計輸出與啟動仿真

m5.stats.periodicStatDump(m5.ticks.fromSeconds(0.1e-3))  # 每0.1毫秒輸出一次統計數據
bL.run()  # 啟動仿真

作用

  • 配置統計信息的輸出周期(每 0.1 毫秒一次),確保能實時記錄功耗、性能等關鍵指標(如動態功耗、IPC、緩存缺失率等)。

  • 調用?bL.run()?啟動仿真流程,執行預設的工作負載(如應用程序、基準測試等),并在仿真過程中根據功耗模型實時計算功耗。

總結:main 函數的核心邏輯

main 函數通過 “參數解析→系統構建→功耗模型綁定→實例化→啟動仿真” 的流程,將 “big.LITTLE 硬件架構” 與 “自定義功耗模型” 結合,最終實現帶功耗統計的仿真。其核心價值是將抽象的功耗計算公式與具體的硬件組件關聯,并通過 gem5 的仿真引擎輸出量化的功耗數據,為芯片功耗優化提供參考。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python基礎】 19 Rust 與 Python if 語句對比筆記

一、基本語法對比 Rust if 語句 // 基本形式 let number 7;if number < 5 {println!("condition was true"); } else {println!("condition was false"); }// 多條件 else if if number % 4 0 {println!("number is divisible by 4"); } el…

Vue項目_項目配置腳本代碼詳細講解

Vue項目代碼詳細講解 1. jsconfig.json - JavaScript配置文件 {"compilerOptions": { // 編譯器選項配置"target": "es5", // 編譯目標&#xff1a;將代碼編譯為ES5版本&#xff0c;確保更好的瀏覽器兼容性"module": "esnext…

第一節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門

Vben Admin vben5 系列文章目錄 &#x1f4bb; 基礎篇 ? 第一節&#xff1a;Vben Admin 最新 v5.0 (vben5) Python Flask 快速入門 ? 第二節&#xff1a;Vben Admin 最新 v5.0 (vben5) Python Flask 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節&#xff1a;V…

Guava中常用的工具類

1. 集合工具類&#xff08;com.google.common.collect&#xff09;Guava 對 Java 集合框架進行了豐富擴展&#xff0c;解決了標準集合的諸多痛點。&#xff08;1&#xff09;Lists / Sets / Maps:用于簡化集合創建和操作&#xff1a;// 創建不可變集合&#xff08;線程安全&…

redission實現讀寫鎖的原理

Redisson 實現分布式讀寫鎖的核心原理是 ?基于 Redis 的 Lua 腳本原子操作? ?Pub/Sub 通知機制&#xff0c;在保證強一致性的同時實現高效的讀并發&#xff08;讀不阻塞讀&#xff0c;寫阻塞讀&#xff09;。以下是其核心設計&#xff1a;?一、核心數據結構?Redisson 使用…

【 ??SQL注入漏洞靶場】第二關文件讀寫

SQLi-Labs?它是一個開源的、專門為學習 ??Web安全?? 和 ??SQL注入技術?? 而設計的靶場項目。開發者故意在代碼中留下了各種不同類型的SQL注入漏洞&#xff0c;讓安全研究人員、學生和愛好者可以在一個合法、安全的環境中進行實戰練習&#xff0c;從而掌握發現和利用SQ…

設計藝術~緩存結構設計

背景 面對高QPS場景的業務&#xff0c;不得不考慮對一些數據做緩存設計&#xff0c;常見的緩存設計有這些&#xff1a;DB Proxy緩存、分布式緩存、Localcache緩存。 在考慮加緩存的背景下不考慮數據的一致性&#xff0c;都是瞎扯&#xff0c;所以我們再定義一下數據的一致性場景…

后端開發技術棧

后端開發技術棧核心技術內容平臺 (Content Platform)電商 (E-Commerce)金融科技 (FinTech) / 支付物聯網 (IoT - Internet of Things)游戲后端 (Game Backend)社交平臺搜索平臺企業級應用開發音視頻處理后端地圖與地理位置服務DevOps大數據開發大模型應用開發智能合約開發核心技…

【ICCV2025】計算機視覺|即插即用|ESC:顛覆Transformer!超強平替,ESC模塊性能炸裂!

論文地址&#xff1a;https://arxiv.org/pdf/2503.06671 代碼地址&#xff1a;https://github.com/dslisleedh/ESC 關注UP CV縫合怪&#xff0c;分享最計算機視覺新即插即用模塊&#xff0c;并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要 本研究…

【面試場景題】如何進行高并發系統的性能測試?

文章目錄一、明確測試目標與指標二、測試環境搭建三、測試工具選型四、測試場景設計五、執行測試與監控六、瓶頸分析與調優七、測試報告與迭代總結高并發系統的性能測試是驗證系統在極限流量下是否能保持穩定運行的關鍵環節&#xff0c;需要結合場景設計、工具選型、指標監控、…

攻防世界ReverseMe-120

這道題比較經典&#xff0c;涉及三個知識點&#xff0c;所以記錄一下。首先給了一個文件&#xff0c;detect it easy看了下&#xff0c;是32位exe。放入ida中&#xff0c;找下main函數&#xff0c;F5反編譯看一下偽代碼。int __cdecl main(int argc, const char **argv, const …

小白也能看懂,HTTP中的文件上傳與下載到底發生了什么?

HTTP 文件傳輸協議解析&#xff1a;上傳與下載 這份文檔會用最簡單的方式&#xff0c;帶你了解 HTTP 協議是如何處理文件下載和上傳的。我們會專注于協議本身&#xff0c;看看客戶端&#xff08;比如你的瀏覽器&#xff09;和服務端&#xff08;網站服務器&#xff09;之間到底…

快速構建數據集-假數據(生成劃分)

快速構建數據集-假數據1、torch.randn&#xff08;?&#xff09;2、HuggingFace Datasets&#xff08;?&#xff09;&#x1f539;1. 從字典生成&#x1f539;2. 從 pandas.DataFrame 生成&#x1f539;3. 批量生成“業務型”假數據&#xff08;配合 Faker&#xff09;&#…

[修訂版]Xenomai/IPIPE源代碼情景解析

[修訂版]Xenomai/IPIPE源代碼情景解析 第一章&#xff1a;Interrupt Pipeline介紹 1.1 I-pipe與Xenomai1.2 I-pipe核心概念1.3 拉取I-pipe代碼 第二章&#xff1a;I-pipe對ARM64異常的改造 2.1 ARM64中斷機制與異常處理2.2 EL0_IRQ 中斷改造之入口2.3 EL0_IRQ 中斷改造之中斷處…

【Qt開發】按鈕類控件(三)-> QCheckBox

目錄 1 -> 概述 2 -> 核心特性 2.1 -> 狀態管理 2.2 -> 信號機制 2.3 -> 外觀與文本 3 -> 應用場景 4 -> 代碼示例 5 -> 總結 1 -> 概述 QCheckBox 是 Qt 框架中提供的一個基礎控件&#xff0c;用于實現復選框功能。它允許用戶在兩種或三種…

在新發布的AI論文中 pytorch 和tensorflow 的使用比例

根據 2025 年最新的學術動態和行業報告&#xff0c;PyTorch 在 AI 論文中的使用比例已占據絕對主導地位&#xff0c;而 TensorFlow 的占比持續下降。以下是基于多個權威來源的綜合分析&#xff1a; 一、頂級會議中的框架分布 在 NeurIPS、ICML、CVPR 等頂級學術會議中&#xff…

3DXML格式是什么?用什么軟件可以打開?

3DXML 是一種開放標準的數據交換格式&#xff0c;主要用于三維 CAD&#xff08;計算機輔助設計&#xff09;模型的存儲和交換。它是由 Dassault Systmes 開發的一種文件格式&#xff0c;常用于 CATIA V6 和其他支持該格式的應用程序中。3DXML 文件可以包含完整的 3D 模型數據&a…

9月8日星期一今日早報簡報微語報早讀

9月8日星期一&#xff0c;農歷七月十七&#xff0c;早報#微語早讀。1、中國火箭與月亮同框&#xff0c;遙感四十號03組衛星發射成功&#xff1b;2、湖南郴州開發區改革&#xff1a;編制數由815名減至680名&#xff0c;精簡16.6%&#xff1b;3、水利部對廣東、廣西啟動洪水防御Ⅳ…

windows系統搭建MQTT服務器

1、MQTT 協議 MQTT協議&#xff1a;實現MQTT協議需要客戶端和服務器端通訊完成。 三種身份: 發布者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。 消息的發布者和訂閱者都是客戶端&#xff0c;消息代理是服務器&#xff0c;消息發布者可以同時是訂閱者。 MQTT&am…

從 GPT 到 LLaMA:解密 LLM 的核心架構——Decoder-Only 模型

&#x1f525;從 GPT 到 LLaMA&#xff1a;解密 LLM 的核心架構——Decoder-Only 模型 “為什么所有大模型&#xff08;LLM&#xff09;都長一個樣&#xff1f;” 因為它們都有一個共同的“基因”——Decoder-Only 架構。 在前面兩節中&#xff0c;我們學習了&#xff1a; BER…