Python modul mpi4py: komunikatori i grupe procesa
Ova značajka je dio standarda MPI-1.
Dokumentacija svih funkcija koje koristimo u nastavku dana je u sklopu pregleda dostupne funkcionalnosti u mpi4py-u.
-
komunikator = grupa procesa + komunikacijski kontekst
- grupa procesa -- skup procesa koji čine sudjeluju u izvođenju MPI posla; neovisna o grupi procesa na razini OS-a
- komunikacijski kontekst -- izolira poruke u različitim dijelovima programa; skriven od korisnika, nećemo se njime dalje baviti
-
MPI.COMM_WORLD-- komunikator koji uključuje sve pokrenute procese tog posla MPI.COMM_SELF-- komunikator koji uključuje samo proces sam (rijetko se koristi)-
MPI.COMM_NULL-- prazan komunikator -
metode za pristup podacima
comm.Get_group()-- metoda komunikatora koja dohvaća grupu
-
objekti tipa
Groupgroup.Excl(ranks)-- iz grupe isključuje procese s rangovima danim u listiranksgroup.Incl(ranks)-- u grupi ostavlja samo one procese navedene u listiranks, i to u poretku navedenom u listiranksgroup.Difference(group1, group2),group.Intersect(group1, group2),group.Union(group1, group2)-- stvaraju grupu koja je rezultat skupovne razlike, presjeka, odnosno unije grupagroup1igroup2group.Free()-- prazni grupu, odnosno miče sve procese iz grupe
Konstruktori komunikatora
comm.Dup()-- stvara duplikat komunikatora-
comm.Create(group)-- stvara komunikator zasnovan na grupigroupfrom mpi4py import MPI comm = MPI.COMM_WORLD group = comm.Get_group() newgroup = group.Excl([0]) newcomm = comm.Create(newgroup) if comm.Get_rank() == 0: assert newcomm == MPI.COMM_NULL else: assert newcomm.Get_size() == comm.Get_size() - 1 assert newcomm.Get_rank() == comm.Get_rank() - 1 group.Free() newgroup.Free() if newcomm: newcomm.Free()
Zadatak
Stvorite grupu procesa koja sadrži samo procese iz grupe COMM_WORLD koji imaju parni rang. Iskoristite novu grupu da bi stvorili novi komunikator. (Uputa: iskoristite Group.Incl(), Group.Range_incl() ili Group.Excl().)
-
comm.Split(color, key)-- dijeli komunikator prema boji i ključu- boja procesa je cijeli broj koji određuje raspored procesa po podgrupama
- ključ procesa je cijeli broj koji određuje kojim redom će se dodijeliti rang procesima u novonastalim podgrupama
from mpi4py import MPI world_rank = MPI.COMM_WORLD.Get_rank() world_size = MPI.COMM_WORLD.Get_size() if world_rank < world_size // 2: color = 55 key = -world_rank else: color = 77 key = +world_rank newcomm = MPI.COMM_WORLD.Split(color, key) # dobivamo dvije podgrupe procesa koje ne komuniciraju međusobno newcomm.Free()
Zadatak
- Iskoristite
Comm.Split()da bi razdijeliliCOMM_WORLDu dva dijela. - Prvi dio neka sadrži procese s parnim rangom iz
COMM_WORLDu uzlaznom poretku. - Drugi dio neka sadrži procese s neparnim rangom iz
COMM_WORLDu silaznom poretku.
MPI terminologija razlikuje intrakomunikator od interkomunikatora:
- Intrakomunikator (engl. intracommunicator) je komunikator koji se koristi za komunikaciju unutar jedne grupe procesa.
-
Interkomunikator (engl. intercommunicator) je komunikator koji se koristi za komunikaciju između dvaju ili više grupa procesa, primjerice kod dinamičkog upravljanja procesima.
- U standardu MPI-1, interkomunikator se koristi za komunikaciju točka-do-točke između dvije disjunktne grupe procesa.
- U standardu MPI-2, interkomunikator se može koristiti i za kolektivnu komunikaciju između dvije ili više grupa procesa.
Author: Vedran Miletić