next up previous contents
Next: Exemple d'utilisation de PVM Up: Quelques primitives de PVM Previous: Lancement d'un exécutable sur

Mécanisme de communication

PVM met à la disposition du programmeur différentes primitives permettant l'échange de messages entre les processus en exécution sur la grappe.

$\bullet$Envoi de messages

L'envoi d'un message se subdivise en 3 étapes:

1) Initialisation d'un buffer
Avant d'envoyer un message, il faut demander à PVM d'initialiser un buffer dans lequel sera recopié le message à transmettre. Ceci se fait à l'aide de la primitive: pvm_initsend(PvmDataDefault). Cette fonction renvoie un entier bufID qui correspond au numéro d'identification du buffer.

2) Copie du message dans le buffer
Avant d'être transmis le message doit être copié dans le buffer. Pour des raisons d'optimisation de transmission, PVM compresse le message avant de l'envoyer, on utilise pour celà la fonction: pvm_pkTYPE(TYPE *message, int nb_elem, int pas) où:
-
TYPE est l'un des types suivants: float, double, int, long, short,
-
message est un pointeur sur les éléments constituant le message (vecteur contigu d'éléments),
-
nb_elem est le nombre d'éléments constituant le message,
-
pas est l'intervalle utilisé pour copier le message dans le buffer
.
pas=1, tous les élémenst sont copiés dans le buffer,
.
pas=2, un élément sur 2 est copié dans le buffer,
$\vdots$
.
pas=n, un élément sur n est copié dans le buffer.
Il existe une version simplifiée de la fonction pvm_pkTYPE dans le cas où le message à envoyer est une chaîne de caractères (suite de caractères terminée par $\backslash 0$): pvm_pkstr(char *chaine).
Dans tous les cas le résultat renvoyé est négatif s'il y a eu un problème.

3) Envoi des données contenues dans le buffer
L'envoi des données ainsi stockées dans le buffer se fait en utilisant la primitive:

int pvm_send(int TID, int msgID)

qui envoie le contenu du buffer au processus d'indentificateur TID avec un identificateur de message égal à msgID.

$\bullet$Réception d'un message

Afin de recevoir un message, un processus doit tout d'abord se mettre en attente de réception en utilisant la primitive:

int pvm_recv(int TID, int msgID)

Cette routine reste en attente jusqu'à ce qu'un message identifié par msgTID arrive du processus TID. Le message est alors automatiquement stocké dans un buffer. La fonction renvoie l'identificateur bufID de ce dernier. Remarque 6.
.
Si msgID=-1, alors tout message provenant du processus TID est accepté,
.
Si TID=-1, alors tout message identifié par msgID est accepté,
.
Si msgID=-1 et TID=-1, alors n'importe quel message est accepté.
Une fois le message reçu dans le buffer, il faut le décompresser en utilisant la primitive:

int pvm_upkTYPE(TYPE *reçu, int nb_elem, int pas)

qui extrait à partir du buffer nb_elem (en prenant un élément sur pas) et stocke le résultat dans reçu. La valeur prise par TYPE est la même que pour la primitive pvm_pkTYPE.
Dans le cas particulier de la réception d'une chaîne de caratères, on utilisera la fonction pvm_upkstr(char *reçu).

Calcul d'information à partir du buffer (optionnel)
Dans le cas où le processus était en attente d'un message quelconque (TID=-1 et/ou msgID=-1) il est possible, à partir des données stockées dans le buffer de retrouver le TID du processus expéditeur et/ou l'identificateur du message reçu. On utilise pour cela la fonction:

int pvm_bufinfo(int bufID, int *bytes, int *msgID, int *TID)

qui renvoie pour le message contenu dans le buffer bufID, sa taille en octets, son identificateur de message et le TID de l'émetteur.

next up previous contents
Next: Exemple d'utilisation de PVM Up: Quelques primitives de PVM Previous: Lancement d'un exécutable sur
Pascal Véron
1999-03-04