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 os

import m5
from m5.objects import MathExprPowerModel, PowerModel

import fs_bigLITTLE as bL


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 Watt
        self.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),  # ON
            CpuPowerOff(),  # CLK_GATED
            CpuPowerOff(),  # SRAM_RETENTION
            CpuPowerOff(),  # 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 cache
        self.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 state
        self.pm = [
            L2PowerOn(l2_path),  # ON
            L2PowerOff(),  # CLK_GATED
            L2PowerOff(),  # SRAM_RETENTION
            L2PowerOff(),  # 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 CPUs
    for cpu in root.system.descendants():
        if not isinstance(cpu, m5.objects.BaseCPU):
            continue

        cpu.power_state.default_state = "ON"
        cpu.power_model = CpuPowerModel(cpu.path())

    # Example power model for the L2 Cache of the bigCluster
    for l2 in root.system.bigCluster.l2.descendants():
        if not isinstance(l2, m5.objects.Cache):
            continue

        l2.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 periodically
    m5.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 Watt
        self.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):
            continue

        desc.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),       # ON
            CpuPowerClkGated(cpu_path), # CLK_GATED
            CpuPowerOff(),              # SRAM_RETENTION
            CpuPowerOff(),              # 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 parser


def 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, CpuPowerModel
                  so_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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月10日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月10日 星期六 农历正月初一 春节 1、 国务院&#xff1a;到2025年&#xff0c;初步建成覆盖各领域、各环节的废弃物循环利用体系。 2、 国家移民管理局&#xff1a;部分国家人员可以用更多事由免签入境海南。 3、 市场…

使用AI开发一个红包封面生成器

使用 VUE3&#xff0c;和 Express 开发一个红包封面。 生成效果如下 体验地址&#xff1a;https://hongbao.digitalmodel.top/

政安晨:示例演绎TensorFlow的官方指南(三){快速使用数据可视化工具TensorBoard}

这篇文章里咱们演绎TensorFLow的数据可视化工具&#xff1a;TensorBoard。 在机器学习中&#xff0c;要改进模型的某些参数&#xff0c;您通常需要对其进行衡量。TensorBoard 是用于提供机器学习工作流期间所需测量和呈现的工具。它使您能够跟踪实验指标&#xff08;例如损失和…

Blender教程(基础)--试图的显示模式-22

一、透视模式&#xff08;AltZ&#xff09; 透视模式下可以实现选中透视的物体信息 发现选中了透视区的所有顶点 二、试图着色模式-显示网格边框 三、试图着色模式-显示实体 三、试图着色模式-材质预览 四、试图着色模式-显示渲染预览

RNA二级结构基础知识+一些绘制程序及用法

整理笔记翻出来的&#xff0c;以下所有程序的测试时间都是2019年11月&#xff0c;不保证现在是否能用。基本都来自论文。 此外&#xff0c;这些程序都属于能用&#xff0c;但是对长序列&#xff08;>3000&#xff09;或者复杂序列不够友好的。 &#xff08;后来我自己写了…

Qt PCL学习(三):点云滤波

注意事项 版本一览&#xff1a;Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容&#xff1a;Qt PCL学习&#xff08;一&#xff09;&#xff1a;环境搭建、Qt PCL学习&#xff08;二&#xff09;&#xff1a;点云读取与保存 0. 效果演示 1. pcl_open_save.pro QT core guigr…

Project 2010下载安装教程,保姆级教程,附安装包和工具

前言 Project是一款项目管理软件&#xff0c;不仅可以快速、准确地创建项目计划&#xff0c;而且可以帮助项目经理实现项目进度、成本的控制、分析和预测&#xff0c;使项目工期大大缩短&#xff0c;资源得到有效利用&#xff0c;提高经济效益。软件设计目的在于协助专案经理发…

除夕快乐(前端小烟花)

家人们&#xff0c;新的一年好运常在&#xff0c;愿大家在新的一年里得偿所愿&#xff0c;发财暴富&#xff0c;愿大家找到属于自己的那个公主&#xff0c;下面就给大家展示一下给公主的烟花 前端烟花 新的一年&#xff0c;新的挑战&#xff0c;愿我们不忘初心&#xff0c;砥砺…

谷歌发布AI新品Gemini及收费模式;宜家推出基于GPT的AI家装助手

&#x1f989; AI新闻 &#x1f680; 谷歌发布AI新品Gemini及收费模式 摘要&#xff1a;谷歌宣布将原有的AI产品Bard更名为Gemini&#xff0c;开启了谷歌的AI新篇章。同时推出了强化版的聊天机器人Gemini Advanced&#xff0c;支持更复杂的任务处理&#xff0c;提供了两个月的…

人力资源智能化管理项目(day04:组织架构)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 树组件应用 <!-- 展示树形结构 --><!-- default-expand-all默认展开所有节点 --><el-tree default-ex…

医学护理答案怎么查找? #笔记#学习方法#微信

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式&#xff0c;可以快速查找问题解析&#xff0c;加深对题目答案的理解。 1.滴墨书摘 这款软件相当于一个在线“摘抄本”&#xff0c;我们可以利用它来记录一些阅读时遇到的好句子或者是段落&#xff0c;或许下次…

Linux操作系统基础(五):Linux的目录结构

文章目录 Linux的目录结构 一、Linux目录与Windows目录区别 二、常见目录介绍&#xff08;记住重点&#xff09; Linux的目录结构 一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概…

【DDD】学习笔记-领域模型与函数范式

函数范式 REA 的 Ken Scambler 认为函数范式的主要特征为&#xff1a;模块化&#xff08;Modularity&#xff09;、抽象化&#xff08;Abstraction&#xff09;和可组合&#xff08;Composability&#xff09;&#xff0c;这三个特征可以帮助我们编写简单的程序。 通常&#…

JavaScript综合练习4

JavaScript 综合练习 4 1. 案例演示 2. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

ES实战-book笔记1

#索引一个文档,-XPUT手动创建索引, curl -XPUT localhost:9200/get-together/_doc/1?pretty -H Content-Type: application/json -d {"name": "Elasticsearch Denver","organizer": "Lee" } #返回结果 {"_index" : "g…

【GO语言卵细胞级别教程】03.条件与循环语句

注意&#xff1a;以下演示所用的项目&#xff0c;在第一章节已经介绍了&#xff0c;这里不做赘述 目录&#xff1a; 【GO语言卵细胞级别教程】03.条件与循环语句1.条件语句1.1 if语句1.1.1 单层if语句1.1.2 if-else语句1.1.3 if-else-if 语句1.1.4 if 嵌套 1.2 switch 语句1.1…

[office] 怎么在Excel2003菜单栏自定义一个选项卡 #其他#微信#知识分享

怎么在Excel2003菜单栏自定义一个选项卡 怎么在Excel2003菜单栏自定义一个选项卡 ①启动Excel2003&#xff0c;单击菜单栏--工具--自定义。 ②在自定义界面&#xff0c;我们单击命令标签&#xff0c;在类别中选择新菜单&#xff0c;鼠标左键按住新菜单&#xff0c;拖放到菜单栏…

【Linux笔记】动静态库的封装和加载

一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段&#xff0c;而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的&#xff0c;或者库是怎么形成的&…

高防服务器出租的优势及特点

高防服务器出租是指租用具备高防御能力的服务器&#xff0c;用于应对网络攻击、保护网站和数据安全。那么为什么会选择高防服务器出租&#xff0c;小编为您整理发布高防服务器出租的优势及特点。 高防服务器通常具备以下特点&#xff1a; 1. 高性能硬件配置&#xff1a;高防服务…

前端工程化面试题 | 01.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…