【问题标题】:How to benchmark in Qemu i386 system using rdtsc如何使用 rdtsc 在 Qemu i386 系统中进行基准测试
【发布时间】:2015-11-25 20:17:59
【问题描述】:

目前我正在尝试测量在同一环境中使用两种不同的编程语言完成操作所需的时钟周期数。 (不使用操作系统)

目前我正在使用 Qemu-i386 模拟器并使用 rdtsc 来测量时钟周期。

/* Return the number of CPU ticks since boot. */
static inline u64 rdtsc(void)
{
    u32 hi, lo;
    // asm("cpuid");
    asm("rdtsc" : "=a" (lo), "=d" (hi));
    return ((u64) lo) | (((u64) hi) << 32);
}

取运行前后rdtsc的差应该提供时钟周期数。

    start_time = rdtsc();
    operation();
    stop_time = rdtsc();
    num_cycles = stop_time-start_time;

但是即使我进行了 100 多次迭代并且变化了几千个周期,差异也不是恒定的。

  • 有没有更好的测量时钟周期的方法?

  • 还有没有办法在 Qemu 中提供频率作为输入参数? 目前我正在使用

qemu-system-i386 -kernel out.elf

【问题讨论】:

  • 一千个周期在 1 GHz CPU 上是 0.000001 秒。那只是噪音。您需要增加迭代次数(例如 1,000,000 次),以使噪音变得微不足道。

标签: assembly x86 clock qemu rdtsc


【解决方案1】:

尝试在 QEMU 仿真下对客户软件进行基准测试充其量是极其困难的。 QEMU 的仿真没有任何像真正的硬件 CPU 那样的性能特征:一些在硬件上很快的操作,比如浮点,在 QEMU 上却很慢;我们不对缓存建模,当数据集达到缓存行或 L1/L2/etc 缓存大小限制时,您将看不到任何性能曲线;等等。

影响现代 CPU 性能的重要因素包括(至少):

  • 执行的原始指令计数
  • TLB 未命中
  • 分支预测器未命中
  • 缓存未命中

QEMU 不会跟踪最后三个中的任何一个,如果您使用 -icount 选项,只会对第一个进行模糊尝试。 (特别是,在没有 -icount 的情况下,我们在仿真下提供给客户的 RDTSC 值或多或少只是主机 CPU RDTSC 值,因此使用它测量的时间将包括各种 QEMU 开销,包括翻译客户代码所花费的时间。)

假设您在 x86 主机上,您可以尝试使用 -enable-kvm 选项在 KVM 虚拟机下运行它。然后至少你会看到硬件 CPU 的真实性能,尽管你仍然会看到一些来自开销的噪音,因为其他主机进程与 VM 竞争 CPU。

【讨论】:

  • 谢谢@peter 现在我已经包含了 icount 和 kvm 选项。添加 icount 选项后,QEMU 为每次执行提供相同数量的时钟计数。由于我正在比较两种语言的性能,因此 QEMU 增加的任何开销都将适用于两种语言。我还可以考虑结果并得出结论吗?
  • 不,因为 QEMU 报告的“循环计数”与实际 CPU 行为没有任何有趣的关系。通过 QEMU 上的指令计数,程序 A 可能比程序 B 更快,但在真实 CPU 上运行速度较慢。
  • @PeterMaydell 你能举个例子如何在 Qemu 中获取指令数吗?我运行这个命令。 qemu-system-mips -icount shift=7,rr=record,rrfile=replay.bin -net none -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/ dev/sda1 控制台=tty0" -m 400 -redir tcp:8022::22
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多