gem5学习(18):ARM DVFS建模——ARM DVFS modelling

目录

一、Voltage Domains

1、灵活方法:使用命令行标志

2、不太灵活方法:创建 CpuCluster 的子类

二、Clock Domains

三、Adding Clock Domains to an existing simulation

四、The DVFS Handler

1、the number of Voltage Domains does not match the number of Clock Domains

2、no enabled DVFSHandler found


官网教程:gem5: ARM DVFS Support

(温馨提示:笔记置顶有一个gem5学习导览,可以按照自己需要查询对应的博客)

说明:

DVFS(Dynamic Voltage and Frequency Scaling)是一种动态调整处理器电压和频率的技术,旨在根据处理器负载和性能需求来优化功耗和性能之间的平衡。ARM架构支持DVFS,并提供了相应的建模方法。

DVFS建模涉及定义处理器在不同电压和频率下的功耗模型。这可以通过以下步骤完成:

  1. 定义不同电压和频率下的功耗模型:根据处理器的规格和特性,定义不同电压和频率组合下的功耗模型。这些模型通常是基于实际测量数据或根据处理器架构和性能模型进行建模。
  2. 考虑处理器负载和性能需求:DVFS建模还需要考虑处理器负载和性能需求之间的关系。不同的负载和性能需求会导致处理器在不同的电压和频率下工作,从而产生不同的功耗。
  3. 实现DVFS控制算法:DVFS建模还需要实现DVFS控制算法,该算法根据处理器负载和性能需求来选择合适的电压和频率组合。这个算法可以根据实际应用场景进行定制,以实现最佳的功耗和性能平衡。

通过进行ARM DVFS建模,可以更好地理解处理器在不同电压和频率下的功耗特性,并优化处理器的功耗和性能表现。这对于系统级设计、功耗分析和性能优化都非常重要。

与大多数现代CPU一样,ARM CPU支持DVFS。可以通过gem5来对其进行建模,并监控由此产生的功耗使用情况。DVFS建模通过使用Clocked Objects的两个组件来实现:电压域(Voltage Domains)和时钟域(Clock Domains)。本教程详细介绍了不同的组件,并展示了将它们添加到现有仿真中的不同方法。

一、Voltage Domains

电压域(Voltage Domains)规定了CPU可以使用的电压值。在gem5中运行Full System仿真时,如果没有指定电压域(VD),将使用默认值1.0V(伏特)。这是为了避免在用户不希望模拟电压时强制考虑电压。

可以使用单个值或值列表构建电压域,并通过voltage关键字传递给VoltageDomain构造函数。如果指定了单个值和多个频率,则该电压值将用于时钟域中的所有频率。如果指定了电压值列表,其条目数必须与相应的时钟域中的条目数相匹配,并且条目必须按降序排列。与真实硬件一样,电压域适用于整个处理器插槽。这意味着如果要为不同的处理器(例如big.LITTLE设置)使用不同的VD,需要确保big和LITTLE集群位于不同的插槽中(检查与集群相关联的socket_id值)。

有两种方法可以将VD添加到现有的CPU/仿真中,其中一种更灵活,另一种更直观。第一种方法是在提供的configs/example/arm/fs_bigLITTLE.py文件中添加命令行标志,而第二种方法是添加自定义类。

1、灵活方法:使用命令行标志

将电压域添加到仿真中的最灵活方式是使用命令行标志。要添加命令行标志,找到文件中的addOptions函数,并在其中添加标志,可选地附带一些帮助文本。

以下是支持单个和多个电压的示例:

def addOptions(parser):[...]parser.add_argument("--big-cpu-voltage", nargs="+", default="1.0V",help="Big CPU voltage(s).")return parser

可以使用以下方式指定电压域的值:

--big-cpu-voltage <val1>V [<val2>V [<val3>V [...]]]

然后可以在 build 函数中使用 options.big_cpu_voltage 来访问它。nargs="+" 确保至少需要一个参数。下面是在 build 函数中使用的示例:

def build(options):[...]# big clusterif options.big_cpus > 0:system.bigCluster = big_model(system, options.big_cpus,options.big_cpu_clock,options.big_cpu_voltage)[...]

可以添加类似的标志和对构建函数的修改来支持指定 LITTLE CPU 的电压值。这种方法非常方便指定和修改电压值。这种方法唯一的缺点是,多个命令行参数(其中一些是列表形式)可能会使用于调用模拟器的命令显得混乱。

使用基于标志的方法可以解决在运行仿真时指定和修改电压值的问题。通过添加额外的命令行参数,例如 --little_cpu_voltage,可以轻松地指定 LITTLE CPU 的电压值。这样的修改使得在不修改代码的情况下,能够通过命令行直接指定所需的电压值。

然而,随着命令行参数的增加,特别是当参数形式为列表时,命令行可能会变得混乱。这可能会给用户带来一些不便,特别是当需要指定多个不同电压值的时候。

2、不太灵活方法:创建 CpuCluster 的子类

较不灵活的指定电压域的方法是创建 CpuCluster 的子类。类似于现有的 BigCluster 和 LittleCluster 子类,这些子类将扩展 CpuCluster 类。在子类的构造函数中,除了指定 CPU 类型外,还定义了一个电压域值的列表,并将其作为关键字参数 cpu_voltage 传递给超类构造函数的调用。以下是一个示例,用于向 BigCluster 添加电压:

class VDBigCluster(devices.CpuCluster):def __init__(self, system, num_cpus, cpu_clock=None, cpu_voltage=None):# use the same CPU as the stock BigClusterabstract_cpu = ObjectList.cpu_list.get("O3_ARM_v7a_3")# voltage value(s)my_voltages = [ '1.0V', '0.75V', '0.51V']super(VDBigCluster, self).__init__(cpu_voltage=my_voltages,system=system,num_cpus=num_cpus,cpu_type=abstract_cpu,l1i_type=devices.L1I,l1d_type=devices.L1D,wcache_type=devices.WalkCache,l2_type=devices.L2)

这段代码定义了一个名为 VDBigCluster 的自定义类,继承自 devices.CpuCluster。该类的作用是创建一个具有可调节电压(DVFS)功能的 CPU 集群。

在 VDBigCluster 类的构造函数中,有以下关键操作:

  1. 初始化 abstract_cpu

    • 通过 ObjectList.cpu_list.get("O3_ARM_v7a_3") 获取一个名为 "O3_ARM_v7a_3" 的 CPU 对象。这个 CPU 对象代表了用于 BigCluster 的 CPU,可能是一个 ARM 架构的 O3 处理器。
  2. 定义电压值列表 my_voltages

    • 在这个示例中,my_voltages 定义了三个不同的电压值:'1.0V'、'0.75V' 和 '0.51V'。这些电压值将用于创建电压域。
  3. 调用父类的构造函数 super(VDBigCluster, self).__init__(...)

    • 这里使用了 super() 函数来调用父类 devices.CpuCluster 的构造函数。
    • 通过传递相应的参数,包括 cpu_voltage(电压值列表)、systemnum_cpus(CPU 数量)、cpu_type(CPU 类型)、l1i_type(L1I Cache 类型)、l1d_type(L1D Cache 类型)、wcache_type(WalkCache 类型)和 l2_type(L2 Cache 类型),创建了一个具有指定电压值的 CPU 集群。

通过调用这个类的构造函数,可以创建具有不同电压的 CPU 集群对象,用于后续的仿真和研究。

要将电压添加到 LittleCluster,可以定义一个类似的 VDLittleCluster 类。

在定义子类后,我们仍然需要在文件中的 cpu_types 字典中添加一个条目,指定一个字符串名称作为键,以及一对类作为值。例如:

cpu_types = {[...]"vd-timing" : (VDBigCluster, VDLittleCluster)
}

通过传递已定义的 VD 类型,可以使用具有电压域(VD)的 CPU。

--cpu-type vd-timing

由于修改电压值需要找到正确的子类并修改其代码,或添加更多的子类和 cpu_types 条目,所以这种方法比基于标志的方法要灵活性较差。

使用子类和 cpu_types 的方式确实不如基于标志的方式灵活。当需要修改电压值时,必须修改代码并重新构建仿真环境。这种方式需要更多的手动操作,并且不够直观,特别是在需要频繁更改电压值时。

相比之下,基于标志的方法更加灵活和易于使用。通过命令行标志,可以在不修改代码的情况下指定电压值,从而实现动态的电压调整。例如,在上述的示例中,使用 `--big_cpu_voltage` 标志可以直接指定所需的电压值,而不需要修改代码或创建额外的子类。

因此,对于需要频繁修改电压值或希望提供更大灵活性的情况,使用基于标志的方法是更好的选择。这种方法使得在运行仿真时能够直接指定电压值,而不需要手动修改代码或创建额外的子类。

二、Clock Domains

电压域(Voltage Domains)通常与时钟域(Clock Domains)一起使用。如前所述,如果没有指定自定义的电压值,则时钟域中的所有值都使用默认值 1.0V。

时钟域有三种类型(来自 src/sim/clock_domain.hh):

  1. ClockDomain:为一组位于同一时钟域下的时钟对象提供时钟。时钟域进一步分组为电压域。时钟域提供了一个具有“源”和“派生”时钟域的分层结构支持。

  2. SrcClockDomain:提供与可调节时钟源连接的时钟域的概念。它维护时钟周期,并提供设置/获取时钟的方法,以及由处理器管理的时钟域的配置参数。这些参数包括不同性能级别下的频率值、域 ID 和当前性能级别。需要注意的是,软件请求的性能级别对应于时钟域可以操作的频率操作点之一。

  3. DerivedClockDomain:提供了一个与父时钟域连接的时钟域的概念,父时钟域可以是 SrcClockDomain 或 DerivedClockDomain。它维护时钟分频器,并提供获取时钟的方法。

时钟域和电压域的结合提供了对处理器和系统中时钟和电压的灵活控制。时钟域用于定义时钟的层次结构,并提供与时钟源和时钟频率相关的配置参数。电压域用于定义不同组件的电压值,并允许根据需求调整电压。

三、Adding Clock Domains to an existing simulation

这个示例将使用与电压域示例相同的文件,即 configs/example/arm/fs_bigLITTLE.py 和 configs/example/arm/devices.py。

与电压域类似,时钟域可以是单个值或值的列表。如果给出了一个时钟速度列表,那么与给定电压域值列表的规则相同,即时钟域中的值数量必须与电压域中的值数量相匹配,并且时钟速度必须按降序给出。提供的文件支持将时钟指定为单个值(通过 --{big,little}-cpu-clock 标志),但不支持作为值列表指定。扩展/修改提供的标志的行为是添加对多值时钟域支持的最简单和最灵活的方式,但也可以通过添加子类来实现。

要向现有的 --{big,little}-cpu-clock 标志添加多值支持,请定位 configs/example/arm/fs_bigLITTLE.py 文件中的 addOptions 函数。在各种 parser.add_argument 调用中,找到添加 CPU 时钟标志的那些,并将 kwarg type=str 替换为 nargs="+":

def addOptions(parser):[...]parser.add_argument("--big-cpu-clock", nargs="+", default="2GHz",help="Big CPU clock frequency.")parser.add_argument("--little-cpu-clock", nargs="+", default="1GHz",help="Little CPU clock frequency.")[...]

在这里使用 system.numCpuClusters() 是因为时钟域适用于整个集群(cluster),即第一个集群的编号为0,第二个集群的编号为1,依此类推。

如果您不设置域 ID,在尝试运行支持 DVFS 的仿真时,会出现以下错误,因为一些内部检查会捕获默认的域 ID:

--{big,little}-cpu-clock <val1>GHz [<val2>MHz [<val3>MHz [...]]]

四、The DVFS Handler

1、the number of Voltage Domains does not match the number of Clock Domains

如果您指定了电压域(VDs)和时钟域(CDs),然后尝试运行仿真,它可能会运行,但可能会在输出中注意到以下警告:

warn: You have specified both Voltage Domains and Clock Domains, but the number of Voltage Domains does not match the number of Clock Domains.

这个警告表明您在配置中同时指定了电压域和时钟域,但电压域的数量与时钟域的数量不匹配。

要解决这个警告,需要确保电压域和时钟域的数量相匹配。可以通过添加或删除电压域或时钟域来调整它们的数量,以使它们一致。

例如,如果有两个电压域和三个时钟域,可以添加一个额外的电压域或删除一个时钟域,以使它们的数量匹配。

一旦调整了电压域和时钟域的数量,警告就会消失,并且可以继续运行仿真。确保在配置中正确设置电压域和时钟域的数量可以确保Gem5按预期工作,并获得准确的仿真结果。

2、no enabled DVFSHandler found

warn: Existing EnergyCtrl, but no enabled DVFSHandler found.

如果您已经添加了VDs(电压域)和CDs(时钟域),但系统无法与DVFSHandler(动态电压频率调节处理器)进行接口交互以调整数值,则最简单的方法是在configs/example/arm/fs_bigLITTLE.py文件中添加另一个命令行标志。

请按照VD和CD示例的方式,在文件中找到addOptions函数,并在其中追加以下代码:

def addOptions(parser):[...]parser.add_argument("--dvfs", action="store_true",help="Enable the DVFS Handler.")return parser

然后,在 build 函数中追加以下代码:

def build(options):[...]if options.dvfs:system.dvfs_handler.domains = [system.bigCluster.clk_domain,system.littleCluster.clk_domain]system.dvfs_handler.enable = options.dvfsreturn root

有了这些代码,现在能够在调用仿真时使用 --dvfs 标志运行支持DVFS的仿真,并根据需要指定大核心和小核心集群的电压和频率操作点。

例如,可以使用以下命令行来运行DVFS仿真:

./build/ARM/gem5.opt --dvfs --big-voltage 1.2V --little-voltage 0.9V --big-cpu-clock 2GHz 1.5GHz --little-cpu-clock 1.2GHz 900MHz configs/example/arm/fs_bigLITTLE.py

在这个示例中,--dvfs 标志用于启用DVFS功能。--big-voltage 和 --little-voltage 用于分别指定大核心和小核心集群的电压值。--big-cpu-clock 和 --little-cpu-clock 用于分别指定大核心和小核心集群的频率值。

可以根据需要调整这些值,以满足实际需求。通过使用这些命令行选项,Gem5将会加载指定的DVFSHandler,并根据您提供的电压和频率操作点进行动态调整。

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

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

相关文章

养好花草鱼鸟,也能旺家

不少朋友家里既养了鱼鸟&#xff0c;也养了花草&#xff0c;平时逗逗鸟喂喂鱼再赏赏花&#xff0c;真是非常惬意的生活&#xff0c;而用养鱼的水养植物&#xff0c;花草植物会长得格外茂盛。根据这一原理&#xff0c;很多人喜欢在养一些水培花草的时候&#xff0c;顺便养几尾小…

基于SpringBoot+Vue的外卖点餐管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

SSM框架,Maven的学习(下)

依赖传递和依赖冲突 依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B&#xff0c;而 B 又依赖于模块或库 C&#xff0c;那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时&#xff0c;构建工具&#xff08;如 Maven、Gradle&…

2024.02.05

复习单向&#xff0c;双向链表&#xff0c;并且实现两种链表的增加和删除功能。 单链表头插 Linklist insert_head(datatype element,Linklist head) { //创建新节点 Linklist screate_node(); if(NULLs) return head; s->dataelement; //1,判断链表为空 if(NULLhea…

第三篇:SQL数据模型、通用语法和语法分类

一&#xff0c;SQL数据模型 &#xff08;一&#xff09;关系型数据库&#xff08;RDBMS&#xff09; 1.概念 &#xff08;百度百科&#xff09;指采用了关系模型来组织数据的数据库&#xff0c;其以行和列的形式存储数据&#xff0c;以便于用户理解&#xff0c;关系型数据库这…

【蓝桥杯选拔赛真题64】python数字塔 第十五届青少年组蓝桥杯python 选拔赛比赛真题解析

python数字塔 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要求 (注:input()输入函数的括号中不允许添加任何信息) 提示信息: 数字塔是由 N 行数堆积而成,最顶层只有一个数,次顶层两个数,以此类推。相邻层之间的数用线连接,下一层的每个数与它上一层左上…

网络安全大赛

网络安全大赛 网络安全大赛的类型有很多&#xff0c;比赛类型也参差不齐&#xff0c;这里以国内的CTF网络安全大赛里面著名的的XCTF和强国杯来介绍&#xff0c;国外的话用DenCon CTF和Pwn2Own来举例 CTF CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相…

EasyX图形库学习(三、用easyX控制图形界面中的小球、图片-加载、输出)

目录 小球视频 图像输出函数 loadimage用于从文件中读取图片 putimage在当前设备上绘制指定图像。 initgraph 函数 图片输出 代码详解&#xff1a; 1. 初始化图形界面 2. 设置背景颜色并清除屏幕 3. 加载并显示图片 4. 等待用户输入并退出程序 图形界面中的小球 1…

在云计算环境下保护Java应用程序的有效措施

云计算&#xff08;Cloud&#xff09;技术是近年来计算机科学的一个重要突破。大多数组织已经通过将自己的应用程序移入云平台而获益。不过&#xff0c;如何保证应用程序在第三方服务器上的安全性&#xff0c;是一项艰巨的挑战。 在本文中&#xff0c;我们将重点讨论Java&…

C++ dfs搜索枚举(四十八)【第八篇】

曾经我们讲过枚举算法&#xff0c;那假设我们把枚举算法应用到搜索里呢&#xff1f; 1.搜索枚举 以前我们在进行枚举的时候是用了多层循环嵌套&#xff0c;但是当枚举的变量过多或者是输入的数量的时候就很难利用循环完成枚举了&#xff0c;不过我们可以尝试利用搜索进行枚举。…

自动化诊断测试之CANoe.DIVA入门

目录 0 前言 1 CANoe.DIVA基础 2 CANoe.DIVA TIPs 0 前言 写在前面&#xff1a;如对本文有任何疑问欢迎评论区讨论&#xff0c;希望和大家一起进步。同时HIL测试群欢迎大家加入如有需要也可私信我拉你。VT和DIVA都可以做UDS的自动化测试&#xff0c;但相对VT来说使用DIVA生成…

Redis学习及总结

Redis 快速入门 Redis属于非关系型数据库 SQL应用场景 数据结构固定相关业务对数据安全性一致性要求高 NoSQL应用场景 数据结构不固定对一致性&#xff0c;安全性要求不高性能要求高 &#x1f3af;需要使用Xftp 传输压缩包到虚拟机上 安装好Redis后&#xff0c; 执行命令…

系统架构设计师-21年-上午答案

系统架构设计师-21年-上午答案 更多软考资料 https://ruankao.blog.csdn.net/ 1 ~ 10 1 前趋图(Precedence Graph)是一个有向无环图&#xff0c;记为:→{(Pi,Pj)|Pi must complete before Pj may strat}&#xff0c;假设系统中进程P{P1&#xff0c;P2&#xff0c;P3&#xf…

UE5 PAK包热加载

参考知乎UE5 Pak学习与应用&#xff08;一&#xff09;运行时导入模型 - 知乎 使用的版本为UE5.1 使用插件为HorPatcher和EasyFile Dialog HotPatcher:UE资源热更打包工具HotPatcher | 循迹研究室 ,Github地址为:GitHub - hxhb/HotPatcher: Unreal Engine hot update manage …

最小生成树超详细介绍

目录 一.最小生成树的介绍 1.最小生成树的简介 2.最小生成树的应用 3.最小生成树的得出方法 二.Kruskal算法 1.基本思想&#xff1a; 2.步骤&#xff1a; 3.实现细节&#xff1a; 4.样例分析&#xff1a; 5.Kruskal算法代码实现&#xff1a; 三.Prim算法 1.基本思想…

【多模态大模型】视觉大模型SAM:如何使模型能够处理任意图像的分割任务?

SAM&#xff1a;如何使模型能够处理任意图像的分割任务&#xff1f; 核心思想起始问题: 如何使模型能够处理任意图像的分割任务&#xff1f;5why分析5so分析 总结子问题1: 如何编码输入图像以适应分割任务&#xff1f;子问题2: 如何处理各种形式的分割提示&#xff1f;子问题3:…

【数据结构和算法】--- 基于c语言排序算法的实现(1)

目录 一、排序的概念及其应用1.1排序的概念1.2 排序的应用1.3 常见的排序算法 二、插入排序2.1直接插入排序2.2 希尔排序2.2.1 预排序2.2.2 缩小gap2.2.3 小结 三、选择排序3.1 直接选择排序3.2 堆排序 一、排序的概念及其应用 1.1排序的概念 排序&#xff1a; 所谓排序&…

RTE2023第九届实时互联网大会:揭秘未来互联网趋势,PPT分享引领行业新思考

随着互联网的不断发展&#xff0c;实时互动技术正逐渐成为新时代的核心驱动力。 在这样的背景下&#xff0c;RTE2023第九届实时互联网大会如期而至&#xff0c;为业界人士提供了一个探讨实时互联网技术、交流创新理念的绝佳平台。 本文将从大会内容、PPT分享价值等方面&#…

ShardingSphere 5.x 系列【6】YAML 配置介绍

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. YamlConfiguration3. 常用配置项3.1 JDBC 驱动3.2 数据源3.3 规则…

mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境 创建对应的数据库&#xff0c;然后写脚本向数据库中写入400万条的数据 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20…