Title

checkpoint 学习分析1 —— 1. SimPoint

背景

现代计算机架构研究需要理解处理器在执行应用程序时的周期级行为。这需要模拟器模型化每一个周期。但是,这样做是以牺牲速度为代价的。更糟糕的是,为了在性能、复杂性、面积、和功耗之间做权衡,benchemark需要在不同的架构配置上模拟运行。做计算机架构研究就绕不过simpoint,为了度量所实现的微架构的性能,通常都需要在新架构上运行一些大型的benchmark程序,俗称跑分。在多种多样的跑分软件中,SPEC基本上称霸了CPU性能测试的江湖,SPEC对厂商有强约束条件,在跑分时需要严格按照规定的规则运行SPEC benchmark程序,跑出的分数也就更能体现微架构的性能。

既然是作微架构研究,就肯定是要在流片前完成,没有流片而又需要在上面跑程序就只有两种方法:

  1. 软件模拟CPU微架构;
  2. FPGA原型验证;
    • FPGA原型验证需要在RTL完成后进行功能仿真、综合、P&R和时序仿真,然后才能在FPGA上运行,周期长,代价高。

软件模拟有可以分为两种:

  1. EDA功能仿真后进行benchmark跑分,这种方式其实是FPGA原型验证中的一环,速度感人;
  2. 直接用软件模拟CPU各组件,实现模块级的cycle accurate,这种是目前最常用的,功能和架构上跟最终的CPU微架构更接近,速度也可以接受,而GEM5就是这种类型的模拟器中的佼佼者,也是当前微架构研究使用最广泛的,既可以做CPU微架构的研究也可以做memory Hierarchy的性能研究。

但即便是已经使用了GEM5这种性能较好的模拟器,要运行大型程序,如SPEC中包含的benchmark程序,速度上也是较长。为了提高效率,各路大神奇招百出,而simpoint就是很棒的一种方法。

simpoint涉及术语列表

definition describe
Interval 将程序的执行分解为连续的不重叠interval。之前版本的Simpoint要求所有的interval大小相同。Simpoint 3.0仍然支持固定长度区间,但也提供可变长度区间的支持
Phase 程序执行中具有相似行为的一组intervals,一个phase可以有不连续的intervals组成,因此一个phase可以在执行过程中多次出现。
Similarity similarity定义了两个区间之间的行为在某些指标集上的接近程度。良好形成的phase应该包含在各种架构指标(e.g IPC、cache misses、branch misprediction)上表现出相似行为的intervals。
Frequency Vector 每个interval由一个frequency vector表示,该vector表示程序在该interval的执行情况。最常用的frequency vector是basic block vector,它表示在一个interval内每个basic block vector被执行的次数。
frequency vector还可以用于跟踪其他的代码结构,例如branch edges, loops, procedures, registers, opcodes, data, 或program working set行为,只要跟踪这些结构的使用能够提供程序行为的特征。
Similarity Metric 两个interval之间的相似性是通过计算这两个intervals之间的距离来确定的。SimPoint通过计算这两个intervals之间的Euclidean距离来判断相似性。
Phase Classification phase classification将interval根据相似性度量分组为具有相似行为的phase。phase classification是特定于运行特定输入的程序二进制文件。

SimPoint的核心思想

程序运行时所执行的指令流切分成连续的不重叠intervals,然后把有相似行为的intervals聚和成一个phase,然后在每个聚类中选取一个指令interval做代表,使用GEM5仿真的时候只执行选取出的指令interval运行,然后根据每个聚类的切分成连续的不重叠intervals大小对执行的指令interval加权重,再加到一起就是原程序的跑分结果。实验证明在指令集和编译器相同的情况下,与原程序跑分结果约等,可以作为相同指令集/编译器情况下的微架构性能对比。

SimPoint的执行步骤

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

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

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

输出文件格式为:

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中指令的个数的乘积。

  1. 聚类。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个维度是最合适的, 不设置参数default=15。

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

simpoint会输出两个文件:simpoints文件和weights文件。simpoints中保存了选择的interval的编号,weights中包含了选择的interval的权重。

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

refernece

  1. simpoint原理
  2. simpoint-3.0论文

posted on 2024-09-14 18:23  松—松  阅读(17)  评论(0编辑  收藏  举报

导航