使模拟确定性(基于qemu的模拟器)

时间:2011-11-14 22:12:11

标签: c++ simulator qemu deterministic

我正在使用Marss周期精确模拟器,它使用QEMU。它是一个完整的系统模拟器,提供用户和内核统计信息。 但是,即使我只使用用户统计信息,不同运行之间的统计信息也会有很大不同。我在火星网站上问了这个问题,但是得不到好的答案。 我想知道它是否与qemu有关。或任何qemu选项/变体,可以使模拟确定性。 我尝试使用-icount auto,但仍有一些变化。 使用simplescalar eio文件,我从未观察到任何变化。 我会感激一些帮助。

2 个答案:

答案 0 :(得分:3)

我没有使用过MARSS / QEMU,但我熟悉这个问题,一般是模拟器,还有SimpleScalar。

制作完整系统模拟器非常难以确定。例如。如果您的程序打印时间和一天中的时间更改,将遵循不同的代码路径。更一般地说,如果您正在进行完整的系统仿真和时间ls,那么操作系统和用户代码的确切交错将根据磁头的位置,磁盘缓存中的数据量等而有所不同。其他进程正在系统上运行。

SimpleScalar eio(以及工业中的模​​拟器)通过记录一系列外部I / O事件来提供确定性,以便在与先前运行完全相同的指令计数中应用于模拟。基本上,您只是在录制时进行完整的系统模拟

您需要为MARSS / QEMU寻找类似的选项。不幸的是,我还没有找到这样的。

缺乏这些......

但我可以听到你说“我的节目没有阅读时间。每次都不应该以完全相同的方式运行吗?”也许是这样......但是(1)许多Linux图书馆在道德上等同于阅读时间。 (2)还有其他进程运行用户代码。

所以你需要控制跑步。不要一直启动虚拟机(不是硬件虚拟机,我只是在模拟器上运行的操作系统)。在单用户中停止。编辑/ etc / rc以停止尽可能多的进程运行。完整的系统仿真与真实机器上的基准测试不同。在真机上,我们甚至可能在每次运行基准测试时重新启动机器。禁用(虚拟)网络。等

如果可以,请不要在真实的操作系统上运行,而应在最小的显示器上运行。

但是,最好找到I / O跟踪重放工具。有时这些隐藏在调试器选项下。


这是一篇参考文献,在2008年讨论了qemu中I / O重播的补丁。

http://wiki.qemu.org/Features/FaultTolerance - I / O重放可靠性/容错性。

QEMU用户空间仿真可能更具可重复性。我不知道它是否与MARSS一起使用


顺便说一下:重现性问题不仅与模拟器有关。它还与可靠性和调试有关。

您可以找到一个通用的Linux重放工具,您可以使用它来使您的系统在QEMU / MARSS之上更具可重复性。


在MARSS内部,您可以使用ptlcall检查点工具在您的基准测试点(假设您正在运行SPEC等)完成大量初始I / O之后,在此之前使用检查点。下一个IO许多基准测试会执行大量初始I / O,然后在用户代码中运行一段时间,然后执行一些最终I / O.通过使用这些检查点,您可以避免时变系统调用。

同样是Simpoints,http://www.marss86.org/~marss86/index.php/Simpoints


顺便提一下,我刚想起程序可能是非确定性的另一种方式(除了意外地依赖于时间或多处理器交互):它们可能明确地和内在地依赖于时间。

E.g。 lymore98版本的Livermore Loops基准测试表示循环花了多长时间,如果花费的时间不足,则增加循环次数。您可以在此处记录外部交互,例如时间和系统调用,并且程序可能会重现 - 但您无法准确测量它将在您的更新,更快的计算机上执行的操作。

反过来:想象一下你有一个编译器优化开关的形式“应用这个非常昂贵的优化不超过2小时,然后停止......”

答案 1 :(得分:0)

QEMU内置确定性记录和重播

QEMU 2.9.0现在具有确定性记录并通过保存外部输入进行重放,但暂时中断:How to use QEMU's deterministic record and replay feature for a Linux kernel boot?

主要文件是: