赞
踩
Garnet 可以用与full system或者standalone模式。standalone模式很多人写过,但是full system模式没有,而且涉及到可用的实验结果的,例如parsec的,更是几乎没有。这里主要是讲garnet的overview,topology,还有频率/DVFS。
如果要用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
如果打开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的传输。
是的,如果要一行行看garnet的源代码的话,我们应该每一个c++代码的读下来。但是很显然,在那之前,我们应该读懂每一个文件在干什么然后再逐行读c++代码。而python文件,提供了一个知其然的选项,让我们了解garnet的网络构建。
先是引入了 from m5.objects.Network import RubyNetwork, 我们不妨碍先默认RubyNetwork是一个存在的黑匣子。
作为gem5自己定义的simple objects, rubynetwork是可以继承的。 GarnetNetwork.py 里,这个python class继承了rubynetwork并细化。
然后还继承了ClockedObject来创建 NI:
在ruby的basic router之上,创建了新的GarnetRouter
GarnetNetwork是继承了RubyNetwork的,那么RubyNetwork是什么样子的呢?
network.hh很显然就用了c++的部分, 然后我们粗略的看看用到了什么:
Ruby文件夹下的network.cc
本身也是继承了一个c++里的clockobject
读了一些参数,
根据node数目,创建了一个topology结构
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++也没有这个设置。
但其实GarnetNetwork.cc也只有这一行和mesh有关,所以下文会介绍topology其实是由python文件定义的。
Each topology is a python file in configs/topologies/
千辛万苦终于找到了拓扑结构了。
为什么要这么一路写下来呢?因为
Garnet 支持的topp如下
NoC可调整的部分很多,比如VC,buffer,noc的topo结构等。我们刚刚看了一个大概,看到哪里可以调整mesh或其他,但是最常用的mesh——xyrouting已经足够用了。 我的研究之一会涉及 NoC DVFS的设计,那让我们来看看 Garnet是怎么设计频率相关的部分呢?
根据我(截至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的这个文章。
他们2
不来梅大学2014 DVFS的文章是这么写gem5的:
不来梅大学2014 DVFS的文章是这么用dvfs的
然后他们是这样用dvfs的。
cpu的dvfs其实很好理解,也很容易让研究NoC的人误解。 比如我,就耽误了很长的时间去思考cpu (更严谨的说,ISA)的DVFS。
可是NoC in GEM5的 DVFS,其实只需要Garnet。
(啊。多么痛的领悟。)
在2017年以前(以及当下,如果我没错的话),garnet并不支持多频率,而是保持与ruby一致。
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用的多说明等的多,所以加功耗提速度。然后他们手动设了这几个阈值来根据负载调节频率。
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级别,导致功率供应过多或不足,从而导致能源效率较低。”
整个NoC网络或者单个路由器,在TVD里都算做了NoC级别。
扩展了一下NoC DVFS,算上了l2 缓存,因为l1是core私有的,l2是共享的。功能
粗暴的说,cpu(严谨的说,core)的dvfs,工作有很多,但不是这个文章和我们的关心的点,挺多不涉及gem5的工作,先跳过。
就是把整个芯片分为不同的子区域,以8x8=64核cpu为例,可以分为一个大岛也可以分为4个4x4的小岛。TVD就是这么干的,只不过TVD分的是16个小岛,每个岛是2x2=4个core。
而同时,core还是2GHz的 Alpha cpu。(当年还有alpha架构,现在学术界主流都没有这个里。。所以很多东西都要重跑实验。 但是原理还是相通的)
最后总结,要用garnet就要用ruby,ruby是在mem下面的。也就是说,GEM5仿真的board设置,需要设为ruby,才可以有NoC的相关功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。