Simpoint - 0x0 原理和步骤


做CPU微架构就绕不过simpoint,为了度量所实现的微架构的性能,通常都需要在新架构上运行一些大型的benchmark程序,俗称跑分。benchmark也是多种多样,遍地开发,没有约束的情况下容易出现厂商修改benchmark程序或编译参数以获取看起来更高的跑数,但程序的优化也导致了分数不能完全体现微架构的真正性能。在多种多样的跑分软件中,SPEC基本上称霸了CPU性能测试的江湖,SPEC对厂商有强约束条件,在跑分时需要严格按照规定的规则运行SPEC benchmark程序,跑出的分数也就更能体现微架构的性能。SPEC先按下不表,本文先关注在simpoint,接下来就讲下simpoint的由来和作用。

既然是作微架构研究,就肯定是要在流片前完成,没有流片而又需要在上面跑程序就只有两种方法:软件模拟CPU微架构;FPGA原型验证。FPGA原型验证需要在RTL完成后进行功能仿真、综合、P&R和时序仿真,然后才能在FPGA上运行,周期长,代价高。软件模拟有可以分为两种:EDA功能仿真后进行benchmark跑分,这种方式其实是FPGA原型验证中的一环,速度感人;直接用软件模拟CPU各组件,实现模块级的cycle accurate,这种是目前最常用的,功能和架构上跟最终的CPU微架构更接近,速度也可以接受,而GEM5就是这种类型的模拟器中的佼佼者,也是当前微架构研究使用最广泛的,既可以做CPU微架构的研究也可以做memory Hierarchy的性能研究。

但即便是已经使用了GEM5这种性能较好的模拟器,要运行大型程序,如SPEC中包含的benchmark程序,速度上也是较长。为了提高效率,各路大神奇招百出,而simpoint就是很棒的一种方法。说来simpoint思想也跟简单,就是把程序运行时所执行的指令流切段,然后把各段进行聚合,就是把相似的段归到一类,然后在每个聚类中选取一个指令段做代表,使用GEM5仿真的时候只执行选取出的指令段运行,然后根据每个聚类的大小对执行的指令段加权重,再加到一起就是原程序的跑分结果。实验证明在指令集和编译器相同的情况下,与原程序跑分结果约等,可以作为相同指令集/编译器情况下的微架构性能对比。

根据上面的描述,完成simpoint需要如下步骤:

1.Basic block vector(BBV)。basic block是参考2中给出的一个概念,由程序中不包含跳转指令的一段连续指令组成。在simpoint中对程序的运行时先按100Million条指令为单位切段,就级,然后统计这段时间内,每个basic block执行的次数,再将每个basic block出现的次数和block中包含的指令条数相乘就得到这个basic block的对应的值,所有这些值组成一个向量。如果程序运行时包含N个100Million条指令组成的指令流,就会有N个向量,统称为basic block vector。

上面三个图表示一个程序在3个interval,从图中看此程序包含5个basic block,每个interval中执行流程是不同的,使用上面描述方法统计得到的basic block vector如下:

此步骤另一个需要注意的点是,程序的切段和统计是在运行时完成的,所以如果要得到结果需要至少运行一次要跑的程序,并实时的进行统计,然后按固定格式输出到文件中供接下来的步骤使用。

输出文件格式为:

   T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
   T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
   T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
    ...
    ...
    ...
   T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
   T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted

文件中的每行记录对应一个interval,T为interval的编号,interval编号从0开始;BB_*为basic block的编号;TimesExecuted为对应的basic block的值,值的计算方式为在此interval中对应的block出现的次数和block中指令的个数的乘积。

simpoint官方给出了基于ATOM和superscalar的统计Basic block vector的程序,下篇中介绍。

2. 聚类。BBV中每条记录对应一个interval中每个basic block的统计值,如果有两条记录中每个block的值完全相同,那跑这两个interval的指令流和跑其中一个interval的指令流两次,在统计概念上来说效果是一样的,聚类也是依赖于此。但要做到两个interval完全一样的可能性比较低,做个退让,把“相似”的interval也归为一类。相似也需要有个度量来确定两个interval是否一致,这里选择使用欧几里得距离或曼哈顿距离来度量interval的相似度。OK,现在可以算每两个interval的距离了,那哪些interval应该聚为一类呢?这是机器学习中的经典问题,而选择也是经典的k-means算法。将BBV中每条记录作为一个M维空间上的点,k-means算法起始于从BBV中选择k个随机点作为中心点,然后计算每个点和这k个中心点的距离,将每个点聚类到跟此点最近的中心点上,由此形成k个点集,然后在每个点集中重新选择中心点,重复此过程直到点集和中心点不在变化。

通常BBV中记录的维度都很大,导致k-means算法运行时间过长,可通过random linear projection进行降维,实验显示降维到15个维度是最合适的。

3. 选择k。k-means算法还有个缺点就是需要提前确定k的值,k表示最后需要聚合成几个类。simpoint中用的方法是按某种规则选择多个k值,分别计算得到聚类的结果后使用beyesian information criteron(BIC)算法进行打分,打分最高的k值作为最终的选择。

对于步骤2、3,simpoint给出了软件实现,参考1中可现在。输入为步骤1的输出,而simpoint会输出两个文件:simpoints文件和weights文件。simpoints中保存了选择的interval的编号,weights中包含了选择的interval的权重。

4. 仿真。拿到步骤3的simpoints后就知道选择interval编号了,可以使用GEM5快速forward到对应的interval,然后切换到GEM5的detailCPU模式开始运行。为了在后续仿真时跳过forward过程,加速仿真流程,GEM5提供了checkpoint功能,第一次运行时,forward到interval的起始点后使用checkpoint功能把快照保存起来,以后运行时直接从快照恢复速度很快很多。

由此,simpoint的简单介绍完成。其实simpoint也可以认为是一个程序的处理框架,其中步骤1、2、3的算法和程序特征选择都是可变的。比如步骤1中的BBV可以使用memory access、register usage等特征进行替换;步骤2中的点间距离的计算方法和聚类算法也是可变的;步骤3中如果有效果更好的算法,也可以替换掉BIC。


【参考】

1. simpoint官方网站:SimPoint

2.  Discovering and Exploiting Program Phases 

3.  Structures for Phase Classification

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值