Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Κατανεμημένα Συστήματα - Εργαστήριο
Message Passing Interface - MPI
2
Για την κατασκευή του υλικού αυτού έχουν χρησιμοποιηθεί διαφάνειες από τις παρακάτω παρουσιάσεις:
“MPI: a message passing parallel programming model”, by Eduard Ayguadé, Barcelona Supercomputer Center “Parallel Programming and MPI”, R Badrinath, STSD Bangalore, Hewlett-Packard Development Company
3
Ακολουθιακός ή Παράλληλος Προγραμματισμός;
Μέχρι τώρα είμαστε περισσότερο εξοικειωμένοι με τον ακολουθιακό προγραμματισμό. Χρησιμοποιούμε γλώσσες όπως C, Java, κλπ., για να λύσουμε διάφορα προβλήματα, π.χ. ταξινόμηση με χρήση αλγορίθμων όπως buble sort, κλπ. Στην πραγματικότητα όμως χρησιμοποιούμε περισσότερο από ότι νομίζουμε τον παράλληλο προγραμματισμό, σαν έννοια κυρίως, όχι για προγραμματισμό. Παράδειγμα: έστω ότι θέλουμε να ταξινομήσουμε μια λίστα με 500 στοιχεία. Μπορούμε να διαιρέσουμε τη λίστα σε 5 μικρότερες των 100 στοιχείων, δίνοντας σε 5 ανθρώπους από μία, ώστε να τις ταξινομήσουν. Κατόπιν, κάνουμε συγχώνευση.
4
Προγραμματισμός με κοινή μνήμη ή με κατανεμημένη μνήμη;
Κοινή μνήμη: όλα τα υποέργα προσπελαύνουν την ίδια μνήμη, δηλαδή τα ίδια δεδομένα. Η υλοποίηση των υποέργων γίνεται με χρήση νημάτων. Κατανεμημένη μνήμη: υπάρχουν μόνο τοπικές μνήμες. Η διαμοίραση δεδομένων γίνεται μόνο με τη μεταφορά δεδομένων από το ένα υποέργο στο άλλο.
5
Παράγοντες που πρέπει να απαντηθούν στον παράλληλο προγραμματισμό
Πόσοι εκτελούν το έργο. (Βαθμός του παραλληλισμού) Τι απαιτείται για την εκκίνηση του έργου. (Αρχικοποίηση) Ποιος εκτελεί ποιο έργο. (Κατανομή εργασιών) Προσπέλαση στο μερίδιο εργασίας. (Data/IO access) Όποτε απαιτείται να γίνεται πληροφόρηση μεταξύ τους, προκειμένου να τελειώσουν τα έργα τους. (Επικοινωνία) Πότε ολοκληρώνονται όλα. (Συγχρονισμός) Τι απαιτείται για τη συλλογή των αποτελεσμάτων.
6
MPI - Βιβλιογραφία Βιβλία Homepage: http:// www.mcs.anl.gov/mpi
"MPI: The Complete Reference" by Snir, Otto, Huss-Lederman, Walker, and Dongarra, MIT Press (also in Postscript and html) "Using MPI: Portable Parallel Programming with the Message-Passing Interface, " by Gropp, Lusk and Skjellum, MIT Press “Designing and Building Parallel Programs”, by Ian Foster, Addison-Wesley, 1995. “Parallel Programming with MPI”, by Peter Pacheco, Morgan-Kaufmann, 1997. “MPI θεωρία και Εφαρμογές”, A. Μάργαρης, Εκδόσεις Τζιόλα, 2008. Homepage:
7
Υλοποιήσεις MPICH LAM CHIMP IBM MPI HP MPI SUN MPI Digital MPI SGI MPI
8
Σημεία κλειδιά στο MPI Το ίδιο πρόγραμμα εκτελείται σε αρκετούς διαφορετικούς επεξεργαστές Οι επεξεργαστές επικοινωνούν με πέρασμα μηνυμάτων Τυπική μεθοδολογία start job on n processors do i=1 to j each processor does some calculation pass messages between processors end do end job
9
MPI τύποι δεδομένων MPI_CHAR MPI_SHORT MPI_INT MPI_LONG
MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED
10
Το 1ο MPI Πρόγραμμα με C #include "mpi.h" #include <stdio.h>
int main( argc, argv ) int argc; char *argv[]; { int rank, size; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); printf( "I am %d of %d\n", rank, size ); MPI_Finalize(); return 0; }
11
Πώς εκτελείται; Μετάφραση: mpicc –o simple simple.c
Εκτέλεση: mpirun –np 2 simple Στο συγκεκριμένο παράδειγμα η εκτέλεση γίνεται από δύο κόμβους ταυτόχρονα. Ο αριθμός των κόμβων καθορίζεται από τον αριθμό που εισάγεται με την παράμετρο np.
12
Communicator Φροντίζει για την ασφάλεια της μετάδοσης και την ταυτοποίηση των διακινούμενων μηνυμάτων ώστε αυτά να παραλαμβάνονται με τη σωστή σειρά. Κάθε communicator σχετίζεται με τις ομάδες διεργασιών της εφαρμογής Χρησιμοποιείται σαν παράμετρος στις περισσότερες κλήσεις MPI. Η σταθερά MPI_COMM_WORLD περιλαμβάνει όλους τους επεξεργαστές της εφαρμογής Οι επεξεργαστές που ελέγχονται από ένα communicator διαθέτουν ένα αριθμό τάξης (rank)
13
Communicator Intra – communicator: για την επικοινωνία μεταξύ διεργασιών της ίδιας ομάδας Inter – communicator: για την επικοινωνία μεταξύ διεργασιών διαφορετικών ομάδων Οι τιμές των τάξεων για μία ομάδα Ν διεργασιών είναι 0...Ν-1
14
Βασικές Συναρτήσεις int MPI_Init (int *argc, char **argv): αρχικοποιεί το MPI περιβάλλον και δημιουργεί όλες τις δομές δεδομένων που είναι αναγκαίες για τη λειτουργία του (π.χ. ο προεπιλεγμένος communicator MPI_COMM_WORLD). int MPI_Finalize (void): τερματίζει τη λειτουργία του περιβάλλοντος MPI. int MPI_Comm_rank (MPI_comm comm, int *rank): επιστρέφει την τάξη της τρέχουσας διεργασίας. int MPI_Comm_size (MPI_comm comm, int *size): επιστρέφει το πλήθος των διεργασιών που σχετίζεται με τον συγκεκριμένο communicator.
15
Επικοινωνία διεργασιών με MPI
Χρησιμοποιεί το μοντέλο επικοινωνίας point-to-point Κάθε μήνυμα ταυτοποιείται με μία ετικέτα (tag) ώστε να ξεχωρίζει από τα υπόλοιπα μηνύματα της εφαρμογής Χρησιμοποιεί και διάφορες μορφές ομαδικής επικοινωνίας Broadcast (καθολική εκπομπή) Scattering (διασπορά): ένα μήνυμα διασπάται σε μικρότερα κομμάτια κάθε ένα εκ των οποίων αποστέλλεται και σε διαφορετική διεργασία Gather (συλλογή): το σύνολο των μηνυμάτων όλων των μελών της ομάδας παραλαμβάνεται από μία απλή διεργασία Reduce (υποβιβασμός): μία διεργασία συλλέγει δεδομένα από όλες τις υπόλοιπες διεργασίες της ομάδας και υπολογίζει κάποια συνάρτηση για τα δεδομένα αυτών Για τις παραπάνω μορφές επικοινωνίας υπάρχει ένας συντονιστής
16
Είδη Επικοινωνιών Blocking: η κλήση μιας συνάρτησης αναστέλλει τη λειτουργία της καλούσας διεργασίας, μέχρι την ολοκλήρωση της συνάρτησης αυτής. Non-blocking: η κλήση μιας συνάρτησης δεν αναστέλλει τη λειτουργία της καλούσας διεργασίας. Στην περίπτωση των non-blocking κλήσεων πρέπει η διαδοχική κλήση συναρτήσεων send να μην γίνεται σε πολύ μικρό χρονικό διάστημα. Γιατί;
17
Είδη Επικοινωνιών Πρότυπη: η απόφαση για τη δέσμευση ή όχι ενδιάμεσης μνήμης, λαμβάνεται από το MPI και όχι από το χρήστη. Με ενδιάμεση αποθήκευση Σύγχρονη: μια διαδικασία αποστολής μπορεί να ξεκινήσει ανεξάρτητα από την εκκίνηση της διαδικασίας παραλαβής. Θα ολοκληρωθεί με επιτυχία όμως, μόνο όταν η αντίστοιχη διαδικασία παραλαβής έχει ξεκινήσει. Σε κατάσταση ετοιμότητας: η διαδικασία αποστολής ξεκινά μαζί με την αντίστοιχη διαδικασία παραλαβής
18
Βασικές συναρτήσεις για επικοινωνία
int MPI_send (void * buf, int count, MPI_Datatype dataType, int destRank, int messageTag, MPI_Comm com): blocking συνάρτηση αποστολής μηνύματος σε κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator buf: η διεύθυνση που βρίσκονται τα δεδομένα count: το μέγεθος των δεδομένων dataType: ο τύπος των δεδομένων destRank:η τάξη της διεργασίας παραλήπτη messageTag: η ετικέτα του μηνύματος com: ο communicator
19
Βασικές συναρτήσεις για επικοινωνία
int MPI_Recv (void * buf, int count, MPI_Datatype dataType, int sourceRank, int messageTag, MPI_Comm com, MPI_status status): blocking συνάρτηση παραλαβής μηνύματος από κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator buf: η διεύθυνση που θα τοποθετηθούν τα δεδομένα count: το μέγεθος των δεδομένων dataType: ο τύπος των δεδομένων sourceRank:η τάξη της διεργασίας αποστολέα messageTag: η ετικέτα του μηνύματος com: ο communicator status: η κατάσταση παραλαβής του μηνύματος
20
Βασικές συναρτήσεις για επικοινωνία
int MPI_Get_count (MPI_Status *status, MPI_Datatype dataType, int *count): χρησιμοποιείται σε συνδυασμό με την MPI_Recv για τον έλεγχο του μεγέθους του μηνύματος που παραλαμβάνεται. Στην περίπτωση που η ετικέτα του μηνύματος που παραλαμβάνεται/αποστέλλεται δεν μας ενδιαφέρει χρησιμοποιούμε τη σταθερά MPI_ANY_TAG
21
Βασικές συναρτήσεις για επικοινωνία
22
Το 2ο πρόγραμμα με MPI #include "mpi.h" #include <stdio.h>
int main( int argc, char *argv[] ) { int rank, size, retVal; MPI_Status status; char inMessage, outMessage=‘x’; retVal=MPI_Init( &argc, &argv ); if (retVal!=MPI_SUCCESS) { printf(“Error starting MPI.\n”); MPI_Abort(MPI_COMM_WORLD,retVal); }
23
Το 2ο πρόγραμμα με MPI (συνέχεια)
MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); if(rank==0) { MPI_Send(&outMessage,1,MPI_CHAR,1,0,MPI_COMM_WORLD); MPI_Recv(&inMessage,1,MPI_CHAR,1,0,MPI_COMM_WORLD, &status); printf( “Process %02d send %c and received %c\n", rank, outMessage, inMessage); } if(rank==1) { MPI_Recv(&inMessage,1,MPI_CHAR,0,0,MPI_COMM_WORLD, &status); MPI_Send(&outMessage,1,MPI_CHAR,0,0,MPI_COMM_WORLD); MPI_Finalize(); return 0;
24
Non-blocking συναρτήσεις για επικοινωνία
int MPI_Isend (void * buf, int count, MPI_Datatype dataType, int destRank, int messageTag, MPI_Comm com, MPI_Request* request): non-blocking συνάρτηση αποστολής μηνύματος σε κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator request: παράμετρος εξόδου, χειριστής για τον έλεγχο της κατάστασης της διαδικασίας π.χ. στην MPI_WAIT ή την MPI_TEST int MPI_Ιrecv (void * buf, int count, MPI_Datatype dataType, int sourceRank, int messageTag, MPI_Comm com, MPI_status status): non-blocking συνάρτηση παραλαβής μηνύματος από κάποια από τις διεργασίες που περιλαμβάνονται στον τρέχοντα communicator
25
Non-blocking συναρτήσεις για επικοινωνία
int MPI_Wait( MPI_Request* request, MPI_Status* status ): κάνει μια διεργασία να περιμένει για την ολοκλήρωση μιας μεταφοράς. Καταχωρεί στη μεταβλητή status τις πληροφορίες που σχετίζονται με την κατάσταση της διαδικασίας μετά την ολοκλήρωση αυτής. int MPI_Test( MPI_Request* request, int *flag, MPI_Status* status ): παρόμοια με την MPI_Wait. H flag περιέχει την τιμή true εάν η διαδικασία έχει ολοκληρωθεί, διαφορετικά false.
26
Non-blocking συναρτήσεις για επικοινωνία
27
3o παράδειγμα με MPI #include “mpi.h”
int main( int argc, char* argv[] ) { int rank, nproc, isbuf, irbuf, count; MPI_Request request; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if(rank == 0) { isbuf = 9; MPI_Isend( &isbuf, 1, MPI_INTEGER, 1, 1, MPI_COMM_WORLD, &request);
28
3o παράδειγμα με MPI (συνέχεια)
} else if(rank == 1) { MPI_Irecv( &irbuf, 1, MPI_INTEGER, *, *, MPI_COMM_WORLD, &request); MPI_Wait(&request, &status); MPI_Get_count(&status, MPI_INTEGER, &count); printf( “irbuf = %d source = %d tag = %d count = %d\n”, irbuf, status.MPI_SOURCE, status.MPI_TAG, count); } MPI_Finalize();
29
Ομαδική Επικοινωνία int MPI_Bcast( void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm): συνάρτηση καθολικής μετάδοσης (broadcast). Η διεργασία με τάξη root στέλνει ένα μήνυμα σε όλες τις διεργασίες που ανήκουν στον communicator com. int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm): μεταδίδει ατομικά μηνύματα από τον root προς όλες τις διεργασίες που ανήκουν στον communicator com
30
MPI_Scatter
31
4ο παράδειγμα με MPI #include “mpi.h” int main(int argc, char* argv[])
{ int rank; int ibuf; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if(rank == 0) ibuf = 12345; else ibuf = 0; MPI_Bcast(&ibuf, 1, MPI_INTEGER, 0, MPI_COMM_WORLD); printf(“ibuf = %d\n”, ibuf); MPI_Finalize(); }
32
Ομαδική Επικοινωνία int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm ): συλλέγει ατομικά μηνύματα από κάθε διεργασία που ανήκει στον communicator comm προς τη διεργασία root και τα αποθηκεύει ταξινομημένα. int MPI_Allgather( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm): συλλέγει ατομικά μηνύματα από κάθε διεργασία που ανήκει στον communicator comm και στέλνει το τελικό μήνυμα προς όλες τις διεργασίες.
33
MPI_Gather
34
MPI_Allgather
35
Ομαδική Επικοινωνία int MPI_Alltoall( void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm): στέλνει ένα ξεχωριστό μήνυμα από κάθε διεργασία προς κάθε άλλη. Το j block δεδομένων που στέλνεται από τη διεργασία i λαμβάνεται από τη διεργασία j και αποθηκεύεται στο I block του recvbuf. int MPI_Reduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm: εκτελεί την πράξη op στα δεδομένα του sendbuf, τοποθετώντας το αποτέλεσμα στον recvbuf του root
36
Προκαθορισμένες πράξεις
MPI_SUM MPI_PROD MPI_MAX MPI_MIN MPI_MAXLOC ΜPI_MINLOC MPI_LAND MPI_LOR MPI_LXOR MPI_BAND MPI_BOR MPI_BXOR
37
MPI_Alltoall
38
MPI_Reduce
39
MPI_Reduce για πίνακες
40
Μέθοδοι Ε/Ε στο MPI Με ορισμό διεργασίας – ρίζα που αναλαμβάνει τη λειτουργία Καλή σε απόδοση μόνο για μικρά σύνολα διεργασιών Κάθε διεργασία χρησιμοποιεί το δικό της αποκλειστικό αρχείο εξόδου Κακή απόδοση κατά την ανάγνωση ενός αρχείου Όλες οι διεργασίες αποθηκεύουν την έξοδό τους την ίδια χρονική στιγμή Πρέπει το λειτουργικό σύστημα να επιτρέπει ταυτόχρονη πρόσβαση σε αρχεία Αν ναι, τότε υπάρχει άνω όριο στον αριθμό ταυτόχρονων διεργασιών Αν όχι, ακολουθείται σειριακή πρόσβαση
41
Μέθοδοι Ε/Ε στο MPI (2) Τι γίνεται στην πράξη;
Σύνθετο μοντέλο παράλληλης προσπέλασης των συσκευών Ε/Ε Ασύγχρονη προσπέλαση: η προσπέλαση μπορεί να καθυστερήσει με τέτοιο τρόπο, ώστε να συνεχίσει η διαδικασία επεξεργασίας των δεδομένων της εφαρμογής, ενώ το υποσύστημα Ε/Ε θα εκτελεί τη μεταφορά των δεδομένων Παράλληλη προσπέλαση: το σύστημα διαθέτει πολλούς δίσκους και ένα αρχείο αποθηκεύεται παράλληλα ώστε το κάθε τμήμα του να αποθηκεύεται σε και σε ξεχωριστό δίσκο. Αύξηση του χρόνου εκτέλεσης της εφαρμογής λόγω συχνών προσπελάσεων για μικρά σύνολα δεδομένων.
42
Παράδειγμα με πίνακα 4 × 4 Κάθε επεξεργαστής διαβάζει από μία γραμμή
4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 Κάθε επεξεργαστής διαβάζει από μία γραμμή Απαιτούνται 16 λειτουργίες Ε/Ε Άλλη λύση (συλλογική διαδικασία): κάθε επεξεργαστής διαβάζει από μια στήλη και τη μοιράζει στους υπολοίπους (4 λειτουργίες Ε/Ε)
43
Παράδειγμα με πίνακα 4 × 4 (2)
Κάθε επεξεργαστής γνωρίζει εκ των προτέρων τα δεδομένα που θα διαβιβάσει και τον τρόπο που αυτά είναι αποθηκευμένα. Υπάρχουν δύο υλοποιήσεις Υλοποίηση σε δύο φάσεις: προσπέλαση – διανομή (όπως παραπάνω) Κατευθυνόμενη από το δίσκο: βασίζεται στη γνώση του τρόπου που οι ομάδες δεδομένων είναι αποθηκευμένες στους δίσκους του συστήματος.
44
Υλοποίηση κατευθυνόμενη από το δίσκο
Ορίζονται κάποιοι διακομιστές Ε/Ε Οι επεξεργαστές εκτελούν μόνο τους κατάλληλους υπολογισμούς Οι διακομιστές εκτελούν την προσπέλαση στους δίσκους Τα δεδομένα διακινούνται μόνο φορά στο δίκτυο Μεγάλος αριθμός μηνυμάτων
45
Βασικές συναρτήσεις int MPI_File_open(MPI_Comm comm, char *filename, int accessMode, MPI_Info info, MPI_File fileHandle) Εάν επιθυμούμε το άνοιγμα του αρχείου να γίνει από μία συγκεκριμένη διεργασία, χρησιμοποιούμε ως communicator τη σταθερά MPI_COMM_SELF Τύποι πρόσβασης MPI_MODE_RDONLY MPI_MODE_CREATE MPI_MODE_UNIQUE_OPEN MPI_MODE_RDWR MPI_MODE_EXCL MPI_MODE_SEQUENTIAL MPI_MODE_WRONLY MPI_MODE_DELETE_ON_CLOSE MPI_MODE_APPEND
46
Βασικές συναρτήσεις (2)
int MPI_File_close(MPI_File *fileHandle) int MPI_File_delete (char *filename, MPI_Info info) int MPI_File_set_size(MPI_File fileHandle, MPI_Offset size) int MPI_File_get_size(MPI_File fileHandle, MPI_Offset *size) int MPI_File_preallocate(MPI_File fileHandle, MPI_Offset size) int MPI_File_get_group(MPI_File fileHandle, MPI_Group *group) int MPI_File_get_amode(MPI_File fileHandle, MPI_Offset *accessMode)
47
Συναρτήσεις ανάκτησης και καθορισμού ιδιοτήτων αρχείων
int MPI_File_set_info (MPI_File *fileHandle, MPI_Info info) int MPI_File_get_info (MPI_File *fileHandle, MPI_Info *info) Ιδιότητες Τύπος πρόσβασης Collective buffering: καθορίζει αν θα υπάρχει ή όχι ενδιάμεση μνήμη Chunked: δηλώνει ότι το αρχείο μπορεί να θεωρηθεί ως πολυδιάστατος πίνακας που μπορεί να προσπελαστεί με τη βοήθεια ενός συνόλου υποπινάκων. Η τιμή αυτού του πεδίου είναι οι διαστάσεις του πίνακα. Chunked_item: το μέγεθος του κάθε στοιχείου του πολυδιάστατου πίνακα σε bytes. Chunked_size: περιέχει τις διαστάσεις των υποπινάκων
48
Συναρτήσεις ανάκτησης και καθορισμού ιδιοτήτων αρχείων(2)
Filename File_perm: τα δικαιώματα πρόσβασης Io_mode_list: οι συσκευές Ε/Ε που θα χρησιμοποιηθούν για την αποθήκευση του αρχείου Nb_proc: το πλήθος των παράλληλων διεργασιών που μπορούν να προσπελάσουν το αρχείο Striping_factor: το πλήθος των συσκευών Ε/Ε που θα διαμοιραστεί το αρχείο Striping_unit: το μέγεθος του τμήματος του αρχείου που θα αποθηκευτεί σε κάθε μονάδα Ε/Ε.
49
Συναρτήσεις διαχείρισης όψεων αρχείων
Όψη: υπαγορεύει τον τρόπο με τον οποίο τα δεδομένα ενός αρχείου θα προσπελαύνονται από τις διεργασίες. int MPI_File_set_view (MPI_File fileHandle, MPI_Offset disp, MPI_Datatype eType, MPI_Datatype fileType, char *dataRep, MPI_Info info) disp: η απόσταση του πρώτου byte δεδομένων του της όψης από την αρχή του αρχείου eType: ο τύπος δεδομένων του αρχείου fileType: η κατανομή των δεδομένων του αρχείου στις διεργασίες data_rep: ο τρόπος αναπαράστασης των δεδομένων
50
Συναρτήσεις διαχείρισης όψεων αρχείων (2)
int MPI_File_get_view (MPI_File fileHandle, MPI_Offset disp, MPI_Datatype *eType, MPI_Datatype *fileType, char *dataRep) Τα ορίσματα eType και fileType πρέπει να δηλωθούν στο σύστημα με την MPI_Type_commit πριν τη χρήση των συναρτήσεων αυτών.
51
Συναρτήσεις προσπέλασης δεδομένων
Προσπέλαση με τη βοήθεια της ακριβούς θέσης int MPI_File_read_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_read_at_all (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_at_all (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_iread_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request) int MPI_File_iwrite_at (MPI_File fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request)
52
Συναρτήσεις προσπέλασης δεδομένων - Παράδειγμα
#include <mpi.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define LENGTH 100 int main (int argc, char **argv) { int counter, rank,size; int buffer[LENGTH]; char filename[64]=“data.txt”; MPI_File fileHandle; int disp=0, count, offset; MPI_Datatype eType=MPI_INT; MPI_Datatype fType=MPI_INT; MPI_Status status; MPI_Init(&argc, &argv);
53
Συναρτήσεις προσπέλασης δεδομένων – Παράδειγμα (2)
MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); offset=rank*LENGTH; for(counter=0; counter<LENGTH; counter++) buffer[counter]=counter*(rank+1); MPI_File_open(MPI_COMM_WORLD, fileName, MPI_MODE_RDWR|MPI_MODE_CREATE, MPI_INFO_NULL, &fileHandle); MPI_File_set_view(fileHandle, disp, eType, fType, “native”, MPI_INFO_NULL); MPI_File_write_at(fileHandle, offset, buffer, 100, MPI_INT, &status); MPI_Get_elements(&status, MPI_INT, &count); printf(“%d elements saved to disk file from process %d (offset value is %d)\n”, count, rank, offset); MPI_File_close(&fileHandle); MPI_Finalize(); }
54
Συναρτήσεις προσπέλασης δεδομένων (2)
Προσπέλαση με τη βοήθεια του ατομικού δείκτη int MPI_File_read (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_read_all (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_all (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_iread (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request) int MPI_File_iwrite (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request)
55
Συναρτήσεις προσπέλασης δεδομένων (3)
int MPI_File_seek (MPI_File fileHandle, MPI_Offset offset, int whence) whence: MPI_SEEK_SET, MPI_SEEK_CUR, MPI_SEEK_END int MPI_File_get_position (MPI_File fileHandle, MPI_Offset *offset) int MPI_File_get_byte_offset (MPI_File fileHandle, MPI_Offset offset, MPI_Offset *disp)
56
Συναρτήσεις προσπέλασης δεδομένων (4)
Προσπέλαση με τη βοήθεια του κοινόχρηστου δείκτη int MPI_File_read_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_read_ordered (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_write_ordered (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_status *status) int MPI_File_iread_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request) int MPI_File_iwrite_shared (MPI_File fileHandle, void *buffer, int count, MPI_Datatype dataType, MPI_Request *request)
57
Συναρτήσεις προσπέλασης δεδομένων (5)
int MPI_File_seek_shared (MPI_File fileHandle, MPI_Offset offset, int whence) int MPI_File_get_position_shared (MPI_File fileHandle, MPI_Offset *offset)
58
Συναρτήσεις προσπέλασης δεδομένων (6)
Split – collective συναρτήσεις int MPI_File_read_at_all_begin (MPI_File *fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType) int MPI_File_write_at_all_begin (MPI_File *fileHandle, MPI_Offset offset, void *buffer, int count, MPI_Datatype dataType) int MPI_File_read_all_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType) int MPI_File_write_all_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType) int MPI_File_read_ordered_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType) int MPI_File_write_ordered_begin (MPI_File *fileHandle, void *buffer, int count, MPI_Datatype dataType)
59
Συναρτήσεις προσπέλασης δεδομένων (7)
Split – collective συναρτήσεις int MPI_File_read_at_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_write_at_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_read_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_write_all_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_read_ordered_end (MPI_File *fileHandle, void *buffer, MPI_Status *status) int MPI_File_write_ordered_end (MPI_File *fileHandle, void *buffer, MPI_Status *status)
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.