Ανταλλαγι Μθνυμάτων Κϊςτασ Διαμαντάρασ Τμιμα Πλθροφορικισ ΤΕΙ Θεςςαλονίκθσ
Στζλνω και λαμβάνω μθνφματα Θέματα: Προσ ποιόν ςτζλνονται τα δεδομζνα; Τι ςτζλνεται; Πϊσ ο δζκτθσ αναγνωρίηει τα δεδομζνα; 2
Πζραςμα μθνυμάτων Αποςτολι μθνφματοσ point-to-point: send(dest, type, address, length) dest είναι ζνασ ακζραιοσ που αναπαριςτά τθ διεργαςία που κα λάβει το μινυμα. type είναι ζνασ κετικόσ ακζραιοσ τον οποίο ο παραλιπτθσ μπορεί να χρθςιμοποιιςει για να επιλζξει μθνφματα. (address, length) περιγράφει ζνα ενιαίο χϊρο ςτθ μνιμθ που περιζχει το μινυμα προσ αποςτολι. 3 Αποςτολι μθνφματοσ προσ όλουσ (global): broadcast(type, address, length)
Ο Buffer Στζλνοντασ και λαμβάνοντασ μόνο μια ςυνεχι ςειρά από bytes: Κρφβει από το hardware τθν πραγματικι δομι των δεδομζνων Απαιτεί πακετάριςμα διεςπαρμζνων δεδομζνων Γραμμζσ ενόσ πίνακα αποκθκευμζνου κατά ςτιλεσ Συλλογζσ διαφορετικϊν τφπων δομϊν δεδομζνων Εμποδίηει τθν επικοινωνία μεταξφ μθχανϊν με διαφορετικζσ αναπαραςτάςεισ των τφπων των δεδομζνων (πχ το μικοσ ενόσ integer, ι ενόσ double, κλπ) 4
Γενικεφοντασ τον buffer Στο MPI ο buffer ορίηεται από starting address, datatype, και count Datatype = elementary (όλοι τα datatypes τθσ C ι Fortran) array από datatypes Strided blocks από datatypes Δεικτοδοτθμζνο (indexed) array με blocks από datatypes Γενικι δομι Τα Datatypes δθμιουργοφνται αναδρομικά. Οι οριςμοί των βαςικϊν datatypes επιτρζπει ετερογενι επικοινωνία. Βζλτιςτθ χριςθ ειδικοφ hardware ορίηοντασ τφπουσ δεδομζνων 5
Τφποι δεδομζνων Ο απλόσ τφποσ είναι πολφ περιοριςτικόσ. Συχνά χρθςιμοποιοφμε overloading για να επιτφχουμε τθν απαραίτθτθ ευελιξία. Προβλιματα: - κάτω από τον ζλεγχο του χριςτθ - επιτρζπονται wild cards (MPI_ANY_TAG) - ςυγκροφςεισ χριςθσ τθσ βιβλιοκικθσ με άλλουσ χριςτεσ ι άλλεσ βιβλιοκικεσ 6
Ορκι χριςθ επικοινωνίασ 7
Λανκαςμζνθ χριςθ επικοινωνίασ 8
Επικοινωνία ςε αναμονι 9
Λανκαςμζνθ επικοινωνία με αναμονι 10
Λφςθ ςτο πρόβλθμα του τφπου Διαφορετικό context επικοινωνίασ για κάκε οικογζνεια μθνυμάτων. Χρθςιμοποιείται για τθν τοποκζτθςθ μθνυμάτων ςτθν ουρά (queueing) και το ταίριαςμα (matching) των send και receive. Απαγόρευςθ wild cards, για αςφάλεια Οι τφποι (tags, ςτο MPI) διατθροφνται για κανονικι χριςθ (wild cards OK) 11
Περιοριςμοί ςτθν επικοινωνία Ξεχωριςτά γκρουπ διεργαςιϊν δουλεφουν ςε ξεχωριςτά υπο-προβλιματα - Επικυμθτζσ οι τοπικζσ μεταβλθτζσ ςτισ διεργαςίεσ - Ο κοινόσ χϊροσ διευκφνςεων δυςκολεφει το modularity - Τα μθνφματα από τθν εφαρμογι διαχωρίηονται από τα εςωτερικά μθνφματα τθσ βιβλιοκικθσ. - Η γνϊςθ των τφπων μθνυμάτων τθσ βιβλιοκικθσ είναι ανεπικφμθτθ -Ο ςυγχρονιςμόσ πριν και μετά από τισ κλιςεισ ςτισ ςυναρτιςεισ βιβλιοκικθσ είναι ανεπικφμθτοσ 12
Το βαςικό send/receive του MPI Το βαςικό (blocking) send: MPI_Send( start, count, datatype, dest, tag, comm ) Και το receive: MPI_Recv(start, count, datatype, source, tag, comm, status) Τα source, tag, και count του μθνφματοσ που ελιφκθ πραγματικά μπορεί να ανακτθκεί από το status. Δφο απλζσ ςυλλογικζσ ςυναρτιςεισ: MPI_Bcast(start, count, datatype, root, comm) MPI_Reduce(start, result, count, datatype, operation, root, comm) 13
Παίρνοντασ πλθροφορία για το μινυμα που ελιφκθ MPI_Status status; MPI_Recv(..., &status );... status.mpi_tag;... status.mpi_source; MPI_Get_count( &status, datatype, &count ); Τα MPI_TAG και MPI_SOURCE χρθςιμοποιοφνται κυρίωσ όταν ζχουμε MPI_ANY_TAG και/ι MPI_ANY_SOURCE ςτο receive. Το MPI_Get_count χρθςιμοποιείται για να δοφμε πόςα data του ςυγκεκριμζνου τφπου ελιφκθςαν. 14
Οι 6 βαςικζσ ςυναρτιςεισ Το MPI είναι πολφ απλό. 6 ςυναρτιςεισ αρκοφν για να γράψεισ τα περιςςότερα προγράμματα: 1. MPI_Init 2. MPI_Finalize 3. MPI_Comm_size 4. MPI_Comm_rank 5. MPI_Send 6. MPI_Recv 15
Συλλογικι επικοινωνία Η ςυνάρτθςθ MPI_Bcast ςτζλνει data από μια διεργαςία προσ όλεσ τισ άλλεσ (broadcast) Η ςυνάρτθςθ MPI_Reduce ςυνδυάηει δεδομζνα από όλεσ τισ διεργαςίεσ (ακροίηοντάσ τα ςτθν περίπτωςθ αυτι) και επιςτρζφει το αποτζλεςμα ςε μια μόνο διεργαςία 16
Παράδειγμα (υπολογιςμόσ του π) #include "mpi.h" #include <math.h> int main(argc,argv) int argc; char *argv[]; { int done = 0, n, myid, numprocs, i, rc; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, a; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); 17
while (!done) { if (myid == 0) { printf("enter the number of intervals: (0 quits) "); scanf("%d",&n); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) break; h = 1.0 / (double) n; sum = 0.0; for (i = myid + 1; i <= n; i += numprocs) { x = h * ((double)i - 0.5); sum += 4.0 / (1.0 + x*x); } mypi = h * sum; MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (myid == 0) printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); } /* end while */ MPI_Finalize(); } /* end program */ 18
Συλλογικζσ επικοινωνίεσ ςτο MPI Η επικοινωνία γίνεται ςτο εςωτερικό ενόσ γκρουπ διεργαςιϊν. Τα γκρουπ φτιάχνονται «με το χζρι». Χριςθ ςυναρτιςεων MPI group-manipulation ι ρουτίνεσ MPI topologydefinition. Δε χρθςιμοποιοφνται Message tags. Αντ αυτοφ χριςθ διαφορετικϊν communicators. Καμία ςυλλογικι επικοινωνία non-blocking. Τρία είδθ ςυλλογικισ επικοινωνίασ: - ςυγχρονιςμόσ - μετακίνθςθ δεδομζνων - ςυλλογικζσ πράξεισ 19
Συγχρονιςμόσ MPI_Barrier(comm) Η ςυνάρτθςθ αυτι μπλοκάρει τθ διεργαςία που τθν καλεί μζχρι να τθν καλζςουν όλεσ οι διεργαςίεσ που ανικουν ςτον communicator comm. 20
Διακζςιμοι τφποι ςυλλογικισ επικοινωνίασ 21
Διακζςιμοι τφποι ςυλλογικϊν υπολογιςμϊν 22
Συλλογικζσ ρουτίνεσ Allgather Allgatherv Allreduce Alltoall Alltoallv Bcast Gather Gatherv Reduce ReducedScatter Scan Scatter Scatterv 23
Συλλογικζσ ρουτίνεσ (2) Οι ςυναρτιςεισ All δίνουν δεδομζνα ςε όλεσ τισ διεργαςίεσ. Οι ςυναρτιςεισ V επιτρζπουν διαφορετικοφ μεγζκουσ δεδομζνα. Οι ςυναρτιςεισ Allreduce, Reduce, ReduceScatter, και Scan παίρνουν τόςο built-in όςο και user-defined ςυναρτιςεισ ςυνδυαςμοφ 24
Συλλογικζσ ςυναρτιςεισ υπολογιςμοφ MPI Name Λειτοσργία MPI name Λειτοσργία MPI_MAX maximum MPI_LXOR Λογικό XOR MPI_MIN minimum MPI_BAND Bitwise AND MPI_PROD γινόμενο MPI_BOR Bitwise OR MPI_SUM άθροισμα MPI_BXOR Bitwise XOR MPI_LAND Λογικό AND MPI_MAXLOC Max & Θέση MPI_LOR Λογικό OR MPI_MINLOC Min & Θέση 25
Ορίςτε τθ δικι ςασ ςυλλογικι πράξθ MPI_Op_create(user_function, commute, op) MPI_Op_free(op) user_function(invec, inoutvec, len, datatype) Η ςυνάρτθςθ user_function εκτελεί: for i from 0 to len-1 inoutvec[i] = invec[i] op inoutvec[i]; Η user_function μπορεί να μην ζχει τθν αντιμετακετικι ιδιότθτα (π.χ. πολλαπλαςιαςμόσ πινάκων). 26