O alternativă la supercomputere

PVM(Parallel Virtual Machine) oferă scalabilitate sI un excelent raport pret/performantă

Daniel Grosu

PVM (Parallel Virtual Machine) este un pachet de programe dezvoltat de Oak Ridge National Laboratory, Universitatea statului Tennessee si Universitatea Emory, care permite ca o multime eterogenă de masini UNIX (PC, statii de lucru, calculatoare paralele, calculatoare vectoriale), legate în retea, să functioneze ca un singur calculator paralel. Astfel, prin utilizarea puterii de calcul a mai multor calculatoare, pot fi rezolvate probleme care necesitau utilizarea unor calculatoare paralele foarte puternice, prohibitive din punct de vedere al costului (circa 10 mil. $). Mai mult decât atât, dacă se vor conecta în această retea si câteva calculatoare masiv paralele sau supercalculatoare, se poate obtine o putere de calcul foarte greu de realizat în alt mod.

Proiectul PVM a fost demarat în vara anului 1989 la Oak Ridge National Laboratory. Sistemul prototip PVM 1.0 a fost conceput de Vaidy Sunderam si Al Geist, această versiune fiind utilizată numai în cadrul laboratorului. Versiunea 2 a PVM a fost scrisă la Universitatea Tennessee si distribuită în martie 1991. Deja în anul următor, PVM era utilizat pentru rezolvarea multor probleme stiintifice. Versiunile PVM 2.1 până 2.4 au fost dezvoltate pe baza sugestiilor primite de la utilizatori, astfel corectându-se unele greseli si operându-se mici modificări. În februarie 1993, PVM a fost complet rescris si a fost distribuit ca PVM 3. Cu versiunea PVM 3.3.0 din iunie 1994 a fost adăugată si o interfată grafică X-window, numită XPVM.

PVM asigură un mediu de lucru unitar în care programele paralele pot fi dezvoltate într-o manieră eficientă, utilizând mediul hardware deja existent. Se asigură o transparentă în rutarea mesajelor prin retea, în conversia datelor si în planificarea taskurilor pe calculatoarele din retea (care sunt diferite).

Modelul de calcul utilizat de PVM este simplu: utilizatorul va scrie aplicatiile ca o colectie de taskuri care cooperează. Aceste taskuri vor accesa resursele PVM cu ajutorul unor biblioteci de rutine de interfată. Rutinele din cadrul bibliotecilor asigură initierea si terminarea taskurilor, comunicarea si sincronizarea între taskuri.

În orice punct al executiei unei aplicatii concurente, orice task în executie poate initia sau termina alte taskuri, poate adăuga sau elimina calculatoare din masina virtuală.

Sunt incluse facilităti de asigurare a tolerantei la defecte. Astfel, dacă unul sau mai multe calculatoare "cad", se asigură functionarea în continuare a masinii virtuale.

Utilizatorii pot scrie aplicatii paralele în Fortran sau C utilizând rutinele din bibliotecile PVM. Modelul de programare utilizat este cel cu transfer de mesaje (message-passing), adică prin trimiterea si receptionarea mesajelor, taskurile aplicatiei pot coopera pentru a rezolva o problemă în paralel .

PVM este utilizat în peste o mie de locuri din lume ca o alternativă, eficientă din punct de vedere al raportului cost/performante, pentru calculatoarele paralele puternice. În Statele Unite cei mai importanti utilizatori sunt NASA si Departmentul Energiei, fără să mai luăm în considerare numeroasele universităti unde este utilizat atât pentru cercetare cât si pentru realizarea orelor de aplicatii. Si la noi în tară PVM este utilizat în unele universităti, dintre acestea se pot aminti Univesitatea Transilvania Brasov (unde se desfăsoară un seminar PVM), Universitatea Tehnică "Gh. Asachi" Iasi (în cadrul orelor de aplicatii la disciplinele de calcul paralel si distribuit), Universitatea "Politehnica" Bucuresti si Universitatea Tehnică Timisoara.

Mai există câteva sisteme software cu o functionalitate asemănătoare, dintre acestea se pot aminti: P4 (Argonne National Laboratory), Express (ParaSoft Corporation), Linda (Scientific Computing), MPI-Message Passing Interface.

Sistemul PVM

Obiectivul general al sistemului PVM este să permită unei multimi de calculatoare să fie utilizată pentru calculul paralel sau concurent. Vom prezenta pe scurt principiile pe care se bazează PVM:

Sistemul PVM este alcătuit din două componente. Prima parte este reprezentată de un demon, numit pvmd care va trebui să existe pe toate masinile care alcătuiesc masina virtuală. Acest demon a fost proiectat astfel încât orice utilizator să-l poată instala pe orice masină dacă dispune de un login valid. Când un utilizator doreste să ruleze o aplicatie PVM, va trebui să-si creeze masina virtuală si apoi să pornească masina. O aplicatie PVM poate fi pornită de la orice gazdă. Mai multi utilizatori pot configura masini virtuale care se pot suprapune, iar fiecare utilizator poate executa câteva aplicatii PVM simultan.

A doua componentă este reprezentată de o bibliotecă de rutine PVM. Aceasta contine un set complet de primitive care sunt necesare pentru cooperarea între taskuri (rutine pentru trimitere si receptionare mesaje, initierea taskurilor, coordonarea taskurilor si pentru modificarea configuratiei masinii virtuale).

Modelul de calcul utilizat se bazează pe faptul că o aplicatie este alcătuită din mai multe taskuri. Fiecare task este responsabil pentru calculul unei părti a problemei.

O aplicatie poate accesa resursele de calcul în trei moduri diferite:

Această flexibilitate permite diferitelor taskuri ale unei aplicatii să exploateze eficient puterea de calcul din cadrul masinii virtuale.

Dacă o aplicatie este paralelizată din punct de vedere al functiilor pe care le realizează, adică fiecare task execută o functie diferită (de exemplu intrare, solutionare, iesire, afisare) acest proces se numeste paralelism functional. O altă metodă de paralelizare este exploatarea paralelismului datelor. În cadrul acestei metode toate taskurile sunt identice, dar fiecare din ele detine si utilizează pentru rezolvare numai o parte din date. Acest model mai este denumit SPMD (Single Program Multiple Data). Ambele modele, sau o combinatie a lor, pot fi utilizate pentru a dezvolta o aplictie PVM.

Toate taskurile PVM sunt identificate cu un întreg numit task identifier (TID). Aceste TID-uri trebuie să fie unice în cadrul masinii virtuale si sunt asigurate de demonul pvmd local (deci nu sunt alese de utilizator). PVM contine rutine care returnează valoarea TID astfel încât aplicatiile pot identifica taskurile din sistem.

Pentru a programa o aplicatie un utilizator va scrie unul sau mai multe programe secventiale în C, C++, Fortran 77, cu apeluri la rutinele din bibliotecile PVM. Fiecare program va fi de fapt un task, toate aceste taskuri formând aplicatia. Fiecare task va fi compilat pentru fiecare arhitectură existentă în host-pool si fisierele se vor plasa la locatii accesibile masinilor din host-pool.

Pentru a executa o aplicatie, un utilizator initiază o copie a unui task (numit task master) de la o masină din host-pool, iar acesta va initia taskuri PVM care pot fi rulate pe alte masini sau pe aceeasi masină cu taskul master. Acesta este scenariul tipic, dar pot exista situatii in care mai multe taskuri sunt initiate de utilizator, iar ele pot initia la rândul lor alte taskuri.

Consola PVM

Consola PVM este un task PVM de sine stătător care permite utilizatorului să pornească, să interogheze si să modifice masina virtuală. Consola poate fi pornită si oprită de mai multe ori pe orice gazde din PVM fără a afecta rularea PVM sau a altor aplicatii. La pornire consola PVM determină dacă nu cumva aceasta rulează, dacă nu, pvm execută pvmd pe acea gazdă si apoi execută pvmd, dar de această dată cu optiunea slave, pe celelalte gazde din configuratie. La pornire se afisează un prompter pvm> si se asteaptă comenzi. Comenzile sunt:

add - adaugă gazde la masina virtuală;

conf -afisează configuratia masinii virtuale (numele gazdei, pvmd tid, tipul arhitecturii si viteza relativă);

delete - elimină gazde din masina virtuală;

halt - termină toate procesele PVM inclusiv consola si opreste masina virtuală;

help - oferă informatii despre comenzile consolei;

id - afisează identificatorul de task al consolei;

jobs - afisează lista taskurilor în executie;

kill - termină un task PVM;

mstat - afisează starea gazdelor specificate;

pstat - afisează starea unui task PVM specificat;

quit - părăseste consola lăsând demonii si taskurile PVM în executie;

reset - termină toate procesele PVM exceptând consola;

spawn - porneste o aplicatie PVM.

PVM permite utilizarea mai multor console. Este posibil să rulăm o consolă pe orice gazdă din masina virtuală si chiar mai multe console în cadrul aceleasi masini. De asemenea, este posibilă pornirea unei console în timpul rulării unei aplicatii PVM si verificarea stadiului de executie a acesteia.

Există un fisier de configurare a gazdelor pe care masina virtuală le va include. Fiecare utilizator poate avea propriul său fisier de configurare si deci propria masină virtuală pe acelasi suport hardware.

Implementarea PVM

La implementarea PVM s-a tinut cont de trei obiective:

a) Masina virtuală să cuprindă sute de gazde si mii de taskuri. Aceasta a necesitat proiectarea si implementarea unor algoritmi eficienti pentru operatiile de transmitere a mesajelor.

b) Sistemul să fie portabil pe orice versiune de UNIX si, de asemenea, pe masini care nu rulează UNIX (în special MPP).

c) Sistemul să permită construirea aplicatiilor tolerante la defecte.

S-a presupus că sunt disponibile socluri pentru comunicatia între procese si că fiecare gazdă din masina virtuală se poate conecta direct la toate celelalte gazde utilizând protocoale IP (TCP si UDP). Astfel, un pachet trimis de un pvmd se asteaptă să ajungă la un alt pvmd într-un singur pas.

Fiecare task din cadrul masinii virtuale este identificat printr-un identificator de task (TID) unic. TID-urile sunt întregi pe 32 biti folositi pentru a adresa demonii pvmd, taskuri si grupurile de taskuri din PVM (vezi caseta "Identificatorul de task").

Demonii pvmd detin o mapare a numărului de proces L si a identificatorilor de proces UNIX de pe gazda respectivă. Astfel, se pot atribui TID-uri de către pvmd-ul local fără a mai fi nevoie de comunicatii cu alte gazde, evitându-se strangularea care s-ar produce dacă s-ar fi utilizat un server de TID-uri.

Demonul pvmd - nu efectuează calcule, serveste ca router pentru mesaje si controler. El asigură un punct de contact cu exteriorul în fiecare gazdă, autentificarea, controlul proceselor si detectia erorilor.

Primul pvmd (pornit de utilizator) este denumit pvmd "master", iar ceilalti pvmd (initiati de master) sunt numiti "slave". În timpul operării normale toti pvmd sunt considerati egali. Numai pvmd master poate initia noi pvmd slave si îi poate adăuga în masina virtuală. Cererile de reconfigurare a masinii vituale apărute la o gazdă slave sunt redirectionate la demonul master. Dacă masterul a pierdut contactul cu un slave îl va marca si îl va elimina din masina virtuală, iar dacă un slave pierde contactul cu masterul atunci el se elimină singur din masină. Acest algoritm asigură toleranta la defecte, permitând masinii virtuale să functioneze în continuare.

Structurile de date importante pentru pvmd sunt tabelele de taskuri si tabelele de gazde care descriu configuratia masinii virtuale si taskurile care rulează în cadrul acesteia. În plus fată de acestea mai există cozile de mesaje si contextele de asteptare care mentin informatii de stare pentru multitasking.

i) Comunicatii pvmd-pvmd. Demonii pvmd comunică între ei prin socluri UDP. Deoarece UDP este un serviciu de distribuire nefiabil care poate pierde, multiplica sau reordona pachetele, vom avea nevoie de mecanisme de confirmare si de reluare. UDP de asemeni impune limitări în ceea ce priveste lungimea pachetelor, conducând la fragmentarea mesajelor lungi. Prin câteva constructii suplimentare s-a asigurat o conectare similară cu TCP.

Nu s-a utilizat TCP datorită a trei factori. Primul e reprezentat de faptul că masina virtuală trebuie să fie capabilă să includă în configuratie sute de gazde. Fiecare conexiune TCP consumă un descriptor de fisier din pvmd, iar câteva sisteme de operare limitează numărul fisierelor deschise la 32. În cazul UDP, un soclu poate trimite si receptiona pachete de la un număr oarecare de socluri. Al doilea factor este reprezentat de faptul că o masină virtuală compusă din N gazde necesită N(N-1)/2 conexiuni, care vor fi greu de stabilit. Ultimul factor este legat de asigurarea tolerantei la defecte, astfel protocolul va trebui să sesizeze când reteaua, o gazdă sau un pvmd a "căzut".

ii)Comunicatii pvmd-task. Un task comunică cu pvmd căruia îi este asociat prin intermediul conexiunilor TCP. Taskul si pvmd mentin o structură FIFO de pachete, comutând între citire si scriere pe conexiunea TCP. Un dezavantaj al acestui tip de conectare este numărul crescut al apelurilor sistem necesare pentru a transfera un pachet între un task si pvmd.

iii) Comunicatii task-task. Comunicatiile între taskurile locale se realizează ca si comunicatiile pvmd-task. În mod normal, un pvmd nu comunică cu taskurile de pe alte gazde. Astfel, comunicatiile ce trebuie realizate între taskuri de pe gazde diferite, vor folosi ca suport comunicatiile între pvmd.

Limitări legate de resurse

Limitările resurselor impuse de sistemul de operare si hardware-ul disponibil se vor reflecta în aplicatiile PVM. Câteva din limite sunt afectate dinamic datorită competitiei între utilizatorii de pe aceeasi gazdă sau din retea.

Numărul de taskuri pe care un pvmd le poate deservi este limitat de doi factori: numărul de procese permis de către sistemul de operare unui utilizator si numărul de descriptori de fisier disponibili pentru pvmd. Mărimea maximă a mesajelor PVM este limitată de mărimea memoriei disponibile unui task.

Aceste probleme pot fi evitate prin revizuirea codului aplicatiei, de exemplu pentru a utiliza mesaje cât mai scurte, eliminarea strangulărilor, si procesarea mesajelor în ordinea în care au fost generate.

Concluzii

În ciuda dificultătilor cauzate de eterogenitate PVM ofera unele avantaje:

Pentru exemplificare un program numit HELLO


(C) Copyright Computer Press Agora