Gem5在源代码树中有几个测试,并且在http://www.gem5.org/Regression_Tests有一些文档,但是这些文档不是很清楚。
有哪些测试以及如何运行?
答案 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
quick
或long
之外的其他选项是all
或long
,它们可以同时执行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
测试?
所以请注意这两者如何:
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模型发生了变化。
运行测试时,它们会输出到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
其中包含三种类型的结果:CHANGED
,FAILED
或CHANGED
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不是周期精确的系统模拟器,因此绝对值或 一般而言,小的变化是没有意义的。
这也告诉我们,以小幅度获得的结果是 由于噪声太大,通常对发布没有意义。
我不知道那是什么误差幅度。