Previous Next Contents

Appendix C    Utilisation de PVM et de XPVM

C.1  Configuration de PVM

Vous avez accès à une partition disque sans quota sous /users/pvm/LOGIN. Attention à ne pas laisser trop d'exécutables chez vous! Si vous choisissez d'utiliser cette partition, il faut remplacer les $HOME dans tous les fichiers qui suivent (xpvm_hosts, Makefile.aimk) par /users/pvm/LOGIN.

Vous trouverez dans ~goubaul1/pvm_install.tar une installation prédéfinie pour commencer vos TDs. Récupérez la:
> cp ~goubaul1/pvm_install.tar .
> tar -xvf pvm_install.tar
...
> cd pvm
> ls
bin         include     lib         src         xpvm_hosts
Le répertoire bin contient des répertoires par architecture possible. En effet, on doit avoir un exécutable différent du même programme pour toutes les architectures d'une machine PVM.

Le répertoire src contient les sources des programmes PVM. C'est là que vous allez programmer.

Le fichier xpvm_hosts est un fichier de configuration de la machine PVM (par défaut). Faites,
> cp xpvm_hosts ../.xpvm_hosts
Ainsi le fichier de configuration sera automatiquement reconnu par xpvm (mais pas automatiquement par pvm). Ce fichier est comme suit,



* ep=$HOME/pvm/bin/$PVM_ARCH
& ferrari
& rolls
& pontiac
& cher
& morbihan
& carmor
ep indique de considérer ce qui suit comme étant l'endroit en machine où chercher les exécutables. Les noms sur les lignes suivantes sont des noms de stations que l'on veut pouvoir inclure dans la configuration de la machine pvm dès son démarrage (marche sous xpvm).

C.2  Compilation d'un programme C/PVM

Pour compiler un programme PVM, il faut, Tout cela est géré par des makefile.

Les makefile de pvm sont très proches de ceux utilisés ordinairement en C. Seule la commande pour les utiliser change: elle s'appelle ici aimk.

Exemple de Makefile (fourni),

SDIR        =        $(HOME)/pvm/src
#BDIR        =        $(HOME)/pvm3/bin
BDIR        =        $(SDIR)/../bin
XDIR        =        $(BDIR)/$(PVM_ARCH)

OPTIONS        =        -O
CFLAGS        =        $(OPTIONS) -I../include -I$(PVM_ROOT)/include $(ARCHCFLAGS)

LIBS        =        -lpvm3 $(ARCHLIB)
GLIBS        =        -lgpvm3

LFLAGS        =        $(LOPT) -L$(PVM_ROOT)/lib/$(PVM_ARCH)

default:        hello hello_other

hello: $(SDIR)/hello.c $(XDIR)
        $(CC) $(CFLAGS) -o $@ $(SDIR)/hello.c $(LFLAGS) $(LIBS)
        mv $@ $(XDIR)

hello_other: $(SDIR)/hello_other.c $(XDIR)
        $(CC) $(CFLAGS) -o $@ $(SDIR)/hello_other.c $(LFLAGS) $(LIBS)
        mv $@ $(XDIR)
Le makefile plus haut se contente essentiellement de compiler différents programmes exemples (voir section C.5) avec la librairie pvm3 puis de bouger le code compilé dans le répertoire que pvm connaît comme renfermant les exécutables (cf ep de la section C.1).

Exemple: sur une DEC (tarse):
goubaul1@tarse ~ > cd pvm/src
goubaul1@tarse ~/pvm/src > aimk
making in ALPHA/ for ALPHA
cc -O -I../include -I/usr/local/pvm/include -DHASSTDLIB -o hello 
/users/profs/goubault/pvm/src/hello.c  -L/usr/local/pvm/lib/ALPHA 
-lpvm3
mv hello /users/profs/goubault/pvm/src/../bin/ALPHA
cc -O -I../include -I/usr/local/pvm/include -DHASSTDLIB -o 
hello_other /users/profs/goubault/pvm/src/hello_other.c  
-L/usr/local/pvm/lib/ALPHA -lpvm3
mv hello_other /users/profs/goubault/pvm/src/../bin/ALPHA
Puis sur une HP (royce):
goubaul1@royce ~ > cd pvm/src
goubaul1@royce ~/pvm/src > aimk
making in HPPA/ for HPPA
        cc -O -I../include -I/usr/local/pvm/include -DSYSVSIGNAL 
-DNOWAIT3 -DNOGETDTBLSIZ -DRSHCOMMAND=\"/usr/bin/remsh\" 
-DFDSETISINT -o hello /users/profs/goubault/pvm/src/hello.c 
-Wl,-aarchive -L/usr/local/pvm/lib/HPPA -lpvm3
        mv hello /users/profs/goubault/pvm/src/../bin/HPPA
        cc -O -I../include -I/usr/local/pvm/include -DSYSVSIGNAL 
-DNOWAIT3 -DNOGETDTBLSIZ -DRSHCOMMAND=\"/usr/bin/remsh\" 
-DFDSETISINT -o hello_other 
/users/profs/goubault/pvm/src/hello_other.c 
-Wl,-aarchive -L/usr/local/pvm/lib/HPPA -lpvm3

        mv hello_other /users/profs/goubault/pvm/src/../bin/HPPA

C.3  La console PVM

goubaul1@tarse ~/pvm/src > pvm ~/.xpvm_hosts
Les différentes commandes à la console sont

C.4  L'interface XPVM

XPVM est la version X-Windows de pvm. Faire xpvm au clavier pour démarrer la console xpvm, mais surtout pas xpvm &. Au démarrage, on voit la figure C.1.



Figure C.1: Machine pvm

C'est la représentation de la machine PVM avec les noms et les types des différents ordinateurs la composant. Les menus de cette fenêtre permettent de contrôler les tâches (menu Tasks), de contrôler les machines (menu Hosts), d'arrêter PVM (menus Reset, Quit, Halt) et d'avoir de l'aide (menu Help). Voir figure C.2.



Figure C.2: Menus XPVM

On peut ajouter et enlever des hôtes (add et delete de PVM) par le menu Tasks. On conseille dans les prochains TDs de commencer par tester les programmes sur un seul hôte (la machine sur laquelle vous vous êtes loggée) puis sur deux ou trois, choisies parmi les voisins immédiat. Cela permettra de ne pas surcharger certaines machines.

Le spawn de la console PVM se retrouve dans le menu Tasks.

Quand on exécute une tâche, on voit dans la partie basse de la fenêtre XPVM le déroulement dans le temps des différentes tâches, voir figure C.3.



Figure C.3: Activité des tâches

Chaque couleur représente le type d'activité d'une tâche (``computing'', ``overhead'', ``waiting'', ``messages''). Vous pouvez cliquer sur les flèches représentant les messages ou sur les intervalles de temps pour avoir plus d'informations. Vous pouvez également changer d'echelle de visualisation en cliquant-glissant sur cette fenêtre.

On récupère ce qu'affichent les différentes tâches en demandant dans le menu View les ``Task Output'', voir figure C.4.



Figure C.4: Task Output

C'est ce que l'on voyait sous la console PVM (quand on avait mis l'option ->.

Dans le même menu on peut également demander un graphe du type d'activité des processus en fonction du temps (``Utilization versus Time''), voir figure C.5.



Figure C.5: Utilization versus Time

Ou encore, à voir tous les envois et les réceptions de messages entre les tâches (``Call Trace''), voir figure C.6.



Figure C.6: Call Trace

On peut tout avoir en même temps, voir figure C.7.



Figure C.7: Un écran XPVM au complet

C.5  Un programme exemple

Ces programmes vous sont fournis dans la distribution pvm_install.tar.

Le maître (hello.c),

#include <stdio.h>

/* pour avoir acces a la librairie PVM: */
#include "pvm3.h"

main()
{
int cc, tid;
char buf[100];

/* pour raccrocher le programme au demon pvmd3 */
printf("i'm t%x\n", pvm_mytid());

/* pour lancer un esclave en parallele */
cc = pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid);

/* s'il s'est bien lance... */
if (cc == 1) 
{
  /* recevoir un message de n'importe qui */
  cc = pvm_recv(-1, -1);
  /* pvm_bufinfo(cc, (int*)0, (int*)0, &tid); */
  /* decompacter ce message et ranger une chaine de */
  /* caracteres dans la variable buf */
  pvm_upkstr(buf);
  printf("from t%x: %s\n", tid, buf);
} else
  printf("can't start hello_other\n");
 
/* deconnecter le processus du demon pvmd3 */ 
 pvm_exit();
 exit(0);
}
Le programme esclave (hello_other.c),

/* pour avoir acces a la librairie PVM: */
#include "pvm3.h"

main()
{
  int ptid;
  char buf[100];
  
  /* trouver le processus parent */
  ptid = pvm_parent();
  
  strcpy(buf, "hello, world from ");
  gethostname(buf + strlen(buf), 64);
  
  /* initialiser un tampon de communication */
  pvm_initsend(PvmDataDefault);
  /* y ranger la chaine de caracteres buf */
  pvm_pkstr(buf);
  /* envoyer le contenu de ce tampon */
  pvm_send(ptid, 1);
  
  /* deconnecter le processus du demon pvmd3 */
  pvm_exit();
  exit(0);
}

Previous Next Contents