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

标签 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

最佳答案

尝试在 QEMU 仿真下对客户软件进行基准测试充其量也是极其困难的。 QEMU 的仿真不具备与真实硬件 CPU 类似的性能特征:一些在硬件上速度很快的操作(如浮点)在 QEMU 上却非常慢;我们不对缓存进行建模,当数据集达到缓存行或 L1/L2/等缓存大小限制时,您不会看到类似性能曲线的任何内容;等等。

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

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

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

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

关于assembly - 如何使用 rdtsc 在 Qemu i386 系统中进行基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33925699/

相关文章:

Java - 如何每秒更新一个面板

android - 厂商时钟/闹钟包及类名列表,请加

C 内联汇编 Int 0x10

assembly - `movl (%eax), %eax`中的括号是什么意思?

c - 在 8 位 PIN 中设置一位而不更改其他位

windows - 检测另一个进程的位数(在 Windows 中)

assembly - 如何使用 NASM 组装 16 位 asm 代码,然后在 Linux 中对其进行调试,然后再在 DOSBox 中生成可执行文件

组装 - 输出应该是什么

c - 我如何找到我正在运行的 CPU/内核?

time - GPS时钟的精度如何?