2013-02-10 29 views
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 

潜伏期在Intel手册获得是:

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 

你能帮助我,以便发现我如何近似执行时间。

+0

要知道的是缓存未命中可以重叠。处理器可以同时处理多个缓存未命中。所以缓存未命中占用的时间通常远远少于(错过次数)*(未命中延迟)。无论如何,要逼近执行时间几乎是不可能的,除非实际运行它并计时。现代处理器比你想像的要复杂得多。 – Mysticial 2013-02-10 18:24:05

回答

1

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

执行时间= CPU时间+时间存储器

所有现代CPU能够访问存储器而计算正在发生的。所以这两个测量值之间有重大的重叠。此外,在任何非平凡的环境中,很多其他的事情可能发生,采取可衡量的“执行时间” - 拖延对磁盘访问或网络接入,服务中断,等...

执行时间= (#instructions *平均指令执行时间)+ (未命中高速缓存L1 *延迟L2)+ (未命中高速缓存L2 *延迟存取存储器)

撇开高速缓存未命中,现代CPU是流水线和超标量;几十到几百条指令同时在飞行,并且instructions * average execution time远不是一个简单的模型来捕捉真实情况的复杂性。 instructions/(average instructions retired per time unit)是一个更准确的模型,但对于大多数用法仍然不足,因为已实现的退休率非常依赖于正在执行的代码的具体情况。正如他的评论中的神秘主义所述,处理器可以同时服务多个缓存未命中,因此您不能通过线性模型简单地解决它们。除了绝对最简单的设计之外,现代CPU非常复杂,无法用这种形式的任何模型进行精确描述。获得准确的性能数据的唯一方法是实际运行相关部分的计算,或者使用循环精确模拟程序,该模拟程序实际上模拟了每个执行阶段所涉及的所有依赖关系和资源(现代CPU很少对于这样的模拟器是容易获得的,因为它们做得很正确)。