测量时间:gettimeofday,TSC和时钟滴答之间的差异



我正在为我的程序的一部分做一些性能分析。我尝试使用以下四种方法来衡量执行。有趣的是,它们显示出不同的结果,我不完全理解它们的差异。我的 CPU 是英特尔® 酷睿(TM( i7-4770。系统是 Ubuntu 14.04。提前感谢您的任何解释。

方法一:使用gettimeofday()功能,结果以秒为单位

方法2:使用类似于 https://stackoverflow.com/a/14019158/3721062 的rdtsc指令

方法 3 和 4 利用英特尔的性能计数器监视器 (PCM( API

方法3:使用 PCM 的

uint64 getCycles(const CounterStateType & before, const CounterStateType &after)

它的描述(我不太明白(:

Computes the number core clock cycles when signal on a specific core is running (not halted)
Returns number of used cycles (halted cyles are not counted). The counter does not advance in the following conditions:
an ACPI C-state is other than C0 for normal operation
HLT
STPCLK+ pin is asserted
being throttled by TM1
during the frequency switching phase of a performance state transition
The performance counter for this event counts across performance state transitions using different core clock frequencies

方法4:使用 PCM 的

uint64 getInvariantTSC (const CounterStateType & before, const CounterStateType & after)

其描述:

Computes number of invariant time stamp counter ticks.
This counter counts irrespectively of C-, P- or T-states

两个示例运行生成的结果如下所示:(方法 1 以秒为单位。方法2~4除以(相同(数字以显示每件商品的成本(。

0.016489 0.533603 0.588103 4.15136 
0.020374 0.659265 0.730308 5.15672

一些观察:

    方法
  1. 1 与方法 2 的比率非常一致,而其他方法则不然,即 0.016489/0.533603 = 0.020374/0.659265。假设gettimeofday()足够准确,rdtsc方法表现出"不变"属性。(是的,我从互联网上读到,当前一代的英特尔 CPU 具有此功能rdtsc

  2. 方法
  3. 3 的报告高于方法 2。我想它与 TSC 有些不同。但是它是什么?

  4. 方法 4 是最令人困惑的。它报告的数字比方法 2 和 3 大一个数量级。不应该也是一种周期计数吗?更不用说它带有"不变"的名字了。

gettimeofday()不是为测量时间间隔而设计的。不要将其用于此目的。

如果您需要墙壁时间间隔,请使用 POSIX 单调时钟。如果需要特定进程或线程花费的 CPU 时间,请使用 POSIX 进程时间或线程时间时钟。请参阅man clock_gettime

PCM API 非常适合在您确切知道自己在做什么时进行微调的性能测量。其中一般是获得各种独立的内存,核心,缓存,低功耗,...性能数据。如果您不确定需要哪些确切的服务而无法从clock_gettime获得,请不要开始弄乱它。

相关内容

  • 没有找到相关文章

最新更新