MPI: rdzenie czy procesory?

Cześć jestem trochę MPI noob więc proszę o cierpliwość. :)

Powiedzmy, że mam program MPI o nazwie foo.c i uruchamiam plik wykonywalny z

Mpirun-np 3 ./ foo

Teraz oznacza to, że program będzie uruchamiany równolegle przy użyciu 3 Procesorów (1 proces na procesor). Ale ponieważ większość procesorów ma dziś więcej niż jeden rdzeń, (weź 2 rdzenie na procesor powiedzieć) czy to oznacza, że program będzie uruchamiany na 3 rdzenie lub 3 procesory?

Prawdopodobnie to musi wystarczyć przy moim słabym zrozumieniu, jaka jest różnica między rdzeniem a procesorem, więc jeśli mógłbyś również wyjaśnić trochę więcej, byłoby to pomocne.

Dziękuję.

 17
mpi
Author: smilingbuddha, 2011-04-27

5 answers

Mpirun uruchomi szereg "procesów" na maszynie. Procesor lub rdzeń, na którym wykonywane są te procesy, jest zależny od systemu operacyjnego. Na maszynach N cpu z rdzeniami M na każdym cpu, masz miejsce dla procesów N * M działających z pełną prędkością.

Ale zazwyczaj:

  • Jeśli masz wiele rdzeni, każdy proces będzie działał na oddzielnym rdzeniu
  • jeśli poprosisz o więcej procesów niż dostępne CPU core*, wszystko będzie działać, ale z niższą wydajnością (tak, możesz Uruchom zadania wieloprocesowe na jednordzeniowej maszynie z jednym procesorem...)
  • Jeśli używasz systemu kolejkowego lub wstępnie skonfigurowanego systemu MPI, dla którego istnieje lista zdalnych maszyn, przydział zostanie rozdzielony na zdalnych maszynach.

(w zależności od implementacji mpi, mogą istnieć pewne opcje wymuszające użycie określonego procesora lub rdzenia, ale nie powinieneś się tym martwić).

 29
Author: Blklight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-26 23:52:39

Program OS Scheduler spróbuje optymalnie przydzielić oddzielne rdzenie do procesów równoległych aplikacji w systemie wielordzeniowym lub do oddzielnych procesorów w systemie wielordzeniowym.

Interesującym przypadkiem jest wielordzeniowy system multi cpu. Ponownie możesz pozwolić harmonogramowi OS zrobić to za Ciebie, lub możesz wymusić (logiczne/fizyczne) powinowactwo rdzenia do procesów, aby powiązać je z konkretnym rdzeniem.

 4
Author: Jay D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-16 10:58:39

Dystrybucja procesów na rdzenie i procesory jest obsługiwana przez system operacyjny i implementację MPI. Uruchamiany na pulpicie system operacyjny zazwyczaj umieszcza każdy proces w innym rdzeniu, potencjalnie redystrybuując procesy w czasie wykonywania. W większych systemach, takich jak superkomputer lub klaster, dystrybucja jest obsługiwana przez menedżerów zasobów, takich jak SLURM. Jednak tak się dzieje, jeden lub wiele procesów zostanie przypisanych do każdego rdzenia.

Regarding hardware, rdzeń może uruchamiać tylko jeden proces na raz. Technologie takie jak hyper-threading pozwalają wielu procesom współdzielić zasoby jednego rdzenia. Istnieją przypadki, w których dwa lub więcej procesów na rdzeń jest optymalnych. Na przykład, jeśli proces wykonuje dużą ilość We/Wy plików, inny może zająć jego miejsce i wykonać obliczenia, podczas gdy pierwszy jest zawieszony na odczycie lub zapisie.

W skrócie, podaj MPI liczbę procesów, które chcesz wykonać. Rozkład tych procesów jest wtedy obsługiwane przezroczyste dla użytkownika. Liczba używanych procesów powinna być określona przez wymagania aplikacji (Uprawnienia 2, liczba plików do odczytu), liczbę dostępnych rdzeni oraz optymalną liczbę procesów na rdzeń dla aplikacji.

 4
Author: corahm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 19:48:01

Z performance view of MPI job, istnieją pewne wyraźne reguły: 1) jeśli kod jest czystym kodem MPI (BLAS nie jest dostrojony z openMP), wyłącz hyperthread i ustaw liczbę zadań na węzeł na rdzenie węzła 2) jeśli kod jest MPI + openMP, możesz ustawić PPN (procesy na węzeł) na rdzenie węzła i OMP_NUM_THEADS na 2 (jeśli są dwa wątki sprzętowe na rdzeń) 3) Jeśli kod jest MPI+openMP i klaster jest ogromny to można ustawić PPN (procesy na węzeł) na 1 i OMP_NUM_THEADS do logicznych liczb PROCESORA, aby zapisać narzut komunikacji

 2
Author: duoduo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-02 13:22:36

Polecenie mpirun używa listy hostów. Jeśli go nie podasz, prawdopodobnie użyje "localhost" i uruchomi tam wszystkie Twoje procesy. Jeśli uruchamiasz 3 procesy i masz 4-rdzeniową maszynę, prawdopodobnie uzyskasz dobre przyspieszenie, ponieważ system operacyjny zazwyczaj umieszcza je na różnych rdzeniach. Jeśli masz tylko dwa rdzenie, to jeden rdzeń otrzyma dwa procesy.

Poprzednia nie jest do końca prawdziwa, ponieważ system operacyjny może przenosić procesy, więc możesz użyć numactl, aby powiązać je z rdzeniem.

Jeśli znajdujesz się w klastrze wielu węzłów, a następnie dobrze skonfigurowany mpi wygeneruje plik hosta, w którym każdy węzeł pojawia się tyle razy, ile ma rdzeni. Tak więc w klastrze 4 węzłów z 8 rdzeniami na węzeł można zażądać do 32 procesów i oczekiwać zbliżonego do idealnego przyspieszenia. (Jeśli twój kod i algorytm na to pozwalają, oczywiście.) Żądanie 9 procesów w tym klastrze może umieścić 8 na jednym węźle, a 9 na innym, co oczywiście nie jest dobre dla wydajności. Można mieć nadzieję, że oprogramowanie klastra pochodzi z mpirun, który lepiej rozprzestrzenia procesy.

 2
Author: Victor Eijkhout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 14:08:04