1

我使用这个等式来获得执行时间:

Execution time = Cpu time + memory time

然后,

Execution time = (#instructions * average instruction execution time) +
                 (Misses Cache l1 * latency L2) +
                 (Misses Cache l2 * latency access memory).

我开发了一个简单的程序来检查这个方程,伪代码是下一个:

  ini_time = get_cepu_time();
  Init_Papi_counters;

  //intesive computation code (matrix mult)

  End_Papi_counters();
  end_time = get_cepu_time();
  end_time = end_time - ini_time.

获得的值如下:

Execution time: 194,111 sec
Cycles: 568949490685
Instructions: 676850501790
Misses L1: 30666388828
Misses L2: 1743525419

英特尔手册中获得的延迟是:

Acces L2: 4,8 ns
Acces main memory: 110 ns

然后,如果我应用等式:

Misses L1 * Latency l2 = 147 sec
Misses L2 * memory access time =   193 sec

我们可以看到,内存时间分量的总和大于总执行时间:

194 < 147 + 193 ERRORRRRR

您能否帮助我了解如何估算执行时间。

4

1 回答 1

1

你是怎么想出这些“方程式”的?对于任何现代 CPU,它们几乎完全不正确,这就是它们产生垃圾结果的原因。

执行时间=cpu时间+内存时间

所有现代 CPU 都能够在进行计算时访问内存。因此,这两个测量值之间存在显着重叠。此外,在任何不平凡的环境中,可能会发生许多其他需要可测量的“执行时间”的事情——磁盘访问或网络访问停止、服务中断等......

执行时间 = (#instructions * 平均指令执行时间) + (未命中缓存 l1 * 延迟 L2) + (未命中缓存 l2 * 延迟访问内存)

撇开缓存未命中不谈,现代 CPU 是流水线和超标量的;数十到数百条指令同时运行,instructions * average execution time要捕捉情况的真实复杂性远非简单的模型。 instructions / (average instructions retired per time unit)是一个更准确的模型,但对于大多数用途来说仍然严重不足,因为实现的退休率非常依赖于正在执行的代码的细节。

正如 Mystical 在他的评论中指出的那样,处理器可以同时处理多个缓存未命中,因此您也不能简单地通过线性模型来解释它们。除了绝对最简单的设计之外,现代 CPU 非常复杂,无法用这种形式的任何模型准确描述。获得准确性能数据的唯一方法是在相关部件上实际运行计算,或者使用周期精确的模拟器,该模拟器实际上对每个执行阶段所涉及的所有依赖项和资源进行建模(现代 CPU 非常少)此类模拟器很容易获得,因为它们很难正确执行)。

于 2013-02-11T00:52:15.570 回答