Τοπολογίεσ Κώςτασ Διαμαντάρασ Τμιμα Πλθροφορικισ ΤΕΙ Θεςςαλονίκθσ
Τοπολογίεσ ςτο MPI Γιατί να ορίςω τοπολογία; Βολεφει ςε ςυγκεκριμζνουσ αλγορίκμουσ (πχ. Επεξεργαςία εικόνασ ι ςιματοσ) Ποιοί είναι οι γείτονζσ μου; Το MPI προςφζρει ρουτίνεσ για τον οριςμό τοπολογίασ Πχ. 2-Δ Πλζγμα : Καρτεςιανι τοπολογία 1-Δ : Δακτφλιοσ 2 Κ. Διαμαντάρας MPI
2-Δ Πλζγμα Παράδειγμα πλζγματοσ 4x5 (0,0) (0,1) (0,2) (0,3) (0,4) (1,0) (1,1) (1,2) (1,3) (1,4) (2,0) (2,1) (2,2) (2,3) (2,4) (3,0) (3,1) (3,2) (3,3) (3,4) 3 Κ. Διαμαντάρας MPI
n-δ (Καρτεςιανό) Πλζγμα Η ςυνάρτθςθ MPI_Cart_create κάνει n-διάςτατθ καρτεςιανι τακτοποίθςθ των διεργαςιών. Το πλικοσ των διαςτάςεων δίνεται από το όριςμα ndim. dims[0] = 4; dims[1] = 5; periods[0] = False; periods[1] = False; reorder ndim = 2; = True; err = MPI_Cart_create( MPI_COMM_WORLD, ndim, dims, periods, reorder, comm2d); 4 Κ. Διαμαντάρας MPI
MPI_Cart_create Δθμιουργεί ζνα νζο communicator ςτον οποίο ζχει προςτεκεί πλθροφορία τοπολογίασ #include "mpi.h" int MPI_Cart_create ( MPI_Comm comm_old, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm_cart ) Παράμετροι Εισόδου comm_old = handle του communicator ειςόδου ndims = πλικοσ διαςτάςεων ςτο καρτεςιανό πλζγμα (integer) dims = array ακεραίων μικουσ ndims που ορίηει το πλικοσ των διεργαςιών ςε κάκε διάςταςθ periods = λογικό array μικουσ ndims που ορίηει αν το πλζγμα είναι περιοδικό (true) ι όχι (false) ςε κάκε διάςταςθ reorder = το αγνοοφμε Παράμετροι Εξόδου comm_cart = handle του communicator με τθν καρτεςιανι τοπολογία 5 Κ. Διαμαντάρας MPI
Βρίςκοντασ τουσ γείτονεσ Η MPI_Cart_create δθμιουργεί ζνα νζο communicator με τισ ίδιεσ διεργαςίεσ όπωσ ο αρχικόσ communicator ειςόδου, αλλά με τθ ςυγκεκριμζνθ τοπολογία. Η ερώτθςθ «ποιοι είναι οι γείτονζσ μου?» απαντάται με τθν κλιςθ τθσ ςυνάρτθςθσ MPI_Cart_shift: err = MPI_Cart_shift( comm2d, 0, 1, nbrleft, nbrright); err = MPI_ Cart_shift( comm2d, 1, 1, nbrbottom, nbrtop); Οι τιμζσ που επιςτρζφονται είναι τα ranks, ςτον communicator comm2d, των γειτόνων μετατοπιςμζνων κατά +1/-1 ςτισ δφο διαςτάςεισ. 6 Κ. Διαμαντάρας MPI
MPI_Cart_shift Επιςτρζφει τα ranks πθγισ και προοριςμοφ, με δεδομζνθ τθν κατεφκυνςθ και το βιμα τθσ μετατόπιςθσ #include "mpi.h int MPI_Cart_shift ( MPI_Comm comm, int direction, int displ, int *rank_source, int *rank_dest ) Παράμετροι Εισόδου comm = handle ενός communicator με καρτεςιανι τοπολογία direction = διάςταςθ κατά τθν οποία γίνεται θ μετατόπιςθ (integer) disp = μετατόπιςθ (> 0: προσ τα επάνω, < 0: προσ τα κάτω) (integer) Παράμετροι Εξόδου rank_source = rank τθσ διεργαςίασ πθγισ (integer) rank_dest = rank τθσ διεργαςίασ προοριςμοφ (integer) 7 Κ. Διαμαντάρας MPI
Ποια διεργαςία είμαι εγώ? Το ερώτθμα απαντάται με κλιςθ ςτθν MPI_Cart_coords int coords[2]; err = MPI_Comm_rank( comm2d, &myrank); err = MPI_ Cart_coords( comm2d, myrank, 2, coords); Επιςτρζφει τισ Καρτεςιανζσ ςυντεταγμζνεσ τθσ καλοφςασ διεργαςίασ ςτθ μεταβλθτι coords. 8 Κ. Διαμαντάρας MPI
MPI_Cart_coords Βρίςκει τισ ςυντεταγμζνεσ coords μιασ διεργαςίασ ςε μια καρτεςιανι τοπολογία με δεδομζνο το rank #include "mpi.h int MPI_Cart_coords ( MPI_Comm comm, int rank, int maxdims, int *coords ) Παράμετροι Εισόδου comm = handle ενός communicator με καρτεςιανι τοπολογία rank = rank τθσ διεργαςίασ ςτον communicator comm (integer) maxdims = μικοσ του διανφςματοσ coords (integer) Παράμετροι Εξόδου coords = array ακεραίων μικουσ ndims που περιζχει τισ καρτεςιανζσ ςυντεταγμζνεσ τθσ ςυγκεκριμζνθσ διεργαςίασ (integer) 9 Κ. Διαμαντάρας MPI
Άλλεσ τοπολογίεσ Η ςυνάρτθςθ MPI_Graph_create επιτρζπει γενικά τθ δθμιουργία μιασ τοπολογίασ που περιγράφεται από οποιοδιποτε γράφο 10 Κ. Διαμαντάρας MPI
MPI_Graph_create Δθμιουργεί νζο communicator ςτον οποίο ζχει προςτεκεί πλθροφορία ςχετικι με κάποια τοπολογία #include "mpi.h int MPI_Graph_create ( MPI_Comm comm_old, int nnodes, int *index, int *edges, int reorder, MPI_Comm *comm_graph ) Παράμετροι Εισόδου comm_old = handle ενόσ communicator χωρίσ τοπολογία nnodes = πλικοσ κόμβων ςτο γράφο (integer) index = array ακεραίων που περιγράφει τουσ βακμοφσ των κόμβων edges = array ακεραίων που περιγράφει τισ ακμζσ του γράφου reorder = το αγνοοφμε Παράμετροι Εξόδου comm_graph = handle του communicator με τθν τοπολογία που περιγράφεται από το γράφο 11 Κ. Διαμαντάρας MPI
Γιατί υπάρχουν αυτζσ οι ςυναρτιςεισ? Σε πολλζσ παράλλθλεσ διαςυνδζςεισ υπολογιςτών, κάποιοι υπολογιςτζσ είναι πιο κοντά από κάποιουσ άλλουσ. Οι ςυναρτιςεισ αυτζσ προςφζρουν μια διευκζτθςθ των διεργαςιών ςε μια τοπολογία θ οποία κάνει τουσ «λογικοφσ» γείτονεσ να είναι κοντά ςτουσ φυςικοφσ «γείτονεσ». Κάποια ςυςτιματα ζχουν διάφορεσ ενςωματωμζνεσ τοπολογίεσ με πολλαπλά μονοπάτια που τροποποιοφν τουσ γείτονεσ ςε διαφορετικοφσ χρόνουσ. Οι ςυναρτιςεισ αυτζσ απαλλάςςουν τον προγραμματιςτι από τθν επίλυςθ κεμάτων τοπολογίασ. 12 Κ. Διαμαντάρας MPI
Το όριςμα periods Ορίηει τουσ γείτονεσ όταν είμαι ςτο τζλοσ του πλζγματοσ ; 13 Κ. Διαμαντάρας MPI
Περιοδικό πλζγμα Period = True dims[0] = 4; dims[1] = 3; periods[0] = True; periods[1] = True; reorder = True; ndim = 2; err = MPI_Cart_create( MPI_COMM_WORLD, ndim, dims, periods, reorder, comm2d); 14 Κ. Διαμαντάρας MPI
Μθ περιοδικό πλζγμα Period = False MPI_PROC_NULL 15 Κ. Διαμαντάρας MPI
Communicators από groups Οριςμόσ νζου communicator χρθςιμοποιώντασ ςυγκεκριμζνα μζλθ από ζναν άλλο communicator: MPI_Comm_create( oldcomm, group, &newcomm ); 16 Κ. Διαμαντάρας MPI
MPI_Comm_create Δθμιουργεί νζο communicator #include "mpi.h int MPI_Comm_create (MPI_Comm comm, MPI_Group group, MPI_Comm *comm_out ) Παράμετροι Εισόδου comm = handle ενόσ communicator group = γκρουπ διεργαςιών, υποςφνολο του comm Παράμετροι Εξόδου comm_out = handle του communicator που αποτελείται από τισ διεργαςίεσ του group 17 Κ. Διαμαντάρας MPI
Δθμιουργία group Όλεσ οι ςυναρτιςεισ δθμιουργίασ group χρθςιμοποιοφν ιδθ υπάρχοντα group. int MPI_Group_incl( MPI_Group group, int n, int *ranks, MPI_Group *group_out ) /* το group περιλαμβάνει τα ςυγκεκριμζνα ranks */ int MPI_Group_excl /* το group αποκλείει τα ςυγκεκριμζνα ranks */ int MPI_Group_range_incl( MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup ) /* ranges = τριάδεσ (first rank, last rank, stride), n = πλικοσ τριάδων */ int MPI_Group_range_excl /* αποκλείονται τα ranges */ int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *group_out ) /* ζνωςθ δφο group */ int MPI_Group_intersection /* τομι δφο group */ Για να πάρω ζνα ιδθ υπάρχον group: MPI_Comm_group( oldcomm, &group ); Για να ελευκερώςω ζνα group: MPI_Group_free( &group ); 18 Κ. Διαμαντάρας MPI