2013-02-10 66 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很少對於這樣的模擬器是容易獲得的,因爲它們做得很正確)。