2010-08-09 42 views
3

我有用C語言編寫的串行(非並行)應用程序。我使用英特爾線程構建模塊對其進行了修改和重新編寫。當我在一臺四核機器的AMD Phenom II機器上運行這個並行版本時,性能增益超過4倍,這與Amdahl定律相沖突。任何人都可以給我一個爲什麼發生這種情況的原因?多核應用程序中的性能增益問題

謝謝, Rakesh。

+1

是您的應用程序通常CPU綁定,或IO的限制?如果它是IO綁定的,它可能會替換其他進程等待IO的進程,從而節省比正常時間更多的時間。 – Amber 2010-08-09 06:00:51

回答

4

如果您重寫該程序,可以使其更高效。 Amdahl定律限制了並行性導致的加速數量,而不是通過改進代碼來提高代碼的速度。

您可能會意識到擁有4倍緩存的效果,因爲現在您可以使用全部四個特效。或者可能與您的計算機上運行的其他進程爭用較少。或者你意外地修復了一個預測不到的分支。

TL/DR:發生了。

1

任何人都可以給我一個原因,爲什麼發生這種情況?

總之,高速緩存

每個內核都有自己的L1緩存,因此,只需使用更多的內核,就可以增加緩存的數量,從而使更多的數據更接近它將要處理的位置。僅此一項就可以顯着提高性能(就好像您在單個內核上有更大的緩存)。當與有效並行化的近線性加速相結合時,您可以看到總體超線性性能改進。

2

它被稱爲「超級線性加速」,並可能會因多種原因,但最常見的根本原因可能是緩存行爲。通常當超線性加速發生時,可以讓順序版本更高效。

例如,假設你有一個處理器裏的一些核心共享L2緩存(一個通用的架構,這些天),並假設你的算法使得大量數據結構的多個遍歷。如果執行序列中的遍歷,則每個遍歷必須將數據拉入L2高速緩存重新,而如果執行並行遍歷則可能避免大量的未命中,只要遍歷運行一步一步(失步是這裏不可預測的表現的一個很好的來源)。爲了使順序版本更高效,您可以交叉遍歷,從而提高局部性。