Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
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 =" <
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" <
MPI_FALIZE ();
návrat 0;
}
`` `
Vysvetlenie:
1. Inicializácia:
- `MPI_init (&argc a argv)`:Inicializuje prostredie MPI.
- `MPI_COMM_RANK (MPI_COMM_WORLD, &RANK)`:ZÍSKAJTE RANK (ID) aktuálneho procesu.
- `MPI_Comm_size (MPI_Comm_world, &size)`:Získa celkový počet procesov v komunikátore.
2. Inicializácia koreňového procesu:
- `if (Rank ==0)`:Kód vo vnútri tohto `if` blok sa vykonáva iba na procese 0 (koreňový proces).
- `iniciat_population =1000,0;`:Root Process nastavuje počiatočnú hodnotu populácie.
3. vysielanie s `mpi_bcast`:
- `mpi_bcast (&inicil_population, 1, MPI_Double, 0, MPI_Comm_world);`
- `&inicil_population`:Ukazovateľ na údaje, ktoré sa majú vysielať (umiestnenie pamäte, kde sa uloží` inicijála_populácie ").
- `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ú.