2013-12-21 11 views
1

我們有一個小C++項目,具有以下體系結構。算法與預編譯參考實現的速度比在不同計算機上有所不同

這兩個被編譯成一個DLL:

  • 算法
  • 一種用於該檢查結果的正確性和測量執行速度的算法測試儀。

然後另一個實現相同的算法是由別人寫的。

main()功能執行此:

  • 調用該算法的兩種實現測試器並測量它們的執行速度。這是多次完成的,以便以後可以取平均值。
  • 計算它們之間的速度比(測量時間/測量參考時間)。這被稱爲分數。

我們發現在不同的計算機上運行相同的代碼和DLL會返回相當不同的速度比。在一臺計算機上,實現得分爲6.4,而另一臺計算機上的實現得分爲2.8。那怎麼可能?

+0

「算法與預編譯參考實現的速度比在不同計算機上有所不同」 - 是的,這就是非程序員所稱的「真實生活」。 – 2013-12-21 19:03:41

+0

你爲什麼期望該比例(大致)相同? – dyp

+1

計算機在各種或多或少微妙的方面都有所不同。例如,考慮基本算法A和需要額外存儲器的更廣泛的緩存算法B.在系統1上,兩者都適用於可用的RAM,而B更快,而在系統2上,算法B開始交換並放慢抓取速度。 – doynax

回答

1

可能會有噸的因素,但這裏有幾個:

  • CPU緩存可以是一個大的。不同的處理器具有不同的緩存(不僅僅是原始緩存大小,還包括緩存策略)。其中一個可能比另一個「更聰明」,或者在這種特定情況下,碰巧比另一個更好。
  • CPU流水線。現在的指令在CPU中交織,即使在單個執行線程中也是如此。 CPU管道的工作方式因CPU而異,一個CPU可能同時具備兩個特定的功能,而另一個CPU則不能。如果其中一個實現利用這一點,那麼它會得到一個提速(或者如果他們都這樣做了,那麼他們都會接近相同的速度)。
  • CPU指令執行時間可能會有所不同。因此,執行與另一個CPU完全相同的指令的一個CPU可能能夠比其他CPU執行更快的速度。如果一臺計算機的CPU花費較長時間來使用特定的指令(並且其中一個實現碰巧使用該指令),而另一個CPU已經改進以加速該指令的執行時間,則會存在較大的時間差異。
  • CPU中的分支預測模型可能不同,並且一個實現可能對特定CPU的分支預測模型更多或更不友好。
  • 從內存分配策略(也許一個操作系統有一個內存分配策略導致時間差異較大,而另一個操作系統具有不同的分配策略以最小化差異),操作系統可以在很多方面影響到這一點:CPU時間切片管理(例如多線程算法?)。
相關問題