Διεπαφή Μεταβίβασης Μηνυμάτων (Message Passing Interface - MPI)

Η εισαγωγή αυτή είναι βασισμένη στο tutorial "Introduction to Message Passing Interface (MPI)" του Blaise Barney, Lawrence Livermore Laboratory, USA. Μετάφραση και προσαρμογή: Κ.Γ. Μαργαρίτης και Ι.Παπίκας, Εργαστήριο Παράλληλης Κατανεμημένης Επεξεργασίας, Τμήμα Εφαρμοσμένης Πληροφορικής, Πανεπιστήμιο Μακεδονίας.


Πίνακας Περιεχομένων

  1. Περίληψη
  2. Τι είναι το MPI?
  3. Εισαγωγή
  4. Ρουτίνες Διαχείρισης Περιβάλλοντος
  5. Ρουτίνες Σημειακής Επικοινωνίας
    1. Γενική Ιδέα
    2. Παράμετροι Ρουτινών
    3. Ρουτίνες Μεταβίβασης Μηνυμάτων με Αναστολή
    4. Ρουτίνες Μεταβίβασης Μηνυμάτων χωρίς Αναστολή
  6. Ρουτίνες Συλλογικής Επικοινωνίας
  7. Προσαρμοσμένοι Τύποι Δεδομένων
  8. Ρουτίνες Διαχείρησης Ομάδων και Επικοινωνιών
  9. Εικονικές Τοπολογίες
  10. Σύντομη αναφορά στο MPI-2
  11. Παράρτημα: Ευρετήριο Ρουτινών MPI-1
  12. Ασκήσεις


Περίληψη


Η Διεπαφή Μεταβίβασης Μηνυμάτων (Message Passing Interface - MPI) είναι μια βιβλιοθήκη μεταβίβασης μηνυμάτων στατικής σύνδεσης βασισμένη στη προδιαγραφή του MPI Forum, στο οποίο συμμετέχουν παραπάνω απο 40 οργανισμοί, όπου συμπεριλαμβάνονται προμηθευτές, ερευνητές, σχεδιαστές βιβλιοθηκών λογισμικού και χρήστες. Ο στόχος του MPI είναι να καθιερώσει ένα φορητό, αποδοτικό και ευέλικτο πρότυπο για το μοντέλο παράλληλου προγραμματισμού που βασίζεται στη μεταβίβαση μηνυμάτων. Τα πλεονεκτήματα ανάπτυξης λογισμικού μεταβίβασης μηνυμάτων με το MPI είναι μεταξύ άλλων: φορητότητα, αποδοτικότητα και ευελιξία. Το MPI δεν είναι ένα πρότυπο σαν τα IEEE και ISO, αλλά έχει γίνει ένα "εργοστασιακό πρότυπο" για προγράμματα αποστολής μηνυμάτων σε παράλληλους υπολογιστές.

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

Το υλικό του οδηγού περιλαμβάνει επίσης πιο προχωρημένα θέματα όπως τους Τύπους δεδομένων, ρουτίνες Διαχείρισης Ομάδων Διεργασιών και Εικονικές Τοπολογίες. Ωστόσο, αυτά δεν παρουσιάζονται σε έκταση, αλλά είναι περισσότερο σαν περαιτέρω γνώσεις για αυτούς που ενδιαφέρονται.




Τι είναι το MPI?


Μια πρότυπη διεπαφής :MPI Logo

Ιστορία και Εξέλιξη:

Λόγοι χρήσης του MPI:

Μοντέλο Προγραμματισμού:



Εισαγωγή


Αρχείο Κεφαλής:

Τρόπος κλήσης του MPI :

Γενική δομή προγραμμάτων MPI:

Ομάδες Διεργασιών:

Rank:



Ρουτίνες Διαχείρισης Περιβάλλοντος


Οι ρουτίνες διαχείρισης περιβάλλοντος του MPI χρησιμοποιούνται για συγκεκριμένους σκοπούς, όπως την αρχικοποίηση και τον τερματισμό του περιβάλλοντος του MPI. Οι πιο συχνές χρήσεις περιγράφονται παρακάτω.

MPI_Init
Αρχικοποιεί το περιβάλλον εκτέλεσης του MPI. Αυτή η συνάρτηση πρέπει να κληθεί σε κάθε πρόγραμμα MPI, πριν από οποιαδήποτε άλλη συνάρτηση και μόνο μία φορά. H MPI_Init πρέπει να χρησιμοποιηθεί για να περαστούν οι παράμετροι κλήσης σε όλες τις διεργασίες, αν και δεν είναι απαραίτητο και εξαρτάται από την υλοποίηση.

MPI_Init (&argc,&argv)

MPI_Comm_size
Προσδιορίζει τον αριθμό των διεργασιών στο group το οποίο σχετίζεται με έναν communicator. Γενικά χρησιμοποιείται μέσα στον communicator MPI_COMM_WORLD για τον προσδιορισμό του αριθμού των διεργασιών που χρησιμοποιούνται από την εφαρμογή.

MPI_Comm_size (comm,&size)

MPI_Comm_rank
Προσδιορίζει τo αναγνωριστικό της καλούμενης διεργασίας μέσα στον communicator. Αρχικά, κάθε διεργασία θα αποκτήσει έναν μοναδικό αριθμό από το 0 μέχρι το "πλήθος των διεργασιών-1" μέσα στον communicator MPI_COMM_WORLD. Αυτή η θέση συχνά χρησιμοποιείται και ως task ID. Αν μια διεργασία συσχετιστεί με άλλους communicators, θα έχει μια μοναδική θέση και σε εκείνους επίσης.

MPI_Comm_rank (comm,&rank)

MPI_Abort
Τεριατίζει όλες τις διεργασίες του MPI που σχετίζονται με τον communicator. Στις περισσότερες εφαρμογές MPI τερματίζει όλες τις διεργασίες ασχέτως με τον communicator.

MPI_Abort (comm,errorcode)

MPI_Get_processor_name
Επιστρέφει το όνομα της διεργασίας. Επίσης επιστρέφει το μήκος του ονόματος. Ο buffer του ονόματος πρέπει να είναι τουλάχιστον MPI_MAX_PROCESSOR_NAME χαρακτήρες σε μέγεθος. Αυτό που επιστρέφεται στο όνομα εξαρτάται από την υλοποίηση - μπορεί να μην είναι το ίδιο με την έξοδο των εντολών κελύφους "hostname" ή "host".

MPI_Get_processor_name (&name,&resultlength)

MPI_Initialized
Δείχνει αν η έχει κληθεί η MPI_Init - επιστρέφει λογικό true (1) ή false (0). Το MPI απαίτεί την κλήση της MPI_Init μία και μόνο φορά από κάθε διεργασία. Αυτό μπορεί να προκαλέσει πρόβλημα για εφαρμογές οι οποίες θέλουν να χρησιμοποιήσουν το MPI και είανι έτοιμες να καλέσουν το MPI_Init αν χρειαστεί. Η MPI_Initialized λύνει αυτό το πρόβλημα.

MPI_Initialized (&flag)

MPI_Wtime
Επιστρέφει τον χρόνο που έχει περάσει σε δευτερόλεπτα (διπλής ακρίβειας) στην διεργασία που το καλεί.

MPI_Wtime ()

MPI_Wtick
Επιστρέφει την ανάλυση της ώρας σε δευτερόλεπτα από το MPI_Wtime.

MPI_Wtick ()

MPI_Finalize
Τερματίζει το περιβάλλον εκτέλεσης του MPI. Αυτή η συνάρτηση πρέπει να είναι η τελευταία από τις ρουτίνες που θα κληθούν σε κάθε πρόγραμμα MPI - δεν πρέπει να κληθούν άλλες ρουτίνες μετά από αυτή.

MPI_Finalize ()


Παραδείγματα: Ρουτίνες Διαχείρισης Περιβάλλοντος



Ρουτίνες Σημειακής Επικοινωνίας

Βασικές Έννοιες

Τύποι Σημειακής Επικοινωνίας: Ενταμίευση (Buffering): Αναστολή και Μη-Αναστολή:

Προτεραιότητα και Δικαιοσύνη:



Ρουτίνες Σημειακής Επικοινωνίας

Παράμετροι Ρουτινών

Οι ρουτίνες σημειακής επικοινωνίας του MPI έχουν τις παρακάτω μορφές:
Ενταμιευτής (buffer)
Χώρος στο πρόγραμμα στον οποίο αποθηκεύονται τα δεδομένα που είναι για αποστολή ή παραλαβή (o buffer εφαρμογής). Στις περισσότερες περιπτώσεις, είναι απλά μια μεταβλητή η οποία είναι για αποστολή ή παραλαβή. Για προγράμματα σε C, η παράμετρος περνάει κατ' αναφορά και συνήθως πρέπει να συνοδεύεται με το σύμβολο &: &var1
Αριθμός δεδομένων (count)
Δείχνει το πλήθος των δεδομένων ενός τύπου δεδομένων για αποστολή.
Τύπος δεδομένων (type)
Για λόγους φορητότητας, το MPI ορίζει από πριν τους βασικούς τύπους δεδομένων. Ο πίνακας παρακάτω δείχνει μια λίστα από τους τύπους του προτύπου.

Τύποι Δεδομένων στην C
MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED_SHORT unsigned short int
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_BYTE 8 binary digits
MPI_PACKED data packed or unpacked with MPI_Pack()/ MPI_Unpack

Σημειώσεις:

Προορισμός (dest)
Μία παράμετρος για τις ρουτίνες αποστολής η οποία δείχνει την διεργασία στην οποία πρέπει να πάει το μήνυμα. Προσδιορίζεται από το rank της διεργασίας που λαμβάνει.
Πηγή (source)
Μία παράμετρος για τις ρουτίνες παραλαβής η οποία δείχνει την διεργασία από την οποία περιμένει να λάβει το μήνυμα. Προσδιορίζεται από το rank της διεργασίας που στέλνει. Αυτό μπορεί να είναι και ένας μπαλαντέρ MPI_ANY_SOURCE για να λάβει μήνυμα από οποιαδήποτε διεργασία.
Ετικέτα (tag)
Αυθαίρετος μη-αρνητικός αριθμός που μπαίνει από τον προγραμματιστή για να προσδιορίσει μοναδικά ένα μήνυμα. Λειτουργίες αποστολής και παραλαβής πρέπει να έχουν την ίδια ετικέτα για το ίδιο μήνυμα. Για μια λειτουργία παραλαβής, ο μπαλαντέρ MPI_ANY_TAG μπορεί να χρησιμοποιηθεί για να λάβει μηνύματα ασχέτως με την ετικέτα. Το πρότυπο MPI εγγυάται ότι ακέραιοι μεταξύ 0-32767 μπορούν να χρησιμοποιηθούν σαν ετικέτες, αλλά οι περισσότερες υλοποιήσεις επιτρέπουν ένα μεγαλύτερο εύρος.
Communicator
Δείχνει τον κύριο Communicator, ή ένα σετ από διεργασίες για τις οποίες η πηγή ή ο προορισμός είναι έγκυρα. Αν ο προγραμματιστής δεν δημιουργήσει κάποιον communicator, χρησιμοποιείται ο προκαθορισμένος MPI_COMM_WORLD.
Κατάσταση (status)
Για μια λειτουργία παραλαβής, δείχνει την πηγή του μηνύματος και την ετικέτα του. Στην C, αυτή η παράμετρος είναι ένας δείκτης σε μια δομή MPI_Status (πχ. stat.MPI_SOURCE stat.MPI_TAG). Επιπλέον, ο πραγματικός αριθμός των bytes που λαμβάνονται φαίνται από την μέθοδο MPI_Get_count.
Αίτημα (request)
Χρησιμοποιείται από μη-ανασταλτικές ρουτίνες αποστολής και παραλαβής. Καθώς αυτές οι λειτουργίες μπορούν να επιστρέψουν πριν την ανάγνωση του buffer, το σύστημα βάζει έναν μοναδικό "αριθμό αιτήματος". Ο προγραμματιστής χρησιμοποιεί αυτήν την ανάθεση του συστήματος αργότερα (σε μια ρουτίνα τύπου WAIT) για να προσδιορίσει την ολοκλήρωση της λειτουργίας. Στην C, αυτή η παράμετρος είναι ένας δείκτης σε μια δομή MPI_Request.


Ρουτίνες Σημειακής Επικοινωνίας

Ανασταλτικές Ρουτίνες Μεταβίβασης Μηνυμάτων

Οι περισσότερο γνωστές ρουτίνες μεταβίβασης μηνυμάτων με μπλοκάρισμα παρουσιάζονται παρακάτω.
MPI_Send
Βασική λειτουργία αποστολής. Οι ρουτίνες "επιστρέφουν" μόνο αφού ο buffer εφαρμογής μπορεί να χρησιμποιηθεί ξανά. Να σημειωθεί ότι αυτή η ρουτίνα μπορεί να έχει διαφορετική υλοποίηση σε διαφορετικά συστήματα. Το πρότυπο του MPI επιτρέπει την χρήση ενός buffer του συστήματος αλλά δεν το απαιτεί. Μερικές υλοποιήσεις ίσως χρησιμοποιούν σύγχρονη αποστολή (αναφέρεται παρακάτω) για να υλοποιήσει την ανασταλτική αποστολή.

MPI_Send (&buf,count,datatype,dest,tag,comm) 

MPI_Recv
Παραλαμβάνει ένα μήνυμα και αναστέλει τη λειτουργία της διεργασίας μέχρι τα δεδομένα να είναι διαθέσιμα στον buffer της εφαρμογής στην διεργασία παραλαβής.

MPI_Recv (&buf,count,datatype,source,tag,comm,&status)

MPI_Ssend
Σύγχρονη ανασταλτική αποστολή: στέλνει ένα μήνυμα μέχρι ο buffer της εφαρμογής να αδειάσει και να είναι έτοιμος να ξαναχρησιμοποιηθεί και μέχρι η διεργασία παραλαβής να επιβεβαιώσει τη παραλαβή του μηνύματος.

MPI_Ssend (&buf,count,datatype,dest,tag,comm)

MPI_Bsend
Ανασταλτική αποστολή με ενταμίευση: επιτρέπει στον προγραμματιστή να δεσμεύσει όσο μνήμη θέλει στον buffer στην οποία μπορούν να αντιγραφούν τα δεδομένα μέχρι να παραδοθούν. Αποτρέπει τα προβλήματα που δημιουργούνται λόγω έλλειψης χώρου στον buffer. Οι ρουτίνες επιστρέφουν αφού τα δεδομένα αντιγράφτηκαν επιτυχώς από τον buffer της εφαρμογής στον buffer που δεσμεύτηκε για την αποστολή. Πρέπει να χρησιμοποιηθεί με την ρουτίνα MPI_Buffer_attach.

MPI_Bsend (&buf,count,datatype,dest,tag,comm)

MPI_Buffer_attach
MPI_Buffer_detach
Χρησιμοποιείται από τον προγραμματιστή για να από/δεσμεύσει χώρο στον buffer για τα μηνύματα για να χρησιμοποιηθεί από την ρουτίνα MPI_Bsend. Η παράμετρος μεγέθους αναφέρεται σε πραγματικό μέγεθος από bytes - όχι το πλήθος των στοιχείων δεδομέων. Μόνο ένας buffer μπορεί να χρησιμοποιηθεί από μια διεργασία τη φορά. Να σημειωθεί ότι η υλοποίηση IBM χρησιμοποιεί MPI_BSEND_OVERHEAD bytes από τον δεσμευμένο χώρο του buffer για κεφαλίδα.

MPI_Buffer_attach (&buffer,size)
MPI_Buffer_detach (&buffer,size)

MPI_Rsend
Ανασταλτική "ready" αποστολή: χρησιμοποιείται μόνο αν ο προγραμματιστής είναι σίγουρος οτι η αντίστοιχη παραλαβή είναι ήδη σε αναμονή.

MPI_Rsend (&buf,count,datatype,dest,tag,comm)

MPI_Sendrecv
Ζεύγος "αποστολή ενός μηνύματος και παραλαβή ενός άλλου" πριν την αναστολή. Θα υπάρξει αναστολή μέχρι o buffer της αποστολής να είναι έτοιμος για νέα χρήση ή μέχρι ο buffer της παραλαβής να περιέχει το μήνυμα προς παραλαβή.

MPI_Sendrecv (&sendbuf,sendcount,sendtype,dest,sendtag,&recvbuf,recvcount,recvtype,source,recvtag,comm,&status)

MPI_Wait
MPI_Waitany
MPI_Waitall
MPI_Waitsome
Η λειτουργία MPI_Wait προκαλεί αναστολή μέχρι να ολοκληρωθεί μια μη-ανασταλτική λειτουργία. Για πολλαπλές μη-ανασταλτικές λειτουγίες, ο προγραμματιστής μπορεί να προσδιορίσει μερικές ή όλες τις διαδικασίες που πρέπει να ολοκληρωθούν.

MPI_Wait (&request,&status)
MPI_Waitany (count,&array_of_requests,&index,&status)
MPI_Waitall (count,&array_of_requests,&array_of_statuses)
MPI_Waitsome (incount,&array_of_requests,&outcount,&array_of_offsets, &array_of_statuses)

MPI_Probe
Διεξάγει έναν έλεγχο αναστολής για ένα μήνυμα. Οι "μπαλαντέρ" MPI_ANY_SOURCE και MPI_ANY_TAG μπορούν να χρησιμοποιηθούν για να ελέγξουν ένα μήνυμα από οποιαδήποτε πηγή με οποιαδήποτε ετικέτα. Για την C, η πραγματική πηγή και ετικέτα θα επιστραφούν στην δομή ελέγχου σαν status.MPI_SOURCE και status.MPI_TAG.

MPI_Probe (source,tag,comm,&status)


Παραδείγματα: Ανασταλτικές Ρουτίνες Μεταβίβασης Μηνυμάτων



Ρουτίνες Σημειακής Επικοινωνίας

Μη-Ανασταλτικές Ρουτίνες Μεταβίβασης Μηνυμάτων

Οι πιο κοινές ρουτίνες παρουσιάζονται παρακάτω.
MPI_Isend
Δεσμεύει έναν χώρο στην μνήμη σαν buffer για την αποστολή. Η εκτέλεση συνεχίζεται αμέσως χωρίς η διεργασία να περιμένει να αντιγραφεί το μήνυμα από τον buffer της εφαρμογής. Ένας δείκτης σε αίτηση επικοινωνίας επιστρέφεται ώστε η διεργασία να μπορεί να ελέγξει στη συνέχεια τη κατάσταση του μηνύματος. Το πρόγραμμα δεν πρέπει να μεταβάλλει το buffer εφαρμογής μέχρι η MPI_Wait ή η MPI_Test δείξουν ότι η αποστολή ολοκληρώθηκε.

MPI_Isend (&buf,count,datatype,dest,tag,comm,&request)

MPI_Irecv

Δεσμεύει έναν χώρο στην μνήμη σαν buffer για την παραλαβή. Η εκτέλεση συνεχίζεται αμέσως χωρίς η διεργασία να περιμένει να ληφθεί το μήνυμα και να αντιγραφεί στον buffer της εφαρμογής. Ένας δείκτης αίτησης επικοινωνίας επιστρέφεται ώστε η διεργασία να μπορεί να ελέγξει στη συνέχεια τη κατάσταση του μηνύματος. Το πρόγραμμα πρέπει να χρησιμοποιήσει την MPI_Wait ή την MPI_Test για να ελέγξει πότε ολοκληρώθηκε η διαδικασία και το μήνυμα είναι διαθέσιμο στον buffer της εφαρμογής.

MPI_Irecv (&buf,count,datatype,source,tag,comm,&request)

MPI_Issend
Μη-ανασταλτική σύγχρονη αποστολή. Παρόμοια με την MPI_Isend(), αλλά η MPI_Wait() ή η MPI_Test() δείχνει πότε ο παραλήπτης παρέλαβε το μήνυμα.

MPI_Issend (&buf,count,datatype,dest,tag,comm,&request)

MPI_Ibsend
Μη-ανασταλτική αποστολή με την χρήση buffer. Παρόμοια με την MPI_Bsend() αλλά η MPI_Wait() ή η MPI_Test() δείχνει πότε ο παραλήπτης παρέλαβε το μήνυμα. Πρέπει να χρησιμοποιηθεί μαζί με την ρουτίνα MPI_Buffer_attach.

MPI_Ibsend (&buf,count,datatype,dest,tag,comm,&request)

MPI_Irsend
Μη-ανασταλτική αποστολή "ready". Παρόμοια με την MPI_Rsend() αλλά η MPI_Wait() ή η MPI_Test() δείχνει πότε ο παραλήπτης παρέλαβε το μήνυμα. Θα πρέπει να χρησιμοποιηθεί μόνο αν ο προγραμματιστής είναι σίγουρος ότι η παραλαβή έχει εκτελεστεί ήδη από τον παραλήπτη.

MPI_Irsend (&buf,count,datatype,dest,tag,comm,&request)

MPI_Test
MPI_Testany
MPI_Testall
MPI_Testsome
H MPI_Test ελέγχει τη κατάσταση μιας καθορισμένης μη-ανασταλτικής λειτουργίας. Η παράμετρος "flag" επιστρέφει τη τιμή true (1) αν η λειτουργία έχει ολοκληρωθεί, ή τη τιμή false (0) αν δεν έχει. Για πολλαπλές λειτουργίες, υπάρχει η δυνατότητα καθορισμού κάποιας, όλων ή μερικών λειτουργιών.

MPI_Test (&request,&flag,&status)
MPI_Testany (count,&array_of_requests,&index,&flag,&status)
MPI_Testall (count,&array_of_requests,&flag,&array_of_statuses)
MPI_Testsome (incount,&array_of_requests,&outcount,&array_of_offsets, &array_of_statuses)

MPI_Iprobe
Διεξάγει έναν μη-ανασταλτικό έλεγχο για ένα μήνυμα. Οι "μπαλαντέρ" MPI_ANY_SOURCE και MPI_ANY_TAG μπορούν να χρησιμοποιηθούν για αυτόν τον έλεγχο απο οποιαδήποτε πηγή με οποιαδήποτε ετικέτα. Η παράμετρος "flag" επιστρέφει τη τιμή true (1) αν το μήνυμα έφτασε ή false (0) αν όχι. Για την C, ο παραλήπτης και η ετικέτα μπορούν να εμφανιστούν με την χρήση της δομής ελέγχου ως status.MPI_SOURCE και status.MPI_TAG.

MPI_Iprobe (source,tag,comm,&flag,&status)


Παραδείγματα: Μη-Ανασταλτικές Ρουτίνες Μεταβίβασης Μηνυμάτων



Ρουτίνες Συλλογικής Επικοινωνίας


Όλα ή Τίποτα:

Τύποι Συλλογικών Λειτουργιών:

Προγραμματιστικοί Περιορισμοί και Συμβουλές:

Ρουτίνες Συλλογικής Επικοινωνίας

MPI_Barrier
Δημιουργεί ένα όριο συγχρονισμού σε μια ομάδα. Κάθε διεργασία, όταν φτάσει στην εντολή MPI_Barrier, αναστέλεται μέχρι όλες οι υπόλοιπες διεργασίες να φτάσουν στο ίδιο σημείο.

εMPI_Barrier (comm)

MPI_Bcast
Διαδίδει (παν-εκπέμπει) ένα μήνυμα από την διεργασία-πηγή (root) στις υπόλοιπες διεργασίες της ομάδας.

MPI_Bcast (&buffer,count,datatype,root,comm)

MPI_Scatter
Διανέμει τμήματα ενός μηνύματος από μία διεργασία-πηγή στις υπόλοιπες διεργασίες της ομάδας (διαφορετικό τμήμα σε κάθε διεργασία).

MPI_Scatter (&sendbuf,sendcnt,sendtype,&recvbuf,recvcnt,recvtype,root,comm)

MPI_Gather
Συλλέγει διαφορετικά μηνύματα από κάθε διεργασία σε μία διεργασία-προορισμό. Αυτή η ρουτίνα είναι η αντίστροφη διαδικασία της MPI_Scatter.

MPI_Gather (&sendbuf,sendcnt,sendtype,&recvbuf,recvcount,recvtype,root,comm)

MPI_Allgather
Όλες τις διεργασίες της ομάδας συλλέγουν τα μυνήματα όλων των διεργασιών. Κάθε διεργασία διεξάγει μία μετάδοση σε όλες τις υπόλοιπες μέσα στο γκρουπ.

MPI_Allgather (&sendbuf,sendcount,sendtype,&recvbuf,recvcount,recvtype,comm)

MPI_Reduce
Μια διεργασία εφαρμόζει μία συγκεκριμένη πράξη στα βαθμωτά δεδομένα που συλλέγει από όλες τις διεργασίες και τοποθετεί το αποτέλεσμα σε μία μεταβλητη.

MPI_Reduce (&sendbuf,&recvbuf,count,datatype,op,root,comm)

Οι προκαθορισμένες πράξεις του MPI φαίνονται παρακάτω. Οι χρήστες μπορούν επίσης να ορίσουν δικές τους συναρτήσεις υπολογισμών χρησιμοποιώντας την ρουτίνα MPI_Op_create.

MPI Reduction Operation C Data Types
MPI_MAX maximum integer, float
MPI_MIN minimum integer, float
MPI_SUM sum integer, float
MPI_PROD product integer, float
MPI_LAND logical AND integer
MPI_BAND bit-wise AND integer, MPI_BYTE
MPI_LOR logical OR integer
MPI_BOR bit-wise OR integer, MPI_BYTE
MPI_LXOR logical XOR integer
MPI_BXOR bit-wise XOR integer, MPI_BYTE
MPI_MAXLOC max value and location float, double and long double
MPI_MINLOC min value and location float, double and long double

MPI_Allreduce
Όλες οι διεργασίες εφαρμόζουν μια MPI_Reduce επί ων δεδομένων όλων των διεργασιών.

MPI_Allreduce (&sendbuf,&recvbuf,count,datatype,op,comm)

MPI_Reduce_scatter
Αυτή η εντολή ισοδυναμεί με την MPI_Reduce συνδυασμένη με την MPI_Scatter. Κάθε διεργασία εκτελεί MPI_Reduce αλλά σε διαφορετικά στοιχεία (η σειρά καθορίζεται από την MPI_Scatter).

MPI_Reduce_scatter (&sendbuf,&recvbuf,recvcount,datatype,op,comm)

MPI_Alltoall
Κάθε διεργασία εκτελεί μια λειτουργία MPI_Scatter, στέλνοντας ένα τμήμα των δεδομένων σε όλες τις διεργασίες στην ομάδα σύμφωνα με την σειρά στην οποία βρίσκονται.

MPI_Alltoall (&sendbuf,sendcount,sendtype,&recvbuf,recvcnt,recvtype,comm)

MPI_Scan
Διεξάγει μια λειτουργία MPI_Reduce για μια συγκεκριμένη πράξη, αλλά στις διεργασίες της ομάδας που προηγούνται στη σειρά από τη συγκεκριμένη διεργασία.

MPI_Scan (&sendbuf,&recvbuf,count,datatype,op,comm)


Παραδείγματα: Συλλογικές Επικοινωνίες



Προσαρμοσμένοι Τύποι Δεδομένων


Ρουτίνες Προσαρμοσμένων Τύπων Δεδομένων

MPI_Type_contiguous
Ο πιο απλός κατασκευαστής. Δημιουργεί έναν νέο τύπο δεδομένων εκτελώντας count αντίγραφα από ήδη υπάρχοντες τύπους δεδομένων.

MPI_Type_contiguous (count,oldtype,&newtype)

MPI_Type_vector
MPI_Type_hvector
Ίδιο με τον συνεχόμενο, απλά επιτρέπει τα κενά ανάμεσα στις θέσεις. Η MPI_Type_hvector είναι ίδια με την MPI_Type_vector εκτός του ότι το κενό προσδιορίζεται σε bytes.

MPI_Type_vector (count,blocklength,stride,oldtype,&newtype)

MPI_Type_indexed
MPI_Type_hindexed
Ένας πίνακας μετατοπίσεων του εισερχόμενου τύπου δεδομένων παρέχεται σαν χάρτης για τον καινούριο τύπο. Η MPI_Type_hindexed είναι ίδια με την MPI_Type_indexed εκτός του ότι το offset προσδιορίζεται σε bytes.

MPI_Type_indexed (count,blocklens[],offsets[],old_type,&newtype)

MPI_Type_struct
Ο νέος τύπος δεδομένων διαμορφώνεται σύμφωνα με μια συγεκριμένη προκαθορισμένη μορφή των προκαθορισμένων τύπων που μπαίνουν σαν παράμετροι.

MPI_Type_struct (count,blocklens[],offsets[],old_types,&newtype)

MPI_Type_extent
Επιστρέφει το μέγεθος σε bytes του συγκεκριμένου τύπου δεδομένων. Χρήσιμο για τις υπορουτίνες του MPI οι οποίες χρειάζονται ένα offset σε bytes.

MPI_Type_extent (datatype,&extent)

MPI_Type_commit
Δημιουργεί τους νέους τύπους στο σύστημα. Χρειάζεται για όλους τους προσαρμοσμένους τύπους δεδομένων.

MPI_Type_commit (&datatype)

MPI_Type_free
Αποδεσμεύει το συγκεκριμένο αντικείμενο αυτού του τύπου δεδομένων. Η χρήση αυτής της ρουτίνας είναι πολύ σημαντική για την εκκαθάριση της μνήμης σε περίπτωση που δημιουργηθούν πολλά αντικείμενα τύπων δεδομένων.

MPI_Type_free (&datatype)


Παραδείγματα: Προσαρμοσμένοι Τύποι Δεδομένων


Παραδείγματα: Προσαρμοσμένοι Τύποι Δεδομένων Vector


Παραδείγματα: Προσαρμοσμένοι Τύποι Δεδομένων με Δείκτες


Παραδείγματα: Προσαρμοσμένοι Τύποι Δεδομένων με Δομές



Ρουτίνες Διαχείρισης Ομάδων και Επικοινωνιών


Ομάδες (group) και Επικοινωνίες (Communicators):

Κύριοι Στόχοι των Αντικειμένων group και communicator:

  1. Επιτρέπει την οργάνωση διεργασιών, βασισμένοι ανάλογα με την συνάρτηση, σε ομάδες διεργασιών.
  2. Επιστρέπει συλλογικές λειτουργίες επικοινωνιών ανάμεσα σε υποσύνολα διεργασιών που σχετίζονται μεταξύ τους.
  3. Παρέχει την βάση για την διαμόρφωση εικονικών τοπολογιών από τον χρήστη.
  4. Παρέχει ασφαλή επικοινωνία.

Προγραμματιστικοί Περιορισμοί και Συμβουλές:


Ρουτίνες Διαχείρισης Ομάδων και Επικοινωνιών



Εικονικές Τοπολογίες


Τι είναι;

Γιατί να τις χρησιμοποιήσουμε;

Παράδειγμα:


Ρουτίνες Εικονικών Τοπολογιών



Μια σύντομη αναφορά στο MPI-2


Ιστορία:

Σημεία Κλειδιά των νέων Λειτουργιών:




Αναφορές και Περισσότερες Πληροφορίες



Παράρτημα: Ευρετήριο Ρουτινών του MPI-1

Οι σελίδες πάρθηκαν από μια υλοποίηση της IBM και μπορεί να διαφέρουν από άλλες υλοποιήσεις σε διαφορετικές πλατφόρμες.