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

- výťah z kapitoly.

Chapter 9: Parallel Virtual Machine (PVM)

PVM

PVM prostredie a štruktúra aplikácií

Štruktúra supervisor/workers

Hierarchická Štruktúra

Vytváranie úloh

Získanie identifikátora úlohy

Dynamická tvorba úloh

Skupiny úloh

Komunikácia medzi úlohami

Vyrovnávacie pamäte správ

Spakovanie dát

Poslanie správy

Prijatie správy


 
Obr.2.Tri typy operácie príjmu

Rozpakovanie dát

Synchronizácia úloh

Precedenčná synchronizácia


 
Obr.3.Precedenčná synchronizácia realizovaná poslaním správy. Je zaručné ukončenie funkcie f pred začiatkom vykonávania funkcie g.
 

Bariéry


 
Obr.4.Tri úlohy skupiny slave čakajú na bariére.
 

 

 

Operácia redukcie


 
info = pvm_reduce(PvmSum, data_array, 5, PVM_INT, tag, "slave", root)
 
Obr.5. Operácia redukcie vykonaná členmi skupiny slave.
 

Prideľovanie práce

Pomocou odlišných programov

Pomocou rovnakého programu


Pomocou poľa

Supervisor code

/* ******************** Supervisor ****************** */
.....
int tid[n];		/* array to keep track of TIDs */
mytid = pvm_mytid();	/* get supervisor's tid */
tid[0] = mytid;
pvm_spawn(..., ..., ..., n-1, tid+1); /* start up element of the array */
/* Now send the array tid to all the workers */
/* Do the initialization and buffer packing here */
..............
pvm_mcast(tid, n, 1);	/* sam sebe aj tak neposle, mohlo byt tid+1, n-1 */
..............
/* Now do any work that needs to be done in the parent - supervisor */
..............
Worker code

/* ******************** Worker ********************** */
.....
int tid[n];			/* array to keep track of TIDs */
worker_id = pvm_mytid();	/* get the tid of this worker */
supervisor_id = pvm_parent();	/* get the tid of the supervisor */
pvm_recv(supervisor_id,1); /* receive a message from the supervisor */
/* do some unpacking to get the array tid here */
/* search the array tid */
for(i = 0; i < n && tid[i] != worker_id; i++);
my_id = i;
/* my_id for each worker is a unique integer between 1 and n-1 */
/* The switch statement should be inserted here */
...............

Pomocou skupiny úloh

Supervisor code

/* ******************** Supervisor ****************** */
.....
int tid[n];		/* memory for return value of pvm_spawn (TIDs) */
mytid = pvm_mytid();	/* get supervisor's tid */
my_id = pvm_joingroup("everybody"); /* join a group */
pvm_spawn(..., ..., ..., n-1, ...); /* start up the children */
pvm_barrier("everybody",n); /*wait for everyone to join the group */
/* Now do any work that needs to be done in the parent - supervisor */
..............
Worker code

/* ******************** Worker ********************** */
.....
worker_id = pvm_mytid();	/* get the tid of this worker */
my_id = pvm_joingroup("everybody"); /* join a group */
/* my_id for each worker is a unique integer between 1 and n-1 */
pvm_barrier("everybody",n); /*wait for everyone to join the group */
/* The switch statement should be inserted here */
...............