2015-11-25 38 views
1

目前,我试图衡量采取两种不同的编程语言在相同的环境下完成操作的时钟周期数标杆的Qemu i386的系统。 (不使用OS)如何使用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; 

但不同的是不恒定,甚至当我接手的迭代100S和几千个周期的变化。

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

  • 而且是有提供频率为Qemu中输入参数的方法吗? 目前我使用

QEMU系统-I386 -kernel out.elf

+3

一千周期为1 GHz的CPU上0.000001秒。这只是噪音。您需要增加迭代次数(例如,1,000,000次),以便噪声变得无关紧要。 –

回答

1

下QEMU仿真试图标杆客户软件充其量是极其困难的。 QEMU的仿真没有像真正的硬件CPU那样的性能特征:在硬件上快速的一些操作(如浮点)在QEMU上非常缓慢;我们不建模缓存,并且当数据集达到缓存行或L1/L2 /缓存大小限制时,您将看不到任何类似性能曲线;等等。在性能

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

  • 生指令计数执行
  • TLB缺失
  • 分支预测错过
  • 高速缓存未命中

QEMU没有跟踪最后三个中的任何一个,如果使用-icount opti,只会对第一个模糊的尝试上。 (尤其是无-icount我们提供模拟情况下客人的RDTSC值是更多或更少只是主机CPU RDTSC值,所以用它测量时间将包括各种开销QEMU包括时间花在翻译来宾代码。)

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

+0

谢谢@peter现在我已经包含icount和kvm选项。添加icount选项后,QEMU为每次执行提供相同数量的时钟计数。由于我正在比较两种语言的性能,因此QEMU添加的任何开销都将用于两种语言。我仍然可以考虑结果并得出结论吗? – madstr

+0

不,因为QEMU报告的“循环计数”与实际CPU行为没有任何有趣的关系。程序A可以通过QEMU上的指令数比程序B更快,但在实际CPU上运行速度较慢。 –

+0

@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 console = tty0“-m 400 -redir tcp:8022 :: 22 – SamTew