View on GitHub

ceteiep_pdc

Parallel and Distributed Computing

MPI

Εγκατάσταση MPICH σε Ubuntu 18.04

$ sudo apt update
$ sudo apt install mpich

Παραδείγματα

Παράδειγμα 1

Δημιουργία ενός αριθμού διεργασιών και αποστολή ενός μηνύματος από κάθε διεργασία πλην της διεργασίας 0 στη διεργασία 0.

mpi_example01.c

Μεταγλώττιση

$ mpicc mpi_example01.c -o mpi_example01

Εκτέλεση

$ mpirun -n 5 ./mpi_example01
This is  process 0 waiting for messages
Process 1 of 5 says hello.
Process 2 of 5 says hello.
Process 3 of 5 says hello.
Process 4 of 5 says hello.

Παράδειγμα 2

Η διεργασία 0 ζητά από το χρήστη να εισάγει μια πραγματική και μια ακέραια τιμή και τις στέλνει στις υπόλοιπες διεργασίες που εμφανίζουν τα δεδομένα που λαμβάνουν.

mpi_example02.c

Παράδειγμα 3

Η διεργασία 0 ζητά από το χρήστη να εισάγει μια πραγματική και μια ακέραια τιμή και τις στέλνει με broadcast στις υπόλοιπες διεργασίες που εμφανίζουν τα δεδομένα που λαμβάνουν.

mpi_example03.c

Παράδειγμα 4

Κάθε διεργασία παράγει έναν τυχαίο αριθμό από το 1 μέχρι και το 100, τον στέλνει στην διεργασία 0 η οποία αθροίζει όλες τις τιμές που λαμβάνει.

mpi_example04.c

Παράδειγμα 5 (reduce)

Κάθε διεργασία παράγει έναν τυχαίο αριθμό από το 1 μέχρι και το 100, τον στέλνει στην διεργασία 0 η οποία αθροίζει με τη χρήση του MPI_Reduce όλες τις τιμές που λαμβάνει

mpi_example05.c

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

mpi_example05b.c

Παράδειγμα 6 (all reduce)

Για έναν αριθμό από διεργασίες κάθε διεργασία παράγει έναν τυχαίο αριθμό από το 1 μέχρι και το 100. Όλες οι τυχαίες τιμές που παράγονται αθροίζονται και το αποτέλεσμα θα πρέπει να είναι διαθέσιμο σε όλες τις διεργασίες.

mpi_example06.c

Παράδειγμα 7 (scatter, gather)

Η διεργασία 0 δημιουργεί έναν πίνακα με 10 τυχαίες τιμές. Αν εκτελεστεί με 5 διεργασίες στέλνει με την MPI_Scatter από 2 στοιχεία του πίνακα με block allocation σε κάθε διεργασία συμπεριλαμβανομένης και της ίδιας. Δηλαδή η διεργασία 0 λαμβάνει τα 2 πρώτα στοιχεία του πίνακα, η διεργασία 1 τα δύο επόμενα κ.ο.κ. Στη συνέχεια κάθε στοιχείο που έχει λάβει η κάθε διεργασία διπλασιάζεται και τα αποτελέσματα συγκεντρώνονται με την MPI_Gather.

mpi_example07.c

Παράδειγμα 8

Υπολογισμός του αριθμού π με βάση τον τύπο:

mpi_example08.c

Ασκήσεις

Άσκηση 1

Να γράψετε πρόγραμμα που να δημιουργεί 5 διεργασίες. Η κάθε διεργασία απλά να εμφανίζει έναν τυχαίο ακέραιο αριθμό στο διάστημα [1,100] και να τερματίζει. Γράψτε τις εντολές μεταγλώττισης και εκτέλεσης του προγράμματος.

mpi_exercise01.c

Άσκηση 2

Να γράψετε πρόγραμμα που να δέχεται ως παράμετρο γραμμής εντολών έναν ακέραιο αριθμό και να εμφανίζει το άθροισμα όλων των θετικών ακεραίων που είναι μικρότεροι ή ίσοι του αριθμού αυτού (οι σχετικές μεταβλητές να δηλωθούν ως τύπου long long). Για τον υπολογισμό του αθροίσματος να χρησιμοποιεί διεργασίες. Υπολογίστε το άθροισμα των πρώτων 10.000.000 ακέραιων αριθμών χρησιμοποιώντας 4 διεργασίες. Γράψτε τις εντολές μεταγλώττισης και εκτέλεσης του προγράμματος

mpi_exercise02.c

Άσκηση 3

Να γράψετε πρόγραμμα που να γεμίζει με τυχαίες ακέραιες τιμές στο διάστημα [1,10] δύο διανύσματα 1000 θέσεων το καθένα και να υπολογίζει το εσωτερικό τους γινόμενο http://mathinsight.org/dot_product_matrix_notation. Για τον υπολογισμό του εσωτερικού γινομένου η εργασία να «σπάσει» σε 4 διεργασίες.

Άσκηση 4

Σε έναν κύκλο με ακτίνα r η επιφάνεια του είναι πr^2 ενώ η επιφάνεια του περιγεγραμμένου στον κύκλο τετραγώνου είναι 4r^2. Εξετάζοντας το λόγο της επιφάνειας του κύκλου προς την επιφάνεια του τετραγώνου προκύπτει ότι θα πρέπει να ισούται με π/4. Αν πραγματοποιηθεί ένα πείραμα στο οποίο θα μετρούνται πόσα από ένα σύνολο τυχαίων σημείων πέφτουν εντός του κύκλου τότε ο λόγος του πλήθους των τυχαίων σημείων εντός του κύκλου προς το συνολικό πλήθος σημείων θα πρέπει και αυτός να ισούται με π/4. Να γράψετε πρόγραμμα που να υπολογίζει χρησιμοποιώντας τον τρόπο που αναφέρθηκε τον αριθμό π. Η εργασία να μοιράζεται σε έναν αριθμό διεργασιών. Εκτελέστε το πρόγραμμα για πλήθος 300.000.000 σημείων και για 8 διεργασίες.

mpi_exercise04.c


Παραδείγματα από το Κεφάλαιο 3 του βιβλίου “Εισαγωγή στον Παράλληλο Προγραμματισμό, Peter Pacheco”

Σειριακός κώδικας υπολογισμού ολοκληρώματος με τον κανόνα του τραπεζίου

trap.c

Παράλληλος κώδικας υπολογισμού ολοκληρώματος με τιμές μέσα στον κώδικα για τα ακραία σημεία και τον αριθμό των τραπεζίων.

mpi_trap1.c

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

mpi_trap2.c

Παράλληλος κώδικας υπολογισμού ολοκληρώματος με είσοδο τιμών από τον χρήστη για τα ακραία σημεία και τον αριθμό των τραπεζίων. Ανταλλαγή δεδομένων μεταξύ των διεργασιών με συλλογικές επικοινωνίες (collective communications).

mpi_trap3.c

Παράλληλος κώδικας υπολογισμού ολοκληρώματος με είσοδο τιμών από τον χρήστη για τα ακραία σημεία και τον αριθμό των τραπεζίων. Ανταλλαγή δεδομένων μεταξύ των διεργασιών με συλλογικές επικοινωνίες (collective communications) και παράγωγους τύπους δεδομένων (derived types).

mpi_trap4.c