Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας"

Transcript

1 Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα: Εισαγωγή στο OpenMP Δρ. Μηνάς Δασυγένης Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

2 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

3 Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ψηφιακά Μαθήματα στο Πανεπιστήμιο Δυτικής Μακεδονίας» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

4 Σκοπός της Ενότητας Η παραλληλοποίηση υπολογιστών κοινής μνήμης με το OpenMP. 4

5 Περιεχόμενα Τι είναι το OpenMP. Ιστορικό. Στόχοι του OpenMP. Παραλληλοποίηση. Μοντέλο Μνήμης. Σύνταξη. Μοντέλο εκτέλεσης. Directive parallel. Διαμοιρασμός Εργασίας. Directives. Clauses. Ρουτίνες Συστήματος Εκτέλεσης. Μεταβλητές Περιβάλλοντος. OpenMP compilers. Βιβλιογραφία. 5

6 Τι είναι το OpenMP; Το OpenMP είναι μια Διεπαφή Προγραμματισμού Εφαρμογών (Application Programming Interface, API) το οποίο δημιουργήθηκε από κατασκευαστές υλικού και λογισμικού. Τα αρχικά αντιστοιχούν στη φράση "Open Specifications for Multi Processing". Το πρότυπο αυτό προσφέρει στον προγραμματιστή ένα σύνολο από οδηγίες, οι οποίες ενσωματώνονται στον κώδικα ενός προγράμματος, και έτσι μπορεί ο μεταγλωττιστής να επιτύχει παραλληλισμό στο πρόγραμμα αυτό. 6

7 OpenMP: Βασικά Συστατικά Το API αυτό αποτελείται κυρίως από τρία βασικά συστατικά: Οδηγίες προς τον μεταγλωττιστή (compiler directives). Βιβλιοθήκη με συναρτήσεις (runtime routines). Μεταβλητές περιβάλλοντος (environment variables). Το πρότυπο αυτό έχει ορισθεί για τις γλώσσες προγραμματισμού C/C++ και FORTRAN. Ο παραλληλισμός που προσφέρει αφορά συστήματα μοιραζόμενης μνήμης, οπότε δεν μπορεί από μόνο του να εφαρμοστεί σε συστήματα κατανεμημένης μνήμης. 7

8 Ιστορικό (1/3) Η ιστορία του OpenMP ξεκινάει από τις αρχές της δεκαετίας του '90. Εκείνη τη εποχή, οι εταιρίες συστημάτων μοιραζόμενης μνήμης παρείχαν παρόμοιες επεκτάσεις προγραμμάτων Fortran, βασισμένες σε οδηγίες μεταγλωττιστή. Ο προγραμματιστής έδινε στον μεταφραστή ένα σειριακό πρόγραμμα Fortran με οδηγίες που καθόριζαν ποιοι βρόχοι θα παραλληλοποιούνταν. Στη συνέχεια, ο μεταφραγλωτιστής ήταν υπεύθυνος για την αυτόματη παραλληλοποίηση αυτών των βρόγχων σε συμμετρικούς επεξεργαστές (SMP's). 8

9 Ιστορικό (2/3) Αν και οι υλοποιήσεις των διάφορων εταιριών ήταν παρόμοιες ως προς τη λειτουργικότητα, ωστόσο, διέφεραν αρκετά. Έτσι, έγινε μια προσπάθεια για να δημιουργηθεί ένα πρότυπο. Το πρώτο πρότυπο που δημιουργήθηκε ήταν το ANSI X3H5 το 1994, αλλά δεν υιοθετήθηκε επειδή εκείνη την εποχή το ενδιαφέρον για αρχιτεκτονικές μοιραζόμενης μνήμης έπεσε, ενώ ανέβηκε το ενδιαφέρον για συστήματα με αρχιτεκτονική κατανεμημένης μνήμης. 9

10 Στο OpenMP 3.0 ξεκαθαρίστηκαν κάποιες λεπτομέρειες, προστέθηκαν κάποιες νέες συναρτήσεις που μπορούν να κληθούν από τα προγράμματα (π.χ. εύρεση του nesting level). Το βασικότερο όμως ήταν η προσθήκη των tasks!!! Ιστορικό (3/3) 10

11 Στόχοι του openmp Οι στόχοι του OpenMP είναι να παράσχει ένα πρότυπο που θα ισχύει για αρχιτεκτονικές και πλατφόρμες μοιραζόμενης μνήμης. Ένα πρότυπο που θα είναι μικρό και εύκολα κατανοητό, δηλαδή θα παρέχει ένα απλό και περιορισμένο σύνολο από οδηγίες με το οποίο θα μπορεί να γίνεται σημαντική παραλληλοποίηση. Επίσης, θα πρέπει να είναι εύκολο στη χρήση του. Το OpenMP παρέχει: Τη δυνατότητα παραλληλοποίησης ενός προγράμματος σταδιακά (εν αντιθέσει, για παράδειγμα, με το MPI όπου κάθε φορά γίνεται include όλη η βιβλιοθήκη). Τη δυνατότητα τόσο αδρομερούς (coarse-grain) όσο και λεπτομερούς (finegrain) παραλληλισμού. Ο κυριότερος στόχος του OpenMP είναι η μεταφερτότητα. Υποστηρίζει Fortran και C/C++ ενώ έχει υλοποιηθεί για τις πιο πολλές από τις σημαντικές πλατφόρμες όπως Unix/Linux και Windows. 11

12 Παραλληλοποίηση (1/2) Συνήθως ένας αλγόριθμος παραλληλοποιείται με διάσπασή του σε πολλαπλά τμήματα τα οποία ανατίθενται σε ξεχωριστά νήματα ή διεργασίες και έτσι εκτελούνται παράλληλα σε διαφορετικές επεξεργαστικές μονάδες. Η παραλληλοποίηση ενός σειριακού αλγορίθμου, προκειμένου να εκμεταλλευτούμε την αύξηση των υπολογιστικών επιδόσεων που προσφέρει ο παραλληλισμός, διακρίνεται σε τέσσερα βήματα που εκτελούνται διαδοχικά: Τη διάσπαση του ολικού υπολογισμού σε επιμέρους εργασίες. Εξαρτάται από το πρόβλημα και εναπόκειται στον προγραμματιστή. 12

13 Παραλληλοποίηση (2/2) Την ανάθεση εργασιών σε οντότητες εκτέλεσης (διακριτές διεργασίες, νήματα ή ίνες). Μπορεί να είναι είτε στατική, όπου κάθε οντότητα αναλαμβάνει ένα προκαθορισμένο σύνολο εργασιών προς εκτέλεση, ή δυναμική, όπου οι εργασίες ανατίθενται μία-μία κατά τον χρόνο εκτέλεσης μόλις μία οντότητα ολοκληρώσει την τρέχουσα εργασία της ζητά να της δοθεί η επόμενη. Η δυναμική λύση είναι προτιμότερη σε περίπτωση που οι επεξεργαστές έχουν διαφορετικό φόρτο (π.χ. αν κάποιοι εκτελούν και άλλα προγράμματα) αλλά επισύρει κάποια χρονική επιβάρυνση. Την ενορχήστρωση των οντοτήτων. Εδώ γίνεται ο καθορισμός του τρόπου συντονισμού και επικοινωνίας μεταξύ των οντοτήτων εκτέλεσης, π.χ. φράγματα εκτέλεσης, αποστολή ή λήψη μηνυμάτων κλπ. Την αντιστοίχηση οντοτήτων σε επεξεργαστές. Μπορεί να είναι στατική, δηλαδή προκαθορισμένη από τον προγραμματιστή, ή δυναμική, δηλαδή ρυθμιζόμενη από το σύστημα κατά τον χρόνο εκτέλεσης. 13

14 Τρόπος Επικοινωνίας (1/2) Τα βήματα αυτά είναι πανομοιότυπα για προγράμματα γραμμένα τόσο στο μοντέλο κοινού χώρου διευθύνσεων όσο και στο μοντέλο μεταβίβασης μηνυμάτων αυτό που αλλάζει στις δύο περιπτώσεις είναι ο τρόπος που γίνεται η επικοινωνία μεταξύ των οντοτήτων εκτέλεσης ώστε να διαμοιραστεί ο υπολογιστικός φόρτος, να συντονιστούν οι υπολογισμοί και να συλλεχθούν στο τέλος τα επιμέρους αποτελέσματα. Ο όρος «εργασία» αναφέρεται σε ένα τμήμα υπολογισμού που μπορεί να εκτελεστεί παράλληλα και ανεξάρτητα με τα υπόλοιπα. Κάθε οντότητα εκτέλεσης μπορεί να γίνει αντιληπτή ως ένα σύνολο εργασιών που εκτελούνται στον ίδιο επεξεργαστή σειριακά, ενώ συνήθως ο προγραμματιστής κατασκευάζει τόσες οντότητες όσοι είναι οι διαθέσιμοι επεξεργαστές. 14

15 Τρόπος Επικοινωνίας (2/2) Η ανάθεση εργασιών σε οντότητες εκτέλεσης είναι πολύ σημαντική γιατί πρέπει να ισοκατανέμεται ο φόρτος μεταξύ των επεξεργαστών, δηλαδή κάθε οντότητα να εκτελεί περίπου ίδιο όγκο υπολογισμών, και σχετιζόμενες εργασίες να ανατίθενται στην ίδια οντότητα ώστε να ελαχιστοποιείται η ανάγκη επικοινωνίας μεταξύ διαφορετικών επεξεργαστών (πολυπολογιστές) ή επεξεργαστών και μνήμης (πολυεπεξεργαστές). Η διάσπαση σε εργασίες είναι επίσης σημαντική και μπορεί να γίνει με πολλούς τρόπους, ανάλογα με το εκάστοτε πρόβλημα. Συνήθως υπάρχει μία κύρια οντότητα εκτέλεσης η οποία δημιουργεί τις υπόλοιπες όταν χρειάζεται και στο τέλος συλλέγει τα αποτελέσματα των υπολογισμών τους. 15

16 Παραλληλοποίηση και νήματα (1/2) Το μοντέλο προγραμματισμού του OpenMP είναι βασισμένο στο πολυνηματικό μοντέλο παραλληλισμού (multi-thread). Tο πρόγραμμα χωρίζεται σε παράλληλα και σειριακά μέρη. Αρχικά, μία εφαρμογή σε OpenMP ξεκινά με ένα μόνο νήμα, το οποίο ονομάζεται master thread. Όταν το πρόγραμμα εισέρχεται σε μία περιοχή που έχει ορίσει ο προγραμματιστής να εκτελεστεί παράλληλα (παράλληλη περιοχή), τότε δημιουργούνται αρκετά νήματα (fork-join μοντέλο) και το μέρος του κώδικα που βρίσκεται μέσα στη παράλληλη περιοχή εκτελείται παράλληλα. Όταν ολοκληρωθεί ο υπολογισμός της παράλληλης περιοχής όλα τα νήματα τερματίζουν και συνεχίζει μόνο το master thread. 16

17 Παραλληλοποίηση Το OpenMP δεν μπορεί να εγγυηθεί ότι σε μία παράλληλη εκτέλεση ενός κώδικα η είσοδος και η έξοδος είναι συγχρονισμένη. Ο συγχρονισμός των νημάτων είναι ευθύνη του προγραμματιστή. Το OpenMP παρέχει αρκετές οδηγίες και συναρτήσεις συγχρονισμού, και πρέπει να χρησιμοποιηθούν σωστά από τον προγραμματιστή. και νήματα (2/2) 17

18 Μοντέλο Μνήμης Το μοντέλο μνήμης του OpenMP είναι ένα χαλαρό μοντέλο μοιραζόμενης μνήμης. Όλα τα νήματα έχουν πρόσβαση στη κύρια μνήμη. Κάθε νήμα μπορεί να έχει μια προσωρινή άποψη (temporary view) της μνήμης. Με αυτόν τον τρόπο αποφεύγεται η συνεχής προσπέλαση στη μνήμη. Επίσης κάθε νήμα έχει και την ιδιωτική του μνήμη (thread-private memory), όπου τα υπόλοιπα νήματα δεν έχουν πρόσβαση. Επιγραμματικά στο OpenMP ισχύουν τα εξής: Σε μια οδηγία παραλληλισμού μπορεί ορίζονται μοιραζόμενες και ιδιωτικές μεταβλητές. Κάθε αναφορά σε μοιραζόμενη μεταβλητή είναι μία αναφορά στην ίδια την μεταβλητή, ενώ μια αναφορά σε ιδιωτική μεταβλητή είναι μια αναφορά σε ένα τοπικό αντίγραφο στην ιδιωτική μνήμη του νήματος. Για την προσπέλαση των μοιραζόμενων μεταβλητών από διαφορετικά νήματα απαιτείται συγχρονισμός. Σε περίπτωση εμφωλευμένων οδηγιών παραλληλισμού μία μεταβλητή που είναι ιδιωτική στην εξωτερική παράλληλη περιοχή, μπορεί να είναι μοιραζόμενη στην εσωτερική παράλληλη περιοχή, εκτός αν έχει οριστεί στην εσωτερική οδηγία ως ιδιωτική. 18

19 Σύνταξη Οι περισσότερες οδηγίες στο OpenMP είναι οδηγίες προς τον compiler και η σύνταξη τους έχει την ακόλουθη μορφή: C/C++ #pragma omp directive-name [clauses...] Fortran C$OMP directive-name [clauses ]!$OMP directive-name [clauses ] *$OMP directive-name [clauses ] Επομένως είναι δυνατή η αγνόηση τους από τον compiler. 19

20 Μοντέλο εκτέλεσης #include <omp.h> main () { int var1, var2, var3; Serial code... Beginning of parallel section. Fork a team of threads. Specify variable scoping. #pragma omp parallel private(var1, var2) shared(var3) { Parallel section executed by all threads... All threads join master thread and disband Resume serial code... 20

21 Directive parallel (1/2) #pragma omp parallel [clause...] newline if (scalar_expression) private (list) shared (list) default (shared none) firstprivate (list) reduction (operator: list) copyin (list) num_threads (integer-expression) structured_block 21

22 Directive parallel (2/2) Όταν ένα νήμα φτάσει σε μια οδηγία παράλληλης περιοχής, δημιουργεί μια ομάδα από νήματα και το ίδιο γίνεται ο master της ομάδας. Ο master είναι κι ο ίδιος μέλος της ομάδας. Ο κώδικας της παράλληλης περιοχής αντιγράφεται τόσες φορές όσα τα νήματα και δίδεται σε αυτά για να τον εκτελέσουν. Κάθε νήμα μπορεί να φτάσει σε οποιοδήποτε σημείο μέσα στη παράλληλη περιοχή, σε ακαθόριστη χρονική στιγμή. Στο τέλος της παράλληλης περιοχής υπονοείται ένα φράγμα, πέρα από το οποίο μόνο ο master θα συνεχίσει την εκτέλεση του προγράμματος. Το OpenMP παρέχει τη δυνατότητα δημιουργίας παράλληλης περιοχής μέσα σε μια άλλη παράλληλη περιοχή (τακτική που πρέπει γενικά να αποφεύγεται). Η φωλιασμένη αυτή παράλληλη περιοχή, καταλήγει στη δημιουργία μιας καινούριας ομάδας από νήματα η οποία αποτελείται εξ' ορισμού από ένα νήμα. Ωστόσο, διάφορες υλοποιήσεις μπορούν να επιτρέψουν παραπάνω από ένα νήμα σε μια φωλιασμένη παράλληλη περιοχή. 22

23 Hello world program (1/3) Σειριακό πρόγραμμα σε C #include <stdio.h> int main() { printf( Hello world!! ); To μεταγλωτίζουμε και δημιουργούμε το εκτελέσιμο. Το εκτελούμε και παρατηρούμε ότι το μήνυμα εμφανίζεται μία φορά στην οθόνη. 23

24 Hello world program (2/3) Παραλληλοποίηση του hello world #include <omp.h> #include <stdio.h> int main (int argc, char *argv[]) { #pragma omp parallel { int tid=omp_get_thread_num(); printf("hello world from thread %d\n", tid); return 0; To κάνουμε εκτελέσιμο με την εντολή gcc -fopenmp hello.c -o hello.out 24

25 Hello world program (3/3) Εκτελούμε το παράλληλο πρόγραμμα με./hello.out και βλέπουμε ότι το μήνυμα εμφανίζεται δύο φορές ενώ υπάρχει μία φορά στο κώδικα μας και δεν υπάρχει βρόγχος επανάληψης. Φυσικά αν έχουμε μόνο ένα πυρήνα δεν θα δούμε καμία διαφορά. Η εντολή #pragma omp parallel αντιλαμβάνεται από το μεταγλωτιστή gcc σαν σχόλιο αν δεν υπάρχει η εντολή fopenmp κατά τη μεταγλώττιση, πράγμα που επιτρέπει ένα πρόγραμμα που γράφουμε να είναι portable. 25

26 Διαμοιρασμός Εργασίας (1/2) Μια οδηγία διαμοιρασμού εργασίας κατανέμει την εκτέλεση του κώδικα που περικλείεται στην παράλληλη περιοχή μεταξύ των νημάτων της περιοχής. Οι οδηγίες διαμοιρασμού εργασίας δεν δημιουργούν καινούρια νήματα και δεν υπάρχει κάποιος συγχρονισμός κατά την είσοδο σε μια τέτοια οδηγία, υπάρχει όμως συγχρονισμός κατά την έξοδο. Υπάρχουν τρεις τύποι οδηγιών διαμοιρασμού εργασίας: FOR: Διαμοιράζει τις επαναλήψεις ενός βρόχου for στα νήματα της τρέχουσας παράλληλης περιοχής. Αντιστοιχεί στο μοντέλο Παραλληλισμού Δεδομένων (Data Parallelism). 26

27 Διαμοιρασμός Εργασίας (2/2) SECTIONS: Διαμοιράζει την εργασία σε διακριτά δομικά blocks. Κάθε block εκτελείται από ένα νήμα. Αντιστοιχεί στο μοντέλο Συναρτησιακού Παραλληλισμού (Functional Parallelism). SINGLE: Σειριοποιεί ένα τμήμα του κώδικα ώστε να εκτελεστεί υποχρεωτικά από ένα νήμα. 27

28 Directive for #pragma omp for [clause...] newline schedule (type [,chunk]) ordered private (list) firstprivate (list) lastprivate (list) shared (list) reduction (operator: list) collapse (n) nowait for_loop Όλα τα νήματα θα εκτελέσουν το ίδιο τμήμα κώδικα, αλλά σε διαφορετικά δεδομένα. 28

29 Directive sections #pragma omp sections [clause...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait Καθορίζει ότι τα εσωκλειώμενα τμήματα κώδικα θα διαμοιραστούν μεταξύ των νημάτων της ομάδας. Ακολουθεί πρόγραμμα που δείχνει διαφορετικά blocks να εκτελούνται από διαφορετικά νήματα. Ένα νήμα υλοποιεί πρόσθεση και το άλλο πολλαπλασιασμό. 29

30 Παράδειγμα sections void QuickSort (int numlist[], int nlower, int nupper) { if (nlower < nupper) { // create partitions int nsplit = Partition (numlist,nlower,nupper); #pragma omp parallel sections { #pragma omp section QuickSort(numList,nLower, nsplit - 1); #pragma omp section QuickSort(numList, nsplit + 1,nUpper); 30

31 Directive Single #pragma omp single [clause...] newline private (list) firstprivate (list) nowait structured_block Η οδηγία single καθορίζει ότι ο κώδικας που εσωκλείεται από αυτή, θα εκτελεστεί μόνο από ένα νήμα. Το νήμα που θα φτάσει πρώτο στην single οδηγία, αυτό θα εκτελέσει τον κώδικα. 31

32 Directive Parallel For #pragma omp parallel for [clause[[,] clause]...]new-line for-loop Η οδηγία omp parallel for συνδυάζει τις οδηγίες omp parallel και omp for. 32

33 Υπολογισμός π (σειριακά) Σειριακό πρόγραμμα #define N double pi = 0.0, W = 1.0/N; main() { int i; for (i = 0; i < N; i++) pi += 4*W / (1 + (i+0.5)*(i+0.5)*w*w); printf("pi = %.10lf\n", pi); 33

34 Υπολογισμός π (παράλληλα) Παράλληλο πρόγραμμα #include <omp.h> #define N double pi = 0.0, W = 1.0/N; main () { int i; #pragma omp parallel for reduction(+:sum) for (i=0; i < N; i++) pi += 4*W / (1 + (i+0.5)*(i+0.5)*w*w); printf("pi = %.10lf\n", pi); 34

35 Directive Parallel Sections #pragma omp parallel sections [clause[ [, ]clause]...]new-line { [#pragma omp section new-line] structured-block [#pragma omp section new-line structured-block ]... 35

36 Directive Task (1/2) Η παραλληλοποίηση με χρήση tasks ξεκίνησε να υποστηρίζεται από το OpenMP στο τελευταίο πρότυπο (OpenMP 3.0) May Παρέχει τη δυνατότητα παραλληλοποίησης για εφαρμογές που παράγουν δουλειά δυναμικά. Παρέχει ένα ευέλικτο μοντέλο για μη κανονικό (irregular) παραλληλισμό. Ευκαιρίες για παραλληλισμό σε: While loops. Recursive structures. 36

37 Directive Task (2/2) #pragma omp task [clause[ [, ]clause]...] new-line structured-block if(scalar-expression) untied default(shared none) private(list) firstprivate(list) shared(list) Το thread που συναντά ένα #pragma omp task directive δημιουργεί ένα task με τον κώδικα που περιέχει το structured-block και το βάζει σε ένα task pool. 37

38 Task 38

39 Directives barrier/flush Οδηγία BARRIER: Η οδηγία barrier συγχρονίζει όλα τα νήματα της ομάδας απαιτώντας από κάθε νήμα να σταματήσει, προσωρινά την εκτέλεσή του, στο σημείο όπου υπάρχει η οδηγία barrier οδηγία, μέχρις ότου όλα τα νήματα φτάσουν σε αυτό το σημείο. #pragma omp barrier newline Οδηγία FLUSH: Η οδηγία flush καθορίζει ένα σημείο συγχρονισμού στο οποίο η υλοποίηση του κώδικα πρέπει να παρέχει ένα συνεπές στιγμιότυπο της μνήμης. #pragma omp flush (var1, var2,...) newline 39

40 Directives critical/master Οδηγία CRITICAL: Η οδηγία critical καθορίζει μια περιοχή η οποία πρέπει να εκτελεστεί μόνο από ένα νήμα κάθε φορά. Κυρίως χρησιμοποιείται για να ορίσουμε μια κρίσιμη περιοχή (critical region). Σε μια κρίσιμη περιοχή, μόνο μια διεργασία μπορεί να γράψει ή να διαβάσει μια μοιραζόμενη μεταβλητή διασφαλίζοντας έτσι την ακεραιότητα αυτής της μεταβλητής. #pragma omp critical [ name ] newline Οδηγία MASTER: Η οδηγία αυτή ορίζει ένα τμήμα κώδικα το οποίο θα εκτελεστεί από το master thread μόνο. #pragma omp master newline 40

41 Παράδειγμα barrier/master #pragma omp parallel { #pragma omp barrier #pragma omp master gettimeofday(start,(struct timezone*)null); work(); #pragma omp barrier #pragma omp master { gettimeofday(finish,(struct timezone*)null); print_stats(start,finish); 41

42 Directives atomic/ordered Οδηγία ATOMIC: Η οδηγία atomic καθορίζει ότι η συγκεκριμένη θέση μνήμης πρέπει να ενημερώνεται ατομικά (atomic action), μην επιτρέποντας πολλά νήματα να ενημερώσουν ταυτόχρονα τη συγκεκριμένη θέση μνήμης #pragma omp atomic newline Οδηγία ORDERED: Η οδηγία ordered καθορίζει ότι οι επαναλήψεις του εσωκλειώμενου βρόγχου θα εκτελεστούν με τη σειρά όπως θα εκτελούνταν σε ένα σειριακό υπολογιστή. #pragma omp for ordered [clauses...] #pragma omp ordered newline 42

43 Παράδειγμα directives void ordered_example(int lb, int ub, int stride) { int i; #pragma omp parallel for ordered schedule(dynamic) for (i=lb; i<ub; i+=stride) work(i); void work(int k) { #pragma omp ordered printf(" %d\n", k); int main() { ordered_example(0, 100, 5); return 0; 43

44 Directives threadprivate/taskwait Οδηγία THREADPRIVATE: Καθορίζει ότι καθολικά αντικείμενα (ή μεταβλητές) μπορούν να γίνουν ιδιωτικά για κάποιο νήμα αλλά καθολικό μέσα στο νήμα. Με αυτό τον τρόπο, μπορούμε να ορίσουμε καθολικά αντικείμενα, αλλά να μετατρέψουμε την εμβέλειά τους και να τα κάνουμε τοπικά για κάποιο νήμα. Οι μεταβλητές για τις οποίες ισχύει η οδηγία threadprivate συνεχίζουν να είναι ιδιωτικές, για κάθε νήμα, ακόμα και σε διαφορετικές παράλληλες περιοχές #pragma omp threadprivate Οδηγία TASKWAIT: Το τρέχον task σταματά την εκτέλεσή του μέχρι όλα τα tasks που έχουν δημιουργηθεί μέχρι στιγμής από το τρέχον (παιδιά) να ολοκληρώσουν την εκτέλεσή τους #pragma omp taskwait 44

45 Tasks Προσοχή στις έννοιες δημιουργία / εκτέλεση task! Κάθε task μπορεί να εκτελεστεί από ένα από τα threads της ομάδας που το δημιούργησε. Κάθε thread της ομάδας δημιουργεί ένα αρχικό (implicit) task Άρα κάθε λειτουργία σχετική με tasks έχει νόημα μόνο σε παράλληλες περιοχές. Όταν ξεκινήσει η εκτέλεση ενός task by default είναι προσδεμένο (tied) με ένα thread. Ένα task μπορεί να αναστείλει την εκτέλεσή του (suspend) και να εκκινήσει (start) ή να συνεχίσει (resume) κάποιο άλλο task. Ένα task αναστέλλει τη λειτουργία του όταν υποχρεωθεί να εκτελέσει ένα άλλο task (βλ. If (0)) ή αν συναντήσει ένα taskwait. 45

46 Παράδειγμα task void foo () { int a, b, c, x, y; #pragma omp parallel { #pragma omp single //serial creation of tasks { #pragma omp task shared (a) a = A(); #pragma omp task shared (b, c, x) { #pragma omp task shared (b) b = B(); #pragma omp task shared (c) c = C(); #pragma omp taskwait #pragma omp task x = f1 (b, c); #pragma omp taskwait #pragma omp task y = f2 (a, x); 46

47 Sections VS Tasks (1/3) Η εντολή sections περιγράφει ένα σύνολο από ενότητες (sections) οι οποίες θα διαμοιραστούν ανάμεσα στα νήματα. Κάθε ενότητα εκτελείται μόνο μια φορά από ένα νήμα. Έστω ότι έχουμε 1 νήμα. Στο παράδειγμα που βλέπουμε, το πρώτο θα πάρει το πρώτο section και όταν τελειώσει θα πάρει το δεύτερο. Αν είχαμε περισσότερα από 2 νήματα τότε τα δυο πρώτα θα έπαιρναν από ένα section και τα υπόλοιπα απλά θα περίμεναν. #pragma omp sections { #pragma omp section foo(); #pragma omp section bar(); 47

48 Sections VS Tasks (2/3) Οι εργασίες είναι στην ουρά και εκτελούνται όποτε είναι δυνατό. Κατά τη διάρκεια της εκτέλεσης επιτρέπεται τα task να αλλάζουν threads, ακόμα και στο μέσο χρόνο της ζωής τους. Ένα task μπορεί να αρχίσει να εκτελείται σε ένα νήμα, και σε κάποια στιγμή (ακόμα και στη μέση της ζωής του) μπορεί να αρχίσει να εκτελείται σε άλλο νήμα. Το taskwait λειτουργεί σαν το barrier αλλά για τις διεργασίες. Διασφαλίζει ότι η τρέχουσα ροή εκτέλεσης θα πρέπει να διακοπεί έως ότου όλα τα task έχουν εκτελεστεί. #pragma omp single nowait { #pragma omp task foo(); #pragma omp task bar(); #pragma omp taskwait 48

49 Sections VS Tasks (3/3) Το thread 1 και 2 αναστέλλει ότι λειτουργία εκτελεί μέχρι εκείνη τη στιγμή και ξεκινά να εκτελεί τα tasks από την ουρά. Μετά την ολοκλήρωση τα thread συνεχίζουν τη λειτουργία που εκτελούσαν πριν. Το thread 0 μπορεί να τελειώσει μετά από την ολοκλήρωση του taskwait. Επίσης το thread 1 μπορεί να έχει τελειώσει την εργασία που εκτελεί ( foo() ) και να ζητήσει και άλλη εργασία ( bar() ), ακόμα και όταν τα άλλα treads δεν είναι σε θέση για να ζητήσουν μια εργασία. 49

50 Clauses (1/3) private(list); Λίστα ιδιωτικών μεταβλητών. shared(list); Λίστα κοινόχρηστων μεταβλητών. default(shared none); Ορίζει ένα προκαθoρισμένο τύπο πρόσβασης για όλες τις μεταβλητές σε μια παράλληλη περιοχή περιοχές του κώδικα. firstprivate (list) Συνδυάζει τη λειτουργία της φράσης PRIVATE με τη δυνατότητα αρχικοποίησης των μεταβλητών κατά την είσοδο στη παράλληλη περιοχή. reduction(operator:list); Ένας τρόπος για να ενώσουμε τα επιμέρους αποτελέσματα που έχουν υπολογίσει τα threads π.χ. reduction(+:sum). 50

51 Reduction Οι REDUCTION μεταβλητές πρέπει να είναι δηλωμένες ως SHARED, πρέπει να είναι βαθμωτές και δεν μπορεί να είναι πίνακες ή δομές. Οι πράξεις αναγωγής μπορεί να μη λειτουργούν παρόμοια σε πραγματικούς αριθμούς. Οι φράσεις REDUCTION μπορεί να έχουν μία απο τις ακόλουθες μορφές: x = x op expr x = expr op x (εκτός από αφαίρεση) x binop = expr x++ ++x x-- --x X: είναι βαθμωτή μεταβλητή στη λίστα. expr: είναι βαθμωτή έκφραση που δεν αναφέρεται στο x. op: δεν είναι υπερφορτωμένος (overloaded), και είναι ένας από τους +, *, -, /, &, ^,, &&, binop: δεν είναι υπερφορτωμένος (overloaded), και είναι ένας από τους +, *, -, /, &, ^, 51

52 Παράδειγμα (reduction) Στην συνέχεια φαίνεται ένα απλό παράδειγμα, όπου κάθε νήμα κάνει κάποιους υπολογισμούς και το μερικό αποτέλεσμα μπαίνει την μοιραζόμενη μεταβλητή result. Επειδή όμως η result είναι στη λίστα της reduction, έχουν δημιουργηθεί τοπικά αντίγραφα και στην ολοκλήρωση των υπολογισμών τα μερικά αποτελέσματα προστίθενται στην result του master thread. #include <omp.h> main () { int i, n, chunk; float a[100], b[100], result; /* Some initializations */ n = 100; chunk = 10; result = 0.0; for (i=0; i < n; i++) { a[i] = i * 1.0; b[i] = i * 2.0; #pragma omp parallel for default(shared) private(i) schedule(static,chunk) reduction(+:result) for (i=0; i < n; i++) result = result + (a[i] * b[i]); printf("final result= %f\n",result); 52

53 Clauses (2/3) copyin (list) Δίνει αρχική τιμή σε threadprivate μεταβλητές. num_threads (integer-expression) Ο αριθμός threads που θα χρησιμοποιηθούν. structured_block Ορισμός του block που θα γίνει η παραλληλοποίηση. untied Κανονικά, ένα task είναι «δεμένο» ( tied ) με το νήμα που θα ξεκινήσει να το εκτελεί δηλαδή θα εκτελεστεί από το νήμα αυτό μέχρι τέλους. Σε ένα ελεύθερο task ( untied ), η εκτέλεσή του μπορεί να διακόπτεται και να συνεχίζει την εκτέλεσή του άλλο νήμα, κλπ. lastprivate Επιπλέον ανάθεση της τελικής τιμής όπως αυτή προβλέπεται από την ακολουθιακή εκτέλεση. 53

54 Clauses (3/3) schedule (type [,chunk]) Πώς θα γίνει ο καταμερισμός των επαναλήψεων. ordered Καθορίζει πως οι επαναλήψεις του loop πρέπει να εκτελεστούν με την σειρά που επιβάλλει ο σειριακός κώδικας. collapse (n) Καθορίζει πόσα επίπεδα από loops θα συσχετιστούν με την δομή διαμοίρασης εργασίας σε loop. nowait Αφαιρεί το barrier. Εξ ορισμού υπονοείται barrier στο τέλος του omp for. copyprivate Χρησιμοποιείται για την διανομή τιμών μεταβλητής από ένα νήμα σε όλα τα αντίγραφα της μεταβλητής στα υπόλοιπα νήματα. 54

55 firstprivate VS lastprivate Η φράση firstprivate χρησιμοποιείται με τον ίδιο τρόπο όπως και η private. Η μεταβλητή που έχει δηλωθεί ως firstprivate, αρχικοποιείται στην τιμή που είχε πριν από το τμήμα κώδικα, αμέσως μετά τη νέα δήλωσή της. Έτσι η μεταβλητή φέρει την ίδια τιμή, αλλά με το τέλος του μπλοκ κώδικα οποιαδήποτε αλλαγή σε αυτή την τιμή χάνεται, γιατί ο κώδικας φεύγει από την ορατότητά της. Το firstprivate χρησιμοποιείται στις οδηγίες for, parallel, sections, single. Η φράση lastprivate συναντάται μόνο σε οδηγίες for και sections και είναι αντίστοιχη με τη firstprivate. Η διαφορά είναι ότι η μεταβλητή δηλώνεται ξανά μέσα στο μπλοκ κώδικα, και όταν αυτό τελειώσει, ενημερώνει την τιμή της μέχρι τότε σκιασμένης μεταβλητής. Το lastprivate χρησιμοποιείται στις οδηγίες for, sections. 55

56 Παράδειγμα (1/2) int A, B, C; A = B = C = 1; #pragma omp parallel shared(a) private(b) firstprivate(c) { #pragma omp single A++; B++; C++; printf( %d, %d, %d, A,B,C); printf( %d, %d, %d, A,B,C); Μέσα στο παράλληλο τμήμα θα τυπωθεί : 2 (ή 1), <τυχαία τιμή>, 2 Μετά το παράλληλο τμήμα θα τυπωθεί: 2, 1, 1 56

57 copyin VS copyprivate Η φράση copyin ακολουθούμενη από μια λίστα μεταβλητών παρέχει ένα μηχανισμό για την αντιγραφή τιμών από μια μεταβλητή threadprivate του νήματος-αρχηγού σε καθεμία threadprivate μεταβλητή των άλλων μελών της ομάδας νημάτων που εκτελούν μια παράλληλη περιοχή. Το copyin χρησιμοποιείται στις οδηγίες parallel, for, sections Η φράση copyprivate ακολουθούμενη από μια λίστα μεταβλητών παρέχει ένα μηχανισμό για τη χρήση μιας ιδιωτικής μεταβλητής για μεταφορά τιμής από ένα νήμα στα άλλα νήματα της ίδιας ομάδας. Το copyprivate χρησιμοποιείται στην οδηγία single. 57

58 Σύγκριση χρόνων εκτέλεσης for (i = 0; i < Ν; i++) { for (j = 0; j < Ν; j++) for (k = sum = 0; k < N; k++) sum += Α[i][k]*B[k][j]; C[i][j] = sum; Χρόνος: 130msec #pragma omp parallel for private(j,k,sum) for (i = 0; i < Ν; i++) { for (j = 0; j < Ν; j++) for (k = sum = 0; k < N; k++) sum += Α[i][k]*B[k][j]; C[i][j] = sum; Χρόνος: 40msec #pragma omp parallel for for (i = 0; i < Ν; i++) { for (j = 0; j < Ν; j++) for (k = sum = 0; k < N; k++) sum += Α[i][k]*B[k][j]; C[i][j] = sum; Χρόνος: 700msec 58

59 Τι είναι Ρουτίνες Συστήματος Εκτέλεσης Το πρότυπο OpenMP ορίζει ένα API με κλήσεις σε ρουτίνες του συστήματος εκτέλεσης για διάφορες λειτουργίες: Εύρεση/Καθορισμός διαθέσιμων νημάτων/ επεξεργαστών. Κλειδώματα (semaphores). Μέτρηση χρόνου εκτέλεσης. Δυναμική προσαρμογή αριθμού νημάτων κλπ. 59

60 Ρουτίνες Συστήματος OMP_GET_NUM_THREADS: Εκτέλεσης (1/5) Η συνάρτηση αυτή επιστρέφει το πλήθος των νημάτων που εκτελούνται εκείνη τη στιγμή. OMP_SET_NUM_THREADS: Ο αριθμός των νημάτων που δημιουργούνται κατά την είσοδο σε μια παράλληλη περιοχή. OMP_GET_MAX_THREADS: Η συνάρτηση αυτή επιστρέφει την μέγιστη τιμή που η συνάρτηση OMP_GET_NUM_THREADS μπορεί να επιστρέψει. OMP_GET_THREAD_NUΜ: Η συνάρτηση αυτή επιστρέφει τον αριθμό του νήματος που την καλεί. Το master thread έχει την τιμή 0. 60

61 Hello world program 2 (1/2) Στον κώδικα που ακολουθεί φαίνεται ένα απλό παράδειγμα. Αν υποθέσουμε ότι θα δημιουργηθούν πέντε νήματα, τότε στην έξοδο θα είναι το μήνυμα με το "Hello World" πέντε φορές αλλά το μήνυμα για το πλήθος των νημάτων θα το τυπώσει μόνο το master thread, και αυτό γιατί το id του είναι το 0. 61

62 Hello world program 2 (2/2) #include <omp.h> main () { int nthreads, tid; /* Ορίζει μια ομάδα από threads όπου κάθε ένα έχει μια ιδιωτική μεταβλητή tid*/ #pragma omp parallel private(tid) { /* Βρίσκει και τυπώνει το thread id*/ tid = omp_get_thread_num(); printf("hello World from thread = %d\n", tid); /*Μόνο το master thread εκτελεί αυτό το κομμάτι */ if (tid == 0) { nthreads = omp_get_num_threads(); printf("number of threads = %d\n", nthreads); 62

63 Ρουτίνες Συστήματος OMP_GET_NUM_PROCS: Εκτέλεσης (2/5) Με την κλήση της συνάρτησης αυτής μπορούμε να μάθουμε το πλήθος των επεξεργαστών που είναι διαθέσιμοι στο πρόγραμμα. OMP_IN_PARALLEL: Η συνάρτηση αυτή ορίζει αν τη στιγμή της κλήσης της βρισκόμαστε σε παράλληλη ή σειριακή περιοχή. OMP_GET_DYNAMIC: Με τη συνάρτηση αυτή μπορούμε να δούμε αν η δυνατότητα για δυναμικό ορισμό του αριθμού των νημάτων είναι ενεργοποιημένη. OMP_SET_DYNAMIC: Ορίζει αν θα ενεργοποιηθεί ή όχι η δυναμική προσαρμογή του πλήθους των νημάτων. 63

64 Παράδειγμα (ρουτίνες συστήματος) Για να ελεγχθεί ο αριθμός των νημάτων που εκτελούν ένα πρόγραμμα αρχικά απενεργοποιείται το dynamic mode και κατόπιν καθορίζεται ο αριθμός των νημάτων. #include <omp.h> void main() { omp_set_dynamic(0); omp_set_num_threads(4); #pragma omp parallel { int id=omp_get_thread_num(); do_lots_of_stuff(id); 64

65 Ρουτίνες Συστήματος OMP_SET_NESTED: Εκτέλεσης (3/5) Με τη συνάρτηση αυτή μπορούμε να ενεργοποιήσουμε και να απενεργοποιήσουμε τη δυνατότητα για ένθετο παραλληλισμό. OMP_GET_NESTED: Εξετάζει αν επιτρέπεται ένθετος παραλληλισμός ή όχι. OMP_SET_SCHEDULE: Θέτει τον τρόπο διαμοίρασης εργασίας σε νήματα. OMP_GET_SCHEDULE: Επιστρέφει τον τρόπο διαμοίρασης εργασίας σε νήματα και το μέγεθος του chunk. 65

66 Ρουτίνες Συστήματος OMP_GET_THREAD_LIMIT: Εκτέλεσης (4/5) Επιστρέφει τον μέγιστο αριθμό των νημάτων που είναι διαθέσιμα στο πρόγραμμα. OMP_SET_MAX_ACTIVE_LEVELS: Θέτει το μέγιστο βάθος που επιτρέπεται για δημιουργία εμφωλιασμένο παραλληλισμό. OMP_GET_MAX_ACTIVE_LEVELS: Επιστρέφει το μέγιστο βάθος που επιτρέπεται για δημιουργία εμφωλιασμένο παραλληλισμό. INT OMP_GET_LEVEL: Επιστρέφει το πλήθος των εμφωλιασμένων δομών parallel για το έργο που καλεί την συνάρτηση. 66

67 OMP_GET_THREAD_LIMIT: Ρουτίνες Συστήματος Εκτέλεσης (5/5) Επιστρέφει το μέγιστο πλήθος νημάτων που μπορεί να χρησιμοποιήσει το πρόγραμμα. INT OMP_GET_ANCESTOR_THREAD_NUM: Επιστρέφει για το τρέχον νήμα τον αριθμό του νήματος-προγόνου στο επίπεδο εμφωλιασμού. OMP_GET_TEAM_SIZE: Επιστρέφει το πλήθος των νημάτων που αποτελούν την ομάδα στο επίπεδο εμφωλιασμού. OMP_GET_ACTIVE_LEVEL: Επιστρέφει το πλήθος των εμφωλιασμένων δομών parallel για το έργο που καλεί την συνάρτηση. 67

68 Ρουτίνες Συστήματος OMP_INIT_LOCK: Εκτέλεσης Lock (1/3) Αρχικοποιεί μια κλειδαριά στην οποία αναφέρεται ο δείκτης lock. OMP_INIT_NEST_LOCK: Η αρχική κατάσταση της κλειδαριάς είναι unlock. OMP_DESTROY_LOCK: Καταστρέφει την κλειδαριά στην οποία αναφέρεται ο δείκτης lock. OMP_DESTROY_NEST_LOCK: Απαγορεύεται να κληθεί αυτή η συνάρτηση με μεταβλητή lock η οποία δεν έχει αρχικοποιηθεί. 68

69 OMP_SET_LOCK: Ρουτίνες Συστήματος Εκτέλεσης Lock (2/3) Αναγκάζει το νήμα που εκτελείται να περιμένει μέχρις ότου η κλειδαριά στην οποία δείχνει το lock, να γίνει διαθέσιμη. OMP_SET_NEST_LOCK: Απαγορεύεται να κληθεί αυτή η συνάρτηση με μεταβλητή lock η οποία δεν έχει αρχικοποιηθεί. OMP_UNSET_LOCK: Αποδεσμεύει τη κλειδαριά από το νήμα που την χρησιμοποιούσε. OMP_UNSET_NEST_LOCK: Απαγορεύεται να κληθεί αυτή η συνάρτηση με μεταβλητή lock η οποία δεν έχει αρχικοποιηθεί. 69

70 OMP_TEST_LOCK: Ρουτίνες Συστήματος Εκτέλεσης Lock (3/3) Προσπαθεί να αρχικοποιήσει μια κλειδαριά, αλλά δεν κάνει block το νήμα που εκτελεί αυτή τη συνάρτηση, ακόμα κι αν η κλειδαριά δεν είναι διαθέσιμη. Επιστρέφει 1 αν η κλειδαριά έχει αρχικοποιηθεί επιτυχώς και 0 σε αντίθετη περίπτωση. OMP_TEST_NEST_LOCK: Απαγορεύεται να κληθεί αυτή η συνάρτηση με μεταβλητή lock η οποία δεν έχει αρχικοποιηθεί. 70

71 Ρουτίνες Συστήματος Εκτέλεσης Time OMP_GET_WTIME: Ρουτίνα για τη μέτρηση χρόνου εκτέλεσης (wall clock όχι CPU). OMP_GET_WTICK: Η τιμή που επιστρέφει ισούται με τον αριθμό των δευτερολέπτων μεταξύ δύο διαδοχικών παλμών ρολογιού, του χρονομέτρου που χρησιμοποιεί η omp_get_time. 71

72 Omp_get_time Σύνταξη: t_start = omp_get_wtime(); #pragma omp parallel {... t_end = omp_get_wtime() - t_start 72

73 Παράδειγμα (omp_get_wtime) (1/2) #include <stdio.h> #include <omp.h> long STEPS = ; #define NUM_THREADS 5 int main (int argc, char *argv[]) { int i; double step, x, sum, pi = 0; double start, total; start = omp_get_wtime(); step = 1.0 /(double) STEPS; omp_set_num_threads(num_threads); #pragma omp parallel for reduction (+:sum) private(x) for (i=0;i<steps; i++){ x = (i+0.5)*step; sum = sum + 4.0/(1.0+x*x); pi = step * sum; total = omp_get_wtime() - start; printf(" pi: %lf\n steps = %ld\n num_threads = %d\n",pi, STEPS, NUM_THREADS); printf("total time = %lf \n", total); return 0; 73

74 Παράδειγμα (omp_get_wtime) (2/2) Ο παραπάνω κώδικας εμφανίζει τα εξής αποτελέσματα: 74

75 Παράδειγμα (lock) #include <omp.h> omp_lock_t *new_locks() { int i; omp_lock_t *lock = new omp_lock_t[1000]; #pragma omp parallel for private(i) for (i=0; i<1000; i++) omp_init_lock(&lock[i]); return lock; 75

76 Τι Είναι Μεταβλητές Περιβάλλοντος Το OpenMP παρέχει μια σειρά μεταβλητών περιβάλλοντος που βοηθούν στην εκτέλεση του παράλληλου κώδικα. Τα ονόματα των μεταβλητών γράφονται πάντα σε κεφαλαία. Επηρεάζουν τις τιμές των εσωτερικών μεταβλητών. Αλλαγές στις μεταβλητές περιβάλλοντος μετά την έναρξη εκτέλεσης ενός προγράμματος αγνοούνται. Ακόμα και αν γίνουν από το ίδιο το πρόγραμμα. 76

77 Μεταβλητές Περιβάλλοντος schedule (1/3) OMP_SCHEDULE: Η τιμή αυτής της μεταβλητής καθορίζει το τρόπο εκτέλεσης των επαναλήψεων. Η τιμή της μεταβλητής έχει την μορφή: type[,chunk] To type μπορεί να είναι: static, dynamic, guided, auto, runtime. To chunk είναι προαιρετικό. Καθορίζει το μέγεθος κάθε chunk: export OMP_SCHEDULE= guided,4 77

78 Μεταβλητές Περιβάλλοντος schedule (2/3) OMP_SCHEDULE: static: round-robin στατική κατανομή. dynamic: δυναμική κατανομή σε ανενεργά νήματα. guided: δυναμική κατανομή με εκθετική μείωση. auto: ο προγραμματιστής δίνει στην εφαρμογή την «ελευθερία» να επιλέξει οποιαδήποτε πιθανή χαρτογράφηση. runtime: η απόφαση σχεδιασμού αναβάλλεται μέχρι να αρχίσει να εκτελείται το πρόγραμμα. 78

79 Μεταβλητές Περιβάλλοντος schedule (3/3) Το παρακάτω σχήμα δείχνει πως θα γίνει η κατανομή των επαναλήψεων σε κάθε νήμα στην περίπτωση που έχουμε 500 επαναλήψεις και 4 threads. 79

80 Παράδειγμα (1/3) int main( ) { int nstatic1[num_loops], nstaticn[num_loops]; int ndynamic1[num_loops], ndynamicn[num_loops]; int nguided[num_loops]; omp_set_num_threads(num_threads); #pragma omp parallel { #pragma omp for schedule(static, 1) for (int i = 0 ; i < NUM_LOOPS ; ++i) { if ((i % SLEEP_EVERY_N) == SLEEP_EVERY_N) Sleep(0); nstatic1[i] = omp_get_thread_num( ); #pragma omp for schedule(static, STATIC_CHUNK) for (int i = 0 ; i < NUM_LOOPS ; ++i) { if ((i % SLEEP_EVERY_N) == SLEEP_EVERY_N) Sleep(0); nstaticn[i] = omp_get_thread_num( ); #pragma omp for schedule(dynamic, 1) for (int i = 0 ; i < NUM_LOOPS ; ++i) { I if ((i % SLEEP_EVERY_N) == SLEEP_EVERY_N) Sleep(0); ndynamic1[i] = omp_get_thread_num( ); 80

81 Παράδειγμα (2/3) #pragma omp for schedule(dynamic, DYNAMIC_CHUNK) for (int i = 0 ; i < NUM_LOOPS ; ++i) { if ((i % SLEEP_EVERY_N) == SLEEP_EVERY_N) Sleep(0); ndynamicn[i] = omp_get_thread_num( ); #pragma omp for schedule(guided) for (int i = 0 ; i < NUM_LOOPS ; ++i) { if ((i % SLEEP_EVERY_N) == SLEEP_EVERY_N) Sleep(0); nguided[i] = omp_get_thread_num( ); printf_s(" \n"); printf_s(" static static dynamic dynamic guided \n"); printf_s(" 1 %d 1 %d \n", STATIC_CHUNK, DYNAMIC_CHUNK); printf_s(" \n"); for (int i=0; i<num_loops; ++i) { printf_s(" %d %d %d %d " " %d \n", nstatic1[i], nstaticn[i], ndynamic1[i], ndynamicn[i], nguided[i]); printf_s(" \n"); 81

82 Παράδειγμα (3/3) Η έξοδος του παραπάνω παραδείγματ ος φαίνεται δίπλα. 82

83 Μεταβλητές Περιβάλλοντος num_threads-dynamic-nested OMP_NUM_THREADS: Ελέγχει το πλήθος των νημάτων που δημιουργούνται σε μια δομή parallel. Η τιμή της μεταβλητής πρέπει να είναι ένας θετικός ακέραιος export OMP_NUM_THREADS=16 OMP_DYNAMIC: Ελέγχει την δυνατότητα δυναμικής προσαρμογής του πλήθους των νημάτων που χρησιμοποιούνται σε μια δομή parallel export OMP_DYNAMIC=true OMP_NESTED: Επιτρέπει ή απαγορεύει ένθετο παραλληλισμό, αν το επιτρέπει η υλοποίηση. export OMP_NESTED=true 83

84 Μεταβλητές Περιβάλλοντος OMP_STACKSIZE: stacksize-wait_policy Ελέγχει το μέγεθος στοίβας των (non-master) νημάτων. export OMP_STACKSIZE= B export OMP_STACKSIZE=3000k OMP_WAIT_POLICY: Ορίζει αν η αναμονή των νημάτων στην οδηγία wait θα είναι ενεργός (busy waiting) ή όχι. export OMP_WAIT_POLICY=ACTIVE export OMP_WAIT_POLICY=PASSIVE 84

85 Μεταβλητές Περιβάλλοντος thread_limit-max_active_levels OMP_THREAD_LIMIT: Ορίζει το μέγιστο αριθμό νημάτων που μπορεί να χρησιμοποιήσει ένα πρόγραμμα OpenMP. export OMP_THREAD_LIMIT=200 OMP_MAX_ACTIVE_LEVELS: Ελέγχει το μέγιστο επιτρεπτό βαθμό εμφωλιασμένου παραλληλισμού. export OMP_MAX_ACTIVE_LEVEL=4 85

86 Παράδειγμα (parallel firstprivate) #include <assert.h> int A[2][2] = {1, 2, 3, 4; void f(int n, int B[n][n], int C[]) { int D[2][2] = {1, 2, 3, 4; int E[n][n]; assert(n >= 2); E[1][1] = 4; int main() { f(2, A, A[0]); return 0; #pragma omp parallel firstprivate(b, C, D, E) { assert(sizeof(b) == sizeof(int (*)[n])); assert(sizeof(c) == sizeof(int*)); assert(sizeof(d) == 4 * sizeof(int)); assert(sizeof(e) == n * n * sizeof(int)); /* Private B and C have values of original B and C. */ assert(&b[1][1] == &A[1][1]); assert(&c[3] == &A[1][1]); assert(d[1][1] == 4); assert(e[1][1] == 4); 86

87 Παράδειγμα (1/3) #include <stdio.h> #include <omp.h> int main() { omp_set_dynamic(1); omp_set_num_threads(10); #pragma omp parallel // parallel region 1 { #pragma omp single printf("num threads in dynamic region is = %d\n", omp_get_num_threads()); printf("\n"); omp_set_dynamic(0); omp_set_num_threads(10); #pragma omp parallel // parallel region 2 { #pragma omp single printf("num threads in non-dynamic region is = %d\n", omp_get_num_threads()); printf("\n"); 87

88 Παράδειγμα (2/3) omp_set_dynamic(1); omp_set_num_threads(10); #pragma omp parallel // parallel region 3 { #pragma omp parallel { #pragma omp single printf("num threads in nesting disabled region is = %d\n", omp_get_num_threads()); printf("\n"); omp_set_nested(1); #pragma omp parallel // parallel region 4 { #pragma omp parallel { #pragma omp single printf("num threads in nested region is = %d\n", omp_get_num_threads()); 88

89 Παράδειγμα (3/3) Ο παρακάτω κώδικας εμφανίζει: Num threads in dynamic region is = 2 Num threads in non-dynamic region is = 10 Num threads in nesting disabled region is = 1 Num threads in nesting disabled region is = 1 Num threads in nested region is = 2 Num threads in nested region is = 2 89

90 Ολοκλήρωση Τραπεζίου (1/2) Το παρακάτω πρόγραμμα υπολογίζει το ολοκλήρωμα από 1 έως 4 της συνάρτησης f ( x )= (3x)^ int main(int argc, char** argv) { int n,thread_count; float a=1, b=4, global_result=0.0; printf("dwse ton aritho twn trapeziwn : \n"); scanf("%d",&n); # pragma omp parallel num_threads(thread_count) trap(a,b,n,&global_result); printf("oloklhrwma : %f\n",global_result); return 0; float f(float x) { return ((3*x*x)+1); 90

91 Ολοκλήρωση Τραπεζίου (2/2) void trap(float a2,float b2, int n2,float* result ) { float interg,x,h,n,a,b; int i, nthreads, thread_count; nthreads = omp_get_thread_num(); thread_count = omp_get_num_threads(); h=(b2-a2)/n2 ; n=n2/thread_count; a=a2+nthreads*n*h; b=a+n*h; interg=(f(a)+f(b))/2.0; for(i=1;i<=n-1;i++) { x=a+i*h; interg=interg+f(x); interg= interg*h; #pragma omp critical *result+=interg; 91

92 OpenMP compilers GCC: ICC: Υποστήριξη tasks από την έκδοση 4.3.x (όμως άσχημη υλοποίηση). Καλή υλοποίηση από έκδοση 4.4.x. Intel compiler & tools. Εξαιρετικά εργαλεία, ταχύτατα σειριακά προγράμματα για x86. Έχει εξαγοράσει την Cilk Arts. SUNCC: OMPi : SUN C compiler. Γενικά καλές και σταθερές επιδόσεις, όχι όμως ο καλύτερες. Ανοιχτού κώδικα, πολύ καλές επιδόσεις, επεκτάσεις κ.α. Άλλοι ερευνητικοί, ελεύθερου κώδικα, με όχι πλήρη υποστήριξη OpenMP 3: OpenUH. Mercirium (Nanaos). OdinMP. 92

93 Βιβλιογραφία (1/2) /el.wikipedia.org/wiki/%ce%a0%ce%b1%cf%81%ce%ac%ce%bb%ce%bb%ce%b7%ce %BB%CE%BF%CF%82_%CF%80%CF%81%CE%BF%CE%B3%CF%81%CE%B1%CE%BC%CE %BC%CE%B1%CF%84%CE%B9%CF%83%CE%BC%CF%8C%CF%82 / Applications_I.pdf /el.scribd.com/doc/ /introduction-to-openmp / Fall2012.pdf / / / / / 93

94 Βιβλιογραφία (2/2) / / /openmp.org/mp-documents/omp-hands-on-sc08.pdf /sc.tamu.edu/shortcourses/sc-openmp/openmpslides_tamu_sc.pdf /msdn.microsoft.com/en-us/magazine/cc aspx 94

95 Τέλος Ενότητας 95

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα: Εισαγωγή στο OpenMP Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

OpenMP. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων

OpenMP. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων OpenMP 9 ο Εξάμηνο Προγραμματισμός σε μοιραζόμενη μνήμη void thread1(int *shared_var) int

Διαβάστε περισσότερα

OpenMP. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων

OpenMP. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων OpenMP 9 ο Εξάμηνο Προγραμματισμός σε μοιραζόμενη μνήμη void thread1(int *shared_var) int

Διαβάστε περισσότερα

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών. OpenMP. Συστήματα Παράλληλης Επεξεργασίας 9 ο Εξάμηνο

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών. OpenMP. Συστήματα Παράλληλης Επεξεργασίας 9 ο Εξάμηνο Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων OpenMP 9 ο Εξάμηνο Προγραμματισμός σε μοιραζόμενη μνήμη void thread1(int *shared_var) void

Διαβάστε περισσότερα

Συστήµατα Παράλληλης Επεξεργασίας. OpenMP

Συστήµατα Παράλληλης Επεξεργασίας. OpenMP OpenMP Προγραµµατισµός σε µοιραζόµενη µνήµη void thread1(int *shared_var) int i; for (i=0; i

Διαβάστε περισσότερα

Προγραμματισμός με το OpenMP Β. Δημακόπουλος

Προγραμματισμός με το OpenMP Β. Δημακόπουλος ΠΛE006 Παράλληλη Επεξεργασία Προγραμματισμός με το OpenMP Β. Δημακόπουλος Shared address space / shared variables Τι χρειάζεται κανείς για να προγραμματίσει σε αυτό το μοντέλο: Οντότητες εκτέλεσης (νήματα,

Διαβάστε περισσότερα

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Διαμοίραση έργου και συγχρονισμός στο OpenMP Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed Systems Group Παράλληλες Περιοχές Καθορίζονται

Διαβάστε περισσότερα

OpenMP. Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων. Αθήνα, Νοέµβριος /11/2004 Εισαγωγή στο OpenMP 1

OpenMP. Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων. Αθήνα, Νοέµβριος /11/2004 Εισαγωγή στο OpenMP 1 OpenMP Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων Αθήνα, Νοέµβριος 2004 29/11/2004 Εισαγωγή στο OpenMP 1 1 Παράλληλες αρχιτεκτονικές Αρχιτεκτονική κατανεµηµένης µνήµης (distributed

Διαβάστε περισσότερα

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Εισαγωγή στο OpenMP Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed Systems Group Τι είναι το OpenMP Πρότυπο Επέκταση στη C/C++ και τη Fortran

Διαβάστε περισσότερα

Μέρος IΙ: OpenMP Κεφάλαιο 4 (νέο βιβλίο)

Μέρος IΙ: OpenMP Κεφάλαιο 4 (νέο βιβλίο) ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κοινόχρηστος χώρος διευθύνσεων Μέρος IΙ: OpenMP Κεφάλαιο 4 (νέο βιβλίο) Shared address space / shared variables Τι χρειάζεται κανείς για να προγραμματίσει σε αυτό το μοντέλο: Οντότητες

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:12 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

2/4/2012 Προγραμματισμός συστημάτων κοινόχρηστης μνήμης (ΙΙ) OpenMP Β. Δημακόπουλος

2/4/2012 Προγραμματισμός συστημάτων κοινόχρηστης μνήμης (ΙΙ) OpenMP Β. Δημακόπουλος Υ07 Παράλληλα Συστήματα 2011-12 2/4/2012 Προγραμματισμός συστημάτων κοινόχρηστης μνήμης (ΙΙ) OpenMP Β. Δημακόπουλος Shared address space / shared variables Τι χρειάζεται κανείς για να προγραμματίσει σε

Διαβάστε περισσότερα

Επιστημονικοί Υπολογισμοί - Μέρος ΙΙΙ: Παράλληλοι Υπολογισμοί

Επιστημονικοί Υπολογισμοί - Μέρος ΙΙΙ: Παράλληλοι Υπολογισμοί Επιστημονικοί Υπολογισμοί - Μέρος ΙΙΙ: Παράλληλοι Υπολογισμοί Χαρμανδάρης Βαγγέλης, Τμήμα Εφαρμοσμένων Μαθηματικών Πανεπιστήμιο Κρήτης, Εαρινό Εξάμηνο 2013/14 Κεφάλαιο 5: (A) Λογισμικό, Βασικές Εφαρμογές

Διαβάστε περισσότερα

EM 361: Παράλληλοι Υπολογισμοί

EM 361: Παράλληλοι Υπολογισμοί ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ EM 361: Παράλληλοι Υπολογισμοί Ενότητα #5Α: Λογισμικό, Βασικές Εφαρμογές OpenMP Διδάσκων: Χαρμανδάρης Ευάγγελος ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΩΝ ΜΑΘΗΜΑΤΙΚΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΚΑΙ

Διαβάστε περισσότερα

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος 2016-2017 ΤΕΙ Ηπείρου - Άρτα Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp Γκόγκος Χρήστος Παράδειγμα

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:20 OpenMP Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

OpenMP. Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης. Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ. OpenMP p.

OpenMP. Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης. Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ. OpenMP p. OpenMP Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ OpenMP p. 1 Αρχιτεκτονικές Κατανεµηµένης Μνήµης Node Node L2 Memory L2

Διαβάστε περισσότερα

Ε-85: Ειδικά Θέµατα Λογισµικού

Ε-85: Ειδικά Θέµατα Λογισµικού Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Προγραµµατισµός µε το µοντέλο OpenMP» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ: Προγραµµατισµός

Διαβάστε περισσότερα

Ορολογία. Παράδειγµα 3. Εξισορρόπηση Εργασίας. Ε-85: Ειδικά Θέµατα Λογισµικού. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 6

Ορολογία. Παράδειγµα 3. Εξισορρόπηση Εργασίας. Ε-85: Ειδικά Θέµατα Λογισµικού. E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 6 Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Προγραµµατισµός µε το µοντέλο OpenMP» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) Ορολογία Μιαοµάδα νηµάτων

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP ΕΡΓΑΛΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP Νίκος Τρυφωνίδης Μέρος 1 ο : Η ΑΝΑΓΚΗ ΓΙΑ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Γιατί Παράλληλος Προγραμματισμός; Οι επιστημονικές υπολογιστικές

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP (2 ο Μέρος)

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP (2 ο Μέρος) ΕΡΓΑΛΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP (2 ο Μέρος) Νίκος Τρυφωνίδης Εφαρμογή 7: Ανισορροπία Το πρόγραμμα imbalance.c περιέχει ένα loop το οποίο έχει μεγαλύτερη εργασία

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: Μέτρηση χρόνου τοίχου κατά POSIX Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:05 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Ε-85: Ειδικά Θέµατα Λογισµικού

Ε-85: Ειδικά Θέµατα Λογισµικού Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Εισαγωγή στο OpenMP» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών

Διαβάστε περισσότερα

Κατανεμημένος και Παράλληλος Προγραμματισμός

Κατανεμημένος και Παράλληλος Προγραμματισμός Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr Παράλληλος προγραμματισμός OpenMP (3) Critical vs. Single Η

Διαβάστε περισσότερα

ΥΛΟΠΟΙΗΣΗ ΣΥΝΤΑΚΤΙΚΟΥ ΑΝΑΛΥΤΗ ΓΙΑ ΤΟΝ ΠΑΡΑΛΛΗΛΟΠΟΙΗΤΙΚΟ ΜΕΤΑΦΡΑΣΤΗ OMPI Η ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΕΞΕΙ ΙΚΕΥΣΗΣ. Υποβάλλεται στην

ΥΛΟΠΟΙΗΣΗ ΣΥΝΤΑΚΤΙΚΟΥ ΑΝΑΛΥΤΗ ΓΙΑ ΤΟΝ ΠΑΡΑΛΛΗΛΟΠΟΙΗΤΙΚΟ ΜΕΤΑΦΡΑΣΤΗ OMPI Η ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΕΞΕΙ ΙΚΕΥΣΗΣ. Υποβάλλεται στην ΥΛΟΠΟΙΗΣΗ ΣΥΝΤΑΚΤΙΚΟΥ ΑΝΑΛΥΤΗ ΓΙΑ ΤΟΝ ΠΑΡΑΛΛΗΛΟΠΟΙΗΤΙΚΟ ΜΕΤΑΦΡΑΣΤΗ OMPI Η ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΕΞΕΙ ΙΚΕΥΣΗΣ Υποβάλλεται στην ορισθείσα από την Γενική Συνέλευση Ειδικής Σύνθεσης του Τµήµατος Πληροφορικής

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ 1 (Εργαστήριο) Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 2: Δομή ενός προγράμματος C Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Αποδοτική εκτέλεση προγραμμάτων OpenMP σε συστάδες Η/Υ

Αποδοτική εκτέλεση προγραμμάτων OpenMP σε συστάδες Η/Υ Πτυχιακή Εργασία Σιταράς Φώτιος Αύγουστος 2009 Αποδοτική εκτέλεση προγραμμάτων OpenMP σε συστάδες Η/Υ Επιβλέπων: Βασίλειος Δημακόπουλος 1 2 Περιεχόμενα Κεφάλαιο 1: Εισαγωγή...6 1.1 Η εξέλιξη των Η/Υ...6

Διαβάστε περισσότερα

Κατανεμημένος και Παράλληλος Προγραμματισμός

Κατανεμημένος και Παράλληλος Προγραμματισμός Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr Παράλληλος προγραμματισμός OpenMP (2) Παραλληλοποίηση των βρόγχων

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 5: MPI_Reduce Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Υλοποίηση cancellation στον παραλληλοποιητικό μεταφραστή OMPi. Εμμανουήλ Φελουτζή. με Α.Μ: 1579 ΔΙΠΛΩΜΑΤΟΣ

Υλοποίηση cancellation στον παραλληλοποιητικό μεταφραστή OMPi. Εμμανουήλ Φελουτζή. με Α.Μ: 1579 ΔΙΠΛΩΜΑΤΟΣ Υλοποίηση cancellation στον παραλληλοποιητικό μεταφραστή OMPi από τον Εμμανουήλ Φελουτζή με Α.Μ: 1579 ως μέρος των Υποχρεώσεων για τη λήψη του ΔΙΠΛΩΜΑΤΟΣ ΤΟΥ ΤΜΗΜΑΤΟΣ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΡΤΙΟΣ

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 2: OpenMPI Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Διπλωματική Εργασία του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών της Πολυτεχνικής Σχολής του Πανεπιστημίου Πατρών

Διπλωματική Εργασία του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών της Πολυτεχνικής Σχολής του Πανεπιστημίου Πατρών ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ: ΕΡΓΑΣΤΗΡΙΟ Διπλωματική Εργασία του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών της Πολυτεχνικής

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:04 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:11 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Ε-85: Ειδικά Θέµατα Λογισµικού

Ε-85: Ειδικά Θέµατα Λογισµικού Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Επαναληπτικές Ασκήσεις» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων

Διαβάστε περισσότερα

Κατανεμημένος και Παράλληλος Προγραμματισμός

Κατανεμημένος και Παράλληλος Προγραμματισμός Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr Παράλληλος προγραμματισμός - OpenMP Παράλληλες αρχιτεκτονικές

Διαβάστε περισσότερα

Κατανεμημένος και. Ηλίας Κ. Σάββας Αναπληρωτής Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας

Κατανεμημένος και. Ηλίας Κ. Σάββας Αναπληρωτής Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Αναπληρωτής Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr Παράλληλος προγραμματισμός - OpenMP Παράλληλες

Διαβάστε περισσότερα

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 9: Συναρτήσεις Ορισμός συναρτήσεων () { /* δήλωση μεταβλητών */ /* εντολές ελέγχου/επεξεργασίας */ o Μια συνάρτηση ορίζεται δίνοντας

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 5: MPI_Reduce Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Συναρτήσεις Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Συναρτήσεις Ως τώρα γράφαμε όλα τα προγράμματα μας μέσα στην main..1

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 2: OpenMPI Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Προγραµµατισµός Νηµάτων. Αρχικοποίηση µιας Φοράς pthread_once_t once_block = PTHREAD_ONCE_INIT; pthread_mutex_t mutex;

Προγραµµατισµός Νηµάτων. Αρχικοποίηση µιας Φοράς pthread_once_t once_block = PTHREAD_ONCE_INIT; pthread_mutex_t mutex; Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Προγραµµατισµός Νηµάτων Χειµερινό Εξάµηνο 2009-10 «Επαναληπτικές Ασκήσεις» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ: Προγραµµατισµός

Διαβάστε περισσότερα

Περίληψη. Υπερυπολογιστές. Υπολογιστικά προβλήµατα. TOP 500 (Ιούνιος 2007) TOP 500 (Ιούνιος 2009) Ε-85: Ειδικά Θέµατα Λογισµικού

Περίληψη. Υπερυπολογιστές. Υπολογιστικά προβλήµατα. TOP 500 (Ιούνιος 2007) TOP 500 (Ιούνιος 2009) Ε-85: Ειδικά Θέµατα Λογισµικού Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Υπολογιστικά Συστήµατα Υψηλών Επιδόσεων και Εφαρµογές» Περίληψη Υπερυπολογιστές Πολυεπεξεργαστικά συστήµατα

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ 1 (Εργαστήριο) Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 10: Συναρτήσεις Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης

Διαβάστε περισσότερα

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Εισαγωγή στα Πολυεπεξεργαστικά Συστήματα Διερασίες και Νήματα σε Πολυεπεξεργαστικά Συστήματα Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed

Διαβάστε περισσότερα

Ε-85: Ειδικά Θέµατα Λογισµικού

Ε-85: Ειδικά Θέµατα Λογισµικού Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Υπολογιστικά Συστήµατα Υψηλών Επιδόσεων και Εφαρµογές» Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ:

Διαβάστε περισσότερα

Εισαγωγή στον Προγραµµατισµό Πολυεπεξεργαστικών Συστηµάτων Κοινής Μνήµης µε...

Εισαγωγή στον Προγραµµατισµό Πολυεπεξεργαστικών Συστηµάτων Κοινής Μνήµης µε... Εισαγωγή στον Προγραµµατισµό Πολυεπεξεργαστικών Συστηµάτων Κοινής Μνήµης µε... Λογισµικό & Προγραµµατισµός Συστηµάτων Υψηλής Επίδοσης Εργαστήριο Πληροφοριακών Συστηµάτων Υψηλών Επιδόσεων Τοµέας Λογικού

Διαβάστε περισσότερα

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική Ενότητα 7: Συναρτήσεις Νικόλαος Στεργιούλας Τμήμα Φυσικής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:06 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:08 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΧΗΜΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΟ ΚΕΝΤΡΟ Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού Μάθημα 2ο Aντώνης Σπυρόπουλος v2_061015 Οροι που

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ Εισαγωγή Σκοπός τόσο αυτού του εργαστηρίου, όσο και των εργαστηρίων που ακολουθούν, είναι να γνωρίσουμε τους τρόπους δημιουργίας και διαχείρισης των διεργασιών (processes)

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:14 - ADVISOR Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 2 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Εισαγωγή στη C Λίγα λόγια για την C Γλώσσα προγραμματισμού υψηλού επιπέδου. Σχεδιάστηκε και υλοποιήθηκε από τον Dennis Richie στις αρχές της δεκαετίας του 1970 (Bell Labs). Η

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:03 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 4: MPI_ANY_TAG,MPI_ANY_SOURCE,MPI_Bcast, MPI_Wtime, MPI_Wait, MPI_Test, MPI_Scatter Δρ. Μηνάς Δασυγένης

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2014-15

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 8: Λειτουργικά Συστήματα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Εισαγωγή Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Βιβλιογραφία "C Προγραμματισμός", Deitel & Deitel, Πέμπτη Έκδοση, Εκδόσεις

Διαβάστε περισσότερα

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Συναρτήσεις της C Τα Λοιπά Στοίβα και μηχανισμός κλήσης Αναδρομικές συναρτήσεις Στατικές μεταβλητές Άλλα θέματα Μηχανισμός

Διαβάστε περισσότερα

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

FORTRAN και Αντικειμενοστραφής Προγραμματισμός FORTRAN και Αντικειμενοστραφής Προγραμματισμός Παραδόσεις Μαθήματος 2016 Δρ Γ Παπαλάμπρου Επίκουρος Καθηγητής ΕΜΠ georgepapalambrou@lmentuagr Εργαστήριο Ναυτικής Μηχανολογίας (Κτίριο Λ) Σχολή Ναυπηγών

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 12 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons.

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:09 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Εισαγωγή στον δομημένο προγραμματισμό

Εισαγωγή στον δομημένο προγραμματισμό Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Εισαγωγή στον δομημένο προγραμματισμό Ενότητα 12 η : Δυναμική Ανάθεση Θέσης Αν. καθηγητής Στεργίου Κώστας e-mail: kstergiou@uowm.gr Τμήμα Μηχανικών Πληροφορικής

Διαβάστε περισσότερα

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη Εισαγωγικά

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Πίνακες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα

Διαβάστε περισσότερα

Εισαγωγή στον δομημένο προγραμματισμό

Εισαγωγή στον δομημένο προγραμματισμό Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Εισαγωγή στον δομημένο προγραμματισμό Ενότητα 7 η : Δείκτες Αν. καθηγητής Στεργίου Κώστας e-mail: kstergiou@uowm.gr Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Διαβάστε περισσότερα

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:10 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δομή του προγράμματος. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δομή του προγράμματος. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Άδειες Χρήσης ΥΠΟΛΟΓΙΣΤΕΣ ΙI Δομή του προγράμματος Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραμματισμού C ΕΡΓΑΣΤΗΡΙΟ 2: Εκφράσεις, πίνακες και βρόχοι 14 Απριλίου 2016 Το σημερινό εργαστήριο

Διαβάστε περισσότερα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Δομημένος Προγραμματισμός Ενότητα 10: Συναρτήσεις Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

Διαβάστε περισσότερα

Ειδικά Θέματα Προγραμματισμού

Ειδικά Θέματα Προγραμματισμού Ειδικά Θέματα Προγραμματισμού Ενότητα 6: Threads Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Εισαγωγή στη C θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα: Intel Parallel Studio XE 2013 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων

Διαβάστε περισσότερα

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C Οι συναρτήσεις τι είναι Πρόκειται για ανεξάρτητα τμήματα ενός προγράμματος (υποπρογράμματα) που επιτελούν συγκεκριμένες εργασίες. Καλούνται από το κυρίως

Διαβάστε περισσότερα

Κατανεμημένα Συστήματα

Κατανεμημένα Συστήματα Κατανεμημένα Συστήματα Σημειώσεις εργαστηρίου Lab#7 - Διεργασίες, Nήματα, Πολυνημάτωση στη Python Νεβράντζας Βάιος-Γερμανός Λάρισα, Φεβρουάριος 2013 Lab#7 - Διεργασιές, Νη ματα, Πολυνημα τωση στη Python,

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 13: Ταυτόχρονος Προγραμματισμός Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν

Διαβάστε περισσότερα

Ηλεκτρονικοί Υπολογιστές

Ηλεκτρονικοί Υπολογιστές ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΧΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Ενότητα 9: Πίνακες στη C++ Ζαχαρούλα Ανδρεοπούλου Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons.

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα 5: Εντολές επανάληψης Κουκουλέτσος Κώστας Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστικών Συστημάτων

Διαβάστε περισσότερα

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Εισαγωγή στον Προγραµµατισµό Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Hello World /* Αρχείο hello.c * Εµφανίζει στην οθόνη το * µήνυµα hello world */ #include

Διαβάστε περισσότερα

Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος

Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος 2016-2017 ΤΕΙ Ηπείρου - Άρτα Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με pthreads Γκόγκος Χρήστος Παράδειγμα

Διαβάστε περισσότερα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Αλγόριθμοι και Προγράμματα

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 13: (Μέρος Γ ) Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών

Διαβάστε περισσότερα

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα. Ερωτήσεις προόδου C Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα. #include // δίνει οδηγία στον compiler να // συμπεριλάβει την βιβλιοθήκη stdio int

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 13: (Μέρος Β ) Λειτουργικό Σύστημα Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2014-15

Διαβάστε περισσότερα

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μεταβλητές,

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δείκτες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Τι είναι ο δείκτης Ένας δείκτης είναι μια μεταβλητή που περιέχει μια διεύθυνση μνήμης. Θυμηθείτε πως

Διαβάστε περισσότερα

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (pthreads)

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (pthreads) Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος 2016-2017 ΤΕΙ Ηπείρου - Άρτα Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Γκόγκος Χρήστος Εκφωνήσεις ασκήσεων εργαστηρίου

Διαβάστε περισσότερα

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Δομημένος Προγραμματισμός Ενότητα 5(γ): Εργαστηριακή Άσκηση Αναπλ. Καθηγητής: Κωνσταντίνος Στεργίου Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 04 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική Ενότητα 3: Εισαγωγή και Εμφάνιση Δεδομένων Νικόλαος Στεργιούλας Τμήμα Φυσικής Άδειες

Διαβάστε περισσότερα