Βασικές λειτουργίες του MPI. Εισαγωγή στις Τεχνολογίες Παράλληλου Προγραμματισμού (MPI)

Πρόγραμμα Kerish Doctor. 07.07.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Αυτή η σημείωση δείχνει πώς να εγκαταστήσετε το MPI, να το συνδέσετε στο Visual Studio και, στη συνέχεια, να το χρησιμοποιήσετε με τις καθορισμένες παραμέτρους (αριθμός κόμβων υπολογισμού). Αυτό το άρθρο χρησιμοποιεί το Visual Studio 2015, επειδή... Αυτό είναι αυτό με το οποίο οι μαθητές μου είχαν προβλήματα (αυτή η σημείωση γράφτηκε από μαθητές για μαθητές), αλλά οι οδηγίες πιθανότατα θα λειτουργήσουν και για άλλες εκδόσεις.

Βήμα 1:
Πρέπει να εγκαταστήσετε το HPC Pack 2008 SDK SP2 (στην περίπτωσή σας μπορεί να υπάρχει ήδη διαφορετική έκδοση), που διατίθεται στον επίσημο ιστότοπο της Microsoft. Η χωρητικότητα bit του πακέτου και του συστήματος πρέπει να ταιριάζει.

Βήμα 2:
Πρέπει να διαμορφώσετε τις διαδρομές για να το κάνετε αυτό, μεταβείτε στην καρτέλα Εντοπισμός σφαλμάτων - Ιδιότητες:

"C:\Program Files\Microsoft HPC Pack 2008 SDK\Include"

Στο πεδίο Κατάλογοι Βιβλιοθήκης:

"C:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\amd64"

Στο πεδίο της βιβλιοθήκης, εάν υπάρχει έκδοση 32 bit, πρέπει να εισαγάγετε i386 αντί για amd64.

Msmpi.lib

:

Βήμα 3:

Για να διαμορφώσετε την εκκίνηση, πρέπει να μεταβείτε στην καρτέλα Εντοπισμός σφαλμάτων και στο πεδίο Εντολή να καθορίσετε:

"C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin\mpiexec.exe"

Στο πεδίο Command Arguments, καθορίστε, για παράδειγμα,

N 4 $(TargetPath)

Ο αριθμός 4 υποδεικνύει τον αριθμό των διεργασιών.

Για να εκτελέσετε το πρόγραμμα πρέπει να συνδέσετε τη βιβλιοθήκη

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

Για να το κάνετε αυτό, μετά την εγκατάσταση, απλώς εισαγάγετε τη διαδρομή στο πεδίο Command της καρτέλας Debugging:

"C:\Program Files\Microsoft MPI\Bin\mpiexec.exe"

Επίσης, πριν εκτελέσετε το πρόγραμμα, μην ξεχάσετε να υποδείξετε το βάθος bit του:

Παράδειγμα εκτέλεσης προγράμματος με MPI:

#συμπεριλαμβάνω #συμπεριλαμβάνω χρησιμοποιώντας namespace std? int main(int argc, char **argv) ( int rank, size; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); cout<< "The number of processes: " << size << " my number is " << rank << endl; MPI_Finalize(); return 0; }

Εκτέλεση του προγράμματος σε 2 κόμβους:

Παραλληλισμός στη γλώσσα C
Παράδειγμα 3β. Παραλληλισμός στο Fortran
Παράδειγμα 4α. Προσδιορισμός των χαρακτηριστικών του χρονοδιακόπτη συστήματος στη γλώσσα C
Παράδειγμα 4β. Καθορισμός χαρακτηριστικών χρονοδιακόπτη συστήματος στο Fortran

1.4. Αποστολή και λήψη μηνυμάτων μεταξύ ξεχωριστών διεργασιών

1.4.1. Λειτουργίες από σημείο σε σημείο

1.4.2. Αποστολή και λήψη μηνυμάτων με αποκλεισμό

Παράδειγμα 5α. Ανταλλαγή μηνυμάτων μεταξύ δύο διεργασιών σε γλώσσα C
Παράδειγμα 5β. Ανταλλαγή μηνυμάτων μεταξύ δύο διεργασιών στο Fortran
Παράδειγμα 6α. Ανταλλαγή μηνυμάτων μεταξύ ζυγών και περιττών διεργασιών στο C
Παράδειγμα 6β. Ανταλλαγή μηνυμάτων μεταξύ ζυγών και περιττών διεργασιών στο Fortran
Παράδειγμα 7α. Προώθηση σε ανύπαρκτη διαδικασία στο C
Παράδειγμα 7β. Προώθηση σε ανύπαρκτη διαδικασία στο Fortran
Παράδειγμα 8α. Αποστολή δεδομένων σε προσωρινή μνήμη σε γλώσσα C
Παράδειγμα 8β. Αποστολή δεδομένων σε προσωρινή μνήμη σε γλώσσα Fortran
Παράδειγμα 9α. Λήψη πληροφοριών σχετικά με τα χαρακτηριστικά μηνυμάτων στη γλώσσα C
Παράδειγμα 9β. Λήψη πληροφοριών σχετικά με τα χαρακτηριστικά μηνυμάτων στο Fortran
Παράδειγμα 10α. Ορισμός καθυστέρησης και απόδοσης στη γλώσσα C
Παράδειγμα 10β. Καθορισμός καθυστέρησης και απόδοσης στο Fortran

1.4.3. Αποστολή και λήψη μηνυμάτων χωρίς αποκλεισμό

Παράδειγμα 11α. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας λειτουργίες μη αποκλεισμού στο C
Παράδειγμα 11β. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας λειτουργίες μη αποκλεισμού στο Fortran
Παράδειγμα 12α. Σχέδιο επικοινωνίας "μάστερ - εργάτες" στη γλώσσα C
Παράδειγμα 12β. Διάγραμμα επικοινωνίας "μάστερ - εργάτες" στη γλώσσα Fortran
Παράδειγμα 13α. Μεταφορά μήτρας στη γλώσσα C
Παράδειγμα 13β. Μεταφορά μιας μήτρας στο Fortran

1.4.4. Εκκρεμή αιτήματα αλληλεπίδρασης

Παράδειγμα 14α. Σχήμα επαναληπτικής μεθόδου με ανταλλαγή κατά μήκος μιας τοπολογίας δακτυλίου χρησιμοποιώντας αναβαλλόμενα ερωτήματα στη γλώσσα C
Παράδειγμα 14β. Σχήμα επαναληπτικής μεθόδου με ανταλλαγή μέσω τοπολογίας δακτυλίου χρησιμοποιώντας αναβαλλόμενα ερωτήματα στο Fortran

1.4.5. Αδιέξοδες καταστάσεις

Παράδειγμα 15α. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας τη διαδικασία MPI_Sendrecv στη γλώσσα C
Παράδειγμα 15β. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας τη διαδικασία MPI_SENDRECV στο Fortran

1.5. Συλλογικές αλληλεπιδράσεις διεργασιών

1.5.1. Γενικές διατάξεις

1.5.2. Εμπόδιο

Παράδειγμα 16α. Μοντελοποίηση συγχρονισμού φραγμού σε γλώσσα C
Παράδειγμα 16β. Μοντελοποίηση συγχρονισμού φραγμού στο Fortran

1.5.3. Συλλογικές λειτουργίες μεταφοράς δεδομένων

1.5.4. Παγκόσμιες Λειτουργίες

Παράδειγμα 17α. Μοντελοποίηση της συνολικής άθροισης χρησιμοποιώντας ένα σχήμα διπλασιασμού και τη συλλογική πράξη MPI_Reduce στη γλώσσα C
Παράδειγμα 17β. Μοντελοποίηση της συνολικής άθροισης χρησιμοποιώντας ένα σχήμα διπλασιασμού και τη συλλογική λειτουργία MPI_Reduce στο Fortran

1.5.5. Προσαρμοσμένες παγκόσμιες λειτουργίες

Παράδειγμα 18α. Προσαρμοσμένη καθολική λειτουργία στη γλώσσα C
Παράδειγμα 18β. Προσαρμοσμένη καθολική λειτουργία στο Fortran

1.6. Ομάδες και φορείς επικοινωνίας

1.6.1. Γενικές διατάξεις

1.6.2. Λειτουργίες με ομάδες διεργασιών

Παράδειγμα 19α. Εργασία με ομάδες στη γλώσσα C
Παράδειγμα 19β. Εργασία με ομάδες στο Fortran

1.6.3. Λειτουργίες με συσκευές επικοινωνίας

Παράδειγμα 20α. Καταστροφή ενός επικοινωνιολόγου στο C
Παράδειγμα 20β. Διαμέριση ενός communicator στο Fortran
Παράδειγμα 21α. Διαδικασίες επαναρίθμησης στη γλώσσα C
Παράδειγμα 21β. Διαδικασίες επαναρίθμησης στο Fortran

1.6.4. Intercommunicators

Παράδειγμα 22α. Σχέδιο Master-worker με χρήση ενδοεπικοινωνίας στη γλώσσα C
Παράδειγμα 22β. Κύκλωμα Master-worker με χρήση ενδοεπικοινωνίας στο Fortran

1.6.5. Γνωρίσματα

1.7. Εικονικές τοπολογίες

1.7.1. Γενικές διατάξεις

1.7.2. Καρτεσιανή τοπολογία

1.7.3. Τοπολογία γραφήματος

Παράδειγμα 23α. Διάγραμμα Master-worker χρησιμοποιώντας τοπολογία γραφήματος στη γλώσσα C
Παράδειγμα 23β. Σχέδιο Master-worker χρησιμοποιώντας τοπολογία γραφήματος στο Fortran

1.8. Αποστολή διαφορετικών τύπων δεδομένων

1.8.1. Γενικές διατάξεις

1.8.2. Προερχόμενοι τύποι δεδομένων

Παράδειγμα 24α. Αναδιάταξη στηλών μήτρας με αντίστροφη σειρά στη γλώσσα C
Παράδειγμα 24β. Αναδιάταξη στηλών μήτρας με αντίστροφη σειρά στο Fortran

1.8.3. Συσκευασία δεδομένων

Παράδειγμα 25α. Αποστολή συσκευασμένων δεδομένων σε γλώσσα C
Παράδειγμα 25β. Αποστολή συσκευασμένων δεδομένων στο Fortran

1.9. αντικείμενο πληροφοριών

1.9.1. Γενικές διατάξεις

1.9.2. Εργασία με το αντικείμενο πληροφοριών

1.10. Δυναμικός έλεγχος διαδικασίας

1.10.1. Γενικές διατάξεις

1.10.2.Δημιουργία διαδικασιών

πλοίαρχος.γ
σκλάβος.γ
Παράδειγμα 26α. Σχέδιο Master-worker χρησιμοποιώντας διαδικασία αναπαραγωγής στη γλώσσα C
master.f
σκλάβος.φ
Παράδειγμα 26β. Σχέδιο Master-worker χρησιμοποιώντας διαδικασία αναπαραγωγής στο Fortran

1.10.3. Επικοινωνία πελάτη-διακομιστή

διακομιστής.γ
πελάτης.γ
Παράδειγμα 27α. Ανταλλαγή δεδομένων μεταξύ διακομιστή και πελάτη χρησιμοποιώντας ένα δημόσιο όνομα στη γλώσσα C
διακομιστής.f
πελάτης.στ
Παράδειγμα 27β. Ανταλλαγή δεδομένων μεταξύ διακομιστή και πελάτη χρησιμοποιώντας δημόσιο όνομα στη γλώσσα Fortran

1.10.4. Κατάργηση συσχέτισης διαδικασίας

1.10.5. Socket Communication

1.11. Μονόδρομες επικοινωνίες

1.11.1. Γενικές διατάξεις

1.11.2. Εργασία με παράθυρο

1.11.3. Μεταφορά δεδομένων

1.11.4. Συγχρονισμός

Παράδειγμα 28α
Παράδειγμα 28β
Παράδειγμα 29α. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας μονόδρομες επικοινωνίες στο C
Παράδειγμα 29β. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας μονόδρομες επικοινωνίες στο Fortran
Παράδειγμα 30α. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας μονόδρομες επικοινωνίες στο C
Παράδειγμα 30β. Ανταλλαγή μέσω μιας τοπολογίας δακτυλίου χρησιμοποιώντας μονόδρομες επικοινωνίες στο Fortran

1.12. Εξωτερικές διεπαφές

1.12.1. Γενικά ερωτήματα

1.12.2. Πληροφορίες από την κατάσταση

1.12.3. Νήματα

1.13. Παράλληλη I/O

1.13.1. Ορισμοί

1.13.2. Εργασία με αρχεία

1.13.3. Πρόσβαση δεδομένων

Παράδειγμα 31α. Ανάγνωση προσωρινής αποθήκευσης από αρχείο σε γλώσσα C
Παράδειγμα 31β. Ανάγνωση προσωρινής αποθήκευσης από ένα αρχείο στο Fortran
Παράδειγμα 32α. Συλλογική ανάγνωση από αρχείο σε γλώσσα C
Παράδειγμα 32β. Συλλογική ανάγνωση από αρχείο στο Fortran

1.14. Χειρισμός σφαλμάτων

1.14.1. Γενικές διατάξεις

1.14.2. Προγράμματα χειρισμού σφαλμάτων που σχετίζονται με συσκευές επικοινωνίας

1.14.3. Προγράμματα χειρισμού σφαλμάτων που σχετίζονται με το παράθυρο

1.14.4. Προγράμματα χειρισμού σφαλμάτων που σχετίζονται με αρχεία

1.14.5. Πρόσθετες διαδικασίες

1.14.6. Κωδικοί σφαλμάτων και κλάσεις

1.14.7. Χειριστές σφαλμάτων κλήσης

Παράδειγμα 33α. Διαχείριση σφαλμάτων στη γλώσσα C
Παράδειγμα 33β. Διαχείριση σφαλμάτων στο Fortran

Κεφάλαιο 2 Τεχνολογία Παράλληλου Προγραμματισμού OpenMP

2.1. Εισαγωγή

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

2.2.1. Σύνταξη προγράμματος

Παράδειγμα 34α. Σύνταξη υπό όρους στο C
Παράδειγμα 34β
Παράδειγμα 34γ. Συλλογή υπό όρους στο Fortran

2.2.2. Μοντέλο παράλληλου προγράμματος

2.2.3. Οδηγίες και διαδικασίες

2.2.4. Εκτέλεση Προγράμματος

2.2.5. Συγχρονισμός

Παράδειγμα 35α. Εργασία με χρονοδιακόπτες συστήματος στο C
Παράδειγμα 35β. Εργασία με χρονοδιακόπτες συστήματος στο Fortran

2.3. Παράλληλες και σειριακές περιοχές

2.3.1. παράλληλη οδηγία

Παράδειγμα 36α. Παράλληλη περιοχή στη γλώσσα C
Παράδειγμα 36β. Παράλληλη περιοχή στο Fortran
Παράδειγμα 37α. Η επιλογή μείωσης στη γλώσσα C
Παράδειγμα 37β. Η επιλογή μείωσης στο Fortran

2.3.2. Συντομογραφία

2.3.3. Μεταβλητές Περιβάλλοντος και Βοηθητικές Διαδικασίες

Παράδειγμα 38α. Διαδικασία omp_set_num_threads και option num_threads στη γλώσσα C
Παράδειγμα 38β. Διαδικασία omp_set_num_threads και option num_threads στη γλώσσα Fortran
Παράδειγμα 39α. Διαδικασίες omp_set_dynamic και omp_get_dynamic στη γλώσσα C
Παράδειγμα 39β. Διαδικασίες omp_set_dynamic και omp_get_dynamic στο Fortran
Παράδειγμα 40α. Ένθετες παράλληλες περιοχές στο C
Παράδειγμα 40β. Ένθετες παράλληλες περιοχές στο Fortran
Παράδειγμα 41α. Omp_in_parallel συνάρτηση σε γλώσσα C
Παράδειγμα 41β. Η συνάρτηση omp_in_parallel στη γλώσσα Fortran

2.3.4. ενιαία οδηγία

Παράδειγμα 42α. Ενιαία οδηγία και τώρα επιλογή στη γλώσσα C
Παράδειγμα 42β. Ενιαία οδηγία και τώρα επιλογή στο Fortran
Παράδειγμα 43α. Επιλογή Copyprivate σε γλώσσα C
Παράδειγμα 43β. copyprivate επιλογή στο Fortran

2.3.5. κύρια οδηγία

Παράδειγμα 44α. Master Directive στη γλώσσα C
Παράδειγμα 44β. Κύρια οδηγία στο Fortran

2.4. Μοντέλο δεδομένων

Παράδειγμα 45α. Ιδιωτική επιλογή σε γλώσσα C
Παράδειγμα 45β. Η ιδιωτική επιλογή στο Fortran
Παράδειγμα 46α. κοινή επιλογή στη γλώσσα C
Παράδειγμα 46β. Η κοινή επιλογή στο Fortran
Παράδειγμα 47α. πρώτη ιδιωτική επιλογή στη γλώσσα C
Παράδειγμα 47β. πρώτη ιδιωτική επιλογή στο Fortran
Παράδειγμα 48α. threadprivate οδηγία στη γλώσσα C
Παράδειγμα 48β. threadprivate οδηγία στο Fortran
Παράδειγμα 49α. Επιλογή αντιγραφής σε γλώσσα C
Παράδειγμα 49β. επιλογή αντιγραφής στο Fortran

2.5. Κατανομή εργασιών

2.5.1. Παραλληλισμός χαμηλού επιπέδου

Παράδειγμα 50α. Διαδικασίες omp_get_num_threads και omp_get_thread_num στη γλώσσα C
Παράδειγμα 50β. Διαδικασίες omp_get_num_threads και omp_get_thread_num στο Fortran

2.5.2. Παράλληλοι βρόχοι

Παράδειγμα 51α. για οδηγία στη γλώσσα C
Παράδειγμα 51β. Η οδηγία do στο Fortran
Παράδειγμα 52α. Επιλογή προγραμματισμού σε γλώσσα C
Παράδειγμα 52β. επιλογή χρονοδιαγράμματος στο Fortran
Παράδειγμα 53α. Επιλογή προγραμματισμού σε γλώσσα C

Βασικές λειτουργίες MPI

Η πιο κοινή τεχνολογία προγραμματισμού για παράλληλα συστήματα με κατανεμημένη μνήμη είναι αυτή τη στιγμή η MPI (Message Passing Interface). Ο κύριος τρόπος με τον οποίο οι παράλληλες διεργασίες αλληλεπιδρούν μεταξύ τους σε τέτοια συστήματα είναι το Message Passing. Ουσιαστικά, το MPI είναι μια βιβλιοθήκη και ένα περιβάλλον εκτέλεσης για παράλληλα προγράμματα σε C ή Fortran. Αυτό το σεμινάριο θα περιγράψει παραδείγματα προγραμμάτων στη γλώσσα C.

Αρχικά, το MPI επιτρέπει τη χρήση του μοντέλου προγραμματισμού MIMD (Multiple Instruction Multiple Data) - πολλές ροές εντολών και δεδομένων, π.χ. συνδυάζοντας διαφορετικά προγράμματα με διαφορετικά δεδομένα. Αλλά ο προγραμματισμός για ένα τέτοιο μοντέλο στην πράξη αποδεικνύεται πολύ περίπλοκος, επομένως χρησιμοποιείται συνήθως το μοντέλο SIMD (Single Program Multiple Data) - ένα πρόγραμμα και πολλές ροές δεδομένων. Εδώ, ένα παράλληλο πρόγραμμα είναι γραμμένο με τέτοιο τρόπο ώστε τα διάφορα μέρη του να μπορούν να εκτελούν ταυτόχρονα το μέρος της εργασίας τους, επιτυγχάνοντας έτσι παραλληλισμό. Δεδομένου ότι όλες οι συναρτήσεις MPI περιέχονται στη βιβλιοθήκη, κατά τη μεταγλώττιση ενός παράλληλου προγράμματος θα είναι απαραίτητο να συνδέσετε τις αντίστοιχες μονάδες.

Στο MPI, ένα παράλληλο πρόγραμμα ορίζεται ως ένα σύνολο διαδικασιών που εκτελούνται ταυτόχρονα. Οι διεργασίες μπορούν να εκτελεστούν σε διαφορετικούς επεξεργαστές, αλλά πολλές διεργασίες μπορούν επίσης να βρίσκονται στον ίδιο επεξεργαστή (στην περίπτωση αυτή, εκτελούνται σε λειτουργία χρονομερισμού). Όταν εκτελείται ένα πρόγραμμα MPI σε ένα σύμπλεγμα, κάθε κόμβος του θα εκτελέσει το δικό του αντίγραφο του προγράμματος, εκτελώντας το δικό του μέρος της εργασίας, έπεται ότι ένα παράλληλο πρόγραμμα είναι ένα σύνολο διαδικασιών αλληλεπίδρασης, καθεμία από τις οποίες λειτουργεί στη δική του χώρο διευθύνσεων. Στην ακραία περίπτωση, ένας μόνο επεξεργαστής μπορεί να χρησιμοποιηθεί για την εκτέλεση ενός παράλληλου προγράμματος - κατά κανόνα, αυτή η μέθοδος χρησιμοποιείται για τον αρχικό έλεγχο της ορθότητας του παράλληλου προγράμματος.

Ο αριθμός των διεργασιών και ο αριθμός των επεξεργαστών που χρησιμοποιούνται καθορίζονται τη στιγμή που εκκινείται το παράλληλο πρόγραμμα χρησιμοποιώντας το περιβάλλον εκτέλεσης του προγράμματος MPI και δεν μπορεί να αλλάξει κατά τη διάρκεια των υπολογισμών. Όλες οι διεργασίες του προγράμματος αριθμούνται διαδοχικά από 0 έως np-1, όπου np είναι ο συνολικός αριθμός διεργασιών. Ο αριθμός διεργασίας ονομάζεται κατάταξη διεργασίας.

Οι παράλληλες διεργασίες αλληλεπιδρούν μεταξύ τους στέλνοντας μηνύματα. Υπάρχουν δύο τύποι μεθόδων αποστολής (ονομάζονται επικοινωνίες) - συλλογικές και από σημείο σε σημείο. Με τις συλλογικές επικοινωνίες, μια διαδικασία στέλνει τις απαραίτητες πληροφορίες ταυτόχρονα σε μια ολόκληρη ομάδα διεργασιών, υπάρχει επίσης μια πιο γενική περίπτωση όταν, μέσα σε μια ομάδα διεργασιών, οι πληροφορίες μεταφέρονται από κάθε διαδικασία σε καθεμία. Οι απλούστερες επικοινωνίες είναι επικοινωνίες από σημείο σε σημείο, όπου μια διεργασία στέλνει πληροφορίες σε μια άλλη ή και οι δύο ανταλλάσσουν πληροφορίες. Οι λειτουργίες επικοινωνίας είναι οι κύριες λειτουργίες της βιβλιοθήκης MPI. Επιπλέον, οι απαιτούμενες συναρτήσεις είναι οι συναρτήσεις αρχικοποίησης και τερματισμού MPI – MPI_Init και MPI_Finalize. Το MPI_Init πρέπει να καλείται στην αρχή των προγραμμάτων και το MPI_Finalize στο τέλος. Όλες οι άλλες συναρτήσεις MPI πρέπει να καλούνται μεταξύ αυτών των δύο συναρτήσεων.

Πώς γνωρίζει μια διεργασία ποιο τμήμα του υπολογισμού πρέπει να εκτελέσει; Κάθε διεργασία που εκτελείται στο σύμπλεγμα έχει τον δικό της μοναδικό αριθμό - κατάταξη. Μόλις μια διεργασία γνωρίζει την κατάταξή της και τον συνολικό αριθμό των διαδικασιών, μπορεί να καθορίσει το μερίδιό της στην εργασία. Για το σκοπό αυτό, υπάρχουν ειδικές λειτουργίες στο MPI - MPI_Comm_rank και MPI_Comm_size. Το MPI_Comm_rank επιστρέφει μια ακέραια κατάταξη της διεργασίας που την κάλεσε και το MPI_Comm_size επιστρέφει τον συνολικό αριθμό των διεργασιών που εκτελούνται.

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

Όταν εκτελείτε λειτουργίες μετάδοσης μηνυμάτων σε λειτουργίες MPI, είναι απαραίτητο να καθορίσετε τον τύπο των δεδομένων που αποστέλλονται. Το MPI περιέχει ένα μεγάλο σύνολο βασικών τύπων δεδομένων με βάση τους τυπικούς τύπους δεδομένων της γλώσσας C. Επιπλέον, ο προγραμματιστής μπορεί να κατασκευάσει τους δικούς του τύπους δεδομένων χρησιμοποιώντας ειδικές συναρτήσεις MPI. Ακολουθεί ένας πίνακας αντιστοίχισης για βασικούς τύπους δεδομένων.

Σταθερές MPI Τύπος δεδομένων γλώσσας C
MPI_INT υπογεγραμμένο ενθ
MPI_UNSIGNED ανυπόγραφο ενθ
MPI_SHORT υπογεγραμμένο ενθ
MPI_LONG υπογεγραμμένο μακρύ ενθ
MPI_UNSIGNED_SHORT ανυπόγραφο ενθ
MPI_UNSIGNED_LONG ανυπόγραφο μακρύ ενθ
MPI_FLOAT φλοτέρ
MPI_DOUBLE διπλό
MPI_LONG_DOUBLE μακρύ διπλό
MPI_UNSIGNED_CHAR ανυπόγραφο χαρ
MPI_CHAR υπογεγραμμένο χαρ

Παράδειγμα εκκίνησης της βιβλιοθήκης MPI: login student, κωδικός πρόσβασης s304.

#συμπεριλαμβάνω

#συμπεριλαμβάνω

int main (int argc, char *argv)

/* Αρχικοποίηση MPI */

MPI_Init(&argc, &argv);

/* λήψη της κατάταξης της διαδικασίας */

MPI_Comm_rank (MPI_COMM_WORLD, &rank);

/* λάβετε τον συνολικό αριθμό διεργασιών */

MPI_Comm_size (MPI_COMM_WORLD, &size);

printf("Hello world from process %d of %d\n", rank, size);

/* πλήρες MPI */

Ένας μεταγλωττιστής και ένας σύνδεσμος χρησιμοποιούνται για τη μεταγλώττιση. Γραμμή εντολών mpicc. (δείτε mpicc….- βοήθεια)

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

$ mpicc γεια.c –o γεια.ο

$ mpicc γεια.ο –ο γεια

Το αρχείο hello θα είναι το παράδειγμα εκτελέσιμου αρχείου. Μπορείτε να το εκτελέσετε σε ένα μηχάνημα και να δείτε ότι ο αριθμός των επεξεργαστών θα είναι ίσος με 1 και η κατάταξη της διαδικασίας θα είναι 0:

$./γεια

Γεια σου κόσμο από τη διαδικασία 0 από 1

Όταν εργάζεστε σε διακομιστή, η εντολή χρησιμοποιείται για εκκίνηση mpirun . Έχει δύο κύρια ορίσματα - το όνομα του αρχείου που περιέχει τις διευθύνσεις των κόμβων και τον αριθμό των κόμβων στους οποίους θα εκτελεστεί το πρόγραμμα.

Το $ mpirun n0-6 –v φιλοξενεί γεια

Γεια σου κόσμο από τη διαδικασία 0 από 7

Γεια σου κόσμο από τη διαδικασία 3 από 7

Γεια σου κόσμο από τη διαδικασία 5 από 7

Γεια σου κόσμο από τη διαδικασία 4 από 7

Γεια σου κόσμο από τη διαδικασία 2 από 7

Γεια σου κόσμο από τη διαδικασία 6 από 7

Γεια σου κόσμο από τη διαδικασία 1 από 7

Το πρόγραμμα θα εκτελείται σε 7 κόμβους (συμπεριλαμβανομένου του διακομιστή) και οι διευθύνσεις αυτών των κόμβων βρίσκονται σε αρχείο hosts.Η εκτύπωση στην οθόνη πραγματοποιήθηκε με διαδικασίες εκτός σειράς των τάξεων τους. Αυτό συμβαίνει επειδή η εκτέλεση των διεργασιών δεν είναι συγχρονισμένη, αλλά το MPI έχει ειδικές λειτουργίες για το συγχρονισμό των διεργασιών.

Το απλούστερο πρόγραμμα δεν περιέχει λειτουργίες μεταφοράς μηνυμάτων. Σε πραγματικά προβλήματα, οι διαδικασίες πρέπει να αλληλεπιδρούν μεταξύ τους. Φυσικά, δαπανάται χρόνος για τη μετάδοση μηνυμάτων, γεγονός που μειώνει τον συντελεστή παραλληλισμού της εργασίας. Όσο μεγαλύτερη είναι η ταχύτητα της διεπαφής μεταφοράς μηνυμάτων (για παράδειγμα, 10 Mb/sec Ethernet και Gigabit Ethernet), τόσο χαμηλότερο θα είναι το κόστος μεταφοράς δεδομένων. Επειδή ο χρόνος για την ανταλλαγή δεδομένων μεταξύ των διεργασιών είναι πολύ (κατά τάξεις μεγέθους) μεγαλύτερος από τον χρόνο πρόσβασης στη μνήμη του, η κατανομή της εργασίας μεταξύ των διεργασιών θα πρέπει να είναι «χονδροειδής» και θα πρέπει να αποφεύγονται οι περιττές μεταφορές δεδομένων.

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

Υπολογισμός του αριθμού π με μέθοδο αριθμητικής ολοκλήρωσης

Είναι γνωστό ότι

Αντικαθιστώντας τον υπολογισμό του ολοκληρώματος με ένα πεπερασμένο άθροισμα, έχουμε , όπου n είναι ο αριθμός των τμημάτων άθροισης κατά την αριθμητική ολοκλήρωση. Το εμβαδόν κάθε τμήματος υπολογίζεται ως το γινόμενο του πλάτους της «λωρίδας» και της τιμής της συνάρτησης στο κέντρο της «λωρίδας», στη συνέχεια οι περιοχές αθροίζονται με την κύρια διαδικασία (ένα ομοιόμορφο πλέγμα είναι μεταχειρισμένος).

Προφανώς, ο παραλληλισμός αυτού του προβλήματος είναι εύκολο να γίνει εάν κάθε διεργασία υπολογίζει το μερικό άθροισμά της και στη συνέχεια περνά το αποτέλεσμα του υπολογισμού στην κύρια διαδικασία. Πώς μπορώ να αποφύγω τους επαναλαμβανόμενους υπολογισμούς εδώ; Η διαδικασία πρέπει να γνωρίζει την κατάταξή της, τον συνολικό αριθμό των διεργασιών και τον αριθμό των διαστημάτων στα οποία θα χωριστεί το τμήμα (όσο περισσότερα διαστήματα, τόσο μεγαλύτερη είναι η ακρίβεια). Στη συνέχεια, σε έναν κύκλο από το 1 έως τον αριθμό των διαστημάτων, η διαδικασία θα υπολογίσει την περιοχή της λωρίδας στο i-ο διάστημα και στη συνέχεια θα μετακινηθεί όχι στο επόμενο διάστημα i+1, αλλά στο διάστημα i+m , όπου m είναι ο αριθμός των διεργασιών. Όπως ήδη γνωρίζουμε, υπάρχουν συναρτήσεις για τη λήψη της κατάταξης και του συνολικού αριθμού διεργασιών MPI_Comm_rank Και MPI_Comm_size . Πριν ξεκινήσετε τους υπολογισμούς, η κύρια διαδικασία πρέπει να μεταδώσει τον αριθμό των διαστημάτων σε όλους τους άλλους και μετά τους υπολογισμούς, να συλλέξει τα ληφθέντα ποσά από αυτά και να τα συνοψίσει σε MPI. Είναι βολικό να χρησιμοποιήσετε τη λειτουργία συλλογικής αλληλεπίδρασης εδώ για να στείλετε μηνύματα MPI_Bcast , το οποίο στέλνει τα ίδια δεδομένα από μια διεργασία σε όλες τις άλλες. Για τη συλλογή μερικών ποσών υπάρχουν 2 επιλογές - μπορείτε να χρησιμοποιήσετε MPI_Gather , το οποίο συλλέγει δεδομένα από όλες τις διεργασίες και τα δίνει σε μία (λαμβάνεται ένας πίνακας m στοιχείων, όπου m είναι ο αριθμός των διεργασιών) ή MPI_Reduce . MPI_Reduce ενεργεί παρόμοια MPI_Gather – συλλέγει δεδομένα από όλες τις διεργασίες και τα δίνει σε μία, αλλά όχι με τη μορφή πίνακα, αλλά πρώτα εκτελεί μια συγκεκριμένη λειτουργία μεταξύ των στοιχείων του πίνακα, για παράδειγμα, άθροιση και μετά δίνει ένα στοιχείο. Για αυτήν την εργασία φαίνεται πιο βολικό στη χρήση MPI_Reduce . Το κείμενο του προγράμματος δίνεται παρακάτω

#include "mpi.h"

#συμπεριλαμβάνω

#συμπεριλαμβάνω

διπλό f (διπλό α)

επιστροφή (4,0 / (1,0 + a*a));

int main(int argc, char *argv)

int n, myid, numprocs, i;

διπλό PI25DT = 3,141592653589793238462643;

διπλό mypi, pi, h, sum, x;

διπλός χρόνος έναρξης, χρόνος λήξης.

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&nuprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

startwtime = MPI_Wtime();

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

h = 1,0 / (διπλό)n;

για (i = myid + 1; i<= n; i += numprocs)

x = h * ((διπλό)i - 0,5);

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

printf("pi είναι περίπου %.16f, το σφάλμα είναι %.16f\n",

pi, fabs(pi - PI25DT));

endwtime = MPI_Wtime();

printf("ώρα ρολογιού τοίχου = %f\n",

endwtime-startwtime);

Ας ρίξουμε μια πιο προσεκτική ματιά στις κλήσεις συναρτήσεων MPI_Bcast Και MPI_Reduce :

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD) – τα περιεχόμενα της μεταβλητής n και ενός στοιχείου του τύπου MPI_INT από μια διεργασία με κατάταξη 0 αποστέλλονται σε όλες τις άλλες διεργασίες (MPI_COMM_WORLD – όλες οι διεργασίες στον επικοινωτή) στην ίδια μεταβλητή n . Μετά από αυτήν την κλήση, κάθε διεργασία θα γνωρίζει τον συνολικό αριθμό των διαστημάτων. Στο τέλος των υπολογισμών, το MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD) αθροίζει (η παράμετρος MPI_SUM) τις τιμές από τις μεταβλητές mypi τύπου MPI_DOUBLE κάθε διεργασίας και γράφει το αποτέλεσμα στη διαδικασία μεταβλητή pi με κατάταξη 0. Για τη μέτρηση του χρόνου υπολογισμού, η κύρια διεργασία χρησιμοποιεί τη συνάρτηση MPI_Wtime.

διπλό MPI_Wtime();

MPI_Wtimeεπιστρέφει τον αριθμό των δευτερολέπτων σε μορφή κινητής υποδιαστολής, που αντιπροσωπεύει το χρόνο που έχει περάσει από την έναρξη του προγράμματος.

Υπολογισμός του αριθμού π με τη μέθοδο Monte Carlo

Για να υπολογίσετε την τιμή του π, μπορείτε να χρησιμοποιήσετε τη μέθοδο 'shooting'. Όταν εφαρμόζεται σε αυτήν την περίπτωση, η μέθοδος συνίσταται στη δημιουργία σημείων ομοιόμορφα κατανεμημένων σε μια δισδιάστατη περιοχή και στον προσδιορισμό .

Η τιμή του π που υπολογίζεται με αυτόν τον τρόπο είναι κατά προσέγγιση, η ακρίβεια του υπολογισμού της επιθυμητής τιμής αυξάνεται με τον αριθμό των «βολών» και την ποιότητα της γεννήτριας τυχαίων αριθμών. Παρόμοιες μέθοδοι χρησιμοποιούνται όταν είναι δύσκολο να γίνει ακριβής αριθμητική εκτίμηση.

Ο παράλληλος αλγόριθμος για τον υπολογισμό του αριθμού π χρησιμοποιώντας αυτή τη μέθοδο είναι από πολλές απόψεις παρόμοιος με τον προηγούμενο αλγόριθμο που εξετάσαμε. Για να δημιουργήσετε τυχαίους αριθμούς, πρέπει να χρησιμοποιήσετε τη συνάρτηση srand, η οποία ορίζει την κατάταξη της διεργασίας ως όρισμα (sequence seed), έτσι ώστε κάθε διεργασία να έχει τη δική της ακολουθία.

#συμπεριλαμβάνω

void srand(unsigned seed);

Η συνάρτηση srand() ορίζει τον αριθμό σποράς για την ακολουθία που δημιουργείται από τη συνάρτηση rand().

#συμπεριλαμβάνω

int rand(void);

Η συνάρτηση rand() δημιουργεί μια ακολουθία ψευδοτυχαίων αριθμών. Κάθε φορά που καλείται η συνάρτηση, επιστρέφεται ένας ακέραιος αριθμός μεταξύ μηδέν και τιμής RAND_MAX.

Για να συλλέξετε το αποτέλεσμα εδώ, είναι επίσης βολικό να χρησιμοποιήσετε το MPI_Reduce με μια πράξη άθροισης (MPI_SUM), στη συνέχεια να διαιρέσετε το άθροισμα που προκύπτει με τον αριθμό των επεξεργαστών, λαμβάνοντας τον αριθμητικό μέσο όρο.

int MPI_Reduce(void* sendbuf, void* recvbuf, int count,

MPI_Datatype τύπος δεδομένων, MPI_Op op, int root, MPI_Comm comm);

Παράμετροι:

διεύθυνση sendbuf του buffer αποστολής

διεύθυνση recvbuf του buffer λήψης

λειτουργία μείωσης λειτουργίας

επικοινωνίας επικοινωνίας

int MPI_Bcast(void *buffer, int count, MPI_Datatype type data, int root,

MPI_Comm comm);

Παράμετροι:

διεύθυνση buffer του buffer αποστολής/λήψης

μετρήστε τον αριθμό των στοιχείων στο buffer αποστολής (ακέραιος)

τύπος δεδομένων τύπος δεδομένων αποστολής στοιχείων buffer

αριθμός κύριας διεργασίας ρίζας (ακέραιος)

επικοινωνίας επικοινωνίας

Ασκηση: σύμφωνα με τον αριθμό επιλογής, μεταγλωττίστε και εκτελέστε ένα παράλληλο πρόγραμμα που υπολογίζει τον αριθμό π χρησιμοποιώντας έναν δεδομένο αλγόριθμο.

Εκτελέστε μια εργασία σε έναν κόμβο και από ένα σύμπλεγμα σε έναν καθορισμένο αριθμό κόμβων. Αξιολογήστε τον χρόνο υπολογισμού, την ακρίβεια και τον συντελεστή παραλληλοποίησης Amdahl λαμβάνοντας υπόψη την καθυστέρηση δικτύου θεωρητικά και με βάση τα αποτελέσματα της εργασίας.

Επιλογές εργασιών

Επιλογή Αρ. Αλγόριθμος Αριθμός επεξεργαστών Αριθμός επαναλήψεων σε κάθε επεξεργαστή
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο
Αριθμητική ολοκλήρωση
Μόντε Κάρλο

· Δήλωση του προβλήματος, επιλογή.

· Κείμενο παράλληλου προγράμματος σε γλώσσα C σύμφωνα με την εργασία.

· Αποτελέσματα εκτέλεσης του προγράμματος σε έναν κόμβο, χρόνος εκτέλεσης t i , αποτέλεσμα υπολογισμού, σφάλμα.

· Αποτελέσματα εκτέλεσης του προγράμματος στον διακομιστή, χρόνος εκτέλεσης, αποτελέσματα υπολογισμού, σφάλμα.

· Περιγράψτε τον παράλληλο αλγόριθμο, τις ροές πληροφοριών κατά την εκτέλεση του προγράμματος και τη φόρτωση της κρυφής μνήμης κόμβου. Υπολογίστε τον συντελεστή Amdahl - K j με βάση τα αποτελέσματα του προγράμματος.

· Λαμβάνοντας υπόψη τα αποτελέσματα της εργασίας μιας ομάδας μαθητών, να κατασκευάσετε ένα ιστόγραμμα της εξάρτησης των K j , t i από τον αριθμό των επεξεργαστών που συμμετέχουν στους υπολογισμούς.



Συνιστούμε να διαβάσετε

Κορυφή