Εισαγωγή Ε-03: Λειτουργικά Συστήµατα ΙΙ Εαρινό Εξάµηνο 2005-06 Sun RPC MPI «Sun RPC & MPI» ρ. Παναγιώτης Χατζηδούκας (Π..407/80) E-03: Λειτουργικά Συστήµατα ΙΙ 1 E-03: Λειτουργικά Συστήµατα ΙΙ 2 Κλήση Αποµακρυσµένων ιαδικασιών (RPC) Με τις RPCs οι κατανεµηµένοι υπολογισµοί εµφανίζονται ως τοπικοί Ζητήµατα: Μεταβίβαση παραµέτρων Σύνδεση πελάτη εξυπηρετητή Χειρισµός βλαβών Μελέτη: Sun RPC SUN RPC Ένα από τα πιο διαδεδοµένα συστήµατα RPC Αναπτύχθηκε για χρήση µε το NFS Υλοποιηµένο µε τα πρωτόκολλα UDP ή TCP TCP: τα δεδοµένα χωρίζονται σε εγγραφές UDP: µέγιστο µέγεθος πακέτου < 8912 bytes UDP: timeout και περιορισµένος αριθµός επαναµεταδόσεων TCP: επιστροφή λάθους εφόσον η σύνδεση τερµατίζεται από τον εξυπηρετητή Πολλαπλά ορίσµατα οργανώνονται σε µια ενιαία δοµή E-03: Λειτουργικά Συστήµατα ΙΙ 3 E-03: Λειτουργικά Συστήµατα ΙΙ 4 Sun RPC Σύνδεση: Port Mapper Αντιµετώπιση βλαβών At-least-once: αν µια απάντηση έχει παραληφθεί Αt-least-zero: αν δεν υπάρχει απάντηση. Με UDP προσπαθεί για το πολύ µια φορά (at-most-once) Χρήση του προτύπου external Data Representation (XDR) της SUN ιάταξη big endian για ακέραιους 32 bit Χειρισµός αυθαίρετα µεγάλων δοµών δεδοµένων Εκκίνηση Εξυπηρετητή: δηµιουργία port Η ψευδορουτίνα του εξυπηρετητή καλεί svc_register για να καταχωρήσει στον τοπικό port mapper: αριθµό προγράµµατος και έκδοση Ο port mapper αποθηκεύει την παραπάνω πληροφορία και το port Εκκίνηση πελάτη: καλεί clnt_create γιαναεντοπίσειτοport του εξυπηρετητή Στην συνέχεια, ο πελάτης µπορεί να καλεί διαδικασίες του εξυπηρετητή E-03: Λειτουργικά Συστήµατα ΙΙ 5 E-03: Λειτουργικά Συστήµατα ΙΙ 6 1
ηµιουργία ψευδορουτίνων (rpcgen) Ελαφριές RPCs Q_xdr.c: κώδικας για τη µετατροπή των ορισµάτων σύµφωνα µε το πρότυπο XDR Πολλές RPCs πραγµατοποιούνται µεταξύ πελάτη και εξυπηρετητή στο ίδιο σύστηµα Ανάγκη βελτιστοποίησης της συγκεκριµένης περίπτωσης χρησιµοποιώντας έναν πιο ελαφρύ µηχανισµό RPC (Lightweight RPC) Ο εξυπηρετητής εξάγει µια διεπαφή προς τις αποµακρυσµένες διαδικασίες Ο πελάτης στο ίδιο σύστηµα εισάγει την παραπάνω διεπαφή Ο πυρήνα του λειτουργικού συστήµατος δηµιουργεί κατάλληλες δοµές δεδοµένων που περιλαµβάνουν µια στοίβα ορισµάτων που διαµοιράζονται ο εξυπηρετητής και ο πελάτης E-03: Λειτουργικά Συστήµατα ΙΙ 7 E-03: Λειτουργικά Συστήµατα ΙΙ 8 Ελαφριές RPCs Doors Εκτέλεση RPC Ώθηση των παραµέτρων στη στοίβα Παγίδευση στον πυρήνα Ο πυρήνας απεικονίζει τη µνήµη του πελάτη στο πεδίο διευθύνσεων του εξυπηρετητή Ο πελάτης εκτελεί την διαδικασία Ο πελάτης µπλοκάρει στον πυρήνα µέχρι την ολοκλήρωση εκτέλεσης της διαδικασίας Ο εξυπηρετητής καλεί την διαδικασία Ο πυρήνας αλλάζει το πεδίο διευθύνσεων και επιστρέφει τον έλεγχο στον πελάτη Στο Solaris ο συγκεκριµένος µηχανισµός καλείται doors Η επιλογή µεταξύ κανονικής και ελαφριάς RPC πραγµατοποιείται από τη ψευδορουτίνα κατά το χρόνο εκτέλεσης E-03: Λειτουργικά Συστήµατα ΙΙ 9 E-03: Λειτουργικά Συστήµατα ΙΙ 10 Άλλα µοντέλα RPC Ασύγχρονη RPC Ασύγχρονη RPC Η συµπεριφορά αίτησης απάντησης δεν απαιτείται πάντα Ο εξυπηρετητής µπορεί να απαντήσει άµεσα µόλις λάβει την αίτηση και να εκτελέσει την ρουτίνα αργότερα Σύγχρονη RPC µε αναβολή Χρήση δύο ασύγχρονων RPCs Ο πελάτης απαιτεί µια απάντηση αλλά δεν µπορεί να περιµένει για αυτή. Ο εξυπηρετητής αποστέλλει την απάντηση µε µια ακόµα ασύγχρονη RPC. Μια κατεύθυνσης RPC Ο πελάτης δεν περιµένει ούτε για µια επιβεβαίωση από τον εξυπηρετητή Περιορισµός: δεν υπάρχει εγγύηση αξιοπιστίας αφού ο πελάτης δεν γνωρίζει αν η διαδικασία εκτελέστηκε από τον εξυπηρετητή. a) Παραδοσιακή κλήση αποµακρυσµένης διαδικασίας b) Η αλληλεπίδραση στην περίπτωση ασύγχρονης RPC E-03: Λειτουργικά Συστήµατα ΙΙ 11 E-03: Λειτουργικά Συστήµατα ΙΙ 12 2
Σύγχρονη RPC µε αναβολή Επικοινωνία Η αλληλεπίδραση πελάτη εξυπηρετητή πραγµατοποιείται µε δύο ασύγχρονες RPCs Πολλά κατανεµηµένα συστήµατα υλοποιούνται πάνω από ένα απλό µοντέλο µηνυµάτων επικοινωνίας, π.χ. Sockets E-03: Λειτουργικά Συστήµατα ΙΙ 13 E-03: Λειτουργικά Συστήµατα ΙΙ 14 Βασικές Κλήσεις για Sockets Message-Passing Interface (MPI) Κλήση Socket Bind Listen Accept Connect Send Receive Close Λειτουργία ηµιουργία νέου άκρου επικοινωνίας Σύνδεση τοπικής διεύθυνσης σε ένα socket Ανακοίνωση προθυµίας για αποδοχή συνδέσεων Αναστολή εκτέλεσης έως ότου φτάσει µια αίτηση σύνδεσης Ενεργή προσπάθεια δηµιουργίας µιας σύνδεσης Αποστολή δεδοµένων µέσω µιας σύνδεσης Λήψη δεδοµένων µέσω µιας σύνδεσης Τερµατισµός της σύνδεσης Τα Sockets έχουν σχεδιαστεί για δικτυακή επικοινωνία (TCP) Υποστηρίζουν απλές λειτουργίες αποστολής / λήψης Το επίπεδο αφαίρεσης που παρέχουν δεν είναι κατάλληλο για άλλα πρωτόκολλα σε συστάδες σταθµών εργασίας ή µεγάλα παράλληλα συστήµατα Ανάγκη µιας διεπαφής µε πιο προχωρηµένες λειτουργίες Μεγάλος αριθµός µη συµβατών βιβλιοθηκών και πρωτοκόλλων Ανάγκη για ύπαρξη ενός προτύπου Message-passing interface (MPI) Ανεξάρτητο από το υλικό Σχεδιασµένο για παράλληλες εφαρµογές Βασική ιδέα: επικοινωνία µεταξύ οµάδων διεργασιών Κάθε σύνδεση χαρακτηρίζεται από ένα ζευγάρι (groupid, processid) E-03: Λειτουργικά Συστήµατα ΙΙ 15 E-03: Λειτουργικά Συστήµατα ΙΙ 16 Μοντέλα Παράλληλου Υπολογισµού Μοντέλο Μεταβίβασης Μηνυµάτων Κοινή Μνήµη (Νήµατα) Posix Threads OpenMP: πρότυπο υψηλότερου επιπέδου Μεταβίβαση µηνυµάτων (MPI) Οι διεργασίες έχουν µόνο τοπική µνήµη αλλά µπορούν να επικοινωνήσουν µε άλλες µε ανταλλαγή µηνυµάτων Η µεταφορά δεδοµένων µεταξύ διεργασιών απαιτεί την εκτέλεση λειτουργιών και από τις δύο διεργασίες Το δίκτυο επικοινωνίας δεν αποτελεί τµήµα του µοντέλου υπολογισµού (υπερκύβος, πλέγµα, ) Λειτουργίες αποµακρυσµένης µνήµης Επικοινωνία µιας πλευράς ( One-sided ) MPI-2, IBM s LAPI Μια διεργασία µπορεί να προσπελάσει τη µνήµη µιας άλλης χωρίς τη συµµετοχή της τελευταίας Η προσπέλαση όµως γίνεται ρητά και χωρίς διαφάνεια Η µεταβίβαση µηνυµάτων χρησιµοποιείται για επικοινωνία µεταξύ διεργασιών µε διαφορετικά πεδία διευθύνσεων Η ανταλλαγή δεδοµένων γίνεται µε συνεργασία και ρητή αποστολή λήψη µεταξύ των διεργασιών. Οποιαδήποτε αλλαγή στη µνήµη της ληφθείσας διεργασίας πραγµατοποιείται µε σαφή συµµετοχή της τελευταίας Η διαδιεργασιακή επικοινωνία περιλαµβάνει Συγχρονισµό εκτέλεσης Μετακίνηση δεδοµένων µεταξύ των δύο πεδίων διευθύνσεων Συνδυάζονται επικοινωνία και συγχρονισµός, αντίθετα µε ότι συµβαίνει στην περίπτωση των λειτουργιών αποµακρυσµένης µνήµης E-03: Λειτουργικά Συστήµατα ΙΙ 17 E-03: Λειτουργικά Συστήµατα ΙΙ 18 3
Τι είναι το MPI Παράδειγµα Προσδιορισµός µιας βιβλιοθήκη µεταβίβασης µηνυµάτων Επεκταµένο µοντέλο µεταβίβασης µηνυµάτων εν είναι γλώσσα προγραµµατισµού ή προδιαγραφές µεταγλωττιστή εν αποτελεί µια συγκεκριµένη υλοποίηση Υποστηρίζει παράλληλα και κατανεµηµένα συστήµατα και ετερογενή δίκτυα επικοινωνίας Έχει σχεδιαστεί για να παρέχει πρόσβαση σε υλικό παράλληλης επεξεργασίας σε χρήστες, συγγραφείς βιβλιοθηκών και σχεδιαστές εργαλείων Παρέχει έναν ευέλικτο, αποδοτικό και µεταφέρσιµο τρόπο για την ανάπτυξη παράλληλων προγραµµάτων ιευκολύνει την ανάπτυξη βιβλιοθηκών που µπορούν να αποτρέπουν την ανάγκη εκµάθησής του από τους απλούς χρήστες #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); printf( "Hello, world!\n" ); MPI_Finalize(); return 0; E-03: Λειτουργικά Συστήµατα ΙΙ 19 E-03: Λειτουργικά Συστήµατα ΙΙ 20 Περιβάλλον εκτέλεσης Παράδειγµα υο βασικά στοιχεία ενός παράλληλου προγράµµατος: Πόσες διεργασίες συµµετέχουν στον υπολογισµό; Ποια διεργασία είµαι; Το MPI παρέχει συναρτήσεις για τις παραπάνω ερωτήσεις: MPI_Comm_size: επιστρέφει τον αριθµό των διεργασιών MPI_Comm_rank: επιστρέφει το rank, έναν αριθµό µεταξύ 0 και size-1, που προσδιορίζει την τρέχουσα διεργασία #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { int rank, size; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); printf( "I am %d of %d\n", rank, size ); MPI_Finalize(); return 0; E-03: Λειτουργικά Συστήµατα ΙΙ 21 E-03: Λειτουργικά Συστήµατα ΙΙ 22 Αποστολή και λήψη δεδοµένων Περιγραφή δεδοµένων Πρέπει να προσδιοριστούν κάποια στοιχεία που είναι απαραίτητα για την επικοινωνία: Περιγραφή δεδοµένων Προσδιορισµός διεργασιών Αναγνώριση λήψη µηνυµάτων από τον αποδέκτη Σηµασία ολοκλήρωσης αποστολής λήψης δεδοµένων Οι διεργασίες οργανώνονται σε οµάδες (groups). Κάθε µήνυµα αποστέλλεται σε ένα περιβάλλον επικοινωνίας (context) και πρέπει να ληφθεί µέσα από το ίδιο περιβάλλον. Ο συνδυασµός group και context ορίζουν έναν communicator. Μια διεργασία αναγνωρίζεται από τον αριθµό της (rank) στο group που σχετίζεται µε έναν communicator. MPI_COMM_WORLD: Ο βασικός communicator του οποίου το group περιλαµβάνει όλες τις διεργασίες της εφαρµογής Τα δεδοµένα ενός µηνύµατος που αποστέλλεται ή λαµβάνεται περιγράφονται µε τρία στοιχεία: (address, count, datatype) Ένας τύπος δεδοµένων (datatype) του MPI µπορεί να είναι: Προκαθορισµένος, σύµφωνα µε τους τύπους δεδοµένων της γλώσσας προγραµµατισµού (π.χ., MPI_INT, MPI_DOUBLE_PRECISION) Ένας πίνακας τύπων δεδοµένων του MPI Ένα υποσύνολο ενός πίνακα Μια αυθαίρετη δοµή από τύπους δεδοµένων Ο χρήστης µπορεί να ορίσει δικούς του τύπους δεδοµένων E-03: Λειτουργικά Συστήµατα ΙΙ 23 E-03: Λειτουργικά Συστήµατα ΙΙ 24 4
Ετικέτες µηνυµάτων Βασική κλήση αποστολής Τα µηνύµατα αποστέλλονται µαζί µε µια κατάλληλη ετικέτα (ακέραιο αριθµό) που ορίζει ο χρήστης, διευκολύνοντας της διεργασία που θα λάβει το µήνυµα να προσδιορίσει το µήνυµα Τα µηνύµατα µπορούν εποµένως να επιλέγονται κατά την λήψη τους µε βάση την ετικέτα τους Η τιµή ετικέτας MPI_ANY_TAG επιτρέπει τη λήψη µηνυµάτων οποιασδήποτε ετικέτας MPI_SEND (address, count, datatype, dest, tag, comm) Το µήνυµα περιγράφεται από τα (address, count, datatype). Η διεργασία αποδέκτης καθορίζεται από το όρισµα dest, που είναι ο αριθµός (rank) της διεργασίας αυτής στον communicator που ορίζεται από το όρισµα comm. Όταν η συνάρτηση επιστρέψει, τα δεδοµένα έχουν παραδοθεί στο σύστηµα και ο buffer του µηνύµατος (address) µπορεί να χρησιµοποιηθεί πάλι. Το µήνυµα µπορεί να µην έχει παραληφθεί από την διεργασία αποδέκτη. E-03: Λειτουργικά Συστήµατα ΙΙ 25 E-03: Λειτουργικά Συστήµατα ΙΙ 26 Βασική κλήση λήψης Πληροφορίες MPI_RECV(start, count, datatype, source, tag, comm, status) Περιµένει µέχρι το κατάλληλο µήνυµα (όσον αφορά τα ορίσµατα source & tag) παραληφθεί από το σύστηµα. Το όρισµα source είναι ο αριθµός (rank) της διεργασίας αποστολέας στον communicator που ορίζεται από το όρισµα comm, ή MPI_ANY_SOURCE. Το όρισµα status περιέχει επιπλέον πληροφορίες Επιτρέπεται η λήψη λιγότερων στοιχείων από count του τύπου datatype, µα περισσότερων αποτελεί σφάλµα Το όρισµα status είναι µια δοµή δεδοµένων στο πρόγραµµα του χρήστη Παράδειγµα: int recvd_tag, recvd_from, recvd_count; MPI_Status status; MPI_Recv(..,MPI_ANY_SOURCE,MPI_ANY_TAG,..,&status); recvd_tag = status.mpi_tag; recvd_from = status.mpi_source; E-03: Λειτουργικά Συστήµατα ΙΙ 27 E-03: Λειτουργικά Συστήµατα ΙΙ 28 Παράδειγµα (1/3) Παράδειγµα (2/3) #include "mpi.h" #define BUFLEN 512 if (myid == 0) { printf("%d sending '%s' \n",myid,buffer); int main(int argc, char *argv[]) { int i, myid, numprocs, next, rc; char buffer[buflen]; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); strcpy(buffer,"hello there"); next = (myid + 1) %numprocs; MPI_Send(buffer, strlen(buffer)+1, MPI_CHAR, next, 99, MPI_COMM_WORLD); printf("%d receiving \n",myid); MPI_Recv(buffer, BUFLEN, MPI_CHAR, MPI_ANY_SOURCE, 99, MPI_COMM_WORLD, &status); printf("%d received '%s' \n",myid,buffer); E-03: Λειτουργικά Συστήµατα ΙΙ 29 E-03: Λειτουργικά Συστήµατα ΙΙ 30 5
Παράδειγµα (3/3) Βασικές κλήσεις else { /* myid!= 0 */ printf("%d receiving \n",myid); MPI_Recv(buffer, BUFLEN, MPI_CHAR, MPI_ANY_SOURCE, 99, MPI_COMM_WORLD, &status); printf("%d received '%s' \n", myid, buffer); MPI_Send(buffer, strlen(buffer)+1, MPI_CHAR, next, 99, MPI_COMM_WORLD); printf("%d sent '%s' \n",myid,buffer); Οι περισσότερες παράλληλες εφαρµογές µπορούν να γραφτούν χρησιµοποιώντας µόνο τις ακόλουθες έξι ρουτίνες: MPI_INIT MPI_FINALIZE MPI_COMM_SIZE MPI_COMM_RANK MPI_SEND MPI_RECV MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); E-03: Λειτουργικά Συστήµατα ΙΙ 31 E-03: Λειτουργικά Συστήµατα ΙΙ 32 Κλήσεις επικοινωνίας MPI Πλεονεκτήµατα Κλήση MPI_bsend MPI_send MPI_ssend MPI_sendrecv MPI_isend MPI_issend MPI_recv Λειτουργία Τοποθέτησε ένα εξερχόµενο µήνυµα σε ένα τοπικό buffer αποστολής Στείλε ένα µήνυµα και περίµενε µέχρι να αντιγραφεί σε έναν τοπικό ή αποµακρυσµένο buffer Στείλε ένα µήνυµα και περίµενε µέχρι να ξεκινήσει η λήψη του Στείλε ένα µήνυµα και περίµενε για µια απάντηση Πέρνα µια αναφορά στο εξερχόµενο µήνυµα και συνέχισε την εκτέλεση του προγράµµατος Πέρνα µια αναφορά στο εξερχόµενο µήνυµα και περίµενε µέχρι να ξεκινήσει η λήψη του Παρέλαβε ένα µήνυµα, µπλοκάροντας αν δεν υπάρχει κάποιο Το MPI περιλαµβάνει ρητό παραλληλισµό που συνήθως παρέχει καλύτερη απόδοση. Περιλαµβάνει έναν µεγάλο αριθµό βελτιστοποιηµένων κλήσεων επικοινωνίας. Γενικά, υπάρχει επικάλυψη επικοινωνίας και υπολογισµών Προβλήµατα από την τοποθέτηση των δεδοµένων εµφανίζονται σπάνια. Ο συνδυασµός επικοινωνίας και συγχρονισµού µειώνει τις επιβαρύνσεις. MPI_irecv Έλεγξε αν υπάρχει εισερχόµενο µήνυµα αλλά χωρίς µπλοκάρισµα E-03: Λειτουργικά Συστήµατα ΙΙ 33 E-03: Λειτουργικά Συστήµατα ΙΙ 34 Μειονεκτήµατα Η παραλληλοποίηση, ανάπτυξη και το debugging των εφαρµογών µπορεί να είναι αρκετά δύσκολο. Τα κόστη επικοινωνίας µπορεί να είναι σηµαντικές. Οι υπολογισµοί πρέπει να είναι σηµαντικοί σε µέγεθος ώστε να υπερκαλύπτουν τα κόστη επικοινωνίας. Οι καθολικές λειτουργίες µπορεί να είναι πολύ ακριβές. Απαιτούνται σηµαντικές αλλαγές στον αρχικό ακολουθιακό κώδικα. Είναι δύσκολο να επιτευχθεί δυναµική εξισορρόπηση φόρτου. E-03: Λειτουργικά Συστήµατα ΙΙ 35 6