Η εισαγωγή αυτή είναι βασισμένη στο tutorial
"Introduction to Message Passing Interface (MPI)" του Blaise Barney,
Lawrence Livermore
Laboratory, USA.
Μετάφραση και προσαρμογή: Κ.Γ. Μαργαρίτης και Ι.Παπίκας, Εργαστήριο
Παράλληλης
Κατανεμημένης
Επεξεργασίας, Τμήμα Εφαρμοσμένης Πληροφορικής, Πανεπιστήμιο Μακεδονίας.
Η Διεπαφή Μεταβίβασης Μηνυμάτων (Message Passing Interface - MPI) είναι
μια βιβλιοθήκη μεταβίβασης μηνυμάτων στατικής σύνδεσης βασισμένη στη
προδιαγραφή του MPI Forum, στο οποίο συμμετέχουν παραπάνω απο 40
οργανισμοί, όπου
συμπεριλαμβάνονται προμηθευτές, ερευνητές, σχεδιαστές βιβλιοθηκών
λογισμικού και χρήστες. Ο στόχος του MPI είναι να καθιερώσει ένα
φορητό, αποδοτικό και ευέλικτο πρότυπο για το μοντέλο παράλληλου
προγραμματισμού που βασίζεται στη μεταβίβαση μηνυμάτων. Τα
πλεονεκτήματα ανάπτυξης λογισμικού μεταβίβασης μηνυμάτων με το MPI
είναι μεταξύ άλλων: φορητότητα,
αποδοτικότητα και ευελιξία. Το MPI δεν είναι ένα πρότυπο σαν τα IEEE
και ISO, αλλά έχει γίνει ένα "εργοστασιακό πρότυπο" για προγράμματα
αποστολής μηνυμάτων σε παράλληλους υπολογιστές.
Ο στόχος αυτού του οδηγού είναι η εισαγωγή στο MPI και στην
ανάπτυξη και εκτέλεση παράλληλων
προγραμμάτων σύμφωνα με το πρότυπο του MPI. Τα κύρια θέματα που
παρουσιάζονται επικεντρώνουν στα θέματα του MPI τα
οποία είναι σημαντικά για τους προγραμματιστές. Ο οδηγός ξεκινάει με
μια εισαγωγή, το ιστορικό, και βασικές πληροφορίες για να ξεκινήσει
κανείς με το MPI. Ακολουθείται από μια λεπτομερέστερη ματιά στις
ρουτίνες
του MPI οι οποίες είναι πιο χρήσιμες στους προγραμματιστές,
περιλαμβάνοντας την Διαχείριση Περιβάλλοντος, Σημειακές και Συλλογικές
Επικοινωνίες. Υπάρχουν αρκετά
παραδείγματα σε C όπως επίσης και εργαστηριακές ασκήσεις.
Το υλικό του οδηγού περιλαμβάνει επίσης πιο προχωρημένα θέματα όπως
τους Τύπους δεδομένων, ρουτίνες Διαχείρισης Ομάδων Διεργασιών και
Εικονικές Τοπολογίες. Ωστόσο, αυτά δεν παρουσιάζονται σε έκταση, αλλά
είναι περισσότερο σαν περαιτέρω γνώσεις για αυτούς που
ενδιαφέρονται.
Τι είναι το MPI?
Μια πρότυπη διεπαφής :
M P I = Message
Passing Interface
(Διεπαφή Μεταβίβασης Μηνυμάτων)
Το MPI είναι ένα σύνολο προδιαγραφών για προγραμματιστές και
χρήστες βιβλιοθηκών μεταβίβασης μηνυμάτων. Δεν είναι
βιβλιοθήκη καθ'αυτή αλλά περιγράφει τις προδιαγραφές τις οποίες πρέπει
να πληροί
μια βιβλιοθήκη.
Με απλά λόγια, ο στόχος της διεπαφής είναι να παρέχει ένα
πρότυπο για την συγγραφή προγραμμάτων μεταβίβασης
μηνυμάτων. Η διεπαφή προσπαθεί να είναι
πρακτική
φορητή
αποδοτική
ευέλικτη
Οι προδιαγραφές της διεπαφής έχουν ήδη οριστεί για
προγράμματα C/C++ και Fortran.
Ιστορία και Εξέλιξη:
Το MPI είναι αποτέλεσμα προσπαθειών πολλών ατόμων και ομάδων σε
μια περίοδο 2 χρόνων μεταξύ 1992 και 1994. Λίγη ιστορία:
1980 - 1990: Ανάπτυξη παράλληλων αρχιτεκτονικών κατανεμμημένης
μνήμης, ανάπτυξη παράλληλων
προγραμμάτων, μεγάλος αριθμός μη συμβατών λογισμικών για την εγγραφή
τέτοιων προγραμμάτων - προβλήματα φορητότητας, επιδόσεων,
λειτουργικότητας και τιμής. Αναγνώριση της ανάγκης για ενιαία
αντιμετώπιση.
Νοέμβριος 1992: - Παρουσιάζεται η πρώτη πρόταση του MPI (MPI1)
από το Oak Ridge National Laboratory. Δημιουργείται το MPI Forum, που περιλαμβάνει 175 μέλη από 40
οργανισμούς συμεριλαμβανομένων
προμηθευτών, προγραμματιστών, ακαδημαϊκό προσωπικό και επιστήμονες
εφαρμογών.
Σήμερα, οι υλοποιήσεις του MPI είναι ένας συνδυασμός MPI-1 και
MPI-2.
Μερικές μόνο εφαρμογές περιλαμβάνουν την πλήρη λειτουργικότητα και των
δυο. Οι πιο γνωστές υλοποιήσεις είναι τα MPICH1
και MPICH2,
καθώς και το LAM που εξελίχθηκε
στο Open MPI.
Επιπλέον έχουν αναπτυχθεί διάφορες υλοποιήσεις, όπως τo ΜPI-G2
(ειδικά για εφαρμογές Grid) ή το FT-MPI (Fault
Tolerant MPI) κλπ.
Λόγοι χρήσης του MPI:
Προτυποποίηση- Το MPI είναι η μοναδική βιβλιοθήκη
μεταβίβασης μηνυμάτων που μπορεί να θεωρηθεί πρότυπο. Υποστηρίζεται
ουσιαστικά από όλες τις πλατφόρμες HPC. Πρακτικά, αντικατέστησε όλες
τις
προηγούμενες βιβλιοθήκες αυτού του είδους.
Φορητότητα - Δεν υπάρχει λόγος τροποποίησης της εφαρμογής
κατά την μεταφορά της σε άλλη πλατφόρμα η οποία υποστηρίζει το πρότυπο
MPI.
Απόδοση - Οι διάφορες υλοποιήσεις είναι σε θέση να
εκμεταλλευτούν χαρακτηριστικά του αντίστοιχου υλικού για να
βελτιώσουν την απόδοση.
Λειτουργικότητα - Μόνο
στο MPI-1 ορίζονται πάνω από 115 ρουτίνες.
Διαθεσιμότητα - Ποικιλία εφαρμογών είναι διαθέσιμη, από
ιδιώτες και δημόσιους οργανισμούς.
Μοντέλο Προγραμματισμού:
Το MPI μπορεί να υλοποιηθεί στις περισσότερες αρχιτεκτονικές
παράλληλης
επεξεργασίας. Επιπροσθέτως, το MPI χρησιμοποιείται για την
υλοποίηση μοντέλων διαμοιραζόμενης μνήμης, όπως του Παραλληλισμού
Δεδομένων, σε
αρχιτεκτονική κατανεμμημένης μνήμης.
Αρχιτεκτονικές:
Κατανεμμημένης μνήμης: Αρχικά το MPI είχε σαν στόχο τα
συστήματα κατανεμμημένης μνήμης.
Διαμοιραζόμενης μνήμης: Καθώς τα συστήματα διαμοιραζόμενης
μνήμης έγιναν δημοφιλή, πιο συγκεκριμένα οι αρχιτεκτονικές SMP / NUMA,
εμφανίστηκαν υλοποιήσεις του MPI που υποστηρίζουν διαμοιραζόμενη μνήμη.
Υβριδικές: Το MPI χρησιμοποιείται σε σχεδόν όλες τις γνωστές
αριτεκτονικές παράλληλης επεξεργασίας όπως, SMP clusters, NOWs, COWs,
ετερογενή συστήματα, σε συνδυασμό πχ με OpenMP.
Ο παραλληλισμός είναι εντελώς ρητός: ο προγραμματιστής είναι
υπεύθυνος
για την σωστή χρήση του παραλληλισμού και την υλοποίηση αλγορίθμων με
βάση τις δομές του MPI.
Ο αριθμός των διεργασιών (tasks) του παράλληλου
προγράμματος είναι στατικός (MPI-1). Στο MPI-2, ίδίως σε συνδυασμό με
το OpenMP, επιτρέπεται η δυναμική δημιουργία διεργασιών (αν και όχι η
μετανάστευση διεργασιών).
Εισαγωγή
Αρχείο Κεφαλής:
Απαιτείται από όλα τα προγράμματα/ρουτίνες τα οποία καλούν την
βιβλιοθήκη του MPI.
C include file
#include "mpi.h"
Τρόπος κλήσης του MPI :
C Binding
Τρόπος:
rc = MPI_Xxxxx(parameter, ... )
Παράδειγμα:
rc =
MPI_Bsend(&buf,count,type,dest,tag,comm)
Κώδικας Λάθους:
Επιστρέφει τη μεταβλητή "rc". MPI_SUCCESS αν είναι επιτυχής
η κλήση
Τα ονόματα μεταβλητών στην C είναι case sensitive.
Γενική δομή προγραμμάτων
MPI:
Ομάδες Διεργασιών:
Το MPI χρησιμοποιεί αντικείμενα τα οποία ονομάζονται
communicators και groups για να ορίσει ποιο σύνολο διεργασιών μπορεί να
επικοινωνήσει μεταξύ τους. Οι περισσότερες ρουτίντες του MPI απαιτούν
να ορίσει ο χρήστης έναν communicator σαν παράμετρο.
Οι communicators και τα groups καλύπτονται αργότερα με
περισσότερες λεπτομέρειες. Προς το παρόν, απλά χρησιμοποιούμε την
εντολή MPI_COMM_WORLD όταν χρειάζεται ένας communicator - είναι ο
προκαθορισμένος communicator που περιλαμβάνει όλες τις λειτουργίες του
MPI.
Rank:
Μέσα σε έναν communicator, κάθε διεργασία έχει ένα μοναδικό
ακέραιο αναγνωριστικό που της έχει ανατεθεί από το σύστημα όταν γίνεται
η αρχικοποίηση. Επίσης ονομάζεται και "task ID". Τα Ranks είναι
συνεχόμενα και ξεκινούν από το μηδέν.
Χρησιμοποιείται από τον προγραμματιστή για να προσδιορίζει την
προέλευση και τον προορισμό του μηνύματος. Συχνά χρησιμοποιείται σε
δομές ελέγχου για τον έλεγχο της εκτέλεσης του προγράμματος (if rank=0
do this / if rank=1 do that).
Ρουτίνες Διαχείρισης
Περιβάλλοντος
Οι ρουτίνες διαχείρισης περιβάλλοντος του MPI χρησιμοποιούνται για
συγκεκριμένους σκοπούς, όπως την αρχικοποίηση και τον τερματισμό του
περιβάλλοντος του MPI. Οι πιο συχνές χρήσεις περιγράφονται παρακάτω.
Αρχικοποιεί το περιβάλλον εκτέλεσης του MPI. Αυτή η συνάρτηση
πρέπει να κληθεί σε κάθε πρόγραμμα MPI, πριν από οποιαδήποτε άλλη
συνάρτηση και μόνο μία φορά. H MPI_Init πρέπει να χρησιμοποιηθεί για να
περαστούν οι
παράμετροι κλήσης σε όλες τις διεργασίες, αν και δεν είναι απαραίτητο
και εξαρτάται από την υλοποίηση.
Προσδιορίζει τον αριθμό των διεργασιών στο group το οποίο
σχετίζεται με έναν communicator. Γενικά χρησιμοποιείται μέσα στον
communicator MPI_COMM_WORLD για τον προσδιορισμό του αριθμού των
διεργασιών που χρησιμοποιούνται από την εφαρμογή.
Προσδιορίζει τo αναγνωριστικό της καλούμενης διεργασίας μέσα στον
communicator. Αρχικά, κάθε διεργασία θα αποκτήσει έναν μοναδικό αριθμό
από το 0 μέχρι το "πλήθος των διεργασιών-1" μέσα στον communicator
MPI_COMM_WORLD. Αυτή η θέση συχνά χρησιμοποιείται και ως task ID. Αν
μια διεργασία συσχετιστεί με άλλους communicators, θα έχει μια μοναδική
θέση και σε εκείνους επίσης.
Τεριατίζει όλες τις διεργασίες του MPI που σχετίζονται με τον
communicator. Στις περισσότερες εφαρμογές MPI τερματίζει όλες τις
διεργασίες ασχέτως με τον communicator.
Επιστρέφει το όνομα της διεργασίας. Επίσης επιστρέφει το μήκος
του ονόματος. Ο buffer του ονόματος πρέπει να είναι
τουλάχιστον MPI_MAX_PROCESSOR_NAME χαρακτήρες σε μέγεθος. Αυτό που
επιστρέφεται στο όνομα εξαρτάται από την υλοποίηση - μπορεί να μην
είναι το ίδιο με την έξοδο των εντολών κελύφους "hostname" ή "host".
Δείχνει αν η έχει κληθεί η MPI_Init - επιστρέφει λογικό true (1)
ή false (0). Το MPI απαίτεί την κλήση της MPI_Init μία και μόνο φορά
από
κάθε διεργασία. Αυτό μπορεί να προκαλέσει πρόβλημα για εφαρμογές οι
οποίες θέλουν να χρησιμοποιήσουν το MPI και είανι έτοιμες να καλέσουν
το MPI_Init αν χρειαστεί. Η MPI_Initialized λύνει αυτό το πρόβλημα.
Τερματίζει το περιβάλλον εκτέλεσης του MPI. Αυτή η συνάρτηση
πρέπει να είναι η τελευταία από τις ρουτίνες που θα κληθούν σε κάθε
πρόγραμμα MPI - δεν πρέπει να κληθούν άλλες ρουτίνες μετά από αυτή.
MPI_Finalize ()
Παραδείγματα: Ρουτίνες Διαχείρισης Περιβάλλοντος
C Language
- Environment Management
Routines Example
#include "mpi.h" #include <stdio.h>
int main(argc,argv) int argc; char *argv[]; { int numtasks, rank, rc;
MPI_Comm_size(MPI_COMM_WORLD,&numtasks); MPI_Comm_rank(MPI_COMM_WORLD,&rank); printf ("Number of tasks= %d My rank= %d\n", numtasks,rank);
/******* do some work *******/
MPI_Finalize(); }
Ρουτίνες
Σημειακής Επικοινωνίας
Βασικές Έννοιες
Τύποι Σημειακής Επικοινωνίας:
Η σημειακή επικοινωνία του MPI συνήθως περιλαμβάνει μεταβίβαση
μηνυμάτων μεταξύ δύο, και μόνο δύο, διεργασιών. Η μια διεργασία
χρησιμοποιεί μια ρουτίνα αποστολής και η άλλη μια ρουτίνα παραλαβής.
Υπάρχουν διάφοροι τύποι ρουτινών αποστολής και παραλαβής και
χρησιμοποιούνται για διαφορετικούς σκοπούς. Για παράδειγμα:
Συγχρονισμένη αποστολή
Αποστολή / παραλαβή με αναστολή
Αποστολή / παραλαβή χωρίς αναστολή
Αποστολή με την χρήση ενταμίευσης (buffering)
Συνδυασμένη αποστολή / παραλαβή
"Ready" αποστολή
Οποιοσδήποτε τύπος ρουτίνας αποστολής μπορεί να συνδυαστεί με
οποιονδήποτε τύπο ρουτίνας παραλαβής.
Το MPI επίσης προσφέρει πολλές ρουτίνες που σχετίζονται με τις
ρουτίνες αποστολής - παραλαβής, όπως αυτές που χρησιμοποιούνται για να
περιμένουν την παράδοση ενός μηνύματος ή ρωτάνε αν ένα μήνυμα έχει
φτάσει.
Ενταμίευση (Buffering):
Σε έναν τέλειο κόσμο, κάθε λειτουργία αποστολής θα συγχρονιζόταν
τέλεια με τη διεργασία που δέχεται το μήνυμα. Αυτή όμως είναι μια
σπάνια
περίπτωση. Κάπως, η υλοποίηση του MPI, πρέπει να είναι έτοιμη να
αποθηκεύσει δεδομένα όταν τα δυο προγράμματα δεν είναι συγχρονισμένα.
Ας πάρουμε υπόψιν τις επόμενες δυο περιπτώσεις:
Μια λειτουργία αποστολής συμβαίνει 5 δευτερόλεπτα πριν να
είναι έτοιμη η λειτουργία παραλαβής - που θα πάει το μήνυμα μέχρι να
ενεργοποιηθεί η διαδικασία παραλαβής;
Πολλές λειτουργίες αποστολής φτάνουν στην ίδια υλοποίηση η
οποία μπορεί να δεχτεί ένα μήνυμα τη φορά - τι συμβαίνει στα μηνύματα
που επιστρέφουν;
Η υλοποίηση του MPI (όχι του προτύπου) αποφασίζει τι θα κάνει με
τα δεδομένα σε αυτές τις περιπτώσεις. Τυπικά, μια προσωρινή μνήμη του
συστήματος δεσμεύεται για να κρατάει τα δεδομένα σε τέτοιες
περιπτώσεις. Για παράδειγμα:
Ο ενταμιευτής (buffer του
συστήματος), ανάλογα με την υλοποίηση, είναι:
Αόρατος στον προγραμματιστή και ελέγχεται πλήρως από την
βιβλιοθήκη του MPI
Ένας χώρος αποθήκευσης δεδομένων που μπορεί εύκολα να
εξαντληθεί
Συχνά μυστηριώδης και δεν παρουσιάζεται σωστά
Ικανός να υπάρχει στην πλευρά της αποστολής, της παραλαβής ή
και
στις δύο
Κάτι το οποίο μπορεί να βελτιώσει την απόδοση του
προγράμματος επειδή επιτρέπει στις λειτουργίες αποστολής - παραλαβής να
είναι ασύγχρονες.
Οι μεταβλητές του προγράμματος είναι γνωστές και ως buffers της εφαρμογής. Το MPI επίσης
παρέχει buffers αποστολής που διαχειρίζεται ο χρήστης.
Αναστολή και
Μη-Αναστολή:
Οι περισσότερες ρουτίνες σημειακής επικοινωνίας του MPI μπορούν
να
χρησιμοποιηθούν σε λειτουργία με αναστολή ή χωρίς.
Αναστολή:
Μία ανασταλτική ρουτίνα
αποστολής (blocking send) θα "επιστρέψει" μόνο αν
είναι ασφαλές να επαναχρησιμοποιήσει το buffer της εφαρμογής. Ασφαλές
σημαίνει ότι η επαναχρησιμοποίηση
δεν θα επηρεάσει τα δεδομένα που είναι ήδη προς αποστολή. Δεν σημαίνει
οτι τα
δεδομένα έχουν παρληφθεί - μπορεί απλά να βρίσκονται ακόμα στο buffer
της εφαρμογής.
Μια ανασταλτική ρουτίνα
αποστολής (blocking send) μπορεί να είναι σύγχρονη (synchronous), το οποίο
σημαίνει ότι εκτελείται χειραψία
(handshake) με την εφαρμογή παραλαβής να
επιβεβαιώνει την παραλαβή δεδομένων.
Μια ανασταλτική ρουτίνα
αποστολής (blocking send) μπορεί να είναι ασύγχρονη (asynchronous), αν ο
buffer του συστήματος χρησιμοποιείται για να κρατήσει τα δεδομένα προς
παραλαβή.
Μια ρουτίνα παραλαβής "επιστρέφει" αφού τα δεδομένα έχουν
παραληφθεί
και το πρόγραμμα στη πλευρά της παραλαβής είναι έτοιμο να τα
επεξεργαστεί.
Μη-Αναστολή:
Οι μη-ανασταλτικές
ρουτίνες αποστολής / παραλαβής (non-blocking send / receive)
συμπεριφέρονται παρόμοια - "επιστρέφουν" σχεδόν αμέσως. Δεν περιμένουν
για οποιοδήποτε γεγονός επικοινωνίας να ολοκληρωθεί, όπως εγγραφή
δεδομένων σε κάποιο buffer ή χειραψία.
Οι μη-ανασταλτικές ρουτίνες
λειτουργίες απλά ζητούν από την βιβλιοθήκη
του MPI να εκτελέσουν μια λειτουργία όταν μπορέσουν. Ο χρήστης δεν
μπορεί να προβλέψει πότε αυτό θα συμβεί.
Δεν είναι ασφαλές να τροποποιείται ο buffer της
εφαρμογής μέχρι να γίνει γνωστό ότι μια μη-ανασταλτική λειτουργία
πραγματικά ολοκληρώθηκε. Υπάρχουν ρουτίνες αναμονής γι'αυτόν τον λόγο.
Οι μη-ανασταλτικές ρουτίνες
λειτουργίες χρησιμοποιούνται πρωτίστως για
να επικαλύπτουν τους υπολογισμούς με επικοινωνίες και να βελτιώνουν
έτσι την απόδοση.
Προτεραιότητα και
Δικαιοσύνη:
Προτεραιότητα:
Το MPI εγγυάται ότι τα μηνύματα δεν θα προσπεράσουν το ένα το
άλλο.
Αν ο αποστολέας στείλει δύο μηνύματα (Μήνυμα 1 και Μήνυμα 2)
στη σειρά στον ίδιο παραλήπτη, η λειτουργία
παραλαβής θα λάβει πρώτα το μήνυμα 1 και μετά το μήνυμα 2.
Αν ένας παραλήπτης εκτελέσει δύο λειτουργίες παραλαβής
(παραλαβή 1
και παραλαβή 2) στη σειρά και περιμένουν για το ίδιο μήνυμα, η παραλαβή
1 θα πάρει
πρώτη το μήνυμα πριν την παραλαβή 2.
Κανόνες προτεραιότητας δεν εφαρμόζονται αν υπάρχουν πολλά
νήματα που συμμετέχουν σε λειτουργίες επικοινωνίας.
Δικαιοσύνη:
Το MPI δεν εγγυάται δικαιοσύνη - εξαρτάται από τον
προγραμματιστή να εμποδίσει τα σφάλματα.
Παράδειγμα: η διεργασία 0 στέλνει ένα μήνυμα στην διεργασία
2.
Ωστόσο, η διεργασία 1 στέλνει επίσης ένα μήνυμα το οποίο αντιστοιχεί
στην
ίδια λειτουργία παραλαβής της διεργασίας 2. Μόνο μία αποστολή θα
ολοκληρωθεί.
Ρουτίνες
Σημειακής Επικοινωνίας
Παράμετροι Ρουτινών
Οι ρουτίνες σημειακής επικοινωνίας του MPI έχουν τις παρακάτω μορφές:
Χώρος στο πρόγραμμα στον οποίο αποθηκεύονται τα δεδομένα που
είναι για αποστολή ή παραλαβή (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
Οι MPI_BYTE και MPI_PACKED τύποι δεν αντιστοιχούν στους
ίδιους τύπους με την C.
Το πρότυπο του MPI περιλαμβάνει τους εξής τύπους από την
γλώσσα:
C: MPI_LONG_LONG_INT
Μερικές υλοποιήσεις μπορεί να περιλαμβάνουν επιπλέον
στοιχειώδεις τύπους δεδομένων (MPI_LOGICAL2, MPI_COMPLEX32, κλπ.).
Ελέγξτε το αρχείο κεφαλίδας του MPI.
Προορισμός (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.
Ρουτίνες
Σημειακής Επικοινωνίας
Ανασταλτικές Ρουτίνες Μεταβίβασης Μηνυμάτων
Οι περισσότερο γνωστές ρουτίνες μεταβίβασης μηνυμάτων με μπλοκάρισμα
παρουσιάζονται παρακάτω.
Βασική λειτουργία αποστολής. Οι ρουτίνες "επιστρέφουν" μόνο αφού
ο buffer εφαρμογής μπορεί να χρησιμποιηθεί ξανά. Να
σημειωθεί ότι αυτή η ρουτίνα μπορεί να έχει διαφορετική υλοποίηση σε
διαφορετικά συστήματα. Το πρότυπο του MPI επιτρέπει την χρήση ενός
buffer του συστήματος αλλά δεν το απαιτεί. Μερικές υλοποιήσεις ίσως
χρησιμοποιούν σύγχρονη αποστολή (αναφέρεται παρακάτω) για να
υλοποιήσει την ανασταλτική αποστολή.
Παραλαμβάνει ένα μήνυμα και αναστέλει τη λειτουργία της
διεργασίας μέχρι τα δεδομένα να είναι
διαθέσιμα στον buffer της εφαρμογής στην διεργασία παραλαβής.
Σύγχρονη ανασταλτική αποστολή: στέλνει ένα μήνυμα μέχρι ο
buffer της εφαρμογής να αδειάσει και να είναι έτοιμος να
ξαναχρησιμοποιηθεί και μέχρι η διεργασία παραλαβής να επιβεβαιώσει τη
παραλαβή του μηνύματος.
Ανασταλτική αποστολή με ενταμίευση: επιτρέπει στον
προγραμματιστή να δεσμεύσει όσο μνήμη θέλει στον buffer στην οποία
μπορούν να αντιγραφούν τα δεδομένα μέχρι να παραδοθούν. Αποτρέπει τα
προβλήματα που δημιουργούνται λόγω έλλειψης χώρου στον buffer. Οι
ρουτίνες επιστρέφουν αφού τα δεδομένα αντιγράφτηκαν επιτυχώς από τον
buffer της εφαρμογής στον buffer που δεσμεύτηκε για την αποστολή.
Πρέπει να χρησιμοποιηθεί με την ρουτίνα MPI_Buffer_attach.
Χρησιμοποιείται από τον προγραμματιστή για να από/δεσμεύσει χώρο
στον buffer για τα μηνύματα για να χρησιμοποιηθεί από την ρουτίνα
MPI_Bsend. Η παράμετρος μεγέθους αναφέρεται σε πραγματικό μέγεθος από
bytes - όχι το πλήθος των στοιχείων δεδομέων. Μόνο ένας buffer μπορεί
να χρησιμοποιηθεί από μια διεργασία τη φορά. Να σημειωθεί ότι η
υλοποίηση IBM χρησιμοποιεί MPI_BSEND_OVERHEAD bytes από τον δεσμευμένο
χώρο του buffer για κεφαλίδα.
Ζεύγος "αποστολή ενός μηνύματος και παραλαβή ενός άλλου" πριν την
αναστολή. Θα υπάρξει αναστολή μέχρι o buffer της αποστολής να είναι
έτοιμος για νέα χρήση ή μέχρι ο buffer της παραλαβής να περιέχει το
μήνυμα προς παραλαβή.
Η λειτουργία MPI_Wait προκαλεί αναστολή μέχρι να ολοκληρωθεί μια
μη-ανασταλτική λειτουργία. Για πολλαπλές μη-ανασταλτικές λειτουγίες, ο
προγραμματιστής μπορεί να προσδιορίσει μερικές ή όλες τις διαδικασίες
που πρέπει να ολοκληρωθούν.
Διεξάγει έναν έλεγχο αναστολής για ένα μήνυμα. Οι "μπαλαντέρ"
MPI_ANY_SOURCE και MPI_ANY_TAG μπορούν να χρησιμοποιηθούν για να
ελέγξουν ένα μήνυμα από οποιαδήποτε πηγή με οποιαδήποτε ετικέτα. Για
την C, η πραγματική πηγή και ετικέτα θα επιστραφούν στην δομή ελέγχου
σαν status.MPI_SOURCE και status.MPI_TAG.
Δεσμεύει έναν χώρο στην μνήμη σαν buffer για την αποστολή. Η
εκτέλεση συνεχίζεται αμέσως χωρίς η διεργασία να περιμένει να
αντιγραφεί το μήνυμα
από τον buffer της εφαρμογής. Ένας δείκτης σε αίτηση επικοινωνίας
επιστρέφεται ώστε η διεργασία να μπορεί να ελέγξει στη συνέχεια τη
κατάσταση του μηνύματος. Το πρόγραμμα δεν πρέπει να μεταβάλλει το
buffer εφαρμογής μέχρι η MPI_Wait ή η MPI_Test δείξουν ότι η αποστολή
ολοκληρώθηκε.
Δεσμεύει έναν χώρο στην μνήμη σαν buffer για την παραλαβή. Η
εκτέλεση
συνεχίζεται αμέσως χωρίς η διεργασία να περιμένει να ληφθεί το μήνυμα
και να
αντιγραφεί στον buffer της εφαρμογής. Ένας δείκτης αίτησης
επικοινωνίας επιστρέφεται ώστε η διεργασία να μπορεί να ελέγξει στη
συνέχεια τη κατάσταση του μηνύματος. Το πρόγραμμα πρέπει να
χρησιμοποιήσει την MPI_Wait ή
την MPI_Test για να ελέγξει πότε ολοκληρώθηκε η διαδικασία και το
μήνυμα είναι διαθέσιμο στον buffer της εφαρμογής.
Μη-ανασταλτική αποστολή με την χρήση buffer. Παρόμοια με την
MPI_Bsend() αλλά η MPI_Wait() ή η MPI_Test() δείχνει πότε ο παραλήπτης
παρέλαβε το μήνυμα. Πρέπει να χρησιμοποιηθεί μαζί με την ρουτίνα
MPI_Buffer_attach.
Μη-ανασταλτική αποστολή "ready". Παρόμοια με την MPI_Rsend() αλλά
η
MPI_Wait() ή η MPI_Test() δείχνει πότε ο παραλήπτης παρέλαβε το μήνυμα.
Θα πρέπει να χρησιμοποιηθεί μόνο αν ο προγραμματιστής είναι σίγουρος
ότι η παραλαβή έχει εκτελεστεί ήδη από τον παραλήπτη.
H MPI_Test ελέγχει τη κατάσταση μιας καθορισμένης μη-ανασταλτικής
λειτουργίας. Η παράμετρος "flag" επιστρέφει τη τιμή true (1) αν η
λειτουργία έχει ολοκληρωθεί, ή τη τιμή false (0) αν δεν έχει. Για
πολλαπλές λειτουργίες, υπάρχει η δυνατότητα καθορισμού κάποιας, όλων ή
μερικών λειτουργιών.
Διεξάγει έναν μη-ανασταλτικό έλεγχο για ένα μήνυμα. Οι
"μπαλαντέρ" MPI_ANY_SOURCE και MPI_ANY_TAG μπορούν να χρησιμοποιηθούν
για αυτόν τον έλεγχο απο οποιαδήποτε πηγή με οποιαδήποτε ετικέτα. Η
παράμετρος "flag" επιστρέφει τη τιμή true (1) αν το μήνυμα
έφτασε ή false (0) αν όχι. Για την C, ο παραλήπτης και η ετικέτα
μπορούν να εμφανιστούν με την χρήση της δομής ελέγχου ως
status.MPI_SOURCE και status.MPI_TAG.
Οι συλλογικές ρουτίνες πρέπει να περιλαμβάνουν όλες τις
διεργασίες μέσα σε έναν communicator. Όλες οι διεργασίες είναι εξ'
ορισμού μέλη του communicator MPI_COMM_WORLD.
Είναι στην ευθύνη του προγραμματιστή να εγγυηθεί ότι όλες οι
διεργασίες σε έναν communicator συμμετέχουν σε όλες τις συλλογικές
ρουτίνες.
Τύποι Συλλογικών
Λειτουργιών:
Συγχρονισμός - οι διεργασίες περιμένουν μέχρις ώτου όλα τα
μέλη του γκρουπ να φτάσουν στο σημείο συγχρονισμού.
Διανομή/Συλλογή Δεδομένων - μετάδοση,
σκόρπισμα/συγκέντρωση, όλα σε
όλα.
Συλλογικοί Υπολογισμοί - ένα μέλος της ομάδας συλλέγει τα
δεδομένα από τα άλλα μέλη και εκτελεί έναν υπολογισμό (min, max,
πρόσθεση, πολλαπλασιασμό) σε αυτά τα δεδομένα.
Προγραμματιστικοί
Περιορισμοί και Συμβουλές:
Οι συλλογικές λειτουργίες είναι ανασταλτικές.
Οι συλλογικές ρουτίνες επικοινωνίας δεν δέχονται παραμέτρους
ετικετών μηνυμάτων.
Συλλογικές λειτουργίες σε μικρότερα σύνολα διεργασιών διεξάγονται
αφού γίνει μετατροπή αυτού του συνόλου σε νέα ομάδα (group) και αφού
προσκοληθεί
αυτό το group σε κάποιον communicator (συζήτηση στο τμήμα του Ρουτίνες Διαχείρισης Ομάδων και
Επικοινωνιών).
Μπορούν να χρησιμοποιηθούν μόνο με τους προκαθορισμένους τύπους
δεδομένων του MPI, όχι με τους Προσαρμοσμένους
Τύπους Δεδομένων.
Δημιουργεί ένα όριο συγχρονισμού σε μια ομάδα. Κάθε διεργασία,
όταν φτάσει στην εντολή MPI_Barrier, αναστέλεται μέχρι όλες οι
υπόλοιπες
διεργασίες να φτάσουν στο ίδιο σημείο.
Οι προκαθορισμένες πράξεις του MPI φαίνονται παρακάτω. Οι
χρήστες μπορούν επίσης να ορίσουν δικές τους συναρτήσεις υπολογισμών
χρησιμοποιώντας την ρουτίνα MPI_Op_create.
Αυτή η εντολή ισοδυναμεί με την
MPI_Reduce συνδυασμένη με την MPI_Scatter. Κάθε διεργασία εκτελεί
MPI_Reduce αλλά σε διαφορετικά στοιχεία (η σειρά καθορίζεται από την
MPI_Scatter).
Κάθε διεργασία εκτελεί μια λειτουργία MPI_Scatter, στέλνοντας ένα
τμήμα των δεδομένων σε όλες τις διεργασίες στην ομάδα σύμφωνα με την
σειρά στην οποία βρίσκονται.
Διεξάγει μια λειτουργία MPI_Reduce για μια συγκεκριμένη πράξη,
αλλά στις διεργασίες της ομάδας που προηγούνται στη σειρά από τη
συγκεκριμένη διεργασία.
Το MPI επίσης προσφέρει τη δυνατότητα στο χρήστη να ορίσει τις
δικές του δομές δεδομένων βασισμένες στις προκαθορισμένες μορφές. Αυτοί
οι τύποι δεδομένων που ορίζονται από τον χρήστη λέγονται προσαρμοσμένοι
τύποι δεδομένων.
Οι προκαθορισμένοι τύποι δεδομένων είναι συνεχείς.
Προσμαρμοσμένοι τύποι δεδομένων επιτρέπουν στον χρήστη να ορίσει μη
συνεχείς τύπους με έναν εύκολο τρόπο και η συμπεριφορά προς αυτούς τους
τύπους να είναι σαν να είναι συνεχείς.
Το MPI προσφέρει πολλές μεθόδους για την δημιουργία
προσαρμοσμένων τύπων δεδομένων:
Ίδιο με τον συνεχόμενο, απλά επιτρέπει τα κενά ανάμεσα στις
θέσεις. Η MPI_Type_hvector είναι ίδια με την MPI_Type_vector εκτός του
ότι το κενό προσδιορίζεται σε bytes.
Ένας πίνακας μετατοπίσεων του εισερχόμενου τύπου δεδομένων
παρέχεται σαν χάρτης για τον καινούριο τύπο. Η MPI_Type_hindexed είναι
ίδια με την MPI_Type_indexed εκτός του ότι το offset προσδιορίζεται σε
bytes.
Αποδεσμεύει το συγκεκριμένο αντικείμενο αυτού του τύπου
δεδομένων. Η χρήση αυτής της ρουτίνας είναι πολύ σημαντική για την
εκκαθάριση της μνήμης σε περίπτωση που δημιουργηθούν πολλά αντικείμενα
τύπων δεδομένων.
MPI_Type_free (&datatype)
Παραδείγματα: Προσαρμοσμένοι Τύποι Δεδομένων
Δημιουργία ενός τύπου δεδομένων που αναπαριστά μία γραμμή ενός
πίνακα
και διαμοιρασμός διαφορετικής σειράς σε κάθε διεργασία.
/* Setup description of the 4 MPI_FLOAT fields x, y, z, velocity */ offsets[0] = 0; oldtypes[0] = MPI_FLOAT; blockcounts[0] = 4;
/* Setup description of the 2 MPI_INT fields n, type */ /* Need to first figure offset by getting size of MPI_FLOAT */ MPI_Type_extent(MPI_FLOAT, &extent); offsets[1] = 4 * extent; oldtypes[1] = MPI_INT; blockcounts[1] = 2;
/* Now define structured type and commit it */ MPI_Type_struct(2, blockcounts, offsets, oldtypes, &particletype); MPI_Type_commit(&particletype);
/* Initialize the particle array and then send it to each task */ if (rank == 0) { for (i=0; i<NELEM; i++) { particles[i].x = i * 1.0; particles[i].y = i * -1.0; particles[i].z = i * 1.0; particles[i].velocity = 0.25; particles[i].n = i; particles[i].type = i % 2; } for (i=0; i<numtasks; i++) MPI_Send(particles, NELEM, particletype, i, tag, MPI_COMM_WORLD); }
/* Print a sample of what was received */ printf("rank= %d %3.2f %3.2f %3.2f %3.2f %d %d\n", rank,p[3].x, p[3].y,p[3].z,p[3].velocity,p[3].n,p[3].type);
Ένα group είναι ένα ταξινομημένο σύνολο από διεργασίες. Κάθε
διεργασία σε ένα group σχετίζεται με ένα μοναδικό ακέραιο rank. Οι
τιμές του rank ξεκινούν από το μηδέν και φτάνουν μέχρι N-1, όπου N
είναι o αριθμός των διεργασιών μέσα στο group. Στο MPI, ένα group
αναπαριστάται μέσα στην μνήμη του συστήματος σαν ένα αντικείμενο. Είναι
προσπελάσιμο από τον προγραμματιστή μόνο μέσω ενός δείκτη. Ένα group
σχετίζεται πάντα με έναν communicator.
Ένας communicator εσωκλείει ένα group διεργασιών οι οποίες
μπορεί να επικοινωνήσουν μεταξύ τους. Όλα τα μηνύματα του MPI πρέπει να
ορίσουν έναν communicator. Πολύ απλά, ο communicator είναι μια πρόσθετη
ετικέτα η οποία πρέπει να περιλαμβάνεται σε όλες τις κλήσεις του MPI.
Όπως τα group, οι communicators αναπαριστώνται μέσα στην μνήμη του
συστήματος σαν αντικείμενα και είναι προσπελάσιμα από τον
προγραμματιστή μέσω δείκτη. Για παράδειγμα, ο δείκτης ενός
communicator που δείχνει σε όλες τις διεργασίες είναι ο MPI_COMM_WORLD.
Από την πλευρά του προγραμματιστή, group και communicator είναι
το ίδιο. Οι ρουτίνες του group χρησιμοποιούνται κυρίως για να ορίσουν
ποια διεργασία θα χρησιμοποιηθεί για να κατασκευάσει έναν communicator.
Κύριοι Στόχοι των
Αντικειμένων group και communicator:
Επιτρέπει την οργάνωση διεργασιών, βασισμένοι ανάλογα με την
συνάρτηση, σε ομάδες διεργασιών.
Επιστρέπει συλλογικές λειτουργίες επικοινωνιών ανάμεσα σε
υποσύνολα
διεργασιών που σχετίζονται μεταξύ τους.
Παρέχει την βάση για την διαμόρφωση εικονικών τοπολογιών από τον
χρήστη.
Παρέχει ασφαλή επικοινωνία.
Προγραμματιστικοί
Περιορισμοί και Συμβουλές:
Τα group/communicators είναι δυναμικά - μπορούν να δημιουργηθούν
και να καταστραφούν κατά την εκτέλεση του προγράμματος.
Οι διεργασίες μπορούν να είναι σε περισσότερα από ένα
group/communicator. Θα έχουν ένα μοναδικό rank σε κάθε
group/communicator.
Το MPI παρέχει πάνω από 40 ρουτίνες για τα group,
communicators, και τις εικονικές τοπολογίες.
Τυπική Χρήση:
Επιστροφή δείκτη για το group MPI_COMM_WORLD με την
χρήση του MPI_Comm_group
Δημιουργία νέων group σαν υποσύνολο του καθολικού group με
την χρήση του MPI_Group_incl
Δημιουργία νέου communicator για ένα group με την χρήση του
MPI_Comm_create
Προσδιορισμός του rank σε έναν νέο communicator με την χρήση
του MPI_Comm_rank
Διαχείριση επικοινωνιών με την χρήση οποιασδήποτε ρουτίνας
μεταβίβασης μηνυμάτων του MPI
Μετά το τέλος, ελευθερώνει όλους τους communicator και τα
group (προεραιτικό) με την χρήση του MPI_Comm_free και MPI_Group_free
Ρουτίνες Διαχείρισης Ομάδων και Επικοινωνιών
Δημιουργία δύο διαφορετικών groups για ξεχωριστή ανταλλαγή
πληροφοριών.
Απαιτεί την δημιουργία νέων communicators επίσης.
C Language
- Group and Communicator
Routines Example
/* Extract the original group handle */ MPI_Comm_group(MPI_COMM_WORLD, &orig_group);
/* Divide tasks into two distinct groups based upon rank */ if (rank < NPROCS/2) { MPI_Group_incl(orig_group, NPROCS/2, ranks1, &new_group); } else { MPI_Group_incl(orig_group, NPROCS/2, ranks2, &new_group); }
/* Create new new communicator and then perform collective communications */ MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm); MPI_Allreduce(&sendbuf, &recvbuf, 1, MPI_INT, MPI_SUM, new_comm);
Σε όρους του MPI, μία εικονική τοπολογία είναι η λογική οργάνωση
διεργασιών σε ένα γεωμετρικό σχήμα.
Οι δύο κύριοι τύποι τοπολογιών που υποστηρίζονται από το MPI
είναι η καρτεσιανή και το γράφημα.
Οι τοπολογίες του MPI είναι εικονικές - μπορεί να μην υπάρχει
καμιά φυσική σύνδεση του μηχανήματος και της τοπολογίας διεργασιών.
Οι εικονικές τοπολογίες δημιουργούνται πάνω σε MPI communicators
και groups.
Πρέπει να προγραμματιστούν από προγραμματιστές εφαρμογών.
Γιατί να τις
χρησιμοποιήσουμε;
Άνεση
Οι εικονικές τοπολογίες μπορεί να είνα χρήσιμες για εφαρμογές
με συγκεκριμένα σχήματα επικοινωνίας - τα οποία αναπαριστούν
συγκεκριμένη τοπολογία.
Για παράδειγμα, μία καρτεσιανή τοπολογία μπορεί να αποδειχτεί
κατάλληλη για μια εφαρμογή η οποία απαιτεί επικοιωνίες σε 4
κατευθύνσεις για δεδομένα βασισμένα σε πλέγμα.
Αποδοτικότητα Επικοινωνίας
Μερικές αρχιτεκτονικές μπορούν να επιβάλουν ποινές για
επικοινωνίες μεταξύ πολύ μακρινών κόμβων.
Μια ιδιαίτερη υλοποίηση μπορεί να βελτιστοποιήσει την
χαρτογράφηση των διεργασιών βασισμένη στα φυσικά χαρακτηριστικά ενός
δοσμένου φυσικού μηχανήματος.
Η χαρτογράφηση των διεργασιών σε μια εικονική τοπολογία του
MPI εξαρτάται από την υλοποίηση του MPI, και μπορεί να αγνοηθεί
τελείως.
Παράδειγμα:
Μια απλοποιημένη διαδικασία χαρτογράφησης σε μια καρτεσιανή
εικονική τοπολογία φαίνεται παρακάτω:
Ρουτίνες Εικονικών Τοπολογιών
Δημιουργία μιας 4 x 4 καρτεσιανής τοπολογίας από 16 διεργασίες και
ανταλλαγή του rank κάθε διεργασίας με τους 4 γείτονες της.
C Language
- Cartesian Virtual Topology
Example
#include "mpi.h" #include <stdio.h> #define SIZE 16 #define UP 0 #define DOWN 1 #define LEFT 2 #define RIGHT 3
int main(argc,argv) int argc; char *argv[]; { int numtasks, rank, source, dest, outbuf, i, tag=1, inbuf[4]={MPI_PROC_NULL,MPI_PROC_NULL,MPI_PROC_NULL,MPI_PROC_NULL,}, nbrs[4], dims[2]={4,4}, periods[2]={0,0}, reorder=0, coords[2];
Σκόπιμα, το MPI δεν αναφέρεται σε αρκετά "δύσκολα¨ ζητήματα. Για
λόγους
ευκολίας, αυτά τα ζητήματα διαφοροποιήθηκαν σε μια δεύτερη έκδοση, την
MPI-2.
Τον Μάρτιο του 1995, ακολουθούμενη την έκδοση του αρχικού MPI, το
MPI Forum άρχισε την συζήτηση βελτιώσεων για το πρότυπο του MPI.
Συζητήθηκαν τα εξής:
Δεκέμβριος 1995: Συνέδριο Supercomputing '95 - Οι Birds of a
Feather συναντιώνται να συζητήσουν πιθανές επεκτάσεις του MPI.
Νοέμβριος 1996: Συνέδριο Supercomputing '96 - Ένα προσχέδιοο
του MPI-2 είναι διαθέσιμο. Υπήρξαν δημόσια σχόλια. Συνάντηση για την
συζήτηση επεκτάσεων του MPI-2.
Το προσχέδιο που παρουσιάστηκε στο συνέδριο Supercomputing
'96
έγινε λίγο μετά το πρότυπο MPI-2.
Δεν παρέχουν όλες οι βιβλιοθήκες μια πλήρη υλοποίηση του MPI-2.
Σημεία Κλειδιά των νέων
Λειτουργιών:
Δυναμικές Διεργασίες - πρόσθετα που αφαιρούν το μοντέλο
στατικών διεργασιών του MPI. Παρέχει ρουτίνες για την δημιουργία νέων
διεργασιών.
Μονόδρομες Επικοινωνίες - παρέχει ρουτίνες για μονόδρομες
επικοινωνίες. Περιλαμβάνει λειτουργίες κοινής μνήμης (put/get) και
απομακρυσμένες λειτουργίες συσσώρευσης.
Εκτεταμένες Συλλογικές λειτουργίες -επιστρέπει
μη-ανασταλτικές συλλογικές
λειτουργίες και την δημιουργία εφαρμογών με
συλλογικές λειτουργίες σε εσωτερικούς communicators
Εξωτερικές Διεπαφές - Ορίζει ρουτίνες που επιτρέπουν τους
προγραμματιστές να προγραμματίσουν ένα επίπεδο πάνω από το MPI, όπως
debuggers και profilers.
Πρόσθετες Συνδέσεις της Γλώσσας - περιγράφει τις συνδέσεις
της C++.
Παράλληλη I/O - περιγράφει την υποστήριξη παράλληλων
λειτουργιών I/O.
Αναφορές και
Περισσότερες Πληροφορίες
Το αρχικό κείμενο είναι του Blaise
Barney, lawrence Livermore
Laboratory, USA. Η μετάφραση, καθώς και ορισμένες προσαρμογές και
τροποποιήσεις οφείλονται στο Kώστα
Μαργαρίτη, Πανεπιστήμιο Μακεδονίας.