Les clusters de calculs


Parallel Virtual Machine (PVM)

Qu'est ce que PVM ?

PVM est un outil du domaine public développé par "the Oak Ridge National Laboratory". Il permet à un ensemble de machines informatiques hétérogènes connectées sur un réseau local ou distant de se conduire comme une seule et même ressource permettant d'effectuer des opérations de calculs parallèles.

L'outil PVM est constitué d'une bibliothèque de routines. Elles permettent entre autre à l'utilisateur de définir une machine à mémoire distribuée à partir d'un ensemble de machines scalaires, parallèles ou vectorielles.

Une interface utilisateur sommaire est disponible avec la version de base, mais il existe des surcouches graphiques de plus haut niveau (xpvm, hence, etc...).

PVM permet de voir un ensemble de machines comme une seule machine virtuelle :




Toutefois il faut bien garder à l'esprit que la découpe parallèle du programme reste à la charge du développeur.



Architecture

L'architecture de PVM se définie par une machine virtuelle (MV) (en bleue) composée d'un ensemble de machines homogènes ou non :


Démons PVM


Un démon « PVMd » (en rouge) tourne sur chaque hôte de la MV. Un démon PVMd n'a pas pour fonction d'interagir avec un autre PVMd, par contre il route et contrôle les messages. Il possède à sa disposition une table d'hôtes, une table de tâches et une queue de messages sous son contrôle. Le premier démon lancé est maître (master) et les autres esclaves (slaves).

Les tâches se connectent au démon de la machine sur laquelle ils sont lancés pour appartenir à la MV. Une fois connectées elles peuvent créer d'autres tâches sur tous les composants de la MV. Elles peuvent aussi communiquer avec les autres tâches de la MV.


Taches PVM


PVM apporte aussi une librairie de fonctions « libpvm » permettant :

Spécifications principales

Dans librairie PVM il existe une multitude de fonctions de transfert de messages. Nous pouvons citer parmi elles les envois/réceptions bloquants (synchrones), non bloquants (asynchrones), ainsi que toutes les possibilités collectives de communications (multicasting, barrière, broadcast, etc...)

L'un des points forts de PVM réside dans la gestion des groupes et de leurs communications:

Tout processus PVM peut rejoindre un groupe. Un processus peut appartenir à plusieurs groupes. Les messages peuvent être diffusés dans un groupe à partir de n'importe quel processus PVM (appartenant au groupe ou non). Un processus peut se synchroniser dans un groupe à l'aide de barrières.
Dans PVM les groupes sont dynamiques : insertion, suppression, gestion des entrées/sorties et échanges intra-groupes se font par des fonctions spécifiques. Il est à noter qu'un processus peut faire partie de plusieurs groupes.

L'intérêt de la gestion des groupes réside dans la communication intergroupe (diffusion, synchronisation (barrière), opération arithmétique (reduce, min, max, sum, product, ...)) qui est optimisée et facile à mettre en place.

Exemple

Voici un exemple simple de programme démontrant la simplicité des communications via PVM.

Chaque processus peut communiquer en faisait référence à un "ID" de démon dans la MV. La gestion des communications est réduite à son strict minimum, pas besoin de gérer autre chose que l'envoie et la réception de messages.

Ici, chaque noeud esclave vient se déclarer au près du noeud maître.

    #include "/opt3/PVM3/pvm3/include/pvm3.h"
    
    int main(int argc, char** argv)
    {
        int cc, tid;
        char buf[100];
        
        printf("I am t%x\n", pvm_mytid());
        
        cc = pvm_spawn("/root/PVM/hello_toto", (char**)0, 0, "", 1, & tid);
        
        if (cc == 1) 
        { 
            cc = pvm_recv(-1, -1);
            pvm_bufinfo(cc, (int*)0, (int*)0, & tid);
            pvm_upkstr(buf);
            printf("from t%x: %s\n", tid, buf);
        } 
        else
        {
            printf("coin ! hello_toto is dead\n");
        }
        
        pvm_exit();
        exit(0);
    }
                

Programme maître



    #include "/opt3/PVM3/pvm3/include/pvm3.h"
    
    int main(int argc, char** argv)
    {
        int ptid;
        char buf[100];
        int mytid;
        
        mytid = pvm_mytid();
        ptid = pvm_parent();

        strcpy(buf, "hello from ");
        gethostname(buf + strlen(buf), 64);
        pvm_initsend(PvmDataDefault);
        pvm_pkstr(buf);

        pvm_send(ptid, 1);
        pvm_exit();
        exit(0);
  }

                

Programme esclave