gem5学习(17):ARM功耗建模——ARM Power Modelling

目录

一、Dynamic Power States

二、Power Usage Types

三、MathExprPowerModels

四、Extending an existing simulation

五、Stat dump frequency

六、Common Problems


官网教程:gem5: ARM Power Modelling

通过使用gem5中已记录的各种统计数据,可以在gem5模拟中对能量和功率使用(energy and power usage)进行建模和监控。这是通过使用MathExprPowerModel实现的,它是一种通过数学方程来建模功率使用的方法。本教程详细介绍了功耗建模所需的各个组件,并解释了如何将它们添加到现有的ARM模拟中。

本章借鉴了位于configs/example/arm目录中的fs_power.py配置脚本,并提供了扩展此脚本或其他脚本的说明。

请注意,只有在使用更详细的“timing” CPU时才能应用功耗模型。

关于功耗建模如何集成到gem5中以及它们与模拟器的其他部分如何交互的概述,可以在Sascha Bischoff在2017年ARM Research Summit上的演示中找到。

完整的fs_power.py配置脚本:

import argparse
import osimport m5
from m5.objects import MathExprPowerModel, PowerModelimport fs_bigLITTLE as bLclass CpuPowerOn(MathExprPowerModel):def __init__(self, cpu_path, **kwargs):super(CpuPowerOn, self).__init__(**kwargs)# 2A per IPC, 3pA per cache miss# and then convert to Wattself.dyn = ("voltage * (2 * {}.ipc + 3 * 0.000000001 * ""{}.dcache.overallMisses / simSeconds)".format(cpu_path, cpu_path))self.st = "4 * temp"class CpuPowerOff(MathExprPowerModel):dyn = "0"st = "0"class CpuPowerModel(PowerModel):def __init__(self, cpu_path, **kwargs):super(CpuPowerModel, self).__init__(**kwargs)self.pm = [CpuPowerOn(cpu_path),  # ONCpuPowerOff(),  # CLK_GATEDCpuPowerOff(),  # SRAM_RETENTIONCpuPowerOff(),  # OFF]class L2PowerOn(MathExprPowerModel):def __init__(self, l2_path, **kwargs):super(L2PowerOn, self).__init__(**kwargs)# Example to report l2 Cache overallAccesses# The estimated power is converted to Watt and will vary based# on the size of the cacheself.dyn = f"{l2_path}.overallAccesses * 0.000018000"self.st = "(voltage * 3)/10"class L2PowerOff(MathExprPowerModel):dyn = "0"st = "0"class L2PowerModel(PowerModel):def __init__(self, l2_path, **kwargs):super(L2PowerModel, self).__init__(**kwargs)# Choose a power model for every power stateself.pm = [L2PowerOn(l2_path),  # ONL2PowerOff(),  # CLK_GATEDL2PowerOff(),  # SRAM_RETENTIONL2PowerOff(),  # OFF]def main():parser = argparse.ArgumentParser(description="Generic ARM big.LITTLE configuration with ""example power models")bL.addOptions(parser)options = parser.parse_args()if options.cpu_type != "timing":m5.fatal("The power example script requires 'timing' CPUs.")root = bL.build(options)# Wire up some example power models to the CPUsfor cpu in root.system.descendants():if not isinstance(cpu, m5.objects.BaseCPU):continuecpu.power_state.default_state = "ON"cpu.power_model = CpuPowerModel(cpu.path())# Example power model for the L2 Cache of the bigClusterfor l2 in root.system.bigCluster.l2.descendants():if not isinstance(l2, m5.objects.Cache):continuel2.power_state.default_state = "ON"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)# Dumping stats periodicallym5.stats.periodicStatDump(m5.ticks.fromSeconds(0.1e-3))bL.run()if __name__ == "__m5_main__":main()
  • 实现了一个使用gem5模拟器的ARM big.LITTLE配置,并使用了示例的功耗模型。它定义了几个功耗模型类,包括CpuPowerOn、CpuPowerOff、CpuPowerModel、L2PowerOn、L2PowerOff和L2PowerModel。这些类通过继承MathExprPowerModel和PowerModel来定义不同的功耗模型。
  • 主函数main()中首先解析命令行参数,并构建gem5模拟器的系统。然后,将示例的功耗模型与CPU和L2 Cache相关联。对于每个CPU,设置默认的功耗状态为“ON”,并将CpuPowerModel功耗模型与其关联。对于bigCluster的L2 Cache,设置默认的功耗状态为“ON”,并将L2PowerModel功耗模型与其关联。

一、Dynamic Power States

功耗模型由两个函数组成,用于描述如何计算不同功耗状态下的功耗消耗。这些功耗状态包括以下几种(来自src/sim/PowerState.py):

  • UNDEFINED:无效状态,没有可用的功耗状态相关信息。这是默认状态。
  • ON:逻辑块正在主动运行,并根据所需的处理量消耗动态能量和漏电能量。
  • CLK_GATED:块内的时钟电路被关闭以节省动态能量,但块的电源仍然打开,并且块正在消耗漏电能量。
  • SRAM_RETENTION:逻辑块内的SRAM被拉入保持状态,进一步减少漏电能量。
  • OFF:逻辑块被断电,不消耗任何能量。

每个状态(除了UNDEFINED)都分配了一个功耗模型,使用PowerModel类的pm字段。它是一个包含4个功耗模型的列表,分别对应以下顺序的状态:

  • ON
  • CLK_GATED
  • SRAM_RETENTION
  • OFF

需要注意的是,虽然有4个不同的条目,但这些条目不一定是不同的功耗模型。提供的fs_power.py文件在ON状态使用一个功耗模型,然后在其余状态使用相同的功耗模型。

二、Power Usage Types

gem5模拟器对功耗使用模拟了两种类型:

  • 静态功耗(static):模拟系统在任何活动情况下使用的功耗。
  • 动态功耗(dynamic):由于各种活动而导致系统使用的功耗。

一个功耗模型必须包含用于模拟这两种功耗的方程(这个方程可以非常简单,比如,如果不需要或者与该功耗模型无关的静态功耗,可以将其设为st = "0")。

三、MathExprPowerModels

在fs_power.py中提供的功耗模型是继承自MathExprPowerModel类的。MathExprPowerModel是指定为包含用于计算系统功耗的数学表达式的字符串。它们通常包含了一些统计数据和自动变量,比如温度,例如:

class CpuPowerOn(MathExprPowerModel):def __init__(self, cpu_path, **kwargs):super(CpuPowerOn, self).__init__(**kwargs)# 2A per IPC, 3pA per cache miss# and then convert to Wattself.dyn = "voltage * (2 * {}.ipc + 3 * 0.000000001 * " \"{}.dcache.overall_misses / sim_seconds)".format(cpu_path,cpu_path)self.st = "4 * temp"

上述的功耗模型来源于提供的fs_power.py文件。

可以看到自动变量(电压和温度【voltage and temp】)不需要路径,而组件特定的统计信息(CPU的每周期指令ipc)需要路径。在文件的主函数中,可以看到CPU对象有一个path()函数,返回组件在系统中的“路径”,例如system.bigCluster.cpus0。path函数由SimObject提供,因此可以被系统中任何扩展了SimObject的对象使用,例如稍后几行中的L2缓存对象也使用了它。

(注意将dcache.overall_misses除以sim_seconds以转换为瓦特。这是一个功耗模型,即能量随时间的变化。在使用这些术语时要小心,因为它们通常可以互换使用,但在功耗和能量模拟/建模方面,它们具有非常具体的含义。)

四、Extending an existing simulation

提供的fs_power.py脚本通过导入现有的fs_bigLITTLE.py脚本并修改其值来进行扩展。作为其中的一部分,使用了几个循环来迭代SimObjects的后代,以应用功耗模型。因此,为了扩展现有的仿真以支持功耗模型,可以定义一个辅助函数来帮助完成这个任务。

def _apply_pm(simobj, power_model, so_class=None):for desc in simobj.descendants():if so_class is not None and not isinstance(desc, so_class):continuedesc.power_state.default_state = "ON"desc.power_model = power_model(desc.path())

上述函数接受一个SimObject、一个Power Model和一个可选的类,SimObject的子孙必须实例化该类才能应用PM。如果没有指定类,则PM将应用于所有子孙。

无论是否决定使用辅助函数,现在需要定义一些Power Models。可以按照fs_power.py文件中的模式进行操作:

  1. 为感兴趣的每个功耗状态定义一个类。这些类应该扩展MathExprPowerModel,并包含dynst字段(分别表示动态和静态功耗)。每个字段应包含一个字符串,描述在该状态下如何计算各自类型的功耗。它们的构造函数应接受一个路径,用于通过格式在描述功耗计算方程的字符串中使用,并接受一些kwargs参数,以传递给超级构造函数。
  2. 定义一个类来保存在上一步中定义的所有Power Models。这个类应该扩展PowerModel,并包含一个名为pm的单一字段,其中包含一个包含4个元素的列表:pm[0]应该是“ON”功耗状态的Power Model的实例;pm[1]应该是“CLK_GATED”功耗状态的Power Model的实例;等等。这个类的构造函数应接受要传递给各个Power Models的路径,以及一些kwargs参数,这些参数将传递给超级构造函数。
  3. 有了辅助函数和上述类的定义,您可以扩展build函数,并在addOptions函数中添加一个命令行标志(如果希望能够切换使用这些模型)。

示例实现:

class CpuPowerOn(MathExprPowerModel):def __init__(self, cpu_path, **kwargs):super(CpuPowerOn, self).__init__(**kwargs)self.dyn = "voltage * 2 * {}.ipc".format(cpu_path)self.st = "4 * temp"class CpuPowerClkGated(MathExprPowerModel):def __init__(self, cpu_path, **kwargs):super(CpuPowerOn, self).__init__(**kwargs)self.dyn = "voltage / sim_seconds"self.st = "4 * temp"class CpuPowerOff(MathExprPowerModel):dyn = "0"st = "0"class CpuPowerModel(PowerModel):def __init__(self, cpu_path, **kwargs):super(CpuPowerModel, self).__init__(**kwargs)self.pm = [CpuPowerOn(cpu_path),       # ONCpuPowerClkGated(cpu_path), # CLK_GATEDCpuPowerOff(),              # SRAM_RETENTIONCpuPowerOff(),              # OFF][...]def addOptions(parser):[...]parser.add_argument("--power-models", action="store_true",help="Add power models to the simulated system. ""Requires using the 'timing' CPU."return parserdef build(options):root = Root(full_system=True)[...]if options.power_models:if options.cpu_type != "timing":m5.fatal("The power models require the 'timing' CPUs.")_apply_pm(root.system.bigCluster.cpus, CpuPowerModelso_class=m5.objects.BaseCpu)_apply_pm(root.system.littleCluster.cpus, CpuPowerModel)return root[...]

五、Stat dump frequency

默认情况下,gem5每模拟一秒钟就将模拟统计信息转储到stats.txt文件中。可以通过m5.stats.periodicStatDump函数进行控制,该函数接受以模拟时钟周期为单位的统计信息转储频率,而不是以秒为单位。同时,m5.ticks提供了一个fromSeconds函数,以便于使用。

下面是一个示例,展示了统计信息转储频率如何影响结果的分辨率,取自Sascha Bischoff的演示幻灯片第16页:

统计信息转储的频率直接影响基于stats.txt文件生成的图表的分辨率。然而,它也会影响输出文件的大小。每模拟一秒转储统计信息与每模拟一毫秒转储统计信息相比,会增加文件大小几百倍。因此,有意控制统计信息转储频率是合理的。

使用提供的fs_power.py脚本,可以按以下方式进行设置:

[...]def addOptions(parser):[...]parser.add_argument("--stat-freq", type=float, default=1.0,help="Frequency (in seconds) to dump stats to the ""'stats.txt' file. Supports scientific notation, ""e.g. '1.0E-3' for milliseconds.")return parser[...]def main():[...]m5.stats.periodicStatDump(m5.ticks.fromSeconds(options.stat_freq))bL.run()[...]

可以使用以下方式指定统计信息转储频率:

--stat-freq <val>

在调用模拟时进行设置。

六、Common Problems

使用提供的fs_power.py时,gem5崩溃,并显示以下错误消息:致命错误:统计信息''(160)未通过regStats()函数正确初始化
使用提供的fs_power.py时,gem5崩溃,并显示以下错误消息:致命错误:无法评估功耗表达式:[...]
这是因为gem5的统计框架最近进行了重构。获取最新版本的gem5源代码并重新构建应该可以解决这个问题。如果不希望这样做,可以使用以下两组补丁:

​​​​​​

  1. https://gem5-review.googlesource.com/c/public/gem5/+/26643
  1. https://gem5-review.googlesource.com/c/public/gem5/+/26785

可以通过按照各自链接中的下载说明来检出和应用这些补丁。

前阵子放假断更了一段时间(在家除了学习都是有意思的事情),现在逐步开始捡起学习状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2779396.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…

《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)

文章目录 3.1 媒体查询基础&#xff1a;网页的智能眼镜3.1.1 基础知识3.1.2 重点案例&#xff1a;适应三种设备的响应式布局3.1.3 拓展案例 1&#xff1a;改变字体大小3.1.4 拓展案例 2&#xff1a;暗模式适配 3.2 响应式图片和视频&#xff1a;让内容自由呼吸3.2.1 基础知识3.…

猫头虎分享已解决Bug | Go Error: cannot use str (type string) as type int in assignment

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【linux系统体验】-archlinux简易折腾

archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化2.4 桌面面板美化 三、问题总结3.1 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤&#xff1a; 磁盘分区安装 Linux内核配置系统&#xff…

git revert回退某次提交

请直接看原文: 【git revert】使用以及理解&#xff08;详解&#xff09;_git revert用法-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 前言 试验得知:用Reset HEAD方…

【开源】基于JAVA+Vue+SpringBoot的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

寒假作业:2024/2/11

作业1&#xff1a;使用递归实现n! 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> int fun(int n) {if(0n){return 1;}else{return n*fun(n-1);} } int main(int argc, const char *argv[]) {int n;printf("please en…

从左值和右值的角度分析a++和++a

摘自牛客上的一个题目&#xff1a; int a5,则 (a)的值是? 答案是会编译报错。 原因&#xff1a; a返回的是右值(rvalue)&#xff0c;而我们不能对一个右值进行自增操作。所以(a)会报错。 怎么理解呢&#xff1f; &#xff08;a)返回的是a在1之前的值&#xff0c;这个值是一个…

###C语言程序设计-----C语言学习(11)#数据的存储和基本数据类型

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 一. 数据的存储 1.整型数据的存储 计算机处理的所有信息都以二进制形式表示…

【人工智能教育】“奇幻森林里的决战:小明‘剑’指期末,勇闯试卷迷宫

在智慧校园的奇幻乐园中&#xff0c;教育的故事不再局限于传统的粉笔与黑板&#xff0c;而是跃然于光影之间&#xff0c;流淌于数据之海。小明和他的同学们正是这个新世界的探险者&#xff0c;他们手握名为“智能辅导助手”的魔法棒&#xff0c;勇闯知识的迷宫。每当他们在力学…

电子电器架构 —— 对车载软件开发新阶段的愿景

电子电器架构 —— 对车载软件开发新阶段的愿景 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝…

Github 2024-02-07 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-07统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Rust项目2TypeScript项目2Python项目2Ruby项目1HTML项目1NASL项目1Go项目1C项目1Svelte项目1C项目1 React Nat…

华为 huawei 交换机 接口 MAC 地址学习限制接入用户数量 配置示例

目录 组网需求: 配置思路&#xff1a; 操作步骤&#xff1a; 配置文件&#xff1a; 组网需求: 如 图 2-14 所示&#xff0c;用户网络 1 和用户网络 2 通过 LSW 与 Switch 相连&#xff0c; Switch 连接 LSW 的接口为GE0/0/1 。用户网络 1 和用户网络 2 分别属于 VLAN10 和 V…

优质项目追踪平台一览:助力项目管理与监控

项目追踪平台是现代项目管理中不可或缺的工具&#xff0c;它可以帮助团队高效地跟踪和管理项目进度、任务和资源分配。在当今快节奏的商业环境中&#xff0c;有许多热门的项目追踪平台可供选择。 本文总结了当下热门的项目追踪平台&#xff0c;供您参考~ 1、Zoho Projects&…

【MySQL】-18 MySQL综合-4(MySQL储存引擎精讲+MySQL数据类型简介+MySQL整数类型+MySQL小数类型)

MySQL储存引擎精讲MySQL数据类型简介MySQL整数类型MySQL小数类型 十一 MySQL存储引擎精讲11.1 什么是存储引擎11.2 MySQL 5.7 支持的存储引擎11.3 如何选择 MySQL 存储引擎11.4 MySQL 默认存储引擎 十二 MySQL数据类型简介12.1 MySQL 常见数据类型1) 整数类型2) 日期/时间类型3…

Spring Cloud Hystrix 参数配置、简单使用、DashBoard

Spring Cloud Hystrix 文章目录 Spring Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数…

部分意图分类【LLM+RAG】

在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子&#xff1a;在为北美顶级金融服务公司之一设计对话式人工智能助手时&#xff0c;WillowTree 的数据和人工智能研究团队 (DART) 发现&#xff0c;将意图分类与大型语言模型 (LLM) 结合…

基于物联网的实时数据分析(简单介绍)

在当今这个信息化、数字化飞速发展的时代&#xff0c;物联网&#xff08;Internet of Things, IoT&#xff09;和实时数据分析成为了技术革新的两大支柱。对于刚入行的新手来说&#xff0c;理解这两个概念及其相互作用不仅是迈入这一领域的第一步&#xff0c;更是掌握未来技术趋…

专业138+总分400+南京航空航天大学878数电信号考研经验南航电子信息与通信,真题,大纲,参考书

经过一年的复习&#xff0c;顺利被南京航空航天大学录取&#xff0c;初试专业课878数字电路和信号与系统138&#xff0c;总分400&#xff0c;回看这一年的复习&#xff0c;从择校到考研备考经历了很多&#xff0c;也有很多想和大家分享的复习经验&#xff0c;希望对大家复习有所…

免费生成ios证书的方法(无需mac电脑)

使用hbuilderx的uniapp框架开发移动端程序很方便&#xff0c;可以很方便地开发出移动端的小程序和app。但是打包ios版本的app的时候却很麻烦&#xff0c;官方提供的教程需要使用mac电脑来生成证书&#xff0c;但是mac电脑却不便宜&#xff0c;一般的型号都差不多上万。 因此&a…