Προγραµµατισµός µε ανταλλαγή µηνυµάτων Ι. Εισαγωγή στο MPI. Εφαρµογές Ανεξάρτητου Παραλληλισµού. Λογισµικό & Προγραµµατισµός Συστηµάτων Υψηλής Επίδοσης Οµάδα Παράλληλων & Κατανεµηµένων Συστηµάτων http://pdsgroup.hpclab.ceid.upatras.gr/ Εργαστήριο Πληροφοριακών Συστηµάτων Υψηλών Επιδόσεων Τµήµα Μηχανικών Η/Υ και Πληροφορικής 07 Οκτωβρίου 2010
Ανταλλαγή Μηνυµάτων Για ποιες πλατφόρµες προορίζεται Υλικό: Σηµαντικά κλιµακώσιµες µηχανές κατανεµηµένης µνήµης (Clusters). ίκτυα υπολογιστικών συστηµάτων (NOWs). Υπολογιστικά Πλέγµατα (Computational Grids). Λογισµικό: Βασική Οντότητα: ιεργασία. Χαρακτηριστικό: Ο διαχωρισµένος συνολικός χώρος διευθύνσεων (distinct address spaces)
Μοντέλα Παράλληλης Εκτέλεσης MPMD Μοντέλο πολλαπλών διεργασιών που επενεργούν σε πολλαπλά δεδοµένα Multiple Processes Multiple Data - MPMD Πηγαίος Κώδικας Α Πηγαίος Κώδικας B Μετάφραση στην αντίστοιχη αρχιτεκτονική Εκτελέσιμος Κώδικας Α για Αρχιτεκτονική Χ Εκτελέσιμος Κώδικας Β για Αρχιτεκτονική Υ Συνεργατική Εκτέλεση Core 0 Core p-1
Μοντέλα Παράλληλης Εκτέλεσης SPMD Μοντέλο µοναδικής διεργασίας που επενεργεί σε πολλαπλά δεδοµένα Single Process Multiple Data - SPMD Πηγαίος Κώδικας Α Μετάφραση στην αντίστοιχη αρχιτεκτονική Εκτελέσιμος Κώδικας Α για Αρχιτεκτονική Χ Εκτελέσιμος Κώδικας A για Αρχιτεκτονική Υ Συνεργατική Εκτέλεση Core 0 Core p-1
Τί είναι; Message Passing Interface - MPI Προσπάθεια προτυποποίησης του παράλληλου προγραµµατισµού µε ανταλλαγή µηνυµάτων. Πρότυπο που περιγράφει ένα σύνολο προδιαγραφών http://www.mpi-forum.org/. Ευρεία γκάµα υλοποιήσεων: Ελεύθερες: Open MPI, MPICH2 Εµπορικές: Intel MPI, HP MPI, MPI/Pro. Βιβλιοθήκη χρόνου εκτέλεσης (όχι γλώσσα προγραµµατισµού).
Βασική διεπαφή Message Passing Interface - MPI Περιγραφή Μια µατιά στις ϐασικές λειτουργίες: Πλήθος στοιχείων Προορισµός Communicator MPI_Send (buf, count, datatype, dest, tag, comm) ιεύθυνση του send buffer Τύπος στοιχείων Ετικέτα Πλήθος στοιχείων Προέλευση Communicator MPI_Recv (buf, count, datatype, src, tag, comm, status) ιεύθυνση του send buffer Τύπος στοιχείων Ετικέτα Κατάσταση µετά τη λήψη
Ranks Message Passing Interface - MPI Περιγραφή Οι διεργασίες οργανώνονται σε οµάδες (groups) Σε κάθε µία ανατίθεται ένα αναγνωριστικό rank. Η ανάγκη για αναγνωριστικά: Αντιστοίχιση των διεργασιών που επικοινωνούν. ιαχωρισµός λειτουργιών στο προγραµµατιστικό µοντέλο (SPMD): i f ( rank % 2 == 0) MPI_Send ( buf, len, MPI_INT, rank +1, tag, comm) ; i f ( rank % 2! = 0) MPI_Recv ( buf, len, MPI_INT, rank 1, tag, comm, s t a t u s ) ;
Message Passing Interface - MPI Tags και Communicators Περιγραφή Ετικέτες µηνυµάτων (tags): Αντιστοίχιση σε επίπεδο µηνυµάτων. υνατότητα χρήσης wildcard ετικέτας (MPI_ANY_TAG) Communicators: Ο ορισµός τους καθορίζει νέες οµάδες διεργασιών που επικοινωνούν µεταξύ τους. Επιτρέπουν τον ορισµό εικονικών τοπολογιών. Χρησιµοποιούνται σαν όρισµα στις περισσότερες συναρτήσεις. Υπάρχει ένας προκαθορισµένος για όλες τις διεργασίες (MPI_COMM_WORLD)
Τύποι εδοµένων Message Passing Interface - MPI Περιγραφή Προκαθορισµένοι τύποι δεδοµένων: MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED_LONG MPI_UNSIGNED MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED char short int int long int unsigned char unsigned short int unsigned long_int unsigned int float double long double
Message Passing Interface - MPI Το πρώτο πρόγραµµα (έκδοση 1) Περιγραφή # include < s t d i o. h> # include < s t d l i b. h> # include <mpi. h> i n t main ( i n t argc, char argv ) { i n t rank, s i z e ; M P I _ I n i t (&argc, &argv ) ; MPI_Comm_size (MPI_COMM_WORLD, & s i z e ) ; MPI_Comm_rank (MPI_COMM_WORLD, &rank ) ; p r i n t f ( " H e l l o World from process %d ( t o t a l %d)\ n ", rank, s i z e ) ; M P I _ F i n a l i z e ( ) ; r e t u r n 0 ;
Message Passing Interface - MPI Το πρώτο πρόγραµµα (έκδοση 2) i n t main ( i n t argc, char argv ) { i n t i, rank, s i z e ; char msg [ 2 5 6 ] ; M P I _ S t a t u s s t a t u s ; M P I _ I n i t (&argc, &argv ) ; MPI_Comm_size (MPI_COMM_WORLD, & s i z e ) ; MPI_Comm_rank (MPI_COMM_WORLD, &rank ) ; Περιγραφή i f ( rank == 0 ) { s t r n c p y ( msg, " H e l l o World\n ", 2 0 ) ; f o r ( i = 0 ; i < s i z e ; i ++) MPI_Send ( msg, 13, MPI_CHAR, i, MPI_ANY_TYPE, MPI_COMM_WORLD ) ; e l s e MPI_Recv ( msg, 256, MPI_CHAR, 0, MPI_ANY_TYPE, MPI_COMM_WORLD, &s t a t u s ) ; p r i n t f ( " [%d ] %s \n ", rank, msg ) ; M P I _ F i n a l i z e ( ) ; r e t u r n 0 ;
Message Passing Interface - MPI Καθορισµός συστηµάτων Προετοιµασία & Εκτέλεση Καθορισµός συστηµάτων. user@control node> v i machines. t x t node10 node11 node12 node13 Μέριµνα για την κατάλληλη τοποθέτηση των εκτελέσιµων αρχείων και των αρχείων εισόδου (είτε χειροκίνητα είτε µέσω NFS). Προετοιµασία για την ασφαλή πιστοιποίηση: Πιστοποίηση µε χρήση δηµόσιου κλειδιού (Αναζητήστε HOWTOs για OpenSSH Public-key Authentication). ηµιουργία κλειδιών την πρώτη ϕορά. Εκκίνηση και πιστοποίηση µέσω ssh-agent πριν από κάθε πείραµα. Χρήση προγράµµατος screen ( > man screen ) για πιο ευέλικτη διαχείριση τερµατικών από απόσταση.
Εκτέλεση Message Passing Interface - MPI Προετοιµασία & Εκτέλεση Μετάφραση µε mpicc user@control node> mpicc o h e l l o h e l l o. c Εκκίνηση εκτέλεσης µε mpirun user@control node> mpirun np 4 m a c h i n e f i l e nodes. t x t h e l l o [ 0 ] H e l l o World [ 2 ] H e l l o World [ 3 ] H e l l o World [ 1 ] H e l l o World
Εφαρµογές Εφαρµογές Ανεξαρτητου Παραλληλισµού Γνωστές ευρέως ως Tasks of Independent Parallelism ή Embarrasingly Parallel Applications. Ο υπολογισµός που επιτελούν διαµοιράζεται σε ένα πλήθος ανεξάρτητων µερών. Γι αυτό το λόγο προσφέρονται για παράλληλη εκτέλεση. Χαρακτηριστικές Κατηγορίες: Γεωµετρικοί µετασχηµατισµοί σε εικόνες (Μετατόπιση, Κλιµάκωση, Περιστροφή, Περικοπή). Υπολογισµός σε σύνολα Mandelbrot (Fractals). Μέθοδοι Monte Carlo. Επίλυση µέσω στατιστικής δειγµατοληψίας (statistical sampling).
Υπολογισµός του π Εφαρµογές Monte Carlo I Ο λόγος r των εµβαδών ενός κύκλου ακτίνας 1 και του τετραγώνου πλευράς 2 που τον περιέχει είναι r = π/4 Η ιδέα του υπολογισµού του π ως π = 4r µέσω προσέγγισης Monte Carlo στηρίζεται στην παραγωγή τυχαίων σηµείων (x, y) τα οποία ϐρίσκονται µέσα στο τετράγωνο. Το π υπολογίζεται από το ποσοστό r όσων εξ αυτών ϐρίσκονται ταυτόχρονα και µέσα στον κύκλο (x 2 + y 2 < 1) [1][3][4].
Υπολογισµός του π [1] # include < stdio. h> # include < s t d l i b. h> # include <math. h> # include <mpi. h> # define CHUNKSIZE 1000 # define EPSILON 0.000001 # define REQUEST 1 / message tags / # define REPLY 2 Εφαρµογές Monte Carlo I i n t main ( i n t argc, char argv ) { i n t i t e r, in, out, i, r a n k s [ 1 ], done ; double x, y, Pi, e r r o r ; i n t numprocs, myid, server, totalin, totalout, workerid ; i n t rands [ CHUNKSIZE ], request ; MPI_Comm world, workers ; MPI_Group world_group, worker_group ; MPI_Status status ; M P I _ I n i t (&argc,& argv ) ; world = MPI_COMM_WORLD ; MPI_Comm_size ( world,&numprocs ) ; MPI_Comm_rank ( world,&myid ) ; s e r v e r = numprocs 1; / l a s t proc i s server / MPI_Comm_group ( world, &world_group ) ; ranks [ 0 ] = s e r v e r ; MPI_Group_excl ( world_group, 1, ranks, &worker_group ) ; MPI_Comm_create ( world, worker_group, &workers ) ; MPI_Group_free (&worker_group ) ;
Υπολογισµός του π Εφαρµογές Monte Carlo I i f ( myid == server ) { / I am the rand s e r v e r / do { MPI_Recv(& request, 1, MPI_INT, MPI_ANY_SOURCE, REQUEST, world, &status ) ; i f ( request ) { for ( i = 0 ; i < CHUNKSIZE ; ) { rands [ i ] = random ( ) ; i f ( rands [ i ] <= RAND_MAX) i ++; MPI_Send ( rands, CHUNKSIZE, MPI_INT, status. MPI_SOURCE, REPLY, world ) ; w h i le ( request >0 ) ; e l s e { / I am a worker process / request = 1 ; done = i n = out = 0 ; MPI_Send ( &request, 1, MPI_INT, server, REQUEST, world ) ; MPI_Comm_rank ( workers, &workerid ) ; i t e r = 0 ; w h i l e (! done ) { i t e r ++; request = 1 ; MPI_Recv ( rands, CHUNKSIZE, MPI_INT, server, REPLY, world, &status ) ; f o r ( i = 0 ; i <CHUNKSIZE 1; ) { x = ( ( double ) rands [ i ++])/RAND_MAX ; y = ( ( double ) rands [ i ++])/RAND_MAX ; i f ( x x + y y < 1. 0 ) i n ++; e l s e out ++;
Υπολογισµός του π Εφαρµογές Monte Carlo I MPI_Allreduce (& in, &totalin, 1, MPI_INT, MPI_SUM, workers ) ; MPI_Allreduce (&out, &totalout, 1, MPI_INT, MPI_SUM, workers ) ; P i = (4.0 t o t a l i n ) / ( t o t a l i n + t o t a l o u t ) ; e r r o r = fabs ( Pi 3.141592653589793238462643); done = e r r o r < EPSILON ; request = ( done )? 0 : 1 ; i f ( myid == 0) { p r i n t f ( " \ r p i = %23.20 f ", P i ) ; MPI_Send ( &request, 1, MPI_INT, server, REQUEST, world ) ; e l s e { i f ( request ) MPI_Send(& request, 1, MPI_INT, server, REQUEST, world ) ; MPI_Comm_free(& workers ) ; i f ( myid == 0) { p r i n t f ( " \ n p o i n t s : %d\ n i n : %d, out : %d\n ", t o t a l i n + t o t a l o u t, t o t a l i n, t o t a l o u t ) ; M P I _ F i n a l i z e ( ) ; r e t u r n 0 ;
Εφαρµογές Monte Carlo II Υπολογισµός ϑερµοκρασίας σηµείου Ζητούµενο: Ο υπολογισµός της ϑερµοκρασίας ενός σηµείου σε ϑερµαινόµενη µεταλλική πλάκα (2 διαστάσεις). Η ϑερµοκρασία ενός εσωτερικού σηµείου υπολογίζεται ως ο µέσος όρος της ϑερµοκρασίας των σηµείων που το περιβάλλουν (Εξίσωση Laplace: 2 T = 0). Μια επίλυση του προβλήµατος µε µέθοδο Monte Carlo έχεις ως εξής [4]: Υπολογίζουµε τη ϑερµοκρασία του σηµείου S επιλέγοντας τυχαία ένα από τα 4 γειτονικά του σηµεία. Η ϑερµοκρασία του γείτονα προστίθεται σε ένα συνολικό άθροισµα. Αφού γίνει δειγµατοληψία n δειγµάτων, το άθροισµα διαιρείται µε το πλήθος των δειγµάτων. Ο µέσος όρος που προκύπτει έχει αναµενόµενη τιµή (T n + T s + T e + T w)/4) η οποία αντιστοιχεί στη ϑερµοκρασία του σηµείου. Επειδή γνωστές είναι µόνο η ϑερµοκρασίας που εφαρµόζονται στα άκρα της πλάκας η παραπάνω διαδικασία εκτελείτε αναδροµικά. Η αναδροµική δειγµατοληψία αντιστοιχεί σε ένα τυχαίο περίπατο µεταξύ των σηµείων της πλάκας. Κάθε τέτοιος τυχαίος περίπατος τερµατίζει µετά από πεπερασµένο αριθµό ϐηµάτων γιατί η ϑερµοκρασία στα άκρα είναι γνωστή.
Εφαρµογές Monte Carlo II Υπολογισµός ϑερµοκρασίας σηµείου # include < stdio. h> # include < s t d l i b. h> # include <mpi. h> # include <time. h> # include <math. h> # define MAXITER 1000 # define EPSILON 0.0001 void i n i t P l a t e ( f l o a t plate, i n t WIDTH, i n t HEIGHT ) { i n t i, j, count ; unsigned seed ; F I L E randfd = fopen ( " / dev / urandom ", " r " ) ; f o r ( i = 1 ; i < WIDTH 1; i ++) f o r ( j = 1 ; j < HEIGHT 1; j ++) plate [ i ] [ j ] = 1.0; for ( i = 0 ; i < WIDTH ; i ++){ plate [ i ] [ 0 ] = 0. 0 ; plate [ i ] [ HEIGHT 1] = 0. 0 ; f o r ( j = 1 ; j < HEIGHT 1; j ++){ plate [ 0 ] [ j ] = 0. 0 ; plate [ WIDTH 1][ j ] = 1 0 0.0; count = fread (&seed, sizeof ( unsigned ), 1, randfd ) ; i f ( count > 0 ) { p r i n t f ( " Using / dev / urandom w i t h seed %u\n ", seed ) ; srandom ( seed ) ;
Εφαρµογές Monte Carlo II Υπολογισµός ϑερµοκρασίας σηµείου void findpointtemp ( float plate, i n t xcoord, i n t ycoord, i n t samples ) { i n t i t e r = 0, where = 0 ; f l o a t val, d i f f ; f l o a t tempnew = 0.0, tempold = 0. 0 ; i n t i, x, y ; do { tempnew = 0. 0 ; f o r ( i = 0 ; i < samples ; i + + ) { x = xcoord ; y = ycoord ; do { where = random ( ) & 3 ; s w i t c h ( where ) { case 0 : v a l = plate[ x ] [ y ] ; case 1 : v a l = plate [ x ] [ + + y ] ; case 2 : v a l = plate [++ x ] [ y ] ; case 3 : v a l = plate [ x][ y ] ; w h i l e ( v a l < 0. 0 ) ; tempnew += val ; tempnew = tempnew / samples ; d i f f = f a b s f (tempnew tempold ) ; tempold = tempnew ; w h i l e ( d i f f > EPSILON && ++ i t e r < MAXITER ) ; p r i n t f ( " Temperature at (%d, %d) i s %f ( a f t e r d i f f = %.6 f and i t e r = %d)\ n ", xcoord, ycoord, tempold, d i
Εφαρµογές Monte Carlo II Υπολογισµός ϑερµοκρασίας σηµείου void printplate ( float plate, i n t WIDTH, i n t HEIGHT ) { i n t i, j ; p r i n t f ( " P l a t e : \ n " ) ; for ( i = 0 ; i < WIDTH ; i ++){ for ( j = 0 ; j < HEIGHT ; j ++){ p r i n t f ( " %.2 f \ t ", plate [ i ] [ j ] ) ; p r i n t f ( " \n " ) ; i n t main ( i n t argc, char argv ) { i n t i ; i n t WIDTH = a t o i ( argv [ 1 ] ) ; i n t HEIGHT = a t o i ( argv [ 2 ] ) ; i n t samples = a t o i ( argv [ 3 ] ) ; float plate = malloc ( WIDTH sizeof ( float ) ) ; plate [ 0 ] = malloc ( WIDTH HEIGHT s i z e o f ( f l o a t ) ) ; f o r ( i = 1 ; i < WIDTH ; i ++) plate [ i ] = plate [ i 1] + HEIGHT ; i n i t P l a t e ( plate, WIDTH, HEIGHT ) ; printplate ( plate, WIDTH, HEIGHT ) ; findpointtemp ( plate, WIDTH /2 1, HEIGHT /2 1, samples ) ; r e t u r n 0 ;
Ασκήσεις Εξάσκηση Προετοιµάστε το προγραµµατιστικό περιβάλλον στους λογαριασµούς που σας έχουν δοθεί και εκτελέστε το πρώτο σας πρόγραµµα σε MPI. ώστε κατάλληλες παραµέτρους ώστε να διαπιστώσετε πως κατανέµονται οι διεργασίες στους πιθανούς συνδυασµούς κόµβων και διεργασιών. Εκτελέστε το πρόγραµµα που υπολογίζει το π µε µέθοδο Monte Carlo και χρονοµετρήστε την εκτέλεση µε τη συνάρτηση MPI_Wtime. ηµιουργείστε µια παράλληλη έκδοση του προγράµµατος που υπολογίζει τη ϑερµοκρασία σηµείου χρησιµοποιώντας απλές κλήσεις Send/Receive και εκτιµήστε την επιτάχυνση (speedup) που επιτυγχάνεται.
Εξάσκηση Συµπληρωµατική Βιβλιογραφία και Αναφορές [1] William Gropp, Ewing Lusk, and Anthony Skjellum. Using MPI (2nd ed.): portable parallel programming with the message-passing interface. MIT Press, Cambridge, MA, USA, 1999. [ Examples and Tutorials ] [2] Marc Snir, Steve Otto, David Walker, Jack Dongarra, and Steven Huss-Lederman. MPI: The Complete Reference. MIT Press, Cambridge, MA, USA, 1995. [ Available Online ] [3] Barry Wilkinson and Michael Allen. Parallel Programming: Techniques and Applications using Networked Workstations and Parallel Computers. Prentice-Hall, Inc., Upper Saddle River, NJ, USA, second edition, 2004. [4] Michael J. Quinn. Parallel Programming in C with MPI and OpenMP. McGraw-Hill Education Group, 2003. [5] MPI Tutorials. [ Link ]
Συζήτηση/Ερωτήσεις Εξάσκηση Ερωτήσεις;