上一篇中我们讲了simpoint的原理和步骤,接下来实践下。
先从简单的开始,要实现切片需要两个软件:程序分析和统计软件;统计数据分析聚类软件。
0x1-1 程序分析和统计
在simpoint文章中使用的程序分析和统计软件是ATOM和simplescalar,ATOM在“A system for building customized program analysis tools“中有介绍,但未找到可使用的ATOM程序,排除。那在看下simplescalar,simplescalar是一个软件模拟CPU、cache、memory等硬件架构的软件,跟GEM5较相似,既然可以模拟CPU,那它支持什么指令集呢?从simplescalar的README说明中可以发现支持两种指令集:ALPHA和PISA,其中PISA是portable ISA的缩写,是simplescalar专门支持的私有ISA,如果要编译支持PISA的软件需要使用特有的工具链。alpha架构则是支持ALPHA自有的指令集,网络上对alpha处理器的介绍挺多,有兴趣的读者可以搜索了解下。既然alpha有真实的硬件推到市场过,应该还是比较成熟的,那我们在编译simplescalar的时候选择支持alpha吧。
OK,选定了simplescalar,那先下载软件吧。官方网站http://www.simplescalar.com
打开一片空白,试了N次,换了各种网络都不成功。只能求助万能的gitee。还好有乐于分享的同学上传的gitee上,simplescalar_install: simplescalar安装包,里面包含的挺全,有simplescalar的源码和PISA的编译工具链,但simplescalar是有版权保护的,大家传播时还是要慎重。选择下载其中的simplesim-3v0e.tgz,就是simplescalar 3.0的源代码。
simplescalar 3.0官方源码中只包含了模拟器的源码,是不支持切片需要的程序分析和统计功能的,要支持切片还需要对源码做侵入性的修改,要修改的内容可以simpoint中找到。下载并解压后有三个源文件:bbtracker.c/h是做程序分析统计的主要逻辑文件;sim-fast.c是simplescalar中的源文件,但为了支持bbtracker做了部分修改,因为不能确定源码版本跟作者使用的是否完全一致,我们不打算用bbtracker中的sim-fast.c替换simplescalar中的对应文件,而是将sim-fast.c中的修改添加到simplescalar中sim-fast.c的逻辑中。好在要修改的地方不多。修改完成后将bbtracker.c/h也拷贝到simplescalar源码目录,然后在Makefile中将bbtracker.h/c分别添加到SRCS/HDRS和OBJS中,接下来可以编译了。
>> make config-alpha // 配置simplescalar支持alpha架构的指令集
>> make
>> make sim-tests
其中make sim-tests会编译写测试程序来测试simplescalar虚拟机的正确性。
编译完成会生成sim-fast程序,其中就包含了程序的分析和统计功能。下面试下是否能正常的运行。
>> ./sim-fast -interval 100 -outdir bb -outfile bbv tests-alpha/bin/test-fmath
参数:
-interval 是分析时每段的指令流长度。文章中建议是100milion条指令流为一段,但我们使用的程序太小,为了演示方便,设置成了100条。
-outdir 输出文件的目录
-outfile 输出文件的名称,最后输出的其实是gzip压缩过的文件,所以文件名为bbv.tar.gz
可以使用编辑器打开生成的文件,文件格式跟上篇中介绍的步骤1的输出格式相同。
0x1-2 聚类
对于聚类功能,simpoint官方中已经给出了实现,已经发展到了3.2版本,直接拿来使用即可。
下载链接:https://cseweb.ucsd.edu/~calder/simpoint/releases/SimPoint.3.2.tar.gz
下载解压后进入到Simpoint目录,然后执行:
>> make simpoint
此命令会编译simpoint中analysiscode并将生成的可执行文件放到bin目录下,接下来执行simpoint对步骤1中获取到文件的进行聚类分析。
>> ./bin/simpoint -maxK 30 -saveSimpoints simpoints -saveSimpointWeights weights -loadFVFile input/sample.bb
参数:
-maxK N 表示K的取值从1到N,然后用BIC选择最合适的k值。
-saveSimpoints 将最终选择的点信息放到文件
-saveSimpointWeights 将选择的每个点的权重放到文件
-loadFVFile 载入Frequence vector文件,就是步骤1生成的文件
-inputVectorsGzipped 表明输入的FV文件是否经过gizpped压缩了,示例中的文件没有经过压缩,所以没有使用此参数
simpoint支持的参数还有很多,这里不再一一列举,有兴趣的同学可以看下simpoint中README文件,有详细说明。
可以打开simpoint生成的simpoints和weights文件,跟上篇中提到的文件格式对比下看是否一致。
OK,到此我们拿到了聚类后的代表点,在真实的场景中,接下来应该需要根据simpoints中点信息使用模拟器运行程序的若干个片段了。