如何提高 gem5 的模拟速度 运行
How to Increase the simulation speed of a gem5 run
我想在 gem5 环境中模拟一个非常重要的程序。
我为指定的 ISA 交叉编译了三个文件:
- main.c
- my_library.c
- my_library.h
我用命令
build/ARM/gem5.opt configs/example/se.py --cpu-type=TimingSimpleCPU -c test/test-progs/hello/src/my_binary
但是有没有办法,也许是 se.py 脚本的一个参数可以让我的模拟进行得更快?
默认命令通常是最快的(因此模拟精度最低)。
gem5.fast
构建
通过禁用一些与调试相关的宏,.fast
构建可以 运行 快约 20% 而不会损失模拟精度:
scons -j `nproc` build/ARM/gem5.fast
build/ARM/gem5.fast configs/example/se.py --cpu-type=TimingSimpleCPU \
-c test/test-progs/hello/src/my_binary
加速是通过以下方式实现的:
通过宏禁用断言和日志记录。 https://github.com/gem5/gem5/blob/ae7dd927e2978cee89d6828b31ab991aa6de40e2/src/SConscript#L1395 会:
if 'fast' in needed_envs:
CPPDEFINES = ['NDEBUG', 'TRACING_ON=0'],
NDEBUG
是禁用 assert
的标准化方法:_DEBUG vs NDEBUG
TRACING_ON
对整个来源都有影响,但最值得注意的是:https://github.com/gem5/gem5/blob/ae7dd927e2978cee89d6828b31ab991aa6de40e2/src/base/trace.hh#L173
#if TRACING_ON
#define DPRINTF(x, ...) do { \
using namespace Debug; \
if (DTRACE(x)) { \
Trace::getDebugLogger()->dprintf_flag( \
curTick(), name(), #x, __VA_ARGS__); \
} \
} while (0)
#else // !TRACING_ON
#define DPRINTF(x, ...) do {} while (0)
#end
这意味着 --debug-flags
基本上不会做任何事情。
打开link时间优化:Does the --force-lto gem5 scons build option speed up simulation significantly and how does it compare to a gem5.fast build?这可能会减慢link时间(因此在一行更改后重新编译需要多长时间)
所以一般来说 .fast
如果你正在开发模拟器是不值得的,但前提是你已经完成了你可能拥有的任何补丁,并且只需要尽可能快地 运行 数百次模拟尽可能使用不同的参数。
TODO 最好对上述哪些更改对 运行 时间最重要进行基准测试,以及 link 时间是否实际上因 LTO 而显着减慢。
gem5性能分析
我不知道是否对 gem5 进行了适当的性能分析以访问模拟的哪些部分速度慢,以及是否有任何方法可以轻松改进它。有人必须在某个时候这样做,并且 post 它在:https://gem5.atlassian.net/browse/GEM5
降低模拟精度的选项
如果没有 --cpu-type=TimingSimpleCPU
:
,模拟速度也会更快,精度也会更低
build/ARM/gem5.opt configs/example/se.py -c test/test-progs/hello/src/my_binary
它使用更简单的内存模型AtomicSimpleCPU
。
其他精度较低但速度较快的选项包括:
- KVM,但截至2020年支持还不完善,需要ARM主机才能运行在
上进行模拟
- Gabe 的 FastModel 集成将于 2020 年合并,但它需要 ARM 的 FastModel 许可,我认为这对个人来说太贵了
此外,如果有人要在 gem5 中实现二进制翻译,这就是 QEMU 运行速度的方式,那将是一个了不起的选择。
相关
我想在 gem5 环境中模拟一个非常重要的程序。
我为指定的 ISA 交叉编译了三个文件:
- main.c
- my_library.c
- my_library.h
我用命令
build/ARM/gem5.opt configs/example/se.py --cpu-type=TimingSimpleCPU -c test/test-progs/hello/src/my_binary
但是有没有办法,也许是 se.py 脚本的一个参数可以让我的模拟进行得更快?
默认命令通常是最快的(因此模拟精度最低)。
gem5.fast
构建
通过禁用一些与调试相关的宏,.fast
构建可以 运行 快约 20% 而不会损失模拟精度:
scons -j `nproc` build/ARM/gem5.fast
build/ARM/gem5.fast configs/example/se.py --cpu-type=TimingSimpleCPU \
-c test/test-progs/hello/src/my_binary
加速是通过以下方式实现的:
通过宏禁用断言和日志记录。 https://github.com/gem5/gem5/blob/ae7dd927e2978cee89d6828b31ab991aa6de40e2/src/SConscript#L1395 会:
if 'fast' in needed_envs: CPPDEFINES = ['NDEBUG', 'TRACING_ON=0'],
NDEBUG
是禁用assert
的标准化方法:_DEBUG vs NDEBUGTRACING_ON
对整个来源都有影响,但最值得注意的是:https://github.com/gem5/gem5/blob/ae7dd927e2978cee89d6828b31ab991aa6de40e2/src/base/trace.hh#L173#if TRACING_ON #define DPRINTF(x, ...) do { \ using namespace Debug; \ if (DTRACE(x)) { \ Trace::getDebugLogger()->dprintf_flag( \ curTick(), name(), #x, __VA_ARGS__); \ } \ } while (0) #else // !TRACING_ON #define DPRINTF(x, ...) do {} while (0) #end
这意味着
--debug-flags
基本上不会做任何事情。打开link时间优化:Does the --force-lto gem5 scons build option speed up simulation significantly and how does it compare to a gem5.fast build?这可能会减慢link时间(因此在一行更改后重新编译需要多长时间)
所以一般来说 .fast
如果你正在开发模拟器是不值得的,但前提是你已经完成了你可能拥有的任何补丁,并且只需要尽可能快地 运行 数百次模拟尽可能使用不同的参数。
TODO 最好对上述哪些更改对 运行 时间最重要进行基准测试,以及 link 时间是否实际上因 LTO 而显着减慢。
gem5性能分析
我不知道是否对 gem5 进行了适当的性能分析以访问模拟的哪些部分速度慢,以及是否有任何方法可以轻松改进它。有人必须在某个时候这样做,并且 post 它在:https://gem5.atlassian.net/browse/GEM5
降低模拟精度的选项
如果没有 --cpu-type=TimingSimpleCPU
:
build/ARM/gem5.opt configs/example/se.py -c test/test-progs/hello/src/my_binary
它使用更简单的内存模型AtomicSimpleCPU
。
其他精度较低但速度较快的选项包括:
- KVM,但截至2020年支持还不完善,需要ARM主机才能运行在 上进行模拟
- Gabe 的 FastModel 集成将于 2020 年合并,但它需要 ARM 的 FastModel 许可,我认为这对个人来说太贵了
此外,如果有人要在 gem5 中实现二进制翻译,这就是 QEMU 运行速度的方式,那将是一个了不起的选择。
相关