如何运行gem5单元测试?

时间:2018-09-11 16:00:22

标签: gem5

Gem5在源代码树中有几个测试,并且在http://www.gem5.org/Regression_Tests有一些文档,但是这些文档不是很清楚。

有哪些测试以及如何运行?

1 个答案:

答案 0 :(得分:1)

新的测试框架

以下各节中的所有信息都是在2018-11年前后添加新测试框架之前

它记录在:https://gem5.googlesource.com/public/gem5/+/master/TESTING.md

此新测试系统的入口点是tests/main.py。主要功能似乎是更好的测试选择选项和报告。

回归测试

这些是较大的测试,通常会引导Linux或运行某些Syscall Emulation内容并执行整个gem5可执行文件。

回归测试进一步分为:

  • quick
  • long

long模型通常与快速模型非常相似,但是使用的模型更加详细,因此速度也较慢,例如

  • quick/se/10.mcf/ref/arm/linux/simple-atomic/具有更快的CPU速度
  • long/se/10.mcf/ref/arm/linux/minor-timing/的Minor CPU较慢

测试直接通过scons运行。

util/regress

但是,由于测试命令有点长,因此甚至没有树内实用程序为您生成测试命令。

例如,要获取运行X86和ARM quick测试的命令,请运行:

./util/regress -n --builds X86,ARM quick

quicklong之外的其他选项是alllong,它们可以同时执行quick-n

使用scons \ --ignore-style \ --no-lto \ build/X86/gem5.debug \ build/ARM/gem5.debug \ build/X86/gem5.fast \ build/ARM/gem5.fast \ build/X86/tests/opt/quick/se \ build/X86/tests/opt/quick/fs \ build/ARM/tests/opt/quick/se \ build/ARM/tests/opt/quick/fs 只会打印测试命令,而没有打印它实际​​上会运行它们。

输出类似:

/opt/

TODO:为什么要构建gem5.debug和gem5.fast,然后运行build/X86/gem5.debug测试?

所以请注意这两者如何:

  • 构建gem5可执行文件,例如build/X86/tests/opt/quick/fs
  • 运行测试,例如./util/regress -n all

或获取命令以对所有拱门运行所有测试:

quick

然后,如果您只想运行这些类型的测试之一,例如您可以复制的scons个X86粘贴scons --ignore-style build/X86/tests/opt/quick/se 仅用于该测试:

scons --ignore-style /any/path/that/you/want/build/X86/tests/opt/quick/se

通过神奇地解析目标路径,可以像往常一样使用树外构建来运行测试:How to build gem5 out of tree?

--build-dir

或者您可以将util/regress选项传递给./util/regress --build-dir /any/path/that/you/want all

M5_PATH

另一方面,引导Linux的测试要求在tests中使用具有特定名称的Linux映像,这也很烦人。

但这会非常慢,而不是每次提交后都可以运行的东西:您更有可能只想对您感兴趣的ISA运行快速测试。

仅运行一项测试

如果仅将源树中scons --ignore-style build/X86/tests/opt/quick/se 下的路径附加到测试命令,它将在给定目录下运行所有​​测试。

例如,我们有:

tests

,我们注意到源树中quick/se/00.hello/ref/x86/linux/simple-atomic/ 下存在以下路径:

ref

因此我们通过删除build/X86/tests/opt/quick/se/00.hello/x86/linux/simple-atomic/ 来获得最终命令来按摩路径:

scons --ignore-style build/X86/tests/opt/quick/se

长短之间的区别:大多数情况下,只是cpu模型发生了变化。

找出命令运行的确切gem5 CLI

运行测试时,它们会输出到stdout m5out路径。

在m5out路径中,有一个包含模拟器stdout的simout,其中包含使用的完整gem5命令行。

例如:

Running test in /any/path/that/you/want/build/ARM/tests/opt/quick/se/00.hello/arm/linux/simple-atomic.

输出:

/any/path/that/you/want/build/ARM/tests/opt/quick/se/00.hello/arm/linux/simple-atomic

和文件:

command line: /path/to/mybuild/build/ARM/gem5.opt \
  -d /path/to/mybuild/build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-atomic \
  --stats-file 'text://stats.txt?desc=False' \
  -re /path/to/mysource/tests/testing/../run.py \
  quick/fs/10.linux-boot/arm/linux/realview-simple-atomic

包含:

scons build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-atomic
scons build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-atomic

重新运行测试

如果您只运行了两次测试,例如与:

rm -rf build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-atomic

第二次运行不会真正重新运行测试,而只是比较前一次运行的统计信息。

要真正重新运行测试,必须先清除前一次运行生成的统计信息,然后才能重新运行:

scons

获取测试结果

即使这很混乱……0不会返回1成功,而不会返回scons --ignore-style build/X86/tests/opt/quick/se |& grep -E '^\*\*\*\*\* ' 失败,因此您必须解析日志。一种简单的查看方式:

PASSSED

其中包含三种类型的结果:CHANGEDFAILEDCHANGED

FAILED主要用于统计数据比较,它们之间的差别很大,但是通常很难维护并且永久中断,因此您应该关注gem5

请注意,当前大多数测试都依赖于SPEC2000,除非您可以访问此非免费基准测试,否则它会失败...

单元测试

还有一些单元测试,它们可以编译为与UnitTest分开的可执行文件,并且仅测试一小段代码。

目前有两种测试类型:

  • GTest:已过时且已过时,应转换为GTest

  • src/base/cprintf.cc src/base/cprintf.hh src/base/cprintftest.cc :又好又新。使用Google Test

    放置在他们要测试的课程旁边,例如:

    GTest

编译并运行所有scons build/ARM/unittests.opt 单元测试:

build/ARM/base/cprintftest.opt --gtest_output=xml:build/ARM/unittests.opt/base/cprintftest.xml
Running main() from gtest_main.cc
[==========] Running 4 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 4 tests from CPrintf
[ RUN      ] CPrintf.Misc
[       OK ] CPrintf.Misc (0 ms)
[ RUN      ] CPrintf.FloatingPoint
[       OK ] CPrintf.FloatingPoint (0 ms)
[ RUN      ] CPrintf.Types
[       OK ] CPrintf.Types (0 ms)
[ RUN      ] CPrintf.SpecialFormatting
[       OK ] CPrintf.SpecialFormatting (0 ms)
[----------] 4 tests from CPrintf (0 ms total)

[----------] Global test environment tear-down
[==========] 4 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 4 tests.

样本输出摘录:

scons build/ARM/base/cprintftest.opt
./build/ARM/base/cprintftest.opt

仅编译并运行一个测试文件:

./build/ARM/base/cprintftest.opt --gtest_list_tests
./build/ARM/base/cprintftest.opt SpecialFormatting

列出测试文件中可用的测试功能,然后仅运行其中之一:

tests/main.py

经过gem5 200281b08ca21f0d2678e23063f088960d3c0819测试,2018年8月。

持续集成

更新2019-04:现在有一个预提交配置项,在维护者给出+1之后的每个拉取请求之后运行。它仍然仅执行非常基本的测试,但至少会测试构建。它使用了Google提供的神奇的Jenkins设置。例如,请参见以下内容:https://gem5-review.googlesource.com/c/public/gem5/+/18108该服务器当前不在夜间运行。

有一台运行在某处的服务器,每晚对所有拱门进行快速测试,并将其发布到开发邮件列表中,这增加了该列表的无尽噪音:-)

以下是运行示例:https://www.mail-archive.com/gem5-dev@gem5.org/msg26855.html

从2019年第一季度开始,gem5开发人员正在尝试设置一个自动的魔术Google Jenkins以运行预提交测试,可以在以下网址找到指向原型的链接:https://gem5-review.googlesource.com/c/public/gem5/+/17456/1#message-e9dceb1d3196b49f9094a01c54b06335cea4ff88此新设置使用了{{1 }}。

为什么CHANGED一直都有这么多测试?

截至2018年8月,许多测试已经CHANGED很长时间了。

这是因为统计数据可能因多种复杂因素而有所不同 因素。其中一些可能更准确,其他人则不知道, 其他人只是臭虫。

变更经常发生,以至于开发人员还没有找到适当的时间 理解并证明他们。

如果您真的关心它们为什么会改变,那么我最好的建议就是将它们一分为二。

但是通常最好的选择是只是在较新的gem5版本上重新运行旧的实验,并在那里进行比较。

gem5不是周期精确的系统模拟器,因此绝对值或 一般而言,小的变化是没有意义的。

这也告诉我们,以小幅度获得的结果是 由于噪声太大,通常对发布没有意义。

我不知道那是什么误差幅度。