Autor sekcije: Vedran Miletić

Python: modul mpi4py: komunikatori i grupe procesa

  • 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 Group (službena dokumentacija)
    • group.Excl(ranks) – iz grupe isključuje procese s rangovima danim u listi ranks
    • group.Incl(ranks) – u grupi ostavlja samo one procese navedene u listi ranks, i to u poretku navedenom u listi ranks
    • group.Difference(group1, group2), group.Intersect(group1, group2), group.Union(group1, group2) – stvaraju grupu koja je rezultat skupovne razlike, presjeka, odnosno unije grupa group1 i group2
    • group.Free() – prazni grupu, odnosno miče sve procese iz grupe
    • Dokumentacija svih funkcija dana je u sklopu opisa .

Konstruktori komunikatora

  • comm.Dup() – stvara duplikat komunikatora

  • comm.Create(group) – stvara komunikator zasnovan na grupi group

    from 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 komunkator. (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 razdijelili COMM_WORLD u dva dijela.
  • Prvi dio neka sadrži procese s parnim rangom iz COMM_WORLD u uzlaznom poretku.
  • Drugi dio neka sadrži procese s neparnim rangom iz COMM_WORLD u 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.
    • 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.