2

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

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

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

方法 3 和 4 利用 Intel 的性能计数器监视器 (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 的报告高于方法 2。我猜它与 TSC 有所不同。但它是什么?

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

4

1 回答 1

1

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

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

当您确切知道自己在做什么时,PCM API 非常适合微调性能测量。这通常是获得各种单独的内存、核心、缓存、低功耗、...性能数字。如果您不确定您需要从中获得哪些确切的服务,而您无法从clock_gettime.

于 2014-08-21T19:47:04.297 回答