Hesham El-Rewini & Ted G. Lewis: Distributed and Parallel Computing

- výťah z kapitoly. opravené chyby: 123 4

Chapter 10: Message-Passing Interface (MPI)

MPI

MPI aplikácia

Skupiny úloh

Komunikátory

Example 4:

MPI aplikácia má 5 úloh: T0, T1, T2, T3 a T4, ktoré majú rank 0, 1, 2, 3, 4 a 5. Nech všetky zavolajú funkciu MPI_Comm_split():

T0: MPI_Comm_split(MPI_COMM_WORLD, 8, 0, &newcomm)
T1: MPI_Comm_split(MPI_COMM_WORLD, 5, 1, &newcomm)
T2: MPI_Comm_split(MPI_COMM_WORLD, 8, 2, &newcomm)
T3: MPI_Comm_split(MPI_COMM_WORLD, 5, 3, &newcomm)
T4: MPI_Comm_split(MPI_COMM_WORLD, MPI_UNDEFINED, 4, &newcomm)

Potom skupina asociovaná s komunikátorom newcomm bude pozostávať z úloh:
{T0,T2} v úlohách T0 a T2
{T1,T3} v úlohách T1 a T3
a v úlohe T4 bude prázdna.
Rank, ktorý budú mať úlohy v tejto novej skupine bude odvodený z ranku v pôvodnej skupine (teda 0 a 1 v poradí, ako je uvedené).

Virtuálne topológie

Example 5:

máme 6 úloh (T0..T5) s rankami 0..5 a chceme zriadiť grid 2x3:
vytvoríme nový komunikátor 'gridcomm' a nepovolíme optimalizáciu mappingu:

MPI_Cart_create(MPI_COMM_WORLD, 2, {2,3}, {0,0}, 0, &newcomm)

rank v 'starej' skupine: 0 1 2 3 4 5
koordináty úlohy: [0,0] [0,1] [0,2] [1,0] [1,1] [1,2]

Example 6:

máme 6 úloh (T0..T5) s rankami 0..5 a chceme zriadiť nasledovný graf:

  0	int index[6] = {2, 5, 8, 12, 14, 16};
 / \	int edges[16]= {1, 2, 0, 3, 4, 0, 3, 5, 1, 2, 4, 5, 1, 3, 2, 3};
1   2	int mapping = 0;
|\ /|	MPI_Comm *graphcomm; //má byť MPI_COMM_WORLD
| 3 |	MPI_Graph_create(MPI_WORLD_COMM,nnodes,index,edges,mapping,graphcomm)
|/ \|	  vytvoríme nový komunikátor 'graphcomm' a nepovolíme optimalizáciu
4   5

 

Komunikácia medzi úlohami

Synchronizácia

Example 9:

máme 5 úloh (T0..T4) s rankami 0..4 a chceme synchronizovať iba T2 s T3:
vytvoríme nový komunikátor 'newc' a "na ňom" vykonáme bariéru:

int ex[3]={0,1,4};
MPI_Group worldg,smallg;
MPI_Comm newc;

MPI_Comm_group(MPI_COMM_WORLD, &worldg);
MPI_Group_excl(worldg, 3, ex, &smallg);
MPI_Comm_create(MPI_COMM_WORLD, smallg, &newc);
MPI_Barrier(newc);

Kolektívne operácie

Supervisor/worker application skeleton

#include "mpi.h"
void supervisor(), worker();

main(int argc, char *argv[]) {
int myrank;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
if (myrank == 0)
 supervisor();
else 
 worker();
MPI_Finalize();
exit(0);
}

void supervisor()          
{int i, ntasks;
/* ... */;
MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
for (i = 1; i < ntasks; ++i) {
  /* send some work for worker i */;
  }
for (i = 1; i < ntasks; ++i) {
  /* receive results from worker with rank i */;
  }
}

void worker()              
{
/* ... */;
/* receive work from the supervisor (rank == 0) */;
/* send the result to the supervisor */;
}
}