Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr Εισαγωγή στο MPI Εγκατάσταση του Message Passing Interface, To πρώτο πρόγραμμα με MPI Αναζήτηση στοιχείου σε πίνακα: Σειριακό πρόγραμμα, Παράλληλο πρόγραμμα, Συγκρίσεις (απόδοση παράλληλου προγράμματος) Εισαγωγή στο MPI, #1 2 Εγκατάσταση MPICH σε ένα ΗΥ Ψευδοπαράλληλο σύστημα Όλες οι λειτουργίες ενός παράλληλου υπολογιστικού συστήματος (cluster) σε ένα υπολογιστή Εισαγωγή στο MPI, #1 3 1
Βήμα 1: download Κατέβασμα του συμπιεσμένου αρχείου απο https://www.mpich.org/downloads/ Αποσυμπίεση του αρχείου: Αποσυμπίεση: tar -xzf mpich2_version.tar.gz H αποσυμίεση θα γίνει σε ένα νέο φάκελο με όνομα ίδιο με το όνομα του αρχείου, πχ: mpich2_version tar = αποσυμπίεση x = αποσυμπίεση αρχείων εάν προέρχοναται απο gzip ή bzip2 συμπίεση z = φιλτράρισμα των αρχείων απο το gzip για αποσυμπίεση f = αποσυμπίεση αρχείων που ακολουθούν ονομαστικά Εισαγωγή στο MPI, #1 4 Βήμα 2: configure (1)./configure: H διαταγή εκτελεί ένα πρόγραμμα (script) το οποίο ελέγχει εάν το σύστημά μας περιέχει όλο τα απαραίτητο λογισμικό για να μεταγλωττίσει κάποιο πρόγραμμα/πακέτο προγραμμάτων, καθώς επίσης και ότι λογισμικό απαιτείται για να εκτελέσει το πρόγραμμα (μετά την μεταγλώττιση)./: τρέχων κατάλογος Εισαγωγή στο MPI, #1 5 Βήμα 2: configure (2) Μετακίνηση στο κατάλογο που αποσυμπιέστηκε το mpich-3.2: cd mpich-3.2 pwd και ls για επιβεβαίωση Configure./configure ή./configure disable -fortran (για να μην εγκαταστήσει βιβλιοθήκες για Fortran) CONFIGURATION COMPLETED Εισαγωγή στο MPI, #1 6 2
Βήμα 3: make / install make: μεταγλώττιση προγράμματος/πακέτων (θα χρειαστεί χρόνο...) make sudo = εκτέλεση κάποιας διαταγής που απαιτεί δικαιώματα super user (θα ζητηθεί το αντίστοιχο password) sudo make install: εγκατάσταση το προγράμματος mpiexec --version: επιβεβαίωση και έκδοση mpi Version 3.2 κλπ Εισαγωγή στο MPI, #1 7 To πρώτο πρόγραμμα: hello1.c #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); printf( "Hello, world!\n" ); MPI_Finalize(); return 0; Εισαγωγή στο MPI, #1 8 Μεταγλώττιση και εκτέλεση (1) mpicc hello1.c -o hello1.out mpiexec./hello1.out Hello, world! mpicc = o μεταγλωττιστής της C mpic++ = o μεταγλωττιστής της C++ mpiexec (mpirun) = εκτέλεση προγράμματος Εισαγωγή στο MPI, #1 9 3
Καλύτερο πρόγραμμα (με χρήση της mpi): hello2.c #include "mpi.h" #include <stdio.h> int main( 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; Εισαγωγή στο MPI, #1 10 Μεταγλώττιση και εκτέλεση (2) mpicc hello2.c -o hello2 mpiexec -np 5./hello2 Hello from 0 process of 5 Hello from 3 process of 5 Hello from 2 process of 5 Hello from 1 process of 5 Hello from 4 process of 5 Εισαγωγή στο MPI, #1 11 MPI Απλές εντολές (1) #include mpi.h : ενσωμάτωση στο πρόγραμμα του header file της MPI. Περιέχει όλες τις συναρτήσεις οι οποίες μας επιτρέπουν να χρησιμοποιήσουμε παραλληλία στο πρόγραμμα MPI_Init( &argc, &argv ): αρχικοποίηση της MPI MPI_Finalize(): τερματισμός της MPI Εισαγωγή στο MPI, #1 12 4
MPI Απλές εντολές (2) MPI_Comm_rank( MPI_COMM_WORLD, &rank ): αποδίδει στην ακέραια μεταβλητή rank τον αριθμό της τρέχουσας διεργασίας ή υπολογιστικού κόμβου (node) της υπολογιστικής συστοιχίες (computational clusters) MPI_Comm_size( MPI_COMM_WORLD, &size ): αποδίδει στην ακέραια μεταβλητή size το συνολικό πλήθος των ενεργών διεργασιών ή υπολογιστικών κόμβων (nodes) της υπολογιστικής συστοιχίες (computational clusters) Εισαγωγή στο MPI, #1 13 Ασκήσεις Πράξης # 01 Έστω ότι έχουμε ένα σύνολο S αποτελούμενο από Ν ακέραιους αριθμούς (αποθηκευμένοι σε ένα αρχείο κειμένου) και P διαθέσιμους υπολογιστικούς πόρους. Επίσης, έστω ακέραιος αριθμός X. Το ζητούμενο είναι εάν ο X υπάρχει στο S και εάν ναι πόσες φορές υπάρχει. Εισαγωγή στο MPI, #1 14 Σειριακός αλγόριθμος Counter 0 Για i 1 μέχρι Ν Εάν S[i] = X τότε Counter Counter + 1 Πολυπλοκότητα = O(N) Τέλος (εάν) Τέλος (Για) Εάν Counter = 0 τότε Ο Χ δεν υπάρχει στο S Αλλιώς Ο Χ εμφανίζεται Counter φορές στο S Τέλος (εάν) Εισαγωγή στο MPI, #1 15 5
Πρόγραμμα (1 από 3) #include "mpi.h" #include <stdio.h> #include <stdlib.h> #include <time.h> int main( int argc, char *argv[] ) { int *P, N, i; /* Pinakαs - megethos - deiktis */ int x, f=0; /* stoixeio poy anazitoyme, poses fores vrethike */ double ta, tt; /* gia metrisi xronou */ MPI_Init( &argc, &argv ); printf("\nmegethos pinaka:"); scanf("%d", &N); Εισαγωγή στο MPI, #1 16 Πρόγραμμα (2 από 3) /* Dimioyrgia pinaka */ P = malloc( N * sizeof( int ) ); if ( P == NULL ) { printf("\n\npoly megalos pinakas..."); printf("\n\nto programma termatizei...\n\n"); return -1; //srand(time(null)); for (i=0; i<n; i++) P[i] = rand() % 10000; printf("\neisagofi stoixiou pros anazitisi (0-->9999):"); scanf("%d", &x); Εισαγωγή στο MPI, #1 17 Πρόγραμμα (3 από 3) ta = MPI_Wtime(); /* arxi metrisis xronou */ /* anazitisi */ for (i=0; i<n; i++) if (P[i] == x ) f++; tt = MPI_Wtime(); /* telos metrisis xronou */ printf("\n\nto %d yparxei ston pinaka %d fores", x, f); printf("\n\nxronos ektelesis: %.16f\n\n", tt-ta); MPI_Finalize(); return 0; Εισαγωγή στο MPI, #1 18 6
Ερωτήσεις; Τέλος της # 02 διάλεξης Χρησιμοποιείστε το email για όποιες επιπλέον απορίες / ερωτήσεις: savvas@teilar.gr Σημειώσεις μαθήματος (και όχι μόνο): https://e-class.teilar.gr/courses/cs386/ Εισαγωγή στον παράλληλο προγραμματισμό 19 7