运行脚本

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