Τφποι δεδομζνων MPI Κώςτασ Διαμαντάρασ Τμιμα Πλθροφορικισ ΤΕΙ Θεςςαλονίκθσ
MPI datatypes Σκοπόσ MPI datatypes: θ ςυνεργαςία μεταξφ ετερογενών υπολογιςτών και αρχιτεκτονικών Η χριςθ μθ ςυνεχών κζςεων μνιμθσ. Δομζσ δεδομζνων και arrays με μθ μοναδιαίο βιμα Ο χριςτθσ μπορεί να ορίςει δικά του datatypes κατά το χρόνο εκτζλεςθσ (runtime) = derived datatypes 2 Κ. Διαμαντάρας MPI
Τφποι δεδομζνων Βαςικοί (elementary): Οριςμζνοι ςτθ γλώςςα MPI (πχ., MPI_INT ι MPI_DOUBLE_PRECISION ) Διανυςματικοί (vector): Στακερι απόςταςθ μεταξφ ςτοιχείων = «βιμα» (stride) Συνεχείσ (contiguous): Διάνυςμα με βιμα 1 Hvector: Διάνυςμα με βιμα ςε bytes Δείκτεσ (Indexed): Πίνακεσ δεικτών (για scatter/gather) Hindexed: Indexed, με δείκτεσ ςε bytes Struct: Γενικοί μικτοί τφποι (για C structs κλπ.) 3 Κ. Διαμαντάρας MPI
Βαςικοί τφποι C Τύπος MPI MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNISGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED 4 Κ. Διαμαντάρας MPI Τύπος C signed char signed short int signed int signed long int unsigned char unsigned short int unsigned int unsigned long int float double long double
Διανφςματα (vectors) (1) 28 29 30 31 32 33 34 21 22 23 24 25 26 27 14 15 16 17 18 19 20 7 8 9 10 11 12 13 0 1 2 3 4 5 6 5 Κ. Διαμαντάρας MPI
Διανφςματα (2) Για να ορίςουμε αυτι τθ γραμμι ςτθ C χρθςιμοποιοφμε MPI_Type_vector( count, blocklen, stride, oldtype, &newtype ); MPI_Type_commit( &newtype ); Ο ακριβισ κώδικασ είναι MPI_Type_vector( 5, 1, 7, MPI_DOUBLE, &newtype ); MPI_Type_commit( &newtype ); 6 Κ. Διαμαντάρας MPI
MPI_Type_vector Δθμιουργεί ζνα τφπο δεδομζνων διανφςματοσ με βιμα (stride) #include "mpi.h" int MPI_Type_vector( int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype *newtype ) Παράμετροι Εισόδου count = πλικοσ blocks blocklength = πλικοσ ςτοιχείων ςε κάκε block stride = πλικοσ ςτοιχείων μεταξφ των αρχών διαδοχικών blocks oldtype = παλαιό datatype Παράμετροι Εξόδου newtype = νζο datatype 7 Κ. Διαμαντάρας MPI
Δομζσ (structs) Οι τφποι δομών (structs) περιγράφονται από 3 πίνακεσ Πίνακασ με το μικοσ των block (array_of_len) Πίνακασ με μετατοπίςεισ (array_of_displs) Πίνακασ τφπων δεδομζνων (array_of_types) MPI_Type_struct( count, array_of_len, array_of_displs, array_of_types, &newtype ); 8 Κ. Διαμαντάρας MPI
MPI_Type_struct Δθμιουργεί ζνα τφπο δεδομζνων struct #include "mpi.h" int MPI_Type_struct(int count, int blocklens[], MPI_Aint indices[], MPI_Datatype old_types[], MPI_Datatype *newtype ) Παράμετροι Εισόδου count = πλικοσ blocks blocklens = πλικοσ ςτοιχείων ςε κάκε block (πίνακασ) indices = μετατόπιςθ κάκε block (πίνακασ) old_types = τφποι δεδομζνων κάκε block (πίνακασ) Παράμετροι Εξόδου newtype = νζο datatype 9 Κ. Διαμαντάρας MPI
Παράδειγμα struct (1) struct { char display[50]; /* Name of display */ int maxiter; /* max # of iterations */ double xmin, ymin; /* lower left corner of rectangle */ double xmax, ymax; /* upper right corner */ int width; /* of display in pixels */ int height; /* of display in pixels */ } cmdline; 10 Κ. Διαμαντάρας MPI
Παράδειγμα struct (2) /* 4 blocks */ int blockcounts[4] = {50,1,4,2}; MPI_Datatype types[4]; MPI_Aint displ[4]; MPI_Datatype cmdtype; /* initialize types and displacements with addresses of items */ MPI_Address( &cmdline.display, &displ[0] ); MPI_Address( &cmdline.maxiter, &displ[1] ); MPI_Address( &cmdline.xmin, &displ[2] ); MPI_Address( &cmdline.width, &displ[3] ); types[0] = MPI_CHAR; types[1] = MPI_INT; types[2] = MPI_DOUBLE; types[3] = MPI_INT; for (i = 3; i >= 0; i--) { displ[i] -= displ[0]; } MPI_Type_struct( 4, blockcounts, displ, types, &cmdtype ); MPI_Type_commit( &cmdtype ); 11 Κ. Διαμαντάρας MPI
Παράδειγμα struct (3) struct { int a; char b; } foo; blen[0] = 1; indices[0] = 0; oldtypes[0] = MPI_INT; blen[1] = 1; indices[1] = &foo.b - &foo; oldtypes[1] = MPI_CHAR; blen[2] = 1; indices[2] = sizeof(foo); oldtypes[2] = MPI_UB; MPI_Type_struct( 3, blen, indices, oldtypes, &newtype ); Τφποσ MPI_UB δθμιουργεί το απαραίτθτο padding 12 Κ. Διαμαντάρας MPI
Οι τφποι MPI_LB, MPI_UB Η ζκταςθ (extend) ενόσ τφπου δεδομζνων ορίηεται από τθν απόςταςθ μεταξφ του πρώτου και του τελευταίου δεδομζνου Μποροφμε να ορίςουμε τθν ζκταςθ ορίηοντασ δικά μασ MPI_LB, MPI_UB 13 Κ. Διαμαντάρας MPI
Τφποσ Διάνυςμα-γραμμι int blen[2], displ[2]; MPI_Datatype types[2], rowtype; blen[0] = 1; blen[1] = 1; displ[0] = 0; displ[1] = number_in_column * sizeof(double); types[0] = MPI_DOUBLE; types[1] = MPI_UB; MPI_Type_struct( 2, blen, displ, types, &rowtype ); MPI_Type_commit( &rowtype ); 14 Κ. Διαμαντάρας MPI
Τφποσ struct ξανά /* initialize types and displs with addresses of items */ MPI_Address( &cmdline.display, &displ[0] ); MPI_Address( &cmdline.maxiter, &displ[1] ); MPI_Address( &cmdline.xmin, &displ[2] ); MPI_Address( &cmdline.width, &displ[3] ); MPI_Address( &cmdline+1, &displ[4] ); types[0] = MPI_CHAR; types[1] = MPI_INT; types[2] = MPI_DOUBLE; types[3] = MPI_INT; types[4] = MPI_UB; for (i = 4; i >= 0; i--) { displ[i] -= displ[0]; } MPI_Type_struct( 5, blockcounts, displ, types, &cmdtype ); MPI_Type_commit( &cmdtype ); 15 Κ. Διαμαντάρας MPI
Interleaving Θζλω να ςτείλω 0-3, 8-11, 16-19, 24-27 ςτθ διεργαςία 0 4-7, 12-15, 20-23, 28-31 ςτθ διεργαςία 1 16 Κ. Διαμαντάρας MPI 0 8 16 24 32 1 9 17 25 33 2 10 18 26 34 3 11 19 27 35 4 12 20 28 36 5 13 21 29 37 6 14 22 30 38 7 15 23 31 39
Interleaving (2) /* define a block of this matrix. */ MPI_Type_vector( 4, 4, 8, MPI_DOUBLE, &vec ); /* define a block whose extent is just 1 entry */ blen[0] = 1; blen[1] = 1; types[0] = vec; types[1] = MPI_UB; displ[0] = 0; displ[1] = sizeof(double); MPI_Type_struct( 2, blen, displ, types, &block ); 17 Κ. Διαμαντάρας MPI
MPI_Scatterv Τεμαχίηει ζνα buffer και τον μοιράηει ςτισ διεργαςίεσ ενόσ communicator #include "mpi.h" int MPI_Scatterv ( void *sendbuf, int *sendcnts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm ) Παράμετροι Εισόδου sendbuf = διεφκυνςθ του send buffer sendcounts = array που ορίηει το πλικοσ των ςτοιχείων που κα ςτείλουμε ςε κάκε διεργαςία displs = array του οποίου το ςτοιχείο i ορίηει τθ μετατόπιςθ του δεδομζνου που κα ςταλεί ςτθ διεργαςία i sendtype = τφποσ δεδομζνων των ςτοιχείων του sendbuff recvcount = πλικοσ ςτοιχείων ςτον receive buffer recvtype = τφποσ δεδομζνων των ςτοιχείων του receive buffer root = rank τθσ διεργαςίασ αποςτολζα comm = communicator Παράμετροι Εξόδου recvbuf = διεφκυνςθ του receive buffer 18 Κ. Διαμαντάρας MPI
Interleaving και Scatterv scdispl[0] = 0; scdispl[1] = 4; scdispl[2] = 32; scdispl[3] = 36; MPI_Scatterv( sendbuf, sendcounts, scdispl, block, recvbuf, nx * ny, MPI_DOUBLE, 0, MPI_COMM_WORLD ); 19 Κ. Διαμαντάρας MPI