5. cvičenie – základy MPI 📨

Úvod

Zdrojové súbory na cvičenie si stiahnite spoločne ako archív.

Overenie inštalácie

Na použitie MPI potrebujete podporu MPI v Pythone (mpi4py) a samotnú implementáciu MPI. Na predmete používame Intel MPI, ktorá je tiež dostupná ako Python balíček (impi-rt).

Na spustenie paralelnej aplikácie sa používa program mpiexec. Nájdete ho na ceste ...cesta_k_Pythonu\Library\bin\mpiexec.exe. Pri spusteniach aplikácií na tomto cvičení musíte používať celú cestu k programu. Alternatívne si ho môžete pridať do premennej PATH.

Keďže som impi-rt inštaloval globálne, mpiexec mám na ceste C:\Python314\Library\bin\mpiexec.exe. Do PATH ho natrvalo pridám pomocou týchto príkazov v PowerShelli:

1 Point-to-point komunikácia

Nasleduje ukážka point-to-point komunikácie, v ktorej sú posielané Python objekty. Knižnica mpi4py ich pred odosielaním a po prijatí automaticky serializuje/deserializuje pomocou modulu pickle. Takéto posielanie je síce programátorsky prívetivé, ale nie veľmi výkonné.

Všimnite si:

  • Na komunikácii sa podieľajú iba dva procesy (0 a ntids - 1).
  • Proces 0 pošle zoznam data procesu ntids - 1 a ten ho pošle späť procesu 0.
  • Informačný výpis vypisujeme na štandardný chybový výstup bez bufferingu. Vyskúšajte, kedy sa informácia vypíše pri štandardnom výstupe.

Vašou úlohou je prepísať tento kód, aby procesy na komunikáciu používali numpy typy. Využite k tomu kostru programu nižšie.

Tipy:

  • Ako dátový typ pre prvky polí v tejto a ďalších úlohách používajte dtype=np.float64.
  • Na vytvorenie polí sa vám môžu hodiť metódy arange() a empty().

2 Broadcast

Dokončite nižšie uvedený kód skalárneho súčinu dvoch vektorov. Ako dátové typy použite numpy polia. Aký je rozdiel medzi paralelne vypočítaným súčinom a kontrolným súčinom vypočítaným v procese 0?

3 Scatter

V predchádzajúcej úlohe sme pri výpočte skalárneho súčinu rozposlali oba vektory v celej dĺžke všetkým procesom, aj keď každý proces počítal iba s menšou časťou každého vektora.

Teraz implementujte riešenie skalárneho súčinu vektorov, ktoré jednotlivým procesom pošle iba tie časti vektorov, ktoré skutočne potrebujú k výpočtu. Použite na to operáciu scatter.