2011-04-26 87 views
15

嗨,我是一種MPI noob,所以請在這一個承擔我。 :)MPI:內核還是處理器?

說我有一個名爲foo.c的MPI程序和我運行

的mpirun -np 3 ./foo

現在,這意味着可執行程序將並行使用3個處理器上運行(每個處理器1個進程)。但是由於目前大多數處理器都具有多個內核,(每個處理器需要2個內核),這是否意味着該程序將運行在3個內核或3個處理器上?

也許這與我對於核心和處理器之間的差異是什麼所以不太瞭解,如果你還可以多解釋一點,那將會有所幫助。

謝謝。

+0

如果你在Linux機器上執行cat/proc/cpuinfo,你會看到每個超線程都被視爲處理器,與MPI一致使用「處理器」。 – Hackless 2016-03-21 04:04:04

回答

25

mpirun將在機器上執行一些「過程」。執行這些進程的CPU或核心是依賴於操作系統的。 在每個CPU上具有M個核心的N個CPU上,您可以全速運行N * M個進程。

但是,通常爲:

  • 如果你有多個內核,每個進程將在一個單獨的核心
  • 如果你要求比現有的核心* CPU的多個進程,一切都會都跑,但效率較低(是的,您可以在單CPU單核計算機上運行多進程作業...)
  • 如果您使用排隊系統或預配置的MPI系統,並且存在遠程計算機列表,該分配將分配到遠程機器上。

(取決於mpi的實現,可能會有一些選項來強制特定的CPU或核心,但你不應該擔心這一點)。

4

操作系統調度程序將嘗試爲多核系統中的並行應用程序的進程優化分配單獨的內核,或分離多處理器系統中的處理器。

有趣的情況是一個多核多CPU系統。再次,您可以讓OS調度程序爲您執行此操作,或者您可以強制(邏輯/物理)內核關聯到您的進程以將它們綁定到特定內核。

4

進程向內核和處理器的分配由操作系統和MPI實現處理。在桌面上運行時,操作系統通常會將每個進程放在不同的核心上,可能會在運行時重新分配進程。在像超級計算機或集羣這樣的大型系統中,分配由資源管理器(例如SLURM)處理。然而,這會發生,一個或多個進程將被分配給每個核心。

關於硬件,核心一次只能運行一個進程。超線程等技術允許多個進程共享單個內核的資源。有些情況下每個核心有兩個或多個進程是最優的。例如,如果一個進程正在執行大量的文件I/O,另一個可能取代它的位置並在第一個進行讀或寫操作時進行計算。

總之,給MPI你想執行的進程的數量。然後這些過程的分配對用戶是透明的。您使用的進程數應該由應用程序的要求(2的冪數,要讀取的文件數),可用的內核數以及應用程序的每個內核的最佳進程數決定。

0

mpirun命令使用主機列表。如果不指定它,它可能會使用「localhost」並在那裏運行你的所有進程。如果你運行3個進程並且你有一個4核心機器,你可能會獲得很好的加速,因爲操作系統通常會將它們放在不同的核心上。如果你只有兩個內核,那麼一個內核會得到兩個進程。

上述情況並非完全正確,因爲允許操作系統移動進程,因此您可能希望使用numactl將它們綁定到核心。

如果您在多節點集羣上,那麼安裝好的mpi將生成一個主機文件,其中每個節點出現的次數與其核心數量相同。因此,在每個節點有8個內核的4節點集羣中,您可以請求最多32個進程,並期望接近完美加速。 (當然,如果你的代碼和你的算法允許的話)。在這個集羣上請求9個進程可能會將8個節點放在一個節點上,而將9個放在另一個節點上,這對於性能來說當然不是很好。您希望您的集羣軟件帶有一個mpirun,可以將流程分散得更好。

1

從MPI作業的性能角度看,有一些明確的規則: 1)如果你的代碼是純MPI代碼(BLAS沒有用openMP進行調優),關閉超線程並將每個節點的作業數設置爲2)如果代碼爲MPI + openMP,則可以將PPN(每個節點進程)設置爲節點的核心,將OMP_NUM_THEADS設置爲2(如果每個核心有兩個硬件線程) 3)如果代碼是MPI + openMP和你的集羣是巨大的,那麼你可以設置PPN(每個節點的進程)爲1,OMP_NUM_THEADS爲邏輯CPU編號以節省通信開銷