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

news2024/9/23 1:29:56

目录

一、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

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

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

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

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

相关文章

掌握Web服务器之王:Nginx 学习网站全攻略!

介绍&#xff1a;Nginx是一款高性能的Web服务器&#xff0c;同时也是一个反向代理、负载均衡和HTTP缓存服务器。具体介绍如下&#xff1a; 轻量级设计&#xff1a;Nginx的设计理念是轻量级&#xff0c;这意味着它在占用最少的系统资源的同时提供高效的服务。 高并发能力&#x…

ROS笔记二:launch

目录 launch node标签 参数 参数服务器 节点分组 launch launch文件是一种可以可实现多节点启动和参数配置的xml文件,launch文件用于启动和配置ROS节点、参数和其他相关组件。launch文件通常使用XML格式编写&#xff0c;其主要目的是方便地启动ROS节点和设置节点之间的连…

【Unity优化(一)】音频优化

整理资教程&#xff1a;https://learn.u3d.cn/tutorial/unity-optimization-metaverse 1.音频优化 音频一般不会成为性能瓶颈&#xff0c;是为了节省内存和优化包体大小。 1.0 文件格式和压缩格式 原始音频资源尽量采用WAV格式。 移动平台音频尽量采用Vorbis压缩格式&#x…

PyTorch 2.2 中文官方教程(十八)

开始使用完全分片数据并行&#xff08;FSDP&#xff09; 原文&#xff1a;pytorch.org/tutorials/intermediate/FSDP_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Hamid Shojanazeri&#xff0c;Yanli Zhao&#xff0c;Shen Li 注意…

微信小程序学习指南:从基础知识到代码展示

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Windows系统安装Flink及实现MySQL之间数据同步

Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。Flink的设计目标是在所有常见的集群环境中运行&#xff0c;并以内存执行速度和任意规模来执行计算。它支持高吞吐、低延迟、高性能的流处理&#xff0c;并且是一个面向流处理和批处理…

【Leetcode】292. Nim 游戏

文章目录 题目思路代码结果 题目 题目链接 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c; 你作为先手 。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每…

C++ 动态规划 状态压缩DP 最短Hamilton路径

给定一张 n 个点的带权无向图&#xff0c;点从 0∼n−1 标号&#xff0c;求起点 0 到终点 n−1 的最短 Hamilton 路径。 Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数 n 。 接下来 n 行每行 n 个整数&#xff0c;其中第 i 行…

【MySQL】学习如何使用DCL进行用户管理

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-JwFD16F1Kh0fle0X {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

百面嵌入式专栏(面试题)进程管理相关面试题1.0

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍进程管理相关面试题 。 一、进程管理相关面试题 进程是什么?操作系统如何描述和抽象一个进程?进程是否有生命周期?如何标识一个进程?进程与进程之间的关系如何?Linux操作系统的进程0是什么?Linux操…

OJ_浮点数加法(高精度运算)

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<map> #include<string> using namespace std;string GetInteger(string a) {return a.substr(0, a.find(.)); }string GetFraction(string a) {return a.substr(a.find(.) 1 ,a.siz…

记一次VulnStack渗透

信息收集 netdiscover的主机发现部分不再详解&#xff0c;通过访问端口得知20001-2003端口都为web端口&#xff0c;所以优先考虑从此方向下手 外网渗透 GetShell Struct漏洞 访问2001端口后&#xff0c;插件Wappalyzer爬取得知这是一个基于Struct的web站点&#xff0c;直接…

浅谈bypass Etw

文章目录 c#ExecuteAssemblybypass etw c# loader 一种是通过反射找到指定空间的类中method进行Invoke 另一种是通过EntryPoint.Invoke加载 反射加载 Assembly.Load()是从String或AssemblyName类型加载程序集&#xff0c;可以读取字符串形式的程序集 Assembly.LoadFrom()从指定…

记录下Flybirds移动端ui自动化框架的搭建

一、参考文档 1.官方文档&#xff1a;携程机票跨端跨框架 BDD UI 自动化测试方案Flybirds — flybirds v0.1.5 文档 2.Flybirds运行环境&#xff1a;Flybirds运行环境 - 简书 3.Windows系统连接IOS安装tidevice&#xff1a;iOS自动化之tidevice-CSDN博客 二、Windows系统演…

Nacos注册中心和服务发现

Nacos注册中心 01 认识和安装Nacos Nacos比Eureka功能更为丰富&#xff0c;是SpringCloud中的一个组件&#xff0c;Nacos是阿里巴巴的产品&#xff0c;在国内更流行。 NACOS功能&#xff1a;服务发现&#xff08;对标Eureka)、配置管理、服务管理 下载见&#xff1a;D:\zwx\…

【EI会议征稿通知】第三届智能控制与应用技术国际学术会议(AICAT 2024)

第三届智能控制与应用技术国际学术会议&#xff08;AICAT 2024&#xff09; 2024 3rd International Symposium on Artificial Intelligence Control and Application Technology 2024年第三届智能控制与应用技术国际学术会议&#xff08;AICAT 2024&#xff09;定于2024年5月…

jquery写表格,通过后端传值,并合并单元格

<!DOCTYPE html> <html> <head><title>Table Using jQuery</title><style>#tableWrapper {width: 100%;height: 200px; /* 设置表格容器的高度 */overflow: auto; /* 添加滚动条 */margin-top: -10px; /* 负的外边距值&#xff0c;根据实际…

BT656视频传输标准

前言 凡是做模拟信号采集的&#xff0c;很少不涉及BT.656标准的&#xff0c;因为常见的模拟视频信号采集芯片都支持输出BT.656的数字信号&#xff0c;那么&#xff0c;BT.656到底是何种格式呢&#xff1f; 本文将主要介绍 标准的 8bit BT656&#xff08;4:2:2&#xff09;YCbC…

时间序列预测 —— DeepAR 模型

时间序列预测 —— DeepAR 模型 DeepAR 模型是一种专门用于处理时间序列概率预测的深度学习模型&#xff0c;它可以自动学习数据中的复杂模式&#xff0c;提高预测的准确性。本文将介绍 DeepAR 模型的理论基础、优缺点&#xff0c;并通过 Python 实现单步预测和多步预测的完整…

git整合分支的两种方法——合并(Merge)、变基(Rebase)

问题描述&#xff1a; 初次向git上传本地代码或者更新代码时&#xff0c;总是会遇到以下两个选项。有时候&#xff0c;只是想更新一下代码&#xff0c;没想到&#xff0c;直接更新了最新的代码&#xff0c;但是自己本地的代码并没有和git上的代码融合&#xff0c;反而被覆盖了…