Κατανεμημένα Συστήματα - Εργαστήριο

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Λειτουργικό Σύστημα (Operating System) 1o μέρος
Advertisements

Λειτουργικό Σύστημα 2ο μέρος.
Πολυδιάστατοι Πίνακες, Δομές, Ενώσεις
Εισαγωγή στους Η/Υ Πίνακες.
ΣΤΟΙΧΕΙΑ ΨΕΥΔΟΚΩΔΙΚΑ ΒΑΣΙΚΕΣ ΔΟΜΕΣ ΒΑΣΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ ΠΙΝΑΚΩΝ
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
Message Passing Interface (MPI)
29/11/2004Εισαγωγή στο OpenMP1 OpenMP Αθήνα, Νοέμβριος 2004 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
1/12/2003Εισαγωγή στο OpenMP1 OpenMP Αθήνα, Νοέμβριος 2003 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
 Αυδίκου Χριστίνα  Γιουμούκης Παναγιώτης  Κιντσάκης Θάνος  Πάπιστας Γιάννης.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πίνακες Κλάσεις και Αντικείμενα.
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
24/11/2003Message Passing Interface (MPI)1 Αθήνα, Νοέμβριος 2003 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
22/11/2004Message Passing Interface (MPI)1 Αθήνα, Νοέμβριος 2004 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
Βάσεις Δεδομένων (ΚΒΔ)
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 19 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 1.
Νήματα Οι διεργασίες έχουν τα παρακάτω συστατικά:
Εισαγωγικές Έννοιες Διδάσκοντες: Σ. Ζάχος, Δ. Φωτάκης Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο.
Π ΑΡΑΛΛΗΛΗ / ΚΑΤΑΝΕΜΗΜΕΝΗ ΕΠΕΞΕΡΓΑΣΙΑ ΚΑΙ ΕΦΑΡΜΟΓΕΣ Εισαγωγή στο OpenMP.
Λειτουργικά συστήματα ΙΙ
Εργασία Η υλοποίηση του αλγορίθμου συγχώνευσης θα πρέπει να χρησιμοποιεί την ιδέα των ροών (streams). Θα πρέπει να υπάρχουν δύο διαφορετικά είδη.
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(λ,ι)=α, κκπ(τ,σ)=ν, κκπ(λ,π)=η κκπ(π,σ)=γ, κκπ(ξ,ο)=κ ξο κκπ(ι,ξ)=β, κκπ(τ,θ)=θ, κκπ(ο,μ)=α.
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
Ολυμπιάδα Πληροφορικής
Σχεδίαση αλγορίθμων (2ο μέρος)
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
ΣΥΝΑΡΤΗΣΕΙΣ.
Message Passing Interface (MPI) Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων Αθήνα, Δεκέμβριος 2002.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Δείκτες (Pointers) – Δομές (Structs)
Το Message Passing Interface (MPI) και η υποστήριξή του στο EGEE Grid Issues on Grid Technologies, NTUA, 8/3/2010 Vasileios Karakasis GRNET S.A., ICCS.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
ΟΡΙΣΜΟΣ ΣΥΜΠΕΡΙΦΟΡΑΣ ΔΙΑΓΡΑΜΜΑTA ΑΛΛΗΛΕΠΙΔΡΑΣΗΣ
Τεχνολογία TCP/IP TCP/IP internet είναι ένα οποιοδήποτε δίκτυο το οποίο χρησιμοποιεί τα πρωτόκολλα TCP/IP. Διαδίκτυο (Internet) είναι το μεγαλύτερο δίκτυο.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
Παράλληλη/Κατανεμημένη Επεξεργασία και Εφαρμογές
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
Διεργασίες.
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1 Ευρετήρια.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
Κρυφή μνήμη (cache memory) (1/2) Εισαγωγή στην Πληροφορκή1 Η κρυφή μνήμη είναι μία πολύ γρήγορη μνήμη – πιο γρήγορη από την κύρια μνήμη – αλλά πιο αργή.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Πίνακας Συμβόλων Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Πίνακες στην JAVA ΕΡΓΑΣΤΗΡΙΟ AΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (Διαφάνειες: ΧΟΧΟΛΗΣ ΔΙΟΝΥΣΙΟΣ Προσαρμογή 2014: Κώστας Στάμος)
ΔΠΘ-ΤΜΗΜΑ ΜΠΔ: ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ 1 Εισαγωγή στη γλώσσα Προγραμματισμού C ΠΙΝΑΚΕΣ (arrays)
ΜΑΘΗΜΑ: ΣΥΓΧΡΟΝΟ ΛΟΓΙΣΜΙΚΟ ΟΡΓΑΝΩΣΗ ΓΡΑΦΕΙΟΥ 5 ο ΕΡΓΑΣΤΗΡΙΟ: ΕΓΚΑΤΑΣΤΑΣΗ ΕΚΤΥΠΩΤΩΝ ΚΑΘΗΓΗΤΗΣ: ΓΡΗΓΟΡΙΟΣ Ν. ΚΑΡΑΤΑΣΙΟΣ.
ΠΑΡΑΛΛΗΛΗ ΕΠΕΞΕΡΓΑΣΙΑ Ενότητα 7 – MPI 25/02/2015 Ιωάννης Ε. Βενέτης Τμήμα Μηχανικών Η / Υ και Πληροφορικής.
ΜΕΤΑΒΛΗΤΕΣ-ΣΤΑΘΕΡΕΣ -ΕΚΦΡΑΣΕΙΣ
CSMA/CA στο Κατανεμημένα Ενσωματωμένα Συστήματα
Ευρετήρια Βάσεις Δεδομένων Ευαγγελία Πιτουρά.
The University of Adelaide, School of Computer Science
Χειρισμός Χρόνου και Μεθοδολογίες Προσομοίωσης
Κατανεμημένα Συστήματα
Δείκτες Προγραμματισμός Ι
Λειτουργικά Συστήματα και Ασφάλεια Πληροφοριακών Συστημάτων ΔΙΕΡΓΑΣΙΕΣ
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ (ΕΡΓΑΣΤΗΡΙΟ)
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
Λύσεις Ασφάλειας στο Επίπεδο Διασύνδεσης
Κεφάλαιο 7: Διαδικτύωση-Internet Μάθημα 7.9: Δρομολόγηση
Πίνακας Συμβόλων Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής.
Επιβλέπων: Καθηγητής Εφαρμογών Δρ. Δημήτριος Βαρσάμης
Δίκτυα Ι Βπ - 2ο ΕΠΑΛ ΝΕΑΣ ΣΜΥΡΝΗΣ 2011.
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
Vasileios Karakasis GRNET S.A., ICCS
Εξωτερική Αναζήτηση Ιεραρχία Μνήμης Υπολογιστή Εξωτερική Μνήμη
Δυναμικός Κατακερματισμός
Μεταγράφημα παρουσίασης:

Κατανεμημένα Συστήματα - Εργαστήριο Message Passing Interface - MPI

Για την κατασκευή του υλικού αυτού έχουν χρησιμοποιηθεί διαφάνειες από τις παρακάτω παρουσιάσεις: “MPI: a message passing parallel programming model”, by Eduard Ayguadé, Barcelona Supercomputer Center “Parallel Programming and MPI”, R Badrinath, STSD Bangalore, Hewlett-Packard Development Company

Ακολουθιακός ή Παράλληλος Προγραμματισμός; Μέχρι τώρα είμαστε περισσότερο εξοικειωμένοι με τον ακολουθιακό προγραμματισμό. Χρησιμοποιούμε γλώσσες όπως C, Java, κλπ., για να λύσουμε διάφορα προβλήματα, π.χ. ταξινόμηση με χρήση αλγορίθμων όπως buble sort, κλπ. Στην πραγματικότητα όμως χρησιμοποιούμε περισσότερο από ότι νομίζουμε τον παράλληλο προγραμματισμό, σαν έννοια κυρίως, όχι για προγραμματισμό. Παράδειγμα: έστω ότι θέλουμε να ταξινομήσουμε μια λίστα με 500 στοιχεία. Μπορούμε να διαιρέσουμε τη λίστα σε 5 μικρότερες των 100 στοιχείων, δίνοντας σε 5 ανθρώπους από μία, ώστε να τις ταξινομήσουν. Κατόπιν, κάνουμε συγχώνευση.

Προγραμματισμός με κοινή μνήμη ή με κατανεμημένη μνήμη; Κοινή μνήμη: όλα τα υποέργα προσπελαύνουν την ίδια μνήμη, δηλαδή τα ίδια δεδομένα. Η υλοποίηση των υποέργων γίνεται με χρήση νημάτων. Κατανεμημένη μνήμη: υπάρχουν μόνο τοπικές μνήμες. Η διαμοίραση δεδομένων γίνεται μόνο με τη μεταφορά δεδομένων από το ένα υποέργο στο άλλο.

Παράγοντες που πρέπει να απαντηθούν στον παράλληλο προγραμματισμό Πόσοι εκτελούν το έργο. (Βαθμός του παραλληλισμού) Τι απαιτείται για την εκκίνηση του έργου. (Αρχικοποίηση) Ποιος εκτελεί ποιο έργο. (Κατανομή εργασιών) Προσπέλαση στο μερίδιο εργασίας. (Data/IO access) Όποτε απαιτείται να γίνεται πληροφόρηση μεταξύ τους, προκειμένου να τελειώσουν τα έργα τους. (Επικοινωνία) Πότε ολοκληρώνονται όλα. (Συγχρονισμός) Τι απαιτείται για τη συλλογή των αποτελεσμάτων.

MPI - Βιβλιογραφία Βιβλία Homepage: http:// www.mcs.anl.gov/mpi "MPI: The Complete Reference" by Snir, Otto, Huss-Lederman, Walker, and Dongarra, MIT Press (also in Postscript and html) "Using MPI: Portable Parallel Programming with the Message-Passing Interface, " by Gropp, Lusk and Skjellum, MIT Press “Designing and Building Parallel Programs”, by Ian Foster, Addison-Wesley, 1995. “Parallel Programming with MPI”, by Peter Pacheco, Morgan-Kaufmann, 1997. “MPI θεωρία και Εφαρμογές”, A. Μάργαρης, Εκδόσεις Τζιόλα, 2008. Homepage: http:// www.mcs.anl.gov/mpi

Υλοποιήσεις MPICH LAM CHIMP IBM MPI HP MPI SUN MPI Digital MPI SGI MPI

Σημεία κλειδιά στο MPI Το ίδιο πρόγραμμα εκτελείται σε αρκετούς διαφορετικούς επεξεργαστές Οι επεξεργαστές επικοινωνούν με πέρασμα μηνυμάτων Τυπική μεθοδολογία start job on n processors do i=1 to j each processor does some calculation pass messages between processors end do end job

MPI τύποι δεδομένων MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED

Το 1ο MPI Πρόγραμμα με C #include "mpi.h" #include <stdio.h> int main( argc, argv ) 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; }

Πώς εκτελείται; Μετάφραση: mpicc –o simple simple.c Εκτέλεση: mpirun –np 2 simple Στο συγκεκριμένο παράδειγμα η εκτέλεση γίνεται από δύο κόμβους ταυτόχρονα. Ο αριθμός των κόμβων καθορίζεται από τον αριθμό που εισάγεται με την παράμετρο np.

Communicator Φροντίζει για την ασφάλεια της μετάδοσης και την ταυτοποίηση των διακινούμενων μηνυμάτων ώστε αυτά να παραλαμβάνονται με τη σωστή σειρά. Κάθε communicator σχετίζεται με τις ομάδες διεργασιών της εφαρμογής Χρησιμοποιείται σαν παράμετρος στις περισσότερες κλήσεις MPI. Η σταθερά MPI_COMM_WORLD περιλαμβάνει όλους τους επεξεργαστές της εφαρμογής Οι επεξεργαστές που ελέγχονται από ένα communicator διαθέτουν ένα αριθμό τάξης (rank)

Communicator Intra – communicator: για την επικοινωνία μεταξύ διεργασιών της ίδιας ομάδας Inter – communicator: για την επικοινωνία μεταξύ διεργασιών διαφορετικών ομάδων Οι τιμές των τάξεων για μία ομάδα Ν διεργασιών είναι 0...Ν-1

Βασικές Συναρτήσεις int MPI_Init (int *argc, char **argv): αρχικοποιεί το MPI περιβάλλον και δημιουργεί όλες τις δομές δεδομένων που είναι αναγκαίες για τη λειτουργία του (π.χ. ο προεπιλεγμένος communicator MPI_COMM_WORLD). int MPI_Finalize (void): τερματίζει τη λειτουργία του περιβάλλοντος MPI. int MPI_Comm_rank (MPI_comm comm, int *rank): επιστρέφει την τάξη της τρέχουσας διεργασίας. int MPI_Comm_size (MPI_comm comm, int *size): επιστρέφει το πλήθος των διεργασιών που σχετίζεται με τον συγκεκριμένο communicator.

Επικοινωνία διεργασιών με MPI Χρησιμοποιεί το μοντέλο επικοινωνίας point-to-point Κάθε μήνυμα ταυτοποιείται με μία ετικέτα (tag) ώστε να ξεχωρίζει από τα υπόλοιπα μηνύματα της εφαρμογής Χρησιμοποιεί και διάφορες μορφές ομαδικής επικοινωνίας Broadcast (καθολική εκπομπή) Scattering (διασπορά): ένα μήνυμα διασπάται σε μικρότερα κομμάτια κάθε ένα εκ των οποίων αποστέλλεται και σε διαφορετική διεργασία Gather (συλλογή): το σύνολο των μηνυμάτων όλων των μελών της ομάδας παραλαμβάνεται από μία απλή διεργασία Reduce (υποβιβασμός): μία διεργασία συλλέγει δεδομένα από όλες τις υπόλοιπες διεργασίες της ομάδας και υπολογίζει κάποια συνάρτηση για τα δεδομένα αυτών Για τις παραπάνω μορφές επικοινωνίας υπάρχει ένας συντονιστής

Είδη Επικοινωνιών Blocking: η κλήση μιας συνάρτησης αναστέλλει τη λειτουργία της καλούσας διεργασίας, μέχρι την ολοκλήρωση της συνάρτησης αυτής. Non-blocking: η κλήση μιας συνάρτησης δεν αναστέλλει τη λειτουργία της καλούσας διεργασίας. Στην περίπτωση των non-blocking κλήσεων πρέπει η διαδοχική κλήση συναρτήσεων send να μην γίνεται σε πολύ μικρό χρονικό διάστημα. Γιατί;

Είδη Επικοινωνιών Πρότυπη: η απόφαση για τη δέσμευση ή όχι ενδιάμεσης μνήμης, λαμβάνεται από το MPI και όχι από το χρήστη. Με ενδιάμεση αποθήκευση Σύγχρονη: μια διαδικασία αποστολής μπορεί να ξεκινήσει ανεξάρτητα από την εκκίνηση της διαδικασίας παραλαβής. Θα ολοκληρωθεί με επιτυχία όμως, μόνο όταν η αντίστοιχη διαδικασία παραλαβής έχει ξεκινήσει. Σε κατάσταση ετοιμότητας: η διαδικασία αποστολής ξεκινά μαζί με την αντίστοιχη διαδικασία παραλαβής

Βασικές συναρτήσεις για επικοινωνία int MPI_send (void * buf, int count, MPI_Datatype dataType, int destRank, int messageTag, MPI_Comm com): blocking συνάρτηση αποστολής μηνύματος σε κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator buf: η διεύθυνση που βρίσκονται τα δεδομένα count: το μέγεθος των δεδομένων dataType: ο τύπος των δεδομένων destRank:η τάξη της διεργασίας παραλήπτη messageTag: η ετικέτα του μηνύματος com: ο communicator

Βασικές συναρτήσεις για επικοινωνία int MPI_Recv (void * buf, int count, MPI_Datatype dataType, int sourceRank, int messageTag, MPI_Comm com, MPI_status status): blocking συνάρτηση παραλαβής μηνύματος από κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator buf: η διεύθυνση που θα τοποθετηθούν τα δεδομένα count: το μέγεθος των δεδομένων dataType: ο τύπος των δεδομένων sourceRank:η τάξη της διεργασίας αποστολέα messageTag: η ετικέτα του μηνύματος com: ο communicator status: η κατάσταση παραλαβής του μηνύματος

Βασικές συναρτήσεις για επικοινωνία int MPI_Get_count (MPI_Status *status, MPI_Datatype dataType, int *count): χρησιμοποιείται σε συνδυασμό με την MPI_Recv για τον έλεγχο του μεγέθους του μηνύματος που παραλαμβάνεται. Στην περίπτωση που η ετικέτα του μηνύματος που παραλαμβάνεται/αποστέλλεται δεν μας ενδιαφέρει χρησιμοποιούμε τη σταθερά MPI_ANY_TAG

Βασικές συναρτήσεις για επικοινωνία

Το 2ο πρόγραμμα με MPI #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { int rank, size, retVal; MPI_Status status; char inMessage, outMessage=‘x’; retVal=MPI_Init( &argc, &argv ); if (retVal!=MPI_SUCCESS) { printf(“Error starting MPI.\n”); MPI_Abort(MPI_COMM_WORLD,retVal); }

Το 2ο πρόγραμμα με MPI (συνέχεια) MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); if(rank==0) { MPI_Send(&outMessage,1,MPI_CHAR,1,0,MPI_COMM_WORLD); MPI_Recv(&inMessage,1,MPI_CHAR,1,0,MPI_COMM_WORLD, &status); printf( “Process %02d send %c and received %c\n", rank, outMessage, inMessage); } if(rank==1) { MPI_Recv(&inMessage,1,MPI_CHAR,0,0,MPI_COMM_WORLD, &status); MPI_Send(&outMessage,1,MPI_CHAR,0,0,MPI_COMM_WORLD); MPI_Finalize(); return 0;

Non-blocking συναρτήσεις για επικοινωνία int MPI_Isend (void * buf, int count, MPI_Datatype dataType, int destRank, int messageTag, MPI_Comm com, MPI_Request* request): non-blocking συνάρτηση αποστολής μηνύματος σε κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator request: παράμετρος εξόδου, χειριστής για τον έλεγχο της κατάστασης της διαδικασίας π.χ. στην MPI_WAIT ή την MPI_TEST int MPI_Ιrecv (void * buf, int count, MPI_Datatype dataType, int sourceRank, int messageTag, MPI_Comm com, MPI_status status): non-blocking συνάρτηση παραλαβής μηνύματος από κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator

Non-blocking συναρτήσεις για επικοινωνία int MPI_Wait( MPI_Request* request, MPI_Status* status ): κάνει μια διεργασία να περιμένει για την ολοκλήρωση μιας μεταφοράς. Καταχωρεί στη μεταβλητή status τις πληροφορίες που σχετίζονται με την κατάσταση της διαδικασίας μετά την ολοκλήρωση αυτής. int MPI_Test( MPI_Request* request, int *flag, MPI_Status* status ): παρόμοια με την MPI_Wait. H flag περιέχει την τιμή true εάν η διαδικασία έχει ολοκληρωθεί, διαφορετικά false.

Non-blocking συναρτήσεις για επικοινωνία

3o παράδειγμα με MPI #include “mpi.h” int main( int argc, char* argv[] ) { int rank, nproc, isbuf, irbuf, count; MPI_Request request; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if(rank == 0) { isbuf = 9; MPI_Isend( &isbuf, 1, MPI_INTEGER, 1, 1, MPI_COMM_WORLD, &request);

3o παράδειγμα με MPI (συνέχεια) } else if(rank == 1) { MPI_Irecv( &irbuf, 1, MPI_INTEGER, *, *, MPI_COMM_WORLD, &request); MPI_Wait(&request, &status); MPI_Get_count(&status, MPI_INTEGER, &count); printf( “irbuf = %d source = %d tag = %d count = %d\n”, irbuf, status.MPI_SOURCE, status.MPI_TAG, count); } MPI_Finalize();

Ομαδική Επικοινωνία int MPI_Bcast( void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm): συνάρτηση καθολικής μετάδοσης (broadcast). Η διεργασία με τάξη root στέλνει ένα μήνυμα σε όλες τις διεργασίες που ανήκουν στον communicator com. int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm): μεταδίδει ατομικά μηνύματα από τον root προς όλες τις διεργασίες που ανήκουν στον communicator com

MPI_Scatter

4ο παράδειγμα με MPI #include “mpi.h” int main(int argc, char* argv[]) { int rank; int ibuf; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if(rank == 0) ibuf = 12345; else ibuf = 0; MPI_Bcast(&ibuf, 1, MPI_INTEGER, 0, MPI_COMM_WORLD); printf(“ibuf = %d\n”, ibuf); MPI_Finalize(); }

Ομαδική Επικοινωνία int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm ): συλλέγει ατομικά μηνύματα από κάθε διεργασία που ανήκει στον communicator comm προς τη διεργασία root και τα αποθηκεύει ταξινομημένα. int MPI_Allgather( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm): συλλέγει ατομικά μηνύματα από κάθε διεργασία που ανήκει στον communicator comm και στέλνει το τελικό μήνυμα προς όλες τις διεργασίες.

MPI_Gather

MPI_Allgather

Ομαδική Επικοινωνία int MPI_Alltoall( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm): στέλνει ένα ξεχωριστό μήνυμα από κάθε διεργασία προς κάθε άλλη. Το j block δεδομένων που στέλνεται από τη διεργασία i λαμβάνεται από τη διεργασία j και αποθηκεύεται στο I block του recvbuf. int MPI_Reduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm: εκτελεί την πράξη op στα δεδομένα του sendbuf, τοποθετώντας το αποτέλεσμα στον recvbuf του root

Προκαθορισμένες πράξεις MPI_SUM MPI_PROD MPI_MAX MPI_MIN MPI_MAXLOC ΜPI_MINLOC MPI_LAND MPI_LOR MPI_LXOR MPI_BAND MPI_BOR MPI_BXOR

MPI_Alltoall

MPI_Reduce

MPI_Reduce για πίνακες

Μέθοδοι Ε/Ε στο MPI Με ορισμό διεργασίας – ρίζα που αναλαμβάνει τη λειτουργία Καλή σε απόδοση μόνο για μικρά σύνολα διεργασιών Κάθε διεργασία χρησιμοποιεί το δικό της αποκλειστικό αρχείο εξόδου Κακή απόδοση κατά την ανάγνωση ενός αρχείου Όλες οι διεργασίες αποθηκεύουν την έξοδό τους την ίδια χρονική στιγμή Πρέπει το λειτουργικό σύστημα να επιτρέπει ταυτόχρονη πρόσβαση σε αρχεία Αν ναι, τότε υπάρχει άνω όριο στον αριθμό ταυτόχρονων διεργασιών Αν όχι, ακολουθείται σειριακή πρόσβαση

Μέθοδοι Ε/Ε στο MPI (2) Τι γίνεται στην πράξη; Σύνθετο μοντέλο παράλληλης προσπέλασης των συσκευών Ε/Ε Ασύγχρονη προσπέλαση: η προσπέλαση μπορεί να καθυστερήσει με τέτοιο τρόπο, ώστε να συνεχίσει η διαδικασία επεξεργασίας των δεδομένων της εφαρμογής, ενώ το υποσύστημα Ε/Ε θα εκτελεί τη μεταφορά των δεδομένων Παράλληλη προσπέλαση: το σύστημα διαθέτει πολλούς δίσκους και ένα αρχείο αποθηκεύεται παράλληλα ώστε το κάθε τμήμα του να αποθηκεύεται σε και σε ξεχωριστό δίσκο. Αύξηση του χρόνου εκτέλεσης της εφαρμογής λόγω συχνών προσπελάσεων για μικρά σύνολα δεδομένων.

Παράδειγμα με πίνακα 4 × 4 Κάθε επεξεργαστής διαβάζει από μία γραμμή 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 Κάθε επεξεργαστής διαβάζει από μία γραμμή Απαιτούνται 16 λειτουργίες Ε/Ε Άλλη λύση (συλλογική διαδικασία): κάθε επεξεργαστής διαβάζει από μια στήλη και τη μοιράζει στους υπολοίπους (4 λειτουργίες Ε/Ε)

Παράδειγμα με πίνακα 4 × 4 (2) Κάθε επεξεργαστής γνωρίζει εκ των προτέρων τα δεδομένα που θα διαβιβάσει και τον τρόπο που αυτά είναι αποθηκευμένα. Υπάρχουν δύο υλοποιήσεις Υλοποίηση σε δύο φάσεις: προσπέλαση – διανομή (όπως παραπάνω) Κατευθυνόμενη από το δίσκο: βασίζεται στη γνώση του τρόπου που οι ομάδες δεδομένων είναι αποθηκευμένες στους δίσκους του συστήματος.

Υλοποίηση κατευθυνόμενη από το δίσκο Ορίζονται κάποιοι διακομιστές Ε/Ε Οι επεξεργαστές εκτελούν μόνο τους κατάλληλους υπολογισμούς Οι διακομιστές εκτελούν την προσπέλαση στους δίσκους Τα δεδομένα διακινούνται μόνο φορά στο δίκτυο Μεγάλος αριθμός μηνυμάτων

Βασικές συναρτήσεις int MPI_File_open(MPI_Comm comm, char *filename, int accessMode, MPI_Info info, MPI_File fileHandle) Εάν επιθυμούμε το άνοιγμα του αρχείου να γίνει από μία συγκεκριμένη διεργασία, χρησιμοποιούμε ως communicator τη σταθερά MPI_COMM_SELF Τύποι πρόσβασης MPI_MODE_RDONLY MPI_MODE_CREATE MPI_MODE_UNIQUE_OPEN MPI_MODE_RDWR MPI_MODE_EXCL MPI_MODE_SEQUENTIAL MPI_MODE_WRONLY MPI_MODE_DELETE_ON_CLOSE MPI_MODE_APPEND

Βασικές συναρτήσεις (2) int MPI_File_close(MPI_File *fileHandle) int MPI_File_delete (char *filename, MPI_Info info) int MPI_File_set_size(MPI_File fileHandle, MPI_Offset size) int MPI_File_get_size(MPI_File fileHandle, MPI_Offset *size) int MPI_File_preallocate(MPI_File fileHandle, MPI_Offset size) int MPI_File_get_group(MPI_File fileHandle, MPI_Group *group) int MPI_File_get_amode(MPI_File fileHandle, MPI_Offset *accessMode)

Συναρτήσεις ανάκτησης και καθορισμού ιδιοτήτων αρχείων int MPI_File_set_info (MPI_File *fileHandle, MPI_Info info) int MPI_File_get_info (MPI_File *fileHandle, MPI_Info *info) Ιδιότητες Τύπος πρόσβασης Collective buffering: καθορίζει αν θα υπάρχει ή όχι ενδιάμεση μνήμη Chunked: δηλώνει ότι το αρχείο μπορεί να θεωρηθεί ως πολυδιάστατος πίνακας που μπορεί να προσπελαστεί με τη βοήθεια ενός συνόλου υποπινάκων. Η τιμή αυτού του πεδίου είναι οι διαστάσεις του πίνακα. Chunked_item: το μέγεθος του κάθε στοιχείου του πολυδιάστατου πίνακα σε bytes. Chunked_size: περιέχει τις διαστάσεις των υποπινάκων

Συναρτήσεις ανάκτησης και καθορισμού ιδιοτήτων αρχείων(2) Filename File_perm: τα δικαιώματα πρόσβασης Io_mode_list: οι συσκευές Ε/Ε που θα χρησιμοποιηθούν για την αποθήκευση του αρχείου Nb_proc: το πλήθος των παράλληλων διεργασιών που μπορούν να προσπελάσουν το αρχείο Striping_factor: το πλήθος των συσκευών Ε/Ε που θα διαμοιραστεί το αρχείο Striping_unit: το μέγεθος του τμήματος του αρχείου που θα αποθηκευτεί σε κάθε μονάδα Ε/Ε.

Συναρτήσεις διαχείρισης όψεων αρχείων Όψη: υπαγορεύει τον τρόπο με τον οποίο τα δεδομένα ενός αρχείου θα προσπελαύνονται από τις διεργασίες. int MPI_File_set_view (MPI_File fileHandle, MPI_Offset disp, MPI_Datatype eType, MPI_Datatype fileType, char *dataRep, MPI_Info info) disp: η απόσταση του πρώτου byte δεδομένων του της όψης από την αρχή του αρχείου eType: ο τύπος δεδομένων του αρχείου fileType: η κατανομή των δεδομένων του αρχείου στις διεργασίες data_rep: ο τρόπος αναπαράστασης των δεδομένων

Συναρτήσεις διαχείρισης όψεων αρχείων (2) int MPI_File_get_view (MPI_File fileHandle, MPI_Offset disp, MPI_Datatype *eType, MPI_Datatype *fileType, char *dataRep) Τα ορίσματα eType και fileType πρέπει να δηλωθούν στο σύστημα με την MPI_Type_commit πριν τη χρήση των συναρτήσεων αυτών.

Συναρτήσεις προσπέλασης δεδομένων Προσπέλαση με τη βοήθεια της ακριβούς θέσης int MPI_File_read_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_read_at_all (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_at_all (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_iread_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request) int MPI_File_iwrite_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request)

Συναρτήσεις προσπέλασης δεδομένων - Παράδειγμα #include <mpi.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define LENGTH 100 int main (int argc, char **argv) { int counter, rank,size; int buffer[LENGTH]; char filename[64]=“data.txt”; MPI_File fileHandle; int disp=0, count, offset; MPI_Datatype eType=MPI_INT; MPI_Datatype fType=MPI_INT; MPI_Status status; MPI_Init(&argc, &argv);

Συναρτήσεις προσπέλασης δεδομένων – Παράδειγμα (2) MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); offset=rank*LENGTH; for(counter=0; counter<LENGTH; counter++) buffer[counter]=counter*(rank+1); MPI_File_open(MPI_COMM_WORLD, fileName, MPI_MODE_RDWR|MPI_MODE_CREATE, MPI_INFO_NULL, &fileHandle); MPI_File_set_view(fileHandle, disp, eType, fType, “native”, MPI_INFO_NULL); MPI_File_write_at(fileHandle, offset, buffer, 100, MPI_INT, &status); MPI_Get_elements(&status, MPI_INT, &count); printf(“%d elements saved to disk file from process %d (offset value is %d)\n”, count, rank, offset); MPI_File_close(&fileHandle); MPI_Finalize(); }

Συναρτήσεις προσπέλασης δεδομένων (2) Προσπέλαση με τη βοήθεια του ατομικού δείκτη int MPI_File_read (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_read_all (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_all (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_iread (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request) int MPI_File_iwrite (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request)

Συναρτήσεις προσπέλασης δεδομένων (3) int MPI_File_seek (MPI_File fileHandle, MPI_Offset offset, int whence) whence: MPI_SEEK_SET, MPI_SEEK_CUR, MPI_SEEK_END int MPI_File_get_position (MPI_File fileHandle, MPI_Offset *offset) int MPI_File_get_byte_offset (MPI_File fileHandle, MPI_Offset offset, MPI_Offset *disp)

Συναρτήσεις προσπέλασης δεδομένων (4) Προσπέλαση με τη βοήθεια του κοινόχρηστου δείκτη int MPI_File_read_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_read_ordered (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_ordered (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_iread_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request) int MPI_File_iwrite_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request)

Συναρτήσεις προσπέλασης δεδομένων (5) int MPI_File_seek_shared (MPI_File fileHandle, MPI_Offset offset, int whence) int MPI_File_get_position_shared (MPI_File fileHandle, MPI_Offset *offset)

Συναρτήσεις προσπέλασης δεδομένων (6) Split – collective συναρτήσεις int MPI_File_read_at_all_begin (MPI_File *fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType) int MPI_File_write_at_all_begin (MPI_File *fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType) int MPI_File_read_all_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType) int MPI_File_write_all_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType) int MPI_File_read_ordered_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType) int MPI_File_write_ordered_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType)

Συναρτήσεις προσπέλασης δεδομένων (7) Split – collective συναρτήσεις int MPI_File_read_at_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_write_at_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_read_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_write_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_read_ordered_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_write_ordered_end (MPI_File *fileHandle, void *buffer, MPI_Status *status)