Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Môžete uviesť príklad použitia vysielania MPI v aplikácii paralelného výpočtu?

Dobre, uveďte príklad použitia MPI vysielaného v aplikácii paralelného výpočtu. Vyberiem relatívne jednoduchý scenár:Distribúcia počiatočných podmienok pre numerickú simuláciu do všetkých procesov.

scenár:

Predstavte si, že prevádzkujeme paralelnú simuláciu (napr. Modelovanie rastu populácie). Máme globálny parameter `inicil_population`, ktorý musí byť známy * každým * procesom v komunikátore MPI. Túto hodnotu spočiatku pozná iba koreňový proces (proces s hodnotením 0). Použijeme `MPI_BCast` na distribúciu` inicijum_population` do všetkých procesov.

Príklad kódu (C ++)

`` C ++

#include

#include

int main (int argc, char ** argv) {

Rank, veľkosť, veľkosť;

dvojitá iniciiat_populácia; // globálny parameter

MPI_init (&argc, &argv);

MPI_COMM_RANK (MPI_COMM_WORLD, &RANK);

MPI_Comm_size (MPI_Comm_world, &size);

// Inicializáciu inicivita_populácie iba na koreňovom procese

if (road ==0) {

iniciat_population =1000,0; // Príklad počiatočnej hodnoty

Std ::cout <<"Proces 0:počiatočná populácia =" < } else {

iniciat_populácia =0,0; // Iné procesy inicializujú na predvolenú hodnotu (na tom nezáleží)

}

// Vysielajte počiatočnú populáciu z procesu 0 do všetkých procesov.

MPI_BCast (&inicil_population, 1, MPI_Double, 0, MPI_COMM_WORLD);

// Teraz majú všetky procesy správnu hodnotu inicijáka.

// Vykonajte simulačné výpočty pomocou distribuovaných údajov

// príklad:

dvojitý rast_rate =0,05; // 5% miera rastu

Double Final_Population =inicil_population * (1,0 + Growth_rate);

Std ::cout <<"Process" < - `1`:Počet prvkov na vysielanie (v tomto prípade jeden dvojitý).

- `MPI_Double`:Datatyp MPI vysielania údajov.

- `0":Rady koreňového procesu (proces, ktorý má pôvodnú hodnotu a odosiela ju).

- `MPI_Comm_world`:Komunikátor (v tomto prípade predvolený komunikátor vrátane všetkých procesov).

4. Výpočet simulácie:

- Po `MPI_BCast`, * všetky * procesy majú správnu hodnotu` inicijum_population`.

- Príklad kódu potom vykoná jednoduchý výpočet simulácie (vynásobenie rýchlosti rastu) a vytlačí výsledky. V skutočnej aplikácii by to bolo miesto, kde dôjde k paralelnému výpočtu pomocou distribuovaných údajov.

5. finalizácia:

- `MPI_fininalize ()`:Vypína prostredie MPI.

Ako to funguje (pod kapotou):

Funkcia `MPI_BCast` je implementovaná efektívne pomocou knižníc MPI. Použitý konkrétny algoritmus sa môže líšiť v závislosti od implementácie MPI a veľkosti vysielania údajov, ale spoločné stratégie zahŕňajú:

- Direct Send: Koreňový proces priamo odosiela údaje do každého iného procesu. Je to jednoduché, ale môže sa stať neefektívnym pre veľké množstvo procesov.

- Vysielacie vysielania: Koreňový proces odosiela údaje do niekoľkých ďalších procesov, ktoré ich potom postúpia ostatným a vytvárajú distribučnú sieť podobnú stromovi. Toto je všeobecne škálovateľnejšie ako priame odosielanie.

- Pipeline Broadcast: Koreň vysiela na jeden proces, ktorý vysiela inému atď. Vo všeobecnosti je to efektívnejšie pre veľké správy.

Zostaviť a spustiť tento kód:

1. uložiť: Uložte kód ako súbor `.cpp` (napr.,` Broadcast_example.cpp`).

2. kompilácie: Použite kompilátor MPI-Aware (ako `MPIC ++` alebo `MPICC`):

`` `Bash

MPIC ++ Broadcast_example.cpp -o Broadcast_example

`` `

3. Run: Na spustenie programu s požadovaným počtom procesov použite `mpirun` alebo` mpiexec`:

`` `Bash

mpirun -n 4 ./broadcast_example # beh so 4 procesmi

`` `

výstup (príklad so 4 procesmi):

`` `

Proces 0:Počiatočná populácia =1000

Proces 0:Počiatočná populácia =1000, simulovaná konečná populácia =1050

Proces 1:Počiatočná populácia =1000, simulovaná konečná populácia =1050

Proces 2:Počiatočná populácia =1000, simulovaná konečná populácia =1050

Proces 3:Počiatočná populácia =1000, simulovaná konečná populácia =1050

`` `

kľúčové cesty:

- `MPI_BCast` je nevyhnutný na distribúciu údajov z jedného procesu (root) do všetkých ostatných procesov v komunikátore.

- Je to * blokovanie * operácia. Všetky procesy budú čakať, kým sa vysielanie dokončí.

- Zvyčajne sa používa na distribúciu počiatočných údajov, konfiguračných parametrov alebo iných informácií, ktoré sú potrebné všetkými procesmi na spustenie alebo pokračovanie paralelného výpočtu.

- Koreňový proces * musí mať pred vysielaním správnu hodnotu údajov.

- Všetky procesy * musia * volať `MPI_BCast` (dokonca aj koreňový proces). Všetci poskytujú umiestnenie pamäte na * prijímanie * údajov.

Tento príklad poskytuje základné chápanie `MPI_BCast`. Môžete ho prispôsobiť zložitejším paralelným aplikáciám, pri ktorých sa vyžaduje distribúcia údajov všetkým procesom. Nezabudnite opatrne zvoliť koreňový proces a zabezpečiť, aby sa údaje, ktoré sa majú vysielať, v tomto procese správne inicializujú.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené