BBV:实验基本块向量生成工具

来源:互联网 发布:西宁大数据软件公司 编辑:程序博客网 时间:2024/06/08 07:28

目录

12.1。概观
12.2。使用基本块向量创建SimPoints
12.3。BBV命令行选项
12.4。基本块向量文件格式
12.5。履行
12.6。线程可执行支持
12.7。验证
12.8。性能

要使用此工具,必须--tool=exp-bbv在Valgrind命令行上指定 。

12.1。概观

基本块是具有一个入口点和一个出口点的代码的线性部分。甲基本块矢量(BBV)是程序执行过程中输入的所有的基本块的列表,以及每个基本块多少次运行的计数。

BBV是一种生成用于SimPoint 分析工具的基本块向量的 工具。SimPoint方法可以通过仅运行程序的一小部分,然后从这个小部分推断出整体行为,从而加速架构模拟。大多数程序表现出基于阶段的行为,这意味着在执行期间的不同时间,程序将遇到时间间隔,其代码的行为类似于之前的间隔。如果您可以检测到这些间隔并将它们组合在一起,则可以通过仅模拟最小数量的间隔,然后缩放结果来获得总体程序行为的近似值。

在计算机体系结构研究中,在循环精确模拟器上运行基准测试可能会导致1000倍的减速,从而需要数周,数周甚至更长的时间才能运行完整的基准。通过使用SimPoint可以显着降低,通常为90-95%,同时仍然保持合理的准确性。

T. Sherwood,E.Perelman,H. Hamerly和B. Calder在“自动表征大规模程序行为”的文章中可以找到SimPoint如何工作的更完整的介绍。

12.2。使用基本块向量创建SimPoints

要快速创建一个基本的块向量文件,您将像这样调用Valgrind:

valgrind --tool = exp-bbv / bin / ls

在这种情况下,我们正在运行/bin/ls,但这可以是任何程序。默认情况下,bb.out.PID将创建一个调用的文件 ,其中PID被正在运行的进程的进程ID替换。该文件包含基本的块向量。对于长时间运行的程序,此文件可能相当大,因此使用gzip或其他压缩程序进行压缩可能是明智之举。

要创建实际的SimPoint结果,您将需要可从SimPoint网页获得的SimPoint实用程序 。假设您下载了SimPoint 3.2并对其进行了编译,请使用以下命令创建SimPoint结果:

./SimPoint.3.2/bin/simpoint -inputVectorsGzipped \    -loadFVFile bb.out.1234.gz \    -k 5 -saveSimpoints results.simpts \    -saveSimpointWeights results.weights

其中bb.out.1234.gz是由BBV生成的压缩基本块向量文件。

SimPoint实用程序使用15维进行随机线性投影,然后使用k均值聚类来计算哪些间隔是感兴趣的。在本例中,我们使用-k 5选项指定了5个间隔。

SimPoint运行的输出是 results.simpts 和results.weights文件。第一个是程序的最相关的5个间隔。当外推全程序行为时,秒数保持缩放每个间隔的权重。间隔和权重可以与支持快进的模拟器结合使用; 您快速转到感兴趣的间隔,收集所需间隔长度的统计数据,然后使用与权重结合使用的统计量来计算结果。

12.3。BBV命令行选项

BBV特定的命令行选项有:

--bb-out-file=<name> [default: bb.out.%p]

此选项选择基本块向量文件的名称。的 %p%q格式说明可以用来嵌入进程ID和/或名称的环境变量的内容,由于是用于芯选项的情况下 --log-file

--pc-out-file=<name> [default: pc.out.%p]

此选项选择PC文件的名称。该文件保存各种基本块的程序计数器地址和功能名称信息。这可以与基本块向量文件结合使用,通过函数名称快速转换,而不仅仅是指令计数。的 %p%q格式说明可以用来嵌入进程ID和/或名称的环境变量的内容,由于是用于芯选项的情况下 --log-file

--interval-size=<number> [default: 100000000]

此选项选择要使用的间隔的大小。默认值是100万条指令,这是一个常用的值。其他尺寸可以使用; 较小的间隔可以帮助程序更精细的阶段。然而,较小的间隔大小可能导致由于预热效应导致的准确性问题(当快速转发各种架构特征将被初始化时,在将“预热”到状态之前需要一些数量的指令进行完全模拟将没有快进,大间隔时间往往会减轻这种情况。)

--instr-count-only [default: no]

该选项指示该工具仅显示指令计数总计,并且不生成实际的基本块向量文件。这对于调试和收集指令计数信息而无需生成大型基本块向量文件非常有用。

12.4。基本块向量文件格式

基本块向量以固定间隔倾倒。这通常是每1亿个指令完成的; 该 --interval-size选项可用于更改此选项。

输出文件如下所示:

T:45:1024:189:99343T:11:78573:15:1353:56:1T:18:45:12:135353:56:78 314:4324263

每个新的间隔以T开始。在相同的行上跟随一系列基本块和频率对,一个在间隔期间输入的每个基本块。每个块/频率对的格式是冒号,后跟一个数字,唯一标识基本块,另一个冒号,然后是频率(这是块输入的次数乘以在块)。这些对由一个空格彼此分开。

频率计数乘以基本块中的指令数,以便权重计数,使得小基本块中的指令不被计入比大基本块中的指令更重要的位置。

SimPoint程序只处理以“T”开头的行。所有其他行都被忽略。传统的注释是用一个“#”字符开始的。一些其他BBV生成工具,如PinPoints,生成以“T”以外的字母开始的行,以指示有关正在运行的程序的更多信息。我们不会生成这些,因为SimPoint实用程序忽略它们。

12.5。履行

Valgrind提供创建BBV文件所需的所有信息。在当前的实现中,所有指令都将进行检测。这比使用基本块级别的方法慢(约两倍),但是有一些复杂性(特别是使用代表前缀检测),使得该方法更加困难。

Valgrind实际上提供了超级块级的仪器。超级块有一个入口点,但不同于基本块可以有多个出口点。一旦一个分支出现在一个块的中间,它被分割成一个新的基本块。由于Valgrind不能产生“真实”基本块,因此生成的BBV向量将与其他工具生成的不同。实际上,这似乎并不影响SimPoint结果的准确性。我们在内部强制 --vex-guest-chase-thresh=0 选择Valgrind,这迫使更基本的块状行为。

当超级块是第一次运行时,它会用我们的BBV程序进行测试。分配块信息(bbInfo)结构,其保存块的各种信息和统计信息。将唯一的块ID分配给块,然后将结构放入有序集中。然后,该块中的每个本地指令被调用为使用指向块信息结构的指针作为参数来调用指令计数例程。

在运行时,我们的指令计数例程每个本机指令被调用一次。访问相关的块信息结构,更新块计数和总指令数。如果总指令计数溢出间隔大小,则我们走排序集,写出在该间隔中访问的任何块的统计信息,然后将块计数器重置为零。

在x86和amd64架构上,计数代码具有处理代表前缀字符串指令的额外代码。这是因为实际的硬件将一个前缀的指令作为一个指令进行计数,而一个天真的Valgrind实现将会计数尽可能多(可能数百,数千甚至数百万)的指令。我们特别处理代表前缀的指令,以使结果与硬件性能计数器匹配。

BBV也计算fldcw指令。该指令以各种方式用于x86机器上; 将浮点值转换成整数时最常见。在Pentium 4系统上,退出的指令性能计数器将该指令计数为两条指令(所有其他已知处理器仅计数为一条)。当在Pentium 4系统上使用SimPoint时,这可能会影响结果。我们提供fldcw计数,以便用户可以评估是否会影响其结果,以避免使用奔腾4机器进行实验。可以为此工具添加一个模拟双重计数的选项,以便生成的BBV文件可用于使用Pentium 4系统上硬件性能计数器的实验。

12.6。线程可执行支持

BBV支持线程程序。当程序有多个线程时,会为每个线程创建一个附加的基本块向量文件(每个附加文件是指定的文件名,结尾附加了线程号)。

没有官方的方法使用SimPoint与线程工作负载。最常见的方法是独立运行每个线程的SimPoint,并使用一些确定性执行方法来尝试匹配原始工作负载。这可以用当前的BBV来实现。

12.7。验证

BBV已经在x86,amd64和ppc32平台上进行了测试。早期版本的BBV已经使用硬件性能计数器进行了详细的测试,这项工作在VMweaver和SA McKee的HiPEAC'08大会“使用动态二进制仪器生成多平台SimPoints:方法和准确性”的论文中进行了描述。

12.8。性能

使用此程序可以通过本地执行将执行速度降低约40倍。这取决于所使用的机器和正在运行的基准。在3.4 GHz Pentium D处理器上运行的SPEC CPU 2000基准测试中,减速范围从24x(mcf)到340x(vortex.2)。

原创粉丝点击