当前位置:   article > 正文

GEM5 Garnet 代码解读:for x86 parsec full system configuration_gem5 源代码解析

gem5 源代码解析

Garnet 可以用与full system或者standalone模式。standalone模式很多人写过,但是full system模式没有,而且涉及到可用的实验结果的,例如parsec的,更是几乎没有。这里主要是讲garnet的overview,topology,还有频率/DVFS

1. Garnet overview

如果要用GEM5研究NoC,其实只需要看garnet的部分就可以。 GEM5 很大,ruby也很大,各种memroy hierachy和ISA 很复杂。但我花了很久才意思到,只看noc的话,可以只看garnet的部分,而garnet的文件夹下,就是下图中的38个文件。
在这里插入图片描述
garnet可以作为stand alone模式,但是教程已经很多了。 Ful system, 要怎么用呢? 其实就是下面的 --network=garnet 或者 --network=simple 。

./build/X86/gem5.opt \
                      configs/example/ruby_random_test.py \
                      --num-cpus=16  \
                      --num-dirs=16  \
                      --network=garnet
                      --topology=Mesh_XY  \
                      --mesh-rows=4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.1 Garnet 与ruby的关系

如果打开ruby_random_test.py或者其他能用garnet的python文件,会发现并没有直接的import garnet。 那么, garnet要怎么才能从一个最上层最靠近用户命令行的python文件(例如ruby_random_test.py,或者不能调用garnet的x86-parsec-benchmarks.py )里被调用呢?我们就得看一下ruby了。
src里mem文件夹下有很多复杂的文件如下图。
在这里插入图片描述
不用担心,我们先只看ruby。
在这里插入图片描述
依旧很复杂,也很正常。
我们继续看network:好的,我们终于看到garnet了。
在这里插入图片描述
小结: garnet是mem文件夹下,ruby的network的实现的一种,在ruby的network里,garnet之外的另一个选项是simple。
用图看的话,总结就是如下:garnet是ruby memory system下的,通过细化message buffer的变化,来模拟noc的传输。
在这里插入图片描述

2. Garnet 的网络构建: topology

是的,如果要一行行看garnet的源代码的话,我们应该每一个c++代码的读下来。但是很显然,在那之前,我们应该读懂每一个文件在干什么然后再逐行读c++代码。而python文件,提供了一个知其然的选项,让我们了解garnet的网络构建。

2.1 GarnetNetwork.py 新建了三个组件

2.1.1 GarnetNetwork

先是引入了 from m5.objects.Network import RubyNetwork, 我们不妨碍先默认RubyNetwork是一个存在的黑匣子。
作为gem5自己定义的simple objects, rubynetwork是可以继承的。 GarnetNetwork.py 里,这个python class继承了rubynetwork并细化。
在这里插入图片描述

2.1.2 GarnetNetworkInterface

然后还继承了ClockedObject来创建 NI:
在这里插入图片描述

2.1.3GarnetRouter

在ruby的basic router之上,创建了新的GarnetRouter
在这里插入图片描述

2.2 关于组件GarnetNetwork 解读

GarnetNetwork是继承了RubyNetwork的,那么RubyNetwork是什么样子的呢?
在这里插入图片描述
network.hh很显然就用了c++的部分, 然后我们粗略的看看用到了什么:
Ruby文件夹下的network.cc
本身也是继承了一个c++里的clockobject
在这里插入图片描述

读了一些参数,
在这里插入图片描述
根据node数目,创建了一个topology结构
在这里插入图片描述

2.2.1 GarnetNetwork的 Topology

2.2.1.1 gem5/src/mem/ruby/network/Topology.cc

gem5/src/mem/ruby/network/network.cc 还有一些c++功能后面再详解,我们先看这个noc网络是怎zai 构建的,因此我们去看gem5/src/mem/ruby/network/Topology.cc,可这里面并没有mesh一类,只有一下定义如何连接link的函数,例如:
在这里插入图片描述
而在gem5/src/mem/ruby/network/simple/SimpleNetwork.cc 里也没有mesh。说明NoC的mesh在c++层面看,是garnet c++独有的,而不是从ruby c++继承的,同时simplenetwork c++也没有这个设置。

2.2.1.2 gem5/src/mem/ruby/network/garnet/GarnetNetwork.cc

但其实GarnetNetwork.cc也只有这一行和mesh有关,所以下文会介绍topology其实是由python文件定义的。
在这里插入图片描述

2.2.1.3 python 里的 topology

Each topology is a python file in configs/topologies/

千辛万苦终于找到了拓扑结构了。
为什么要这么一路写下来呢?因为

  1. 我确实是这么一路读代码找下来的
  2. 本身确实是有可能写成c++的函数又或者如gem5一样用python来写,这都是个选择而已,不亲眼看到,并不能确定gem5群体的选择。
  3. 如果要更改拓扑结构,也因此可以知道需要在c++代码里改可以复用很多次的代码,或在python里很轻松的,利用已有的接口改。

在这里插入图片描述
Garnet 支持的topp如下
在这里插入图片描述

3. Garnet 的频率和DVFS/freq

NoC可调整的部分很多,比如VC,buffer,noc的topo结构等。我们刚刚看了一个大概,看到哪里可以调整mesh或其他,但是最常用的mesh——xyrouting已经足够用了。 我的研究之一会涉及 NoC DVFS的设计,那让我们来看看 Garnet是怎么设计频率相关的部分呢?

3.1 CPU的DVFS

根据我(截至2023年底)看到的研究,gem5官方的arm ISA 支持dvfs,但是x86并不支持。Multi2Sim, Gem5, Sniper
and ZSim 可以联合McPAT做 energy consumption modeling。

Introducing DVFS-Management in a Full-System Simulator 2013 这篇文章说2013年以前full system 不支持dvfs,而他们引入了。他们也被gem5 20.0+文章引用了。可惜的是,他们的作者是uu.se 和arm的研究员们,也就是瑞典乌普萨拉大学和arm的雇员,所以他们没有提出x86的可用于gem5的dvfs也在意料之中。
下图的是他们的ARM dvfs,用的一个三星处理器作为参照:
在这里插入图片描述

让我们看看谁引用了这个Introducing DVFS-Management in a Full-System Simulator :
20年的review:DVFS and Its Architectural Simulation Models for Improving Energy Efficiency of Complex Embedded Systems in Early Design Phase 对比了挺多dvfs的,关于gem5的dvfs 一下他们(德国不来梅大学)自己2014年和arm 2013的这个文章。
在这里插入图片描述
他们20
不来梅大学2014 DVFS的文章是这么写gem5的:
在这里插入图片描述
不来梅大学2014 DVFS的文章是这么用dvfs的
在这里插入图片描述
然后他们是这样用dvfs的。
在这里插入图片描述

3.2 NoC in GEM5 的dvfs

cpu的dvfs其实很好理解,也很容易让研究NoC的人误解。 比如我,就耽误了很长的时间去思考cpu (更严谨的说,ISA)的DVFS。
可是NoC in GEM5的 DVFS,其实只需要Garnet。
(啊。多么痛的领悟。)

在2017年以前(以及当下,如果我没错的话),garnet并不支持多频率,而是保持与ruby一致。
在这里插入图片描述

BLD 路由器缓存负载dvfs / buffer load

A. K. Mishra, R. Das, S. Eachempati, R. Iyer, N. Vijaykrishnan and C. R. Das, “A case for dynamic frequency tuning in on-chip networks”, Proc. Int. Symp. Microarchitecture, pp. 292-303, 2009.
实现了基于纯粹NoC 网络的路由缓存负责的电压频率调节dvfs。他们没用gem5,而是直接根据buffer使用率来决定频率:
buffer用的多说明等的多,所以加功耗提速度。然后他们手动设了这几个阈值来根据负载调节频率。
在这里插入图片描述

TVD 线程投票dvfs / thread oting

Z. Lu and Y. Yao, “Thread Voting DVFS for Manycore NoCs,” in IEEE Transactions on Computers, vol. 67, no. 10, pp. 1506-1524, 1 Oct. 2018, doi: 10.1109/TC.2018.2827039.
在纯粹NoC路由之外,还有更高的层次可以优化呀,比如完成一个程序的时间: 这里就用到了gem5结合的parsec benchmark了。
在程序这个层面,不同线程之间数据是有依赖性/dependancy,程序对网络利用率和数据共享特性的敏感程度不一,TVD 的文章就委婉的说:“由于上述原因,仅依赖于网络级度量的NoC DVFS机制可能会不适当地调整片上V/F级别,导致功率供应过多或不足,从而导致能源效率较低。”

TVD 讨论的 DVFS 颗粒度
NoC DVFS

整个NoC网络或者单个路由器,在TVD里都算做了NoC级别。

uncore DVFS

扩展了一下NoC DVFS,算上了l2 缓存,因为l1是core私有的,l2是共享的。功能

core DVFS

粗暴的说,cpu(严谨的说,core)的dvfs,工作有很多,但不是这个文章和我们的关心的点,挺多不涉及gem5的工作,先跳过。

Island DVFS

就是把整个芯片分为不同的子区域,以8x8=64核cpu为例,可以分为一个大岛也可以分为4个4x4的小岛。TVD就是这么干的,只不过TVD分的是16个小岛,每个岛是2x2=4个core。

而同时,core还是2GHz的 Alpha cpu。(当年还有alpha架构,现在学术界主流都没有这个里。。所以很多东西都要重跑实验。 但是原理还是相通的)

总结

最后总结,要用garnet就要用ruby,ruby是在mem下面的。也就是说,GEM5仿真的board设置,需要设为ruby,才可以有NoC的相关功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/489250
推荐阅读
相关标签
  

闽ICP备14008679号