2016-08-16 58 views
1

我有一個與MPI並行的C程序(聲波解算器)。但是,我一直在測試各種內核的加速性能,並且發現了一些奇怪的東西。如果我使用N個進程,其中N是機器中可用內核的數量,那麼在下一步我看不到性能改進。MPI - 使用機器上的每個可用內核時性能不會提高

因此,在我的8核心機器上,我看到從1進程加速到2進程到4進程,但不是從4到8.同樣在我的4核心筆記本電腦上,我看到加速從1到2,而不是從2到4.

任何想法可能導致這種情況?

+0

你真的有8(4)個物理內核還是那些只有超線程(https://en.wikipedia.org/wiki/Hyper-threading)的?如果您的代碼將全部負載都加載到所有物理內核上,那麼使用超線程技術通常不會帶來顯着的性能提升。 – jotasi

+0

啊,我從你的評論做了一些研究,我想我明白了。所以我的筆記本電腦有兩個物理核心,但有4個邏輯核因此,通過物理內核的數量不會帶來太多的性能提升? –

+0

這取決於你的代碼,但根據我的經驗,使用包括超線程在內的所有線程通常會降低性能。 – jotasi

回答

1

許多現代(Intel-)cpu在單個物理內核上運行兩個hyperthreads。您引用的核心數量實際上是可用的硬件線程數量,而不是物理執行單元的數量。

只要您使用的物理核心數量小於或等於物理核心數量,進程將(或至少應該)分發以使用所有可用代碼。但是一旦所有物理內核都被佔用,額外的進程將與另一個進程共享一個物理內核。

如果使用所有線程將會提高您的性能或提高多少,則無法給出明確的答案。這很大程度上取決於您正在運行的代碼。在superuser.com上給出了一個類似問題的非常好的答案。從本質上講,如果你的進程是內存綁定的,或者使用你的cpu的不同部分(整數/浮點運算,視頻編碼,矢量處理等),通信開銷很小,你甚至可以獲得完美的縮放比例。 cpu-bound的代碼只能執行一種計算,可能不會有任何改進,或者由於通信開銷,甚至可能需要更長的時間。