如何使用rdtsc在Qemu i386系统中进行基准测试

时间:2015-11-25 20:17:59

标签: assembly x86 clock qemu rdtsc

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

目前我正在使用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 个答案:

答案 0 :(得分:1)

尝试在QEMU仿真下对客户软件进行基准测试至多是非常困难的。 QEMU的仿真没有像真正的硬件CPU那样的性能特征:一些在硬件上运行速度很快的操作,如浮点,在QEMU上非常慢;我们不会对缓存进行建模,您不会看到类似于数据集达到缓存行或L1 / L2 /等缓存大小限制时的性能曲线;等等。

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

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

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

假设您使用的是x86主机,可以尝试使用-enable-kvm选项在KVM虚拟机下运行它。然后至少你会看到硬件CPU的真实性能,但是当其他主机进程争用CPU与CPU时,你仍会看到开销产生的噪音。