如何提高 gem5 的模拟速度 运行

How to Increase the simulation speed of a gem5 run

我想在 gem5 环境中模拟一个非常重要的程序。

我为指定的 ISA 交叉编译了三个文件:

我用命令

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 运行速度的方式,那将是一个了不起的选择。

相关