1

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

目前我正在使用 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

4

1 回答 1

3

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

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

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

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

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

于 2015-11-27T11:00:28.133 回答