ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΓΕΝΙΚΟΙ ΓΡΑΦΟΙ ΣΤΟ MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

Σχετικά έγγραφα
ΕΚΔΟΣΗ 1.1 ΑΠΡΙΛΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΤΟ ΠΡΩΤΟΚΟΛΛΟ ECHO ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΤΟ ΠΡΩΤΟΚΟΛΛΟ TARRY ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

ΕΚΔΟΣΗ 1.1 ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΑΛΓΟΡΙΘΜΟΣ POLLING ΚΥΜΑΤΙΚΟΣ ΑΛΓΟΡΙΘΜΟΣ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β.

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ ΣΤO MESSAGE PASSING INTERFACE - MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β.

ΕΚΔΟΣΗ 1.1 ΜΑΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΚΛΟΓΗ ΑΡΧΗΓΟΥ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 10/3/2017

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΡΟΛΟΓΙΑ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. MPI Απλές εντολές 03/13/2016. Οδηγίες αποστολής / παραλαβής μηνυμάτων, Υπολογισμός του π (

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Τοπολογίεσ. Κώςτασ Διαμαντάρασ Τμιμα Πλθροφορικισ ΤΕΙ Θεςςαλονίκθσ

Παράλληλα και Κατανεµηµένα Συστήµατα. Εισαγωγή

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Minimum Spanning Tree: Prim's Algorithm

Εισαγωγή. E-03: Λειτουργικά Συστήµατα ΙΙ 6. Εαρινό Εξάµηνο SUN RPC. Κλήση Αποµακρυσµένων ιαδικασιών (RPC) Σύνδεση: Port Mapper.

Κατανεμημένα Συστήματα. Javascript LCR example

Network Algorithms and Complexity Παραλληλοποίηση του αλγορίθμου του Prim. Αικατερίνη Κούκιου

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

Η γλώσσα προγραμματισμού C

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

Εισαγωγή στον Προγραμματισμό

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. Γρήγορος οδηγός αναφοράς 1/4/2017

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 6/3/2016

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Φροντιςτήριο. Linked-List

Message Passing Interface (MPI)

Προγραµµατισµός µε ανταλλαγή µηνυµάτων Ι. Εισαγωγή στο MPI. Εφαρµογές Ανεξάρτητου Παραλληλισµού.

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Message Passing Interface (MPI)

Προγραμματισμός I (Θ)

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Προγραμματισμός Ι (ΗΥ120)

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών. Οδηγίες εργαστηρίου. Συστήματα Παράλληλης Επεξεργασίας 9 ο Εξάμηνο

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

Εισαγωγή στον Προγραμματισμό

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

Αλγόριθμοι Ταξινόμησης Μέρος 1

Προγραμματισμός Ι (HY120)

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Παράλληλη Επεξεργασία

Μεθόδων Επίλυσης Προβλημάτων

Συστήµατα Παράλληλης Επεξεργασίας. Message Passing Interface (MPI)

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

HY150a Φροντιστήριο 3 24/11/2017

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Επισκόπηση. Κατανεµηµένα Συστήµατα Ι Μάθηµα Βασικής Επιλογής, Χειµερινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων. Simulation Commands

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

Διδάσκων: Παναγιώτης Ανδρέου

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Διάλεξη 9η: Πίνακες (arrays)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ & ΠΛΗΡΟΦΟΡΙΚΗΣ

Η βασική συνάρτηση προγράμματος main()

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

Εκφωνήσεις ασκήσεων εργαστηρίου 1

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

(C) 2010 Pearson Education, Inc. All rights reserved.

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

Αρχιτεκτονική κοινής μνήμης

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Ηβασικήσυνάρτηση προγράμματος main()

Non-blocking Επικοινωνίεσ και Buffering. Κώςτασ Διαμαντάρασ ΤΕΙ Θεςςαλονίκθσ 2011

Εισαγωγή στον Προγραμματισμό

VERSION 1.0 ΝΟΕΜΒΡΙΟΣ, 2016 ΤΕΧΝΟΛΟΓΙΕΣ ΥΠΟΛΟΓΙΣΤΙΚΟΥ ΝΕΦΟΥΣ ΔΗΜΙΟΥΡΓΩΝΤΑΣ ΤΟΠΟΛΟΓΙΕΣ ΔΙΚΤΥΩΝ ΣΤΟ CLOUDSIM ΕΠΙΜΕΛΕΙΑ: ΒΑΣΙΛΕΙΟΣ ΤΣΑΚΑΝΙΚΑΣ

Μεθόδων Επίλυσης Προβλημάτων

Υπολογισμός - Εντολές Επανάληψης

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Μεθόδων Επίλυσης Προβλημάτων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Transcript:

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΓΕΝΙΚΟΙ ΓΡΑΦΟΙ ΣΤΟ MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

CONTENTS ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ... 2 Γενικοί Γράφοι στο MPI... 2 Εισαγωγή... 2 Οι γενικοι γραφοι στο MPI... 2 Δημιουργία γράφου... 2 Βασικα στοιχεια της τοπολογιασ γραφων... 3 Βασικές Συναρτήσεις Δημιουργίας Τοπολογίας γράφου... 4 Διαδικασία δημιουργιας γραφου στο MPI... 5 Εργαστηριακή Άσκηση Γενικοί γράφοι στο MPI... 7 Βήμα 1: Δημιουργία τοπολογίας αστέρα... 7 Βήμα 2: Επικοινωνία κόμβων σε τοπολογία αστέρα... 8 Βήμα 3: Κατανοώντας ένα ολοκληρωμένο παράδειγμα... 9 Δραστηριότητες... 13 Βιβλιογραφία... 14 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 1

ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΓΕΝΙΚΟΙ ΓΡΑΦΟΙ ΣΤΟ MPI ΕΙΣΑΓΩΓΗ Στόχος της δεύτερης εργαστηριακής άσκησης είναι η παρουσίαση των απαραίτητων δομών και συναρτήσεων μέσω των οποίων μπορούμε να κατασκευάσουμε και να χρησιμοποιήσουμε γενικούς γράφους στο MPI. Τα συγκεκριμένα εργαλεία θα μας επιτρέψουν την υλοποίηση και προσομοίωση αλγορίθμων σε γενικούς γράφους, όπου κάθε κόμβος του γράφου θα αποτελεί ξεχωριστή απομακρυσμένη οντότητα. Το MPI στηρίζει δύο ειδών γράφους. Τους καρτεσιανούς γράφους και τους γενικούς γράφους. Στην συγκεκριμένη εργαστηριακή άσκηση θα δουλέψουμε με τους γενικούς γράφους, αφήνοντας στον αναγνώστη την χαρά να εξερευνήσει μόνος του τους καρτεσιανούς γράφους. ΟΙ ΓΕΝΙΚΟΙ ΓΡΑΦΟΙ ΣΤΟ MPI Οι γράφοι, ως πιο γενικές περιπτώσεις τοπολογιών, παρέχουν μεγαλύτερη ευελιξία στη δημιουργία τοπολογιών που μπορούν να διευκολύνουν και να επιταχύνουν την επίλυση ενός προβλήματος. Έτσι μπορούν να δημιουργηθούν τοπολογίες σε οποιαδήποτε διάταξη, συχνά όμως γίνεται χρήση συγκεκριμένων γράφων ανάλογα με τη φύση του προβλήματος που καλείται να λύσει ένας προγραμματιστής. Για το χειρισμό των γράφων το MPI παρέχει τις παρακάτω συναρτήσεις: ΔΗΜΙΟΥΡΓΙΑ ΓΡΑΦΟΥ MPI_Graph_create(old_conm, nnodes, index, edges, reorder, graph_conm) Η παράμετρος old_comm είναι το handle του communicator στον οποίο ανήκουν οι διεργασίες που θα συμπεριληφθούν στο γράφο και το nnodes ο αριθμός των κόμβων (διεργασιών) του. Το index είναι ένας πίνακας που περιέχει το βαθμό κάθε κόμβου (αθροιστικά το πλήθος των συνδέσεων κάθε κόμβου), ενώ το edges είναι ο πίνακας των ακμών του. Δίνεται κι εδώ η δυνατότητα αναδιάταξης των διεργασιών με στόχο τη βελτίωση της επικοινωνίας, θέτοντας το reorder σε 1 και τέλος το graph_comm (παράμετρος εξόδου) είναι το handle του νέου communicator. ΕΥΡΕΣΗ ΑΡΙΘΜΟΥ ΓΕΙΤΟΝΙΚΩΝ ΚΟΜΒΩΝ MPI_Graph_neighbors_count(conm, rank, nneighbors) με την παράμετρο comm να είναι ο γράφος, rank ο βαθμός του κόμβου (διεργασίας) προς εξέταση και έξοδο τον αριθμό των γειτονικών του κόμβων, nneighbors. ΕΥΡΕΣΗ ΓΕΙΤΟΝΙΚΩΝ ΚΟΜΒΩΝ MPI_Graph_neighbors(conm, rank, naxneighbors, neighbors) ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 2

όπου comm είναι το handle του γράφου, rank ο βαθμός του κόμβου προς εξέταση, maxneighbors το μέγεθος του πίνακα neighbors που είναι παράμετρος εξόδου και περιέχει τους γειτονικούς κόμβους της διεργασίας. ΕΥΡΕΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΓΡΑΦΟΥ MPI_Graphdims_get(conm, nnodes, nedges) με comm να αναπαριστά το γράφο και ως έξοδο τα nnodes και nedges, το πλήθος των κόμβων και ακμών του γράφου αντίστοιχα και MPI_Graph_get(conm, maxindex, maxedges, index, edges) Η παράμετρος comm είναι το handle του γράφου, maxindex και maxedges το μέγεθος των index και edges αντίστοιχα, οι οποίες είναι παράμετροι εξόδου που περιέχουν τις πληροφορίες του γράφου. ΈΛΕΓΧΟΣ ΤΥΠΟΥ ΤΟΠΟΛΟΓΙΑΣ MPI_Topo_test(conm, topo_type) όπου comm είναι το handle του communicator και η έξοδος topo_type το είδος της τοπολογίας που έχει συσχετιστεί με το συγκεκριμένο communicator. ΑΝΤΙΓΡΑΦΗ ΤΟΥ COMMUNICATOR MPI_Comm_dup(old_comm, new_comm) με την παράμετρο old_comm να είναι το handle του προς αντιγραφή communicator, ενώ το new_comm το handle του νέου ως έξοδος. Το MPI επιτρέπει τη χρήση οποιασδήποτε δομής για τη δημιουργία ενός γράφου, παρ' όλα αυτά η φύση κάποιων κλάσεων προβλημάτων απαιτεί τη χρήση συγκεκριμένων τύπων τοπολογιών. ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ ΤΗΣ ΤΟΠΟΛΟΓΙΑΣ ΓΡΑΦΩΝ Τα βασικά στοιχεία της τοπολογίας γράφων είναι (α) το κανάλι επικοινωνίας, (β) οι κόμβοι του γράφου, (γ) οι γείτονες κάθε κόμβου και (δ) ο τύπος της αντιστοίχισης. Θα πρέπει να σημειωθεί πως το MPI υποστηρίζει κατευθυνόμενους γράφους. 0 3 1 2 ΕΙΚΌΝΑ 1: ΠΑΡΆΔΕΙΓΜΑ ΓΡΆΦΟΥ ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 3

ΒΑΣΙΚΕΣ ΣΥΝΑΡΤΗΣΕΙΣ ΔΗΜΙΟΥΡΓΙΑΣ ΤΟΠΟΛΟΓΙΑΣ ΓΡΑΦΟΥ Συνάρτηση Χρήση Παράμετροι int MPI_Graph_create( MPI_Comm comm_old, int nnodes, int *index, int *edges, int reorder, MPI_Comm *comm_graph ); Δημιουργεί γράφο comm_old o [είσοδος] χειριστής communicator εισόδου χωρίς τοπολογία nnodes o [είσοδος] πλήθος των κόμβων στον γράφο index o [είσοδος] πίνακας ακεραίων που περιγράφει τους βαθμούς των κόμβων edges o [είσοδος] πίνακας ακεραίων που περιγράφει τις ακμές reorder o [είσοδος] ακέραιος που όταν είναι 1 επιτρέπεται η αναδιάταξη ενώ όταν είναι -0 δεν επιτρέπεται comm_graph o [έξοδος] χειριστής communicator για τον γράφο int MPI_Graph_neighbor s_count( MPI_Comm comm, int rank, int *nneighbors ); Επιστρέφει το πλήθος των γειτονικών κόμβων του κόμβου rank comm o [είσοδος] ο χειριστής του γράφου rank o [είσοδος] το rank του κόμβου που ζητούμε τους γείτονες nneighbors o [έξοδος] το πλήθος των γειτόνων int MPI_Graph_neighbor s( MPI_Comm comm, int rank, int maxneighbors, int *neighbors ); Επιστρέφει τους γειτονικούς κόμβους του κόμβου rank comm o [είσοδος] ο χειριστής του γράφου rank o [είσοδος] το rank του κόμβου που ζητούμε τους γείτονες maxneighbors o [είσοδος] το μέγιστο πλήθος πιθανών γειτόνων neighbors o [έξοδος] πίνακας με τα ranks of processes that are neighbors to specified process (array of integer) int MPI_Graph_get( MPI _Comm comm, int maxindex, int maxedges, int *index, int *edges ); Επιστέφει την τοπολογία γράφου που έχει συσχετιστεί με έναν comm o [είσοδος] ο χειριστής του communicator maxindex o [είσοδος] το μέγεθος του πίνακα (max) των βαθμών maxedges o [είσοδος] το μέγεθος του πίνακα (max) των ακμών index ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 4

communicat or o [έξοδος] πίνακας ακεραίων που περιέχει την δομή του γράφου edges o [έξοδος] πίνακας ακεραίων που περιέχει την δομή των ακμών int MPI_Topo_test( MPI _Comm comm, int *topo_type ); Επιστρέφει τον τύπο της τοπολογίας comm o [είσοδος] ο χειριστής του communicator top_type o [έξοδος] ο τύπος της τοπολογίας. Εάν δεν υπάρχει τοπολογία, επιστέφεται η τιμή MPI_UNDEFINED ΔΙΑΔΙΚΑΣΙΑ ΔΗΜΙΟΥΡΓΙΑΣ ΓΡΑΦΟΥ ΣΤΟ MPI Για να δημιουργήσουμε έναν γράφο στο MPI, ακολουθούμε τα παρακάτω βήματα: 1. Σχεδιάζουμε τον γράφο που επιθυμούμε να προσομοιώσουμε. 2. Αριθμούμε τους κόμβους τον γράφου με τους ακεραίους 0, 1, 2,, Ν-1, όπου Ν το world_size. 3. Καταστρώνουμε έναν πίνακα με 4 στήλες: (1) Κόμβος, (2) Πλήθος Γειτόνων, (3) Δείκτης και (4) Ακμές, όπως φαίνεται παρακάτω: Κόμβος Πλήθος Γειτόνων Δείκτης Ακμές 4. Γεμίζουμε τον πίνακα ως εξής. a. Στην στήλη «Κόμβος» τοποθετούμε τους ακεραίους 0, 1, 2,, Ν-1. Συνεπώς, κάθε γραμμή αντιστοιχεί σε έναν κόμβο του γράφου. b. Στην στήλη «Πλήθος Γειτόνων» τοποθετούμε το πλήθος των γειτόνων κάθε κόμβου. Σημειώνεται πως ο κόμβος λ είναι γείτονας του κόμβου κ, όταν υπάρχει ακμή από τον κ στον λ. c. Στην στήλη «Δείκτης» σημειώνουμε την ακριβώς από πάνω τιμή συν το πλήθος των γειτόνων του τρέχοντος κόμβου. d. Στην στήλη «Ακμές» σημειώνουμε τους αριθμούς των κόμβων που γειτονεύουν με τον τρέχοντα κόμβο. Για τον γράφο του σχήματος Χ, ο πίνακας συμπληρώνεται ως εξής: Κόμβος Πλήθος Γειτόνων Δείκτης Ακμές 0 1 1 1 1 2 3 0, 2 2 2 5 1, 3 3 1 6 2 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 5

Βεβαιωθείτε πως καταλαβαίνετε γιατί ο πίνακας συμπληρώνεται με αυτές τις τιμές. 5. Γράφουμε τον κώδικα που υλοποιεί τον παραπάνω πίνακα. Ο κώδικας αποτελείται από 4 δηλώσεις. Για τον παραπάνω πίνακα, αυτές οι δηλώσεις εμφανίζονται παρακάτω: int nnodes = 4; /* πλήθος κόμβων */ int index[4] = 1, 3, 5, 6; /* ορισμός δεικτών*/ int edges[6] = 1, 0, 2, 1, 3, 2; /* ορισμός ακμών */ int reorder = 1; /*μεταβλητή που δέχεται την τιμή 1 ή 0, ανάλογα με το εάν */ /*επιτρέπουμε ή όχι το MPI να αναδιατάξει εσωτερικά τους κόμβους */ /*για βελτιστοποίηση */ 6. Γράφουμε τον κώδικα που δημιουργεί τον γράφο: MPI_Comm graph_comm; MPI_Graph_create(MPI_COMM_WORLD, nnodes, index, edges, reorder, graph_comm); ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 6

ΕΡΓΑΣΤΗΡΙΑΚΗ ΆΣΚΗΣΗ ΓΕΝΙΚΟΙ ΓΡΑΦΟΙ ΣΤΟ MPI Σε αυτό το τμήμα της εργαστηριακής άσκησης θα δοκιμάσουμε να εκτελέσουμε κάποια προγράμματα σε MPI και να κατανοήσουμε πλήρως την λειτουργία τους. Κατά την διάρκεια εκτέλεσης του εργαστηριακού οδηγού θα πρέπει να συμπληρώνετε παράλληλα και την εργαστηριακή σας αναφορά, πρότυπο της οποίας μπορείτε να βρείτε στο openclass του μαθήματος. Η εργαστηριακή αναφορά θα πρέπει να έχει παραδοθεί την ημέρα πριν το επόμενο εργαστήριο, σύμφωνα με τις οδηγίες. Βήμα 1: Δημιουργία τοπολογίας αστέρα Στο πρώτο βήμα της εργαστηριακής άσκησης θα δημιουργήσουμε μία τοπολογία αστέρα, όπου ο κεντρικός κόμβος θα είναι ο 0 και θα συνδέεται κατευθυνόμενα με όλους τους υπόλοιπους κόμβους (π.χ. υπάρχει η ακμή 0 > 1, αλλά όχι η ακμή 1 ->0). Για αυτό το λόγο: 1. Συνδεθείτε σε ένα λειτουργικό Linux (Ubuntu ή LUbuntu). 2. Ανοίξτε ένα terminal 3. Δημιουργήστε έναν φάκελο MPI_ABCD, όπου ABCD το μητρώο σας. Για να το πετύχετε αυτό, εκτελέστε την εντολή mkdir MPI_ABCD. Στην συνέχεια μπείτε στον φάκελο εκτελώντας την εντολή cd MPI_ABCD. 4. Δημιουργήστε το αρχείο hello_mpi.c εκτελώντας την εντολή gedit hello_mpi.c 5. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include "mpi.h" #include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) int errs = 0, i, k, neighbournumber,j; int wsize; int rank; int *index, *edges, *outindex, *outedges,*neighbours; int nnodes, nedges; MPI_Comm comm1; MPI_Init( &argc, &argv ); //preparation of environment of MPI MPI_Comm_size( MPI_COMM_WORLD, &wsize ); // Get the number of Processors MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (wsize >= 3) // If Processor number is more than 3 we can make a graph. index = (int*)malloc(wsize * sizeof(int) ); edges = (int*)malloc((wsize-1) * sizeof(int) ); neighbours = (int*)malloc(wsize * sizeof(int) ); // allocate memory for arrays if (!index!edges) printf( "Unable to allocate %d words for index or edges\n", 3 * wsize ); //Error Control if we cannot allocate memory MPI_Abort( MPI_COMM_WORLD, 1 ); nnodes = wsize; index[0] =nnodes - 1; for (i = 1; i < nnodes; i++) index[i]=index[0]; for (i = 0; i < nnodes - 1; i++) edges[i] = i + 1; MPI_Graph_create( MPI_COMM_WORLD, nnodes, index, edges, 0, &comm1 ); printf( "\n-------------------------------------\n"); ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 7

//for( k=0;k < wsize;k++ ) // MPI_Graph_neighbors_count(comm1,rank,&neighbourNumber); MPI_Graph_neighbors(comm1,rank,neighbourNumber,neighbours); printf( "My node no is = %d and I have %d neighbours\n", rank,neighbournumber); printf( "My neıghbours are : "); for(i=0;i<neighbournumber;i++) printf("%d,",neighbours[i]); printf( "\n-------------------------------------\n"); // free( index ); //return the allocated memory to the system. free( edges ); // return the allocated memory to the system. MPI_Comm_free( &comm1 ); //Empty comm1 and give to system. MPI_Finalize(); //Finish MPI return 0; 6. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc star.c o star 7. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 10./star. Σε αυτή την εντολή, η παράμετρος np καθορίζει το πλήθος των διεργασιών που θα δημιουργηθούν στον «κόσμο» μας. 8. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. Βήμα 2: Επικοινωνία κόμβων σε τοπολογία αστέρα Σε αυτό το βήμα θα δημιουργήσουμε εκ νέου έναν αστέρα, όπως στο προηγούμενο βήμα, αλλά αυτή τη φορά οι κόμβοι θα επικοινωνήσουν μεταξύ τους. 1. Ανοίξτε ένα terminal 2. Μπείτε στον φάκελο εκτελώντας την εντολή cd MPI_ABCD. 3. Δημιουργήστε το αρχείο star_comm.c εκτελώντας την εντολή gedit star_comm.c 4. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include "mpi.h" #include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) int errs = 0, i, k, neighbournumber,j; int wsize, inmessage, outmessage = 0; int rank; int *index, *edges, *outindex, *outedges,*neighbours; int nnodes, nedges; MPI_Status status; MPI_Comm comm1; MPI_Init( &argc, &argv ); //preparation of environment of MPI MPI_Comm_size( MPI_COMM_WORLD, &wsize ); // Get the number of Processors MPI_Comm_rank( MPI_COMM_WORLD, &rank ); ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 8

if (wsize >= 3) // If Processor number is more than 3 we can make a graph. index = (int*)malloc(wsize * sizeof(int) ); edges = (int*)malloc((wsize-1) * sizeof(int) ); neighbours = (int*)malloc(wsize * sizeof(int) ); // allocate memory for arrays if (!index!edges) printf( "Unable to allocate %d words for index or edges\n", 3 * wsize ); //Error Control if we cannot allocate memory MPI_Abort( MPI_COMM_WORLD, 1 ); nnodes = wsize; index[0] =nnodes - 1; for (i = 1; i < nnodes; i++) index[i]=index[0]; for (i = 0; i < nnodes - 1; i++) edges[i] = i + 1; MPI_Graph_create( MPI_COMM_WORLD, nnodes, index, edges, 0, &comm1 ); if (rank == 0) MPI_Graph_neighbors_count(comm1,rank,&neighbourNumber); MPI_Graph_neighbors(comm1,rank,neighbourNumber,neighbours); for(i=0;i<neighbournumber;i++) printf("sending message to node %d\n",neighbours[i]); MPI_Send(&outMessage,1,MPI_INT,neighbours[i],0,MPI_COMM_WORLD); else MPI_Recv(&inMessage,1,MPI_INT,0,0,MPI_COMM_WORLD, &status); printf("node %d received message %d\n",rank, inmessage); free( index ); //return the allocated memory to the system. free( edges ); // return the allocated memory to the system. MPI_Comm_free( &comm1 ); //Empty comm1 and give to system. MPI_Finalize(); //Finish MPI return 0; 5. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc star_comm.c o star_comm 6. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 10./star_comm. Σε αυτή την εντολή, η παράμετρος np καθορίζει το πλήθος των διεργασιών που θα δημιουργηθούν στον «κόσμο» μας. 7. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. Βήμα 3: Κατανοώντας ένα ολοκληρωμένο παράδειγμα Σε αυτό το βήμα θα δημιουργήσουμε ένα πρόγραμμα σε MPI, στο οποίο θα δημιουργείται και θα ελέγχεται ένας γράφος. 1. Ανοίξτε ένα terminal 2. Μπείτε στον φάκελο MPI_ABCD. ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 9

3. Δημιουργήστε το αρχείο gen_graph.c εκτελώντας την εντολή gedit gen_graph.c 4. Αντιγράψτε το παρακάτω πρόγραμμα στο αρχείο σας #include "mpi.h" #include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) int errs = 0, i, k, neighbournumber,j; int wsize = 5; int topo_type; int *index, *edges, *outindex, *outedges,*neighbours; int nnodes, nedges; MPI_Comm comm1, comm2; MPI_Init( &argc, &argv ); //preparation of environment of MPI MPI_Comm_size( MPI_COMM_WORLD, &wsize ); // Get the number of Processors if (wsize >= 3) // If Processor number is more than 3 we can make a graph. index = (int*)malloc(wsize * sizeof(int) ); edges = (int*)malloc(wsize * 2 * sizeof(int) ); neighbours = (int*)malloc(wsize * 10 * sizeof(int) ); // allocate memory for arrays if (!index!edges) printf( "Unable to allocate %d words for index or edges\n", 3 * wsize ); //Error Control if we cannot allocate memory MPI_Abort( MPI_COMM_WORLD, 1 ); index[0] =2; // We are filling index values of the graph index[1]=5; index[2]=6; index[3]=8; index[4]=10; edges[0]=1; // We are filling edge values of the graph edges[1]=4; edges[2]=0; edges[3]=2; edges[4]=3; edges[5]=1; edges[6]=1; edges[7]=4; edges[8]=0; edges[9]=3; MPI_Graph_create( MPI_COMM_WORLD, wsize, index, edges, 0, &comm1 ); //We are creating our graph //MPI_COMM_WORLD is the communicators group we are going to use. //wsize is the number of processors //index and edges are the arrays that we are creating our graphs with. // 0 used if we don t want to order processes in the group. //comm1 is the communicator which represents the graph. MPI_Comm_dup( comm1, &comm2 ); // We duplicated our graph. MPI_Topo_test( comm2, &topo_type ); // Get the type of Toplogy we are using. printf( "The Topology Type of Graphs is %d", topo_type); if (topo_type!= MPI_GRAPH) // If Topology type is not graph stop process. errs++; ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 10

errs++; printf( "Topo type of duped graph was not graph\n" ); else // If Topology type is graph continue our program MPI_Graphdims_get( comm2, &nnodes, &nedges ); // With using Graphdims we are getting dimensions of index array and edge array. if (nnodes!= wsize) // And we are controlling if Node number obtained from graphdims same with the number //of processors errs++; printf( "Nnodes = %d, should be %d\n", nnodes, wsize ); if (nedges!= 2*wsize) errs++; printf( "Nedges = %d, should be %d\n", nedges, 2*wsize ); //We are going to obtain arrays that we created graph with. We will use Graphget functions. outindex = (int*)malloc(wsize * sizeof(int) ); //allocate memory for arrays outedges = (int*)malloc(wsize * 2 * sizeof(int) ); //allocate memory for arrays MPI_Graph_get( comm2, wsize, 2*wsize, outindex, outedges ); // Comm2 is the Communicator we will get arrays from. // wsize and 2* wsize are the lenghts of arrays. // outindex and outedges are the arrays to write graph information. for (i=0; i<wsize; i++) // We are controlling arrays we obtained with Graph_get if they are same with input //arrays. if (index[i]!= outindex[i]) printf( "%d = index[%d]!= outindex[%d] = %d\n", index[i], i, i, outindex[i] ); errs++; for (i=0; i<2*wsize; i++) if (edges[i]!= outedges[i]) printf( "%d = edges[%d]!= outedges[%d] = %d\n", edges[i], i, i, outedges[i] ); errs++; printf( "\n The node count of graph that obtained with MPI_Graphdims_get Function : " ); printf( "%d", nnodes ); printf( "\n Edge count of graph that obtained with MPI_Graphdims_get Function : " ); printf( "%d", nedges ); //printf( "\n-------------------------------------\n"); printf( "\narray of indexes that obtained with MPI_Graph_get Function : " ); // We are printing arrays obtained with Graph_Get function. for (i=0;i<wsize;i++) printf( "%d,", outindex[i] ); printf( "\narray of Edges that obtained with MPI_Graph_get Function :" ); for ( i=0;i<wsize;i++) ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 11

printf( "%d,", outedges[i] ); free( outindex );//returns the memory which was allocated for outindex to system. free( outedges ); //returns the memory which was allocated for outedges to system. printf( "\n-------------------------------------\n"); for(i=0;i<wsize;i++) // We are going to print each Nodes and their // neighbours with using arrays that we obtained. int temp; if(i==0) temp=0; else temp=index[i-1]; neighbournumber=index[i]-temp; //Get each node s neighbour // number. printf( "\nmy node no is = %d and I have %d neighbours", i,neighbournumber); printf( "\nmy neighbours are : "); for( j=temp; j<index[i];j++) printf("%d,",edges[j]); printf("\n"); printf( "\nwith Using MPI Commands"); printf( "\n-------------------------------------\n"); for( k=0;k<wsize;k++) MPI_Graph_neighbors_count(comm2,k,&neighbourNumber); // comm2 is the communicator we get graph s info. // k is the node number. // neighbournumber is number of neighbour of k ; MPI_Graph_neighbors(comm2,k,neighbourNumber,neighbours); // k is the node number. // neighbournumber is number of neighbour of k. // neighbour is the array neighbours of k will be write. printf( "My node no is = %d and I have %d neighbours\n", k,neighbournumber); printf( "My neıghbours are : "); for(i=0;i<neighbournumber;i++) printf("%d,",neighbours[i]); printf( "\n-------------------------------------\n"); free( index ); //return the allocated memory to the system. free( edges ); // return the allocated memory to the system. MPI_Comm_free( &comm2 ); // Empty comm2 and give to system. MPI_Comm_free( &comm1 ); //Empty comm1 and give to system. MPI_Finalize(); //Finish MPI return 0; ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 12

5. Προσπαθήστε να προβλέψετε την έξοδο του προγράμματος 6. Αφού αποθηκεύσετε και κλείσετε το αρχείο, μεταγλωττίστε το εκτελώντας την εντολή mpicc gen_graph.c o gen_graph 7. Εάν δεν έγινε κάποιο λάθος, ο μεταγλωττιστής δεν θα πρέπει να βγάλει κανένα μήνυμα. Τότε, μπορείτε να εκτελέσετε το πρόγραμμα, τρέχοντας την εντολή mpirun np 5./gen_graph 8. Αντιγράψτε την έξοδο του προγράμματος στην εργαστηριακή αναφορά σας. ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ Προσπαθήστε να λύσετε τις παρακάτω δραστηριότητες. Οι απαντήσεις κάθε δραστηριότητας θα πρέπει να εμφανίζονται στην εργαστηριακή σας αναφορά. 1. Δημιουργήστε τις κατάλληλες δηλώσεις έτσι ώστε να δημιουργείται στο MPI ο παρακάτω γράφος: 0 3 4 1 2 2. Μετατρέψτε το παράδειγμα του βήματος 3, έτσι ώστε ο κάθε κόμβος να στέλνει στους γείτονές του το id του, και αυτοί φυσικά να το λαμβάνουν και να το εκτυπώνουν. 3. Δημιουργήστε τις κατάλληλες δηλώσεις έτσι ώστε να δημιουργείται στο MPI ένα πλήρες δυαδικό δέντρο βάθους 4 (31 κόμβοι). 4. Σχεδιάστε τον γράφο του βήματος 3. 5. Μετατρέψτε τον κώδικα του βήματος 1, έτσι ώστε οι ακμές να είναι αμφίδρομες. Δηλαδή να μπορεί και ο κόμβος 0 (κεντρικός) να στείλει στον x-οστό, αλλά και ο x-οστός να μπορεί να στείλει στον 0. ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 13

ΒΙΒΛΙΟΓΡΑΦΙΑ Peter S. Pacheco, "PARALLEL PROGRAMMING WITH MPI", Morgan Kaufmann Publishers, 1997 William Gropp, Ewing Lusk, Anthony Skjellum, "USING M P I - PORTABLE PARALLEL PROGRAMMING WITH THE MESSAGE PASSING INTERFACE (SECOND EDITION)", MIT Press, 1999 (Blaise Barney) Message Passing Interface (MPI), https ://computing.llnl. gov/tutorial s/mpi/, Ιούνιος 2015 Contexts, http://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report- 1.1/node93.htm, Ιούνιος 2015 Kubra ADALI Emrah ERKAAN, MPI Topologies - Graph Topology, http://perso.enslyon.fr/mehdi.diouri/ressources/distributed_systems/td3/mpi_topologies_gr aph.pdf, Ιούνιος 2015 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ 14