2011-12-13 54 views
1

爲什麼程序不同部分中的相同彙編程序操作(例如多個)消耗不同的時間量?彙編程序操作的時間

P.S.我正在使用C++和反彙編程序。

+0

您是否有更具體的例子,您是否使用x86(_64?)?這有點含糊。這個問題更多的是關於微代碼架構的問題。例如,您正在註冊兩個註冊表或兩個存儲位置。這是你第一次在一段時間內使用變量導致緩存未命中,因爲它是L(1-3)緩存。 – 111111

+0

64.在profiler中,例如,我看到「mulps%xmm11,%xmm5」。我想這是寄存器中的數據。 – klm123

+0

正確的如果我錯了,但xmmXX是SSE寄存器,它正在執行該操作多達4個浮點數或一次2個雙精度浮點數 – 111111

回答

4

有各種各樣的原因,爲什麼同一種操作可以在現代處理器上有大量不同的性能。

  • 數據緩存缺失: 如果您的操作訪問內存,它可能會去緩存在一個位置和其他地方產生高速緩存未命中。高速緩存未命中可以按照循環週期順序執行,而簡單的操作通常在幾個週期內執行,所以這會使其慢得多。

  • 流水線停頓: 現代CPU通常流水線,所以指令(或一個以上)可被調度每個循環中,但它們通常需要一個以上的週期,直到結果是可用的。您的操作可能取決於另一個操作的結果,該操作在計劃操作時未準備好,因此CPU必須等待生成結果的操作完成。

  • 指令高速緩存未命中: 指令流也被緩存,所以你可能會發現其中的一個位置CPU產生高速緩存未命中每次encounteres該位置(不太可能的事情,這將需要檢測的時間的情況儘管運行時間的數量,指令緩存並不那麼小)。

  • 分支預測失誤: 另一種流水線失速。 CPU將嘗試預測條件跳轉將以何種方式進行,並推測性地執行該執行路徑中的代碼。如果它是錯誤的,它必須放棄這個推測性執行的結果,並從另一條路徑開始。這可能會顯示在探查器中另一路徑的第一行。

  • 資源競爭:該操作可能不會依賴一個不avalible結果,但需要執行單元可能仍然被其他指令(佔據一些指令是不是所有的處理器完全流水線,也可能是因爲一些一種超線程或推土機共享FPU)。再次,CPU可能必須停止,直到設備空閒。

  • 頁面錯誤:應該很明顯。基本上是類固醇緩存小姐。如果訪問的內存必須從磁盤重新加載它會花費週期

  • ...成千上萬的:這樣的例子不勝枚舉,但是提點最有可能使我的opionon產生影響的那些。

+0

不要混淆分支預測和分支預測;-) –

+0

灰熊,感謝您的詳細解釋! – klm123

+0

夢幻般的答案。 –

2

我假設你問的是完全相同的指令應用於相同的操作數。

可能會產生巨大性能影響的一個可能原因是,操作數是否在CPU高速緩存中可用,或者是否必須從主RAM中獲取操作數。

這只是一個例子;還有很多其他潛在的原因。對於現代的CPU,通過查看代碼很難弄清楚給定指令需要多少個週期。

5

這個問題很模糊,但一般在一個現代化的CPU,你不能指望操作具有恆定的執行時間,因爲很多因素會影響這一點,包括但不限於:

  • 分支預測故障
  • 高速緩存未命中
  • 流水線
  • ...
+0

+1,不要忘記交換文件。 – sharptooth

+1

我喜歡我的AVR,其中'mul'總是需要相同的週期數。哦,等等..它沒有'mul'。 –

+0

@ noah1989:不要嘗試圖片asm。它使AVR看起來很棒。 – 111111

1
  1. 在剖析器中,例如,我看到「mulps%xmm11,%xmm5」。我想這是在寄存器

xmmXX是SSE指令的數據。 mulps是精確單數,它取決於您是否將SSE乘法與正常標量乘法進行比較。在這種情況下,這是可以理解的。

我們確實需要更多信息才能更好地回答一大堆asm和您的配置文件數據。

如果只是這個指令很慢?或一塊指令,也許它從未對齊的內存中加載,或者你得到緩存未命中,管道危險和其他許多可能性。