Παράλληλα και Κατανεµηµένα Συστήµατα. Εισαγωγή

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

Download "Παράλληλα και Κατανεµηµένα Συστήµατα. Εισαγωγή"

Transcript

1 Παράλληλα και Κατανεµηµένα Συστήµατα 1 Εισαγωγή Στόχος της περιγραφής που ακολουθεί, αποτελεί η παρουσίαση του περιβάλλοντος διεπαφής ανταλλαγής µηνυµάτων (message passing interface) MPI δια της χρήσεως του οποίου είναι δυνατή η δηµιουργία εφαρµογών που στηρίζονται στις αρχές του παράλληλου προγραµµατισµού. Το πρότυπο MPI δεν είναι τίποτε άλλο από µια συλλογή συναρτήσεων που µπορεί να χρησιµοποιηθεί µέσα από προγράµµατα που είναι γραµµένα σε γλώσσα C ή σε γλώσσα Fortran και τα οποία επιτρέπουν τη δηµιουργία και χρήση ενός πλήθους διεργασιών που εκτελούνται παράλληλα στον ίδιο ή σε διαφορετικούς υπολογιστές και επικοινωνούν µεταξύ τους χρησιµοποιώντας το µοντέλο ανταλλαγής µηνυµάτων. Σε αντίθεση µε το σειριακό µοντέλο προγραµµατισµού στο οποίο λαµβάνει χώρα η χρήση ενός και µοναδικού επεξεργαστή που επικοινωνεί συνεχώς µε την κεντρική µνήµη του συστήµατος δια µέσου διαδικασιών ανάγνωσης και εγγραφής, στο αντίστοιχο παράλληλο µοντέλο υπονοείται η χρήση πολλών διαφορετικών επεξεργαστών κάθε ένας εκ των οποίων χρησιµοποιεί τη δική του περιοχή µνήµης και τις δικές του µεταβλητές προγράµµατος. Αυτό σηµαίνει πως οι εν λόγω επεξεργαστές δεν µοιράζονται κάποιο κοινό φυσικό χώρο διευθύνσεων µνήµης, και εποµένως οι ενέργειες µιας διεργασίας που εκτελείται σε ένα υπολογιστή, δεν είναι ορατές από τις υπόλοιπες διεργασίες του συστήµατος. Εάν δε, κάποια διεργασία απαιτεί τη χρήση µιας µεταβλητής η οποία ανήκει στο χώρο κάποιας άλλης διεργασίας, η µεταβλητή αυτή δεν είναι κοινή στις δύο διεργασίες, αλλά θα πρέπει να αποσταλεί από τη µια διεργασία στην άλλη δια µέσου κάποιου µηνύµατος (message). Υπάρχουν πολλές διαφορετικές προσεγγίσεις τις οποίες µπορούµε να ακολουθήσουµε για να προχωρήσουµε στη δηµιουργία παράλληλων εφαρµογών και στις σελίδες που ακολουθούν θα περιγράψουµε το πρότυπο MPI. Αν και οι πρώτες προσπάθειες για την ανάπτυξη παράλληλων εφαρµογών πραγµατοποιήθηκαν στις αρχές της δεκαετίας του 1980 µε την εισαγωγή της έννοιας της κατανεµηµένης µνήµης και του παράλληλου προγραµµατισµού, το πρότυπο MPI χρησιµοποιήθηκε για πρώτη φορά τον Απρίλιο του 1992 από το πανεπιστήµιο της Virginia, ενώ το Νοέµβριο του ιδίου έτους πραγµατοποιήθηκε η πρώτη συνάντηση της οµάδας εργασία στη Minneapolis. Στόχος αυτής της συνάντησης ήταν ο καθορισµός των βασικών χαρακτηριστικών του προτύπου και η δηµιουργία του MPI Forum µέσα από το οποίο ήταν δυνατή η περαιτέρω ανάπτυξη του εν λόγω περιβάλλοντος και η προτυποποίησή του. Το τελευταίο σηµαντικό στάδιο της σύντοµης ιστορίας του MPI είναι η διάσκεψη Supercomputing 93 όπου και παρουσιάζονται προσχέδια του MPI, ενώ η τελική έκδοση του εν λόγω προτύπου παρουσιάστηκε το Μάιο του Οι παραπάνω αναφορές αφορούν την πρώτη έκδοση του προτύπου MPI που είναι γνωστή ως MPI1 ενώ το εκέµβριο του 1995, το πρότυπο αυτό επεκτάθηκε και µετονοµάσθηκε σε MPI2, που είναι και το µοντέλο που χρησιµοποιείται µέχρι σήµερα.

2 Το περιβάλλον προγραµµατισµού MPI 2 Οι δοµικές µονάδες του MPI Η στοιχειώδης µονάδα µιας εφαρµογής MPI είναι η διεργασία (process) η οποία δηµιουργείται και εκτελείται ανεξάρτητα από τις υπόλοιπες διεργασίες του συστήµατος χρησιµοποιώντας τους δικούς της πόρους (resources). Η κάθε διεργασία ταυτοποιείται µε µοναδικό τρόπο από ένα κωδικό διεργασίας (Process Id, PID) που στην ορολογία του προτύπου ονοµάζεται τάξη (rank) και λαµβάνει τιµές µεγαλύτερες ή ίσες µε το µηδέν. Εάν το πλήθος των διεργασιών που εκτελούνται στο σύστηµα είναι γνωστό και ίσο µε Ν, τότε οι κωδικοί αυτών των διεργασιών θα έχουν τις Ν συνεχόµενες τιµές 0,1,2,3,.,Ν-1. Επειδή οι τάξεις των διεργασιών προσδιορίζουν τις διεργασίες του συστήµατος µε µοναδικό τρόπο, χρησιµοποιούνται πάρα πολύ συχνά από τους προγραµµατιστές των εφαρµογών MPI για να προσδιορίσουν την προέλευση και τον προορισµό των διακινούµενων µηνυµάτων. Ένα σύνολο Ν διατεταγµένων διεργασιών που χαρακτηρίζεται από τιµές τάξεων 0,1,2,,Ν-1 είναι γνωστό ως οµάδα (group). Σε µια εφαρµογή MPI µπορούµε να ορίσουµε πολλές οµάδες διεργασιών κάθε µια από τις οποίες χαρακτηρίζεται από το δικό της κωδικό (group id). Ας σηµειωθεί πως αυτός ο κωδικός είναι άγνωστος στο χρήστη, και υπό αυτή την έννοια µια οµάδα διεργασιών χαρακτηρίζεται ως ένα αδιαφανές αντικείµενο µε άγνωστη εσωτερική δοµή. Εάν ο χρήστης επιθυµεί να προσπελάσει τις τιµές των ιδιοτήτων µιας οµάδας διεργασιών θα πρέπει να χρησιµοποιήσει ειδικές συναρτήσεις του MPI προκειµένου να ανακτήσει αυτές τις τιµές. Ένα τελευταίο σηµαντικό χαρακτηριστικό του προτύπου MPI είναι η έννοια του µέσου επικοινωνίας (communicator) δια της χρήσεως του οποίου λαµβάνει χώρα η ανταλλαγή µηνυµάτων ανάµεσα σε δύο διεργασίες. Αυτή η ενδιάµεση οντότητα χαρακτηρίζεται και αυτή από την ύπαρξη κάποιου κωδικού, η ανάκτηση του οποίου µπορεί να λάβει χώρα χρησιµοποιώντας κάποια από τις συναρτήσεις του MPI. Είναι προφανές πως για να είναι δυνατή η επικοινωνία ανάµεσα σε δύο διεργασίες αυτές θα πρέπει να ανήκουν στον ίδιο communicator. Η χρήση αυτού του τρόπου επικοινωνίας διασφαλίζει το σωστό τρόπο διακίνησης της πληροφορίας και ελαχιστοποιεί την πιθανότητα εµφάνισης προβληµάτων όσον αφορά την αποστολή και λήψη των µηνυµάτων από τις διεργασίες της εφαρµογής. Μιλώντας γενικά, ένας communicator ορίζεται ως ένα τοπικό αντικείµενο (local object) που χρησιµοποιείται για την αναπαράσταση ενός χώρου µέσα στον οποίο ανήκουν οι διεργασίες που έρχονται σε επικοινωνία (communication domain). Αυτός ο χώρος ορίζεται ως µια καθολική (global) και κατανεµηµένη δοµή που επιτρέπει στις διεργασίες µιας οµάδας να επικοινωνήσουν είτε µεταξύ τους, είτε µε τις διεργασίες µιας άλλης οµάδας. Στην περίπτωση κατά την οποία οι διεργασίες που επικοινωνούν ανήκουν στην ίδια οµάδα, ο communicator είναι γνωστός ως intracommunicator ενώ στην περίπτωση κατά την οποία οι διεργασίες που επικοινωνούν ανήκουν σε διαφορετικές οµάδες, ο communicator είναι γνωστός ως intercommunicator. Μια διεργασία µπορεί να συµµετάσχει σε πολλούς επικοινωνιακούς χώρους (communication domains). Με τον ίδιο τρόπο, δύο επικοινωνιακοί χώροι µπορεί να περιέχουν οµάδες διεργασιών που να περιέχουν κοινές διεργασίες ή να επικαλύπτονται πλήρως (να περιέχουν τις ίδιες διεργασίες ή η µια να είναι υποσύνολο ή υπερσύνολο της άλλης). Αυτό το χαρακτηριστικό επιτρέπει σε µια διεργασία να επικοινωνήσει µε µια άλλη διεργασία δια µέσου δύο

3 Παράλληλα και Κατανεµηµένα Συστήµατα 3 διαφορετικών και διακριτών µεταξύ τους επικοινωνιακών χώρων. Αυτό σηµαίνει πως µια διεργασία µπορεί να ανήκει ταυτόχρονα σε πολλούς επικοινωνιακούς χώρους, σε κάθε έναν από τους οποίους θα περιγράφεται και από διαφορετική τιµή τάξης. Ένα τελευταίο χαρακτηριστικό που αξίζει να αναφερθεί, είναι η δυνατότητα που έχει µια διεργασία να αποστείλει ένα µήνυµα στον εαυτό της. Στην περίπτωση αυτή ωστόσο απαιτείται η αποθήκευση του µηνύµατος σε ένα χώρο ενδιάµεσης αποθήκευσης του συστήµατος (system buffer). Αυτό σηµαίνει πως το µήνυµα δεν θα µεταφερθεί απευθείας στην περιοχή µνήµης που έχει δεσµευθεί για την παραλαβή του, αλλά θα διατηρηθεί προσωρινά σε µία περιοχή ενδιάµεσης µνήµης. Ο τρόπος δέσµευσης αυτής της µνήµης καθώς και το µέγιστο µέγεθός της εξαρτώνται από την υλοποίηση που χρησιµοποιείται σε κάθε περίπτωση. Εποµένως γενικά δεν συνίσταται η αποστολή µηνυµάτων από µια διεργασία στον εαυτό της, κάτι που ισχύει ιδιαίτερα για τις παρεµποδιστικές επικοινωνίες που θα παρουσιαστούν στην επόµενη ενότητα. Είδη επικοινωνιών ανάµεσα σε διεργασίες Ο βασικός µηχανισµός επικοινωνίας του MPI είναι η µετάδοση δεδοµένων µεταξύ ενός ζεύγους διεργασιών, εκ των οποίων η πρώτη αποστέλλει το µήνυµα ενώ η δεύτερη το παραλαµβάνει. Αυτός ο τρόπος επικοινωνίας ονοµάζεται επικοινωνία από σηµείο σε σηµείο (point to point communication) και αποτελεί το µοντέλο επικοινωνίας για ένα πολύ µεγάλο εύρος εφαρµογών MPI. Το MPI προσφέρει ένα σύνολο συναρτήσεων που χρησιµοποιείται για την αποστολή και λήψη δεδοµένων µε τη µορφή µηνυµάτων. Το κάθε ένα από αυτά τα µηνύµατα χαρακτηρίζεται από µια τυποποίηση συγκεκριµένης µορφής και ταυτοποιείται µονοσήµαντα από µία ετικέτα (tag) που µας επιτρέπει να το ξεχωρίσουµε από τα υπόλοιπα µηνύµατα της εφαρµογής. Αυτή η τυποποίηση είναι εξαιρετικά σηµαντική και είναι ιδιαίτερα χρήσιµη σε περιπτώσεις επικοινωνίας διεργασιών που ανήκουν σε ετερογενή συστήµατα (δηλαδή σε συστήµατα που χαρακτηρίζονται από διαφορετική αρχιτεκτονική) και η οποία απαιτεί την ενδιάµεση µετατροπή των διακινούµενων δεδοµένων. Από την άλλη µεριά η χρήση της ετικέτας προσφέρει και αυτή αρκετά πλεονεκτήµατα, όπως είναι για παράδειγµα η δυνατότητα της σωστής ταξινόµησης µιας οµάδας µηνυµάτων που παραλαµβάνονται µε σειρά διαφορετική από εκείνη µε την οποία έχουν σταλεί. Σε πλήρη αναλογία µε τα πακέτα δεδοµένων που διακινούνται σε ένα δίκτυο υπολογιστών, ένα µήνυµα του προτύπου MPI δεν περιέχει µόνο τα δεδοµένα προς αποστολή, αλλά και πολλές άλλες πληροφορίες οι οποίες είναι αναγκαίες για την επιτυχή µετάδοση του µηνύµατος. Οι πληροφορίες αυτές περιλαµβάνουν µεταξύ των άλλων το πλήθος και τον τύπο των δεδοµένων που περιλαµβάνονται στο µήνυµα, τις τάξεις των διεργασιών αποστολής και λήψης, την ετικέτα του µηνύµατος και το όνοµα του πληροφοριοδότη δια της χρήσεως του οποίου επικοινωνούν οι δύο διεργασίες. Οι παραπάνω πληροφορίες διαβιβάζονται ως ορίσµατα στη συνάρτηση που χρησιµοποιείται για την αποστολή του µηνύµατος, ενώ εντελώς ανάλογη είναι

4 Το περιβάλλον προγραµµατισµού MPI 4 και η κλήση της συνάρτησης παραλαβής του µηνύµατος, η οποία ωστόσο περιέχει και ένα επιπλέον όρισµα που περιλαµβάνει πληροφορίες σχετικές µε τη διαδικασία παραλαβής. Χρησιµοποιώντας αυτές τις δύο συναρτήσεις (καθώς και ορισµένες άλλες που χρησιµοποιούνται για την αρχικοποίηση και τον τερµατισµό του προτύπου), µπορούµε να κατασκευάσουµε όλες σχεδόν τις εφαρµογές που χαρακτηρίζονται από αυτή τη διαδικασία ανταλλαγής µηνυµάτων. Το δεύτερο είδος επικοινωνίας που υποστηρίζει το πρωτόκολλο MPI, είναι οι συλλογικές επικοινωνίες (collective communications) οι οποίες χαρακτηρίζονται από την ύπαρξη περισσότερων από δύο διαδικασιών. Οι πιο σηµαντικές από αυτές τις µορφές επικοινωνίας, είναι η εκποµπή (broadcasting), όπου ένα µήνυµα αποστέλλεται ενιαίο σε όλες τις διεργασίες, η διασπορά (scattering) όπου ένα µήνυµα διασπάται σε µικρότερα κοµµάτια κάθε ένα εκ των οποίων αποστέλλεται και σε µια διαφορετική διεργασία, η συλλογή (gather) όπου το σύνολο των µηνυµάτων που αποστέλλονται από όλα τα µέλη µιας οµάδας διεργασιών παραλαµβάνεται από µια απλή διεργασία, και η µείωση (reduce) όπου µια διεργασία συλλέγει δεδοµένα από τις υπόλοιπες διεργασίες της οµάδας, και ταυτόχρονα υπολογίζει κάποια συνάρτηση αυτών των δεδοµένων (για παράδειγµα το µέσο όρο τους). Σε όλες τις παραπάνω διεργασίες, υπάρχει µια κεντρική διεργασία η οποία είτε αποστέλλει τις πληροφορίες στις υπόλοιπες διεργασίας της οµάδας, είτε συλλέγει τα µηνύµατα που αποστέλλονται από αυτές. Στην περίπτωση των διεργασιών από σηµείο σε σηµείο, οι συναρτήσεις του MPI εµφανίζονται σε δύο διαφορετικές µορφές που φέρουν τα ονόµατα παρεµποδιστικές (blocking) και µη παρεµποδιστικές (non blocking) συναρτήσεις. Μια συνάρτηση λέγεται παρεµποδιστική όταν η κλήση της µέσα από κάποια διεργασία αναστέλλει τη λειτουργία αυτής της διεργασίας, µέχρι την ολοκλήρωση της λειτουργίας της συνάρτησης που έχει κληθεί. Στην αντίθετη περίπτωση, κατά την οποία η κλήση της συνάρτησης δεν προκαλεί την αναστολή της λειτουργίας της διεργασίας, η εν λόγω συνάρτηση λέγεται µη παρεµποδιστική. Για να κατανοήσουµε τη διαφορά που υφίσταται ανάµεσα στις παρεµποδιστικές και στις µη παρεµποδιστικές συναρτήσεις, ας υποθέσουµε πως η συνάρτηση που χρησιµοποιείται για την αποστολή µηνυµάτων, ονοµάζεται send. Η συνάρτηση αυτή εκτός των άλλων θα δέχεται ως όρισµα και ένα δείκτη προς την περιοχή µνήµης στην οποία βρίσκονται τα δεδοµένα προς αποστολή. Ας υποθέσουµε πως αυτή η περιοχή µνήµης είναι ένας πίνακας που περιέχει 10 πραγµατικούς αριθµούς. Στο πρώτο βήµα της διαδικασίας, θα πρέπει να αρχικοποιήσουµε αυτή την περιοχή µνήµης, ορίζοντας το περιεχόµενο των θέσεων µνήµης που περιλαµβάνονται σε αυτή. Στη συνέχεια θα πρέπει να καλέσουµε τη συνάρτηση send για να αποστείλουµε αυτά τα δεδοµένα σε κάποια από τις διεργασίες της εφαρµογής. Εάν η εντολή send χρησιµοποιείται µε την παρεµποδιστική της µορφή, τότε για όσο χρονικό διάστηµα λαµβάνει χώρα η αποστολή των 10 πραγµατικών αριθµών στη διεργασία παραλήπτη, η λειτουργία της διεργασίας αποστολέα αναστέλλεται. Μετά την ολοκλήρωση της διαδικασίας αποστολής της παραπάνω πληροφορίας, η συνάρτηση send τερµατίζει τη λειτουργία της, κάτι που επιτρέπει τη συνέχιση και ολοκλήρωση της λειτουργίας της διεργασίας αποστολέα. Εντελώς ανάλογη µε την προηγούµενη κατάσταση, είναι και αυτή που συσχετίζεται µε τον τρόπο λειτουργίας της διεργασίας παραλήπτη. Εάν η εν λόγω

5 Παράλληλα και Κατανεµηµένα Συστήµατα 5 διεργασία χρησιµοποιεί την παρεµποδιστική έκδοση της receive η οποία νοείται ως η συνάρτηση που διαβάζει το περιεχόµενο του µηνύµατος που έχει σταλεί τότε η λειτουργία της διεργασίας παραλήπτη θα ανασταλεί κατά το χρονικό διάστηµα ανάγνωσης της πληροφορίας. Όταν η διακινούµενη πληροφορία έχει παραληφθεί στο σύνολό της από τη διεργασία παραλήπτη, η συνάρτηση receive θα αναστείλει τη λειτουργία της κάτι που θα επιτρέψει τη συνέχιση και τελικά την ολοκλήρωση της λειτουργίας της διεργασίας παραλήπτη. Στην περίπτωση κατά την οποία χρησιµοποιούνται οι µη παρεµποδιστικές εκδόσεις των συναρτήσεων αποστολής και παραλαβής µηνυµάτων, η κατάσταση είναι εντελώς διαφορετική. Στην περίπτωση αυτή η κλήση της µη παρεµποδιστικής έκδοσης της send, δεν αναστέλλει τη λειτουργία της διεργασίας αποστολέα, η οποία συνεχίζεται κανονικά και εκτελείται παράλληλα µε την αποστολή του µηνύµατος. Ωστόσο σε µια τέτοια διαδικασία, ενδέχεται να ανακύψουν σηµαντικά προβλήµατα στην περίπτωση διαδοχικών κλήσεων της send µέσα σε µικρό χρονικό διάστηµα. Αυτό σηµαίνει πως αν καλέσουµε την εν λόγω συνάρτηση για να αποστείλουµε το περιεχόµενο µιας περιοχής µνήµης και πριν την ολοκλήρωση αυτής της αποστολής καλέσουµε τη send για δεύτερη φορά µε το ίδιο όρισµα όσον αφορά τη θέση µνήµης αλλά διαφορετικό περιεχόµενο, τότε θα λάβει χώρα επανεγγραφή της περιοχής µνήµης και οριστική απώλεια του περιεχοµένου του πρώτου µηνύµατος που δεν έχει ακόµη αποσταλεί. Αυτό το πρόβληµα θα µεταφερθεί προφανώς και στη διεργασία παραλήπτη, η οποία θα διαβάσει εσφαλµένο περιεχόµενο από το οποίο δεν βγαίνει κανένα νόηµα. Τα παραπάνω προβλήµατα µπορούν να αποφευχθούν εάν πριν την αποστολή του δεύτερου µηνύµατος εξετάσουµε εάν η αποστολή του πρώτου µηνύµατος έχει ολοκληρωθεί. Εάν η αποστολή του πρώτου µηνύµατος έχει ολοκληρωθεί µπορούµε να στείλουµε το δεύτερο µήνυµα χωρίς κανένα πρόβληµα, ενώ στην αντίθετη περίπτωση θα πρέπει να περιµένουµε την περάτωση της αποστολής του πρώτου µηνύµατος, Οι παραπάνω διαδικασίες µπορούν να υλοποιηθούν πάρα πολύ εύκολα, αφού το MPI παρέχει συναρτήσεις που υποστηρίζουν πλήρως όλες αυτές τις διαφορετικές µορφές αποστολής και λήψης δεδοµένων. Ένα δεύτερο είδος διαχωρισµού που µπορούµε να εφαρµόσουµε για τις διαδικασίες επικοινωνίας από σηµείο σε σηµείο που λαµβάνουν χώρα ανάµεσα στις διεργασίες του συστήµατος, έχει να κάνει µε τη χρονική στιγµή περάτωσης της αποστολής του µηνύµατος σε σχέση µε τη χρονική στιγµή εκκίνησης της διαδικασίας παραλαβής του. Χρησιµοποιώντας αυτό το κριτήριο, µπορούµε να ορίσουµε τέσσερις διαφορετικές µορφές επικοινωνίας από σηµείο σε σηµείο, οι οποίες σε γενικές γραµµές, είναι οι εξής: Πρότυπη επικοινωνία (standard communication): σε αυτόν τον τύπο επικοινωνίας η απόφαση για τη δέσµευση ή όχι ενδιάµεσης περιοχής µνήµης στην οποία θα αποθηκευτεί προσωρινά το εξερχόµενο µήνυµα, λαµβάνεται από το MPI και όχι από το χρήστη. Στην περίπτωση κατά την οποία πραγµατοποιηθεί αυτή η διαδικασία της ενδιάµεσης αποθήκευσης του µηνύµατος, η διαδικασία αποστολής του δύναται να περατωθεί ακόµη και εάν η αντίστοιχη διαδικασία παραλαβής του

6 Το περιβάλλον προγραµµατισµού MPI 6 µηνύµατος δεν έχει ξεκινήσει ακόµη. Στην αντίθετη περίπτωση όµως, κατά την οποία δεν είναι διαθέσιµη η περιοχή ενδιάµεσης µνήµης, η διαδικασία αποστολής θα ολοκληρωθεί µόνο όταν έχει ξεκινήσει η αντίστοιχη διαδικασία παραλαβής και το µήνυµα έχει µεταφερθεί στην περιοχή αποθήκευσης της διεργασίας παραλήπτη. Επικοινωνία µε ενδιάµεση µνήµη (buffered communication): σε αυτόν τον τύπο επικοινωνίας η διαδικασία αποστολής µπορεί να ξεκινήσει ανεξάρτητα από το εάν έχει ξεκινήσει η αντίστοιχη διαδικασία παραλαβής, ενώ µπορεί ακόµη και να ολοκληρωθεί ανεξάρτητα από την εκκίνηση ή όχι της τελευταίας διαδικασίας. Στην περίπτωση αυτή ωστόσο είναι πιθανή η απαίτηση της τοπικής αποθήκευσης του εξερχόµενου µηνύµατος κάτι που σηµαίνει πως η εφαρµογή θα πρέπει να µεριµνήσει για την αναζήτηση και δέσµευση του κατάλληλου αποθηκευτικού χώρου. Εάν η µνήµη που δεσµεύεται για το λόγο αυτό είναι ανεπαρκής όσον αφορά το µέγεθός της και δεν δύναται να διατηρήσει το διακινούµενο µήνυµα, λαµβάνει χώρα εµφάνιση σφάλµατος. Στην αντίθετη περίπτωση το µήνυµα θα µεταφερθεί µε επιτυχία στη διεργασία παραλήπτη, κάτι που µας επιτρέπει να αποδεσµεύσουµε πλέον αυτή την τοπική περιοχή µνήµης που είχε δεσµευθεί για τη διακίνηση του µηνύµατος. Σύγχρονη επικοινωνία (synchronous communication): σε αυτόν τον τύπο επικοινωνίας µια διαδικασία αποστολής µπορεί να ξεκινήσει ανεξάρτητα από την εκκίνηση της διαδικασίας παραλαβής από τη διεργασία παραλήπτη. Ωστόσο στην περίπτωση αυτή η αποστολή θα ολοκληρωθεί µε επιτυχία µόνο όταν η διαδικασία παραλαβής έχει ξεκινήσει. Στην περίπτωση αυτή είναι δυνατή η χρήση του αποθηκευτικού χώρου της διαδικασίας αποστολέα για την αποστολή του επόµενου µηνύµατος. Επικοινωνία σε κατάσταση ετοιµότητας (ready state): σε αυτόν τον τύπο επικοινωνίας η διαδικασία επικοινωνίας µπορεί να ξεκινήσει µόνο όταν έχει ξεκινήσει και η αντίστοιχη διαδικασία παραλαβής. Στην αντίθετη περίπτωση η επικοινωνία χαρακτηρίζεται από την εµφάνιση σφαλµάτων και από εξαιρετικά χαµηλό βαθµό αξιοπιστίας. Για κάθε µια από τις παραπάνω µορφές επικοινωνίας υπάρχουν ξεχωριστές συναρτήσεις ειδικά σχεδιασµένες για αυτό το σκοπό, οι οποίες µπορούν να χρησιµοποιηθούν τόσο στην παρεµποδιστική όσο και στη µη παρεµποδιστική τους µορφή. Σε αντίθεση µε τη διαδικασία αποστολής, η παραλαβή ενός µηνύµατος πραγµατοποιείται πάντα από την ίδια συνάρτηση η οποία λειτουργεί µε βάση τις αρχές της πρότυπης επικοινωνίας (standard communication). Οι συναρτήσεις αυτές θα µελετηθούν σε επόµενη ενότητα. Οι τύποι δεδοµένων του MPI Αν και οι συναρτήσεις του προτύπου MPI µπορούν να κληθούν µέσα από ένα πρόγραµµα γραµµένο στη γλώσσα προγραµµατισµού C (η γλώσσα προγραµµατισµού Fortran επίσης υποστηρίζεται), οι τύποι δεδοµένων των ορισµάτων των εν λόγω συναρτήσεων, δεν είναι αυτοί που χρησιµοποιούνται στη γλώσσα C, καθώς το MPI χρησιµοποιεί τους δικού του τύπους δεδοµένων. Ο επόµενος πίνακας περιέχει τους στοιχειώδεις τύπους δεδοµένων που χρησιµοποιούνται από τις συναρτήσεις του MPI και τους τύπους δεδοµένων της γλώσσας C που αντιστοιχούν στους τύπους δεδοµένων του MPI.

7 Παράλληλα και Κατανεµηµένα Συστήµατα 7 MPI Datatype 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 C Datatype signed char signed short int signed int signed long int unsigned char unsigned short int unsigned int unsigned long int float double long_double Εκτός από τους παραπάνω βασικούς τύπους δεδοµένων (primitive data types) το MPI διαθέτει και άλλους δύο τύπους δεδοµένων που φέρουν τα ονόµατα MPI_BYTE και MPI_PACKED και δεν αντιστοιχούν σε τύπους δεδοµένων της γλώσσας C. Μία τιµή που ανήκει στον τύπο δεδοµένων MPI_BYTE απαιτεί για την αποθήκευσή της 1 byte (δηλαδή 8 bits). Στο πρότυπο MPI, ο τύπος δεδοµένων byte δεν είναι ισοδύναµος µε ένα χαρακτήρα, όπως συµβαίνει στις περισσότερες περιπτώσεις. Ανάλογα µε την αρχιτεκτονική που χρησιµοποιείται σε κάθε περίπτωση, ένας χαρακτήρας µπορεί να αναπαρίσταται µε διαφορετικό τρόπο και να απαιτεί τη χρήση περισσότερων από ένα byte. Από την άλλη πλευρά, ένα byte θα έχει την ίδια δυαδική τιµή σε όλες τις αρχιτεκτονικές. Η χρήση του τύπου MPI_PACKED θα µελετηθεί σε επόµενη ενότητα. Η σωστή χρήση των τύπων δεδοµένων έχει πολύ µεγάλη σηµασία για τη σωστή λειτουργία µιας εφαρµογής που στηρίζεται στην ανταλλαγή µηνυµάτων ανάµεσα στις διεργασίες της. Όπως θα µελετήσουµε αναλυτικά σε επόµενη ενότητα, ο τύπος δεδοµένων των στοιχείων που αποστέλλονται ή παραλαµβάνονται αποτελεί ένα από τα ορίσµατα των συναρτήσεων που χρησιµοποιούνται για αυτή τη διαδικασία αποστολής ή παραλαβής. Στην περίπτωση αυτή θα πρέπει ο τύπος δεδοµένων των στοιχείων που αποστέλλονται να είναι ο ίδιος µε εκείνον που καθορίζεται κατά την κλήση της συνάρτησης αποστολής. Με τον ίδιο ακριβώς τρόπο ο τύπος δεδοµένων των στοιχείων που παραλαµβάνονται θα πρέπει να είναι ο ίδιος µε εκείνον που καθορίζεται κατά την κλήση της συνάρτησης παραλαβής του µηνύµατος. Εάν µια εφαρµογή δεν λάβει υπ όψιν αυτή την αντιστοιχία ανάµεσα στους τύπους δεδοµένων

8 Το περιβάλλον προγραµµατισµού MPI 8 των διακινούµενων στοιχείων και στα αντίστοιχα ορίσµατα που χρησιµοποιούνται στις συναρτήσεις αποστολής ή παραλαβής, θα λάβει χώρα η εµφάνιση πολλών προβληµάτων και σφαλµάτων χρόνου εκτέλεσης (run time errors). Μία δεύτερη απαίτηση που θα πρέπει να ικανοποιείται όσον αφορά τη σωστή χρήση των τύπων δεδοµένων, είναι η χρήση του ιδίου τύπου δεδοµένων από τη συνάρτηση αποστολής του µηνύµατος και την αντίστοιχη συνάρτηση παραλαβής. Εάν για παράδειγµα µια διεργασία αποστείλει ένα µήνυµα που περιέχει 15 πραγµατικούς αριθµούς σε µια άλλη διεργασία, τότε η κλήση της συνάρτησης παραλαβής από αυτή τη διεργασία θα πρέπει να περιέχει την πληροφορία πως τα στοιχεία που πρόκειται για παραληφθούν είναι πραγµατικοί αριθµό και δεν ανήκουν σε κάποιον άλλο τύπο δεδοµένων. Αυτό σηµαίνει πως ένα από τα ορίσµατα της συνάρτησης παραλαβής θα πρέπει να είναι ο τύπος δεδοµένων MPI_DOUBLE. Εναλλακτικά, µπορούµε αντί για τον τύπο MPI_DOUBLE να χρησιµοποιήσουµε τον τύπο double της γλώσσας C το MPI επιτρέπει τέτοιου είδους αντιστοιχίες. Η παραπάνω αντιστοιχία ανάµεσα στους τύπους του MPI και στους αντίστοιχους τύπους της γλώσσας προγραµµατισµού, ισχύει για τους όλους τους βασικούς τύπους δεδοµένων που περιλαµβάνονται στον παραπάνω πίνακα, εκτός από τους τύπους MPI_BYTE και MPI_PACKED οι οποίοι αντιστοιχούν σε οποιοδήποτε byte της περιοχής αποθήκευσης, ανεξάρτητα από τον τύπο δεδοµένων της µεταβλητής που περιέχει αυτό το byte. Ο τύπος MPI_BYTE χρησιµοποιείται για να µεταφέρουµε τη δυαδική τιµή ενός byte µιας περιοχής µνήµης, ενώ ο τύπος MPI_PACKED χρησιµοποιείται για την αποστολή δεδοµένων που έχουν οµαδοποιηθεί µε την MPI_PACK ή έχει καταργηθεί η οµαδοποίησή τους µε την MPI_UNPACK. Ένα τελευταίο ζήτηµα που αφορά τη χρήση των τύπων δεδοµένων από τις συναρτήσεις του προτύπου MPI, είναι η µετατροπή των δεδοµένων στην περίπτωση που η διακίνησή τους γίνεται ανάµεσα σε ετερογενή συστήµατα που χαρακτηρίζονται από διαφορετικού τύπου αρχιτεκτονική. Υπάρχουν δύο είδη τέτοιων µετατροπών, η µετατροπή τύπου (type conversion) που µεταβάλλει τον τύπο δεδοµένων ενός στοιχείου (τυπικό παράδειγµα τέτοιας µετατροπής είναι αυτή από πραγµατικό αριθµό σε ακέραιο) και η µετατροπή αναπαράστασης (representation conversion) που µεταβάλλει τη δυαδική αναπαράσταση ενός αριθµού χαρακτηριστικό παράδειγµα τέτοιας µετατροπής είναι η µεταβολή της σειράς των bytes (byte ordering) ή η µεταβολή της αναπαράστασης των πραγµατικών αριθµών από 32 bits σε 64 bits. Είναι σηµαντικό να αναφερθεί στο σηµείο αυτό, πως οι κανόνες αντιστοιχίας των τύπων δεδοµένων που παρουσιάσαµε στις προηγούµενες παραγράφους προϋποθέτουν την απουσία οποιασδήποτε µετατροπής τύπων δεδοµένων. Από την άλλη πλευρά, το MPI απαιτεί πως η παραπάνω µετατροπή αναπαράστασης θα πρέπει να πραγµατοποιείται κάθε φορά που ένα στοιχείο που ανήκει σε κάποιο τύπο δεδοµένων ανταλλάσσεται ανάµεσα σε δύο συστήµατα που χρησιµοποιούν διαφορετικούς τύπους αναπαράστασης για αυτό το στοιχείο. Ωστόσο το MPI δεν καθορίζει τους κανόνες µε βάση τους οποίους θα πραγµατοποιηθεί αυτή η µετατροπή αναπαράστασης. Μια τέτοια µετατροπή αναµένεται να διατηρήσει την τιµή της µεταβλητής που µετατρέπεται (εάν πρόκειται για ακέραια µεταβλητή, λογική µεταβλητή ή µεταβλητή χαρακτήρα) ή να την προσαρµόσει στην πλησιέστερη προς αυτή τιµή που µπορεί να αναπαρασταθεί από το σύστηµα προορισµού (εάν πρόκειται για πραγµατική µεταβλητή).

9 Παράλληλα και Κατανεµηµένα Συστήµατα 9 Η παραπάνω διαδικασία µετατροπής της αναπαράστασης των τύπων δεδοµένων ανάµεσα στα συστήµατα αποστολής και παραλαβής της πληροφορίας, δύναται να οδηγήσει στην εµφάνιση σφαλµάτων υπερχείλισης (overflows) και υποχείλισης (underflows). Υπάρχει επίσης η πιθανότητα η µετατροπή ενός ακεραίου ή χαρακτήρα να οδηγήσει σε µία τιµή η οποία δεν δύναται να αναπαρασταθεί στο σύστηµα παραλήπτη. Τέτοιου είδους προβληµατικές καταστάσεις οδηγούν στη διακοπή της επικοινωνίας και στην αποτυχία της διαδικασίας αποστολής ή λήψης δεδοµένων. Για το λόγο αυτό, οι µετατροπές αυτού του είδους θα πρέπει να πραγµατοποιούνται µε πολύ µεγάλη προσοχή και όπου αυτό είναι αναγκαίο. Οι βασικές συναρτήσεις του MPI Αν και το πρότυπο MPI θεωρείται γενικά ως ένα πολύπλοκο µοντέλο επικοινωνίας, εν τούτοις, το σύνολο σχεδόν των παράλληλων εφαρµογών που στηρίζονται στη χρήση αυτού του προτύπου µπορεί να υλοποιηθεί χρησιµοποιώντας µόνο ένα µικρό πλήθος συναρτήσεων. Αυτές οι συναρτήσεις (καθώς και όλες οι συναρτήσεις του MPI) ορίζονται στο αρχείο επικεφαλίδας mpi.h το οποίο θα πρέπει να χρησιµοποιείται σε όλες τις εφαρµογές που χρησιµοποιούν το πρότυπο διαβίβασης µηνυµάτων. Η χρήση αυτού του αρχείου στη γλώσσα προγραµµατισµού C, θα γίνει κατά τα γνωστά δια της χρήσεως της εντολής του προεπεξεργαστή #include <mpi.h>. Είναι σηµαντικό να αναφερθεί στο σηµείο αυτό, πως πριν τη χρήση οποιασδήποτε εντολής MPI, θα πρέπει να λάβει χώρα η αρχικοποίηση αυτού του περιβάλλοντος, η οποία θα γίνει χρησιµοποιώντας τη συνάρτηση MPI_Init. Αυτό σηµαίνει πως αυτή η συνάρτηση θα πρέπει να καλείται πριν από οποιαδήποτε συνάρτηση MPI. Μετά τη χρήση των κατάλληλων σε κάθε περίπτωση συναρτήσεων του MPI, θα πρέπει να τερµατίζεται η λειτουργία αυτού του περιβάλλοντος, κάτι που γίνεται δια της χρήσεως της συνάρτησης MPI_Finalize(). Εποµένως η συνάρτηση αυτή θα πρέπει να καλείται πάντοτε τελευταία µέσα από τον πηγαίο κώδικα της εφαρµογής. Από την παραπάνω περιγραφή καθίσταται προφανές πως η δοµή ενός προγράµµατος που χρησιµοποιεί συναρτήσεις MPI θα είναι η ακόλουθη: #include <mpi.h> // Στο σηµείο αυτό µπορούµε να δηλώσουµε τα επιθυµητά σε κάθε περίπτωση // αρχεία επικεφαλίδας int main (int argc, char * argv[]) { // ήλωση των µεταβλητών του προγράµµατος // Κλήση συναρτήσεων της γλώσσας C MPI_Init (&argc, &argv); // Ανάµεσα στις συναρτήσεις MPI_Init() και MPI_Finalize() µπορούµε // να καλέσουµε συναρτήσεις του MPI και φυσικά οποιαδήποτε // συνάρτηση της γλώσσας C MPI_Finalize();

10 Το περιβάλλον προγραµµατισµού MPI 10 // Στο σηµείο αυτό µπορούµε να καλέσουµε συναρτήσεις της γλώσσας // C αλλά όχι και συναρτήσεις του MPI return (0); } Ως ένα πρώτο παράδειγµα προγράµµατος σε γλώσσα MPI ας δούµε το πιο απλό πρόγραµµα που µπορούµε να γράψουµε και το οποίο εκτυπώνει στην οθόνη του υπολογιστή µας το µήνυµα Hello World. Ο πηγαίος κώδικας για το απλό αυτό πρόγραµµα, παρουσιάζεται στη συνέχεια. #include <mpi.h> #include <stdio.h> int main (int argc, char * argv[0]) { char message [16] = Hello World!! MPI_Init (&argc, &argv); printf ( %s\n, message); MPI_Finalize(); return (0); } Το παραπάνω πρόγραµµα δεν χρησιµοποιεί καµία συνάρτηση του MPI και απλά αρχικοποιεί και τερµατίζει το προγραµµατιστικό αυτό περιβάλλον. Προκειµένου τώρα να δηµιουργήσουµε το εκτελέσιµο αρχείο, µπορούµε κατά τα γνωστά να χρησιµοποιήσουµε ένα οποιοδήποτε µεταγλωττιστή της γλώσσας C, όπως είναι για παράδειγµα ο µεταγλωττιστής gcc (GNU C compiler). Ωστόσο το MPI περιέχει εκτός των άλλων και ένα ενσωµατωµένο C compiler που εκτός από τις λειτουργίες ενός τυπικού µεταγλωττιστή περιέχει και εξειδικευµένες λειτουργίες που συσχετίζονται µε το περιβάλλον του MPI. Αυτός ο µεταγλωττιστής φέρει το όνοµα mpicc και χρησιµοποιείται µε το ίδιο ακριβώς τρόπο όπως και ο µεταγλωττιστής gcc. Έτσι για να κατασκευάσουµε το αρχείο αντικειµενικού κώδικα του παραπάνω αρχείου (το οποίο ας υποθέσουµε πως ονοµάζεται hello.c) θα πρέπει να χρησιµοποιήσουµε την εντολή mpicc c hello.c ενώ η κατασκευή του εκτελέσιµου αρχείου θα λάβει χώρα εάν γράψουµε mpicc o hello.exe mpi.o. Χρησιµοποιώντας το µεταγλωττιστή mpicc µε τον τρόπο που προαναφέραµε, θα λάβουµε το εκτελέσιµο αρχείο hello.exe. Χρησιµοποιώντας αυτό το αρχείο µπορούµε να κατασκευάσουµε ένα πλήθος Ν διεργασιών οι οποίες δύνανται να επικοινωνούν µεταξύ τους χρησιµοποιώντας τις συναρτήσεις του MPI. Ο τρόπος δηµιουργίας αυτών των διεργασιών είναι δια της χρήσεως της εφαρµογής mpirun που περιλαµβάνεται στο πακέτο διανοµής του προτύπου. Η αναλυτική παρουσίαση αυτής της εντολής θα γίνει σε επόµενη ενότητα. Για την ώρα όµως ας δούµε τον τρόπο µε τον οποίο θα χρησιµοποιήσουµε αυτή την εντολή για να δηµιουργήσουµε ένα πλήθος διεργασιών από την εφαρµογή hello.exe. Για να το κάνουµε αυτό θα πρέπει να καλέσουµε την εντολή µε το διακόπτη np συνοδευόµενο από το πλήθος των διεργασιών που θέλουµε να δηµιουργήσουµε. Έτσι καλώντας την εντολή mpirun µε τη µορφή mpirun np 5 hello.exe θα δηµιουργήσουµε πέντε διεργασίες (αντίγραφα του hello.exe) οι τάξεις (ranks) των οποίων θα είναι 0,1,2,3 και 4. Όσον αφορά το αποτέλεσµα της εκτέλεσης της παραπάνω εντολής, αυτό θα είναι η εκτύπωση του µηνύµατος Hello World!! από κάθε µια από αυτές τις διεργασίες. Αυτό σηµαίνει πως η έξοδος της εντολής mpirun np 5 hello.exe θα έχει τη µορφή Hello World!!

11 Παράλληλα και Κατανεµηµένα Συστήµατα 11 Hello World!! Hello World!! Hello World!! Hello World!! ύο άλλες ενδιαφέρουσες και πολύ χρήσιµες συναρτήσεις του MPI είναι η Get_Comm_rank που επιστρέφει την τάξη της τρέχουσας διεργασίας, και η Get_Comm_size που επιστρέφει το πλήθος των διεργασιών που περιλαµβάνονται στον τρέχοντα Communicator. Οι διεργασίες αυτές δέχονται δύο ορίσµατα εκ των οποίων το πρώτο όρισµα καθορίζει τον Communicator στον οποίο αναφερόµαστε, ενώ το δεύτερο όρισµα είναι ένας δείκτης προς µια ακέραια µεταβλητή, η οποία µετά την κλήση της συνάρτησης θα περιέχει τη ζητούµενη πληροφορία. Θεωρώντας δύο µεταβλητές rank και size τύπου integer, µπορούµε να βρούµε την τάξη της τρέχουσας διεργασίας και το συνολικό πλήθος των διεργασιών του προεπιλεγµένου Communicator που περιγράφεται από τη σταθερά MPI_COMM_WORLD, καλώντας τις παραπάνω συναρτήσεις µε τη µορφή MPI_Comm_rank (MPI_COMM_WORLD, &rank) και MPI_Comm_size (MPI_COMM_WORLD, &size). Εάν για παράδειγµα δηµιουργήσουµε πέντε αντίγραφα της διεργασίας hello.exe χρησιµοποιώντας την εντολή mpirun np 5 hello.exe, η κλήση της συνάρτησης MPI_Comm_size θα αποδώσει στην ακέραια µεταβλητή size την τιµή 5, ενώ η κλήση της συνάρτησης MPI_Comm_rank θα αποδώσει στη µεταβλητή rank την τάξη της τρέχουσας διεργασίας. Υπενθυµίζουµε στο σηµείο αυτό πως η κάθε διεργασία θα έχει τη δική της µεταβλητή rank, στην οποία θα καταχωρηθεί και η τάξη αυτής της διεργασίας. Αυτό σηµαίνει πως η µεταβλητή rank της πρώτης διεργασίας θα λάβει την τιµή 0, η µεταβλητή rank της δεύτερης διεργασίας θα λάβει την τιµή 1, η µεταβλητή rank της τρίτης διεργασίας θα λάβει την τιµή 2, η µεταβλητή rank της τέταρτης διεργασίας θα λάβει την τιµή 3, και η µεταβλητή rank της πέµπτης διεργασίας θα λάβει την τιµή 4. Προκειµένου να κατανοήσουµε το ρόλο και τον τρόπο χρήσης των συναρτήσεων MPI_Comm_rank και MPI_Comm_size ας εµπλουτίσουµε το πρόγραµµα Hello.c έτσι ώστε εκτός από το µήνυµα Hello World!! να εµφανίζει την τάξη της τρέχουσας διεργασίας και το συνολικό πλήθος των διεργασιών του Communicator. Σε πλήρη εφαρµογή της διαδικασίας που περιγράψαµε στην προηγούµενη παράγραφο, ας ορίσουµε δύο ακέραιες µεταβλητές rank και size και ας τις περάσουµε ως ορίσµατα στις αντίστοιχες συναρτήσεις. Ο νέος κώδικας που θα προκύψει µετά τις παραπάνω προσθήκες θα έχει τη µορφή #include <mpi.h> #include <stdio.h> int main (int argc, char * argv[0]) { int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); printf ( Hello World from process %d of %d\n, rank, size); MPI_Finalize();

12 Το περιβάλλον προγραµµατισµού MPI 12 return (0); } Εάν δηµιουργήσουµε το εκτελέσιµο αρχείο Hello.exe µε τον τρόπο που περιγράψαµε στην προηγούµενη παράγραφο και δηµιουργήσουµε τα πέντε αντίγραφα της διεργασίας χρησιµοποιώντας την εντολή mpirun np 5 hello.exe, το αποτέλεσµα που θα λάβουµε θα έχει τη µορφή Hello World from process 1 of 5 Hello World from process 2 of 5 Hello World from process 3 of 5 Hello World from process 4 of 5 Hello World from process 5 of 5 Παρατηρούµε λοιπόν πως η κάθε διεργασία κατά την εκτέλεσή της εκτυπώνει το µήνυµα Hello World εκτυπώνοντας την δική της τάξη και το συνολικό πλήθος των διεργασιών του Communicator. Οι δύο τελευταίες βασικές συναρτήσεις που θα παρουσιαστούν στο σηµείο αυτό, αφορούν τις παρεµποδιστικές συναρτήσεις αποστολής και λήψης µηνυµάτων οι οποίες φέρουν τα ονόµατα MPI_Send και MPI_Recv. Οι δύο αυτές συναρτήσεις παίρνουν ακριβώς τα ίδια ορίσµατα µε τη διαφορά πως η MPI_Recv δέχεται ένα επιπλέον όρισµα που περιέχει πληροφορίες σχετικά µε τη διαδικασία παραλαβής του µηνύµατος. Τα τρία πρώτα ορίσµατα των παραπάνω συναρτήσεων ταυτοποιούν το µήνυµα που αποστέλλεται ή λαµβάνεται. Πιο συγκεκριµένα, το πρώτο όρισµα είναι ένας δείκτης στην περιοχή µνήµης που περιέχει το µήνυµα προς αποστολή, το δεύτερο όρισµα περιέχει το πλήθος των αντικειµένων που περιλαµβάνονται σε αυτό το µήνυµα, ενώ το τρίτο όρισµα περιέχει τον τύπο αυτών των δεδοµένων. Ας υποθέσουµε για παράδειγµα, πως ορίζουµε ένα πίνακα 10 ακεραίων δια της χρήσεως µιας δήλωσης της µορφής int buffer [10]. Στην περίπτωση αυτή τα τρία πρώτα ορίσµατα της MPI_Send θα είναι τα (buffer, 10, MPI_INT). Τα υπόλοιπα ορίσµατα της συνάρτησης MPI_Send αφορούν τις υπόλοιπες παραµέτρους της επικοινωνίας. Έτσι το τέταρτο όρισµα περιέχει την τάξη της διαδικασίας η οποία θα παραλάβει το µήνυµα, το πέµπτο όρισµα περιέχει την ετικέτα του µηνύµατος, ενώ το τελευταίο όρισµα περιέχει τον Communicator στον οποίο ανήκουν οι διεργασίες ανάµεσα στις οποίες ανταλλάσσεται το τρέχον µήνυµα. Εάν δεν θέλουµε να χρησιµοποιήσουµε κάποια ετικέτα για το µήνυµα που αποστέλλεται, µπορούµε ως τιµή στο όρισµα της ετικέτας, να καταχωρήσουµε την τιµή MPI_ANY_TAG. Τέλος, εάν δεν έχουµε ορίσει κάποιο συγκεκριµένο Communicator αλλά οι δύο διεργασίες ανήκουν στον προεπιλεγµένο Communicator, θα χρησιµοποιήσουµε ως τιµή για το τελευταίο όρισµα της συνάρτησης MPI_Send, τη σταθερά MPI_COMM_WORLD. Τυπικό παράδειγµα της συνάρτησης MPI_Send είναι η κλήση της µε τη µορφή MPI_Send (&a, 1, MPI_INT, 5, MPI_ANY_TAG, MPI_COMM_WORLD) η οποία αποστέλλει στη διεργασία µε τιµή τάξης ίση µε 5 που ανήκει στον προεπιλεγµένο Communicator, την τιµή της µεταβλητής a. Επειδή η a είναι µία απλή ακέραια µεταβλητή που έχει δηλωθεί δια µέσου µιας δήλωσης της µορφής int a=10, τα τρία πρώτα ορίσµατα της συνάρτησης MPI_Send, θα είναι τα &a, 1 και MPI_INT. Στο παραπάνω παράδειγµα, η τιµή της ετικέτας του µηνύµατος προς αποστολή δεν

13 Παράλληλα και Κατανεµηµένα Συστήµατα 13 χρειάζεται ή δεν µας ενδιαφέρει για το λόγο αυτό ως τιµή για αυτή την ετικέτα χρησιµοποιείται η σταθερά MPI_ANY_TAG. Στην περίπτωση της διαδικασίας παραλαβής µηνυµάτων αυτή λαµβάνει χώρα δια της χρήσεως της συνάρτησης MPI_Recv. Αυτή η συνάρτηση δέχεται ακριβώς τα ίδια ορίσµατα µε την MPI_Send αλλά διαφέρει µε αυτή σε δύο σηµεία: (α) το τέταρτο όρισµα της συνάρτησης αναφέρεται προφανώς στην τάξη της διεργασίας από την οποία η τρέχουσα διεργασία παραλαµβάνει το αποστελλόµενο µήνυµα (source rank). Εάν επιθυµούµε να λάβουµε µηνύµατα από οποιαδήποτε από τις διεργασίες που υπάρχουν στο σύστηµα θα αποδώσουµε στην παράµετρο αυτή την τιµή MPI_ANY_SOURCE και (β) µετά το έκτο όρισµα που ταυτοποιεί τον Communicator στον οποίο ανήκουν οι δύο διεργασίες, υπάρχει ένα επιπλέον όρισµα που ανήκει στον σύνθετο τύπο δεδοµένων MPI_Status και περιέχει πληροφορίες σχετικά µε τις παραµέτρους παραλαβής του µηνύµατος. Αυτός ο τύπος δεδοµένων ορίζεται ως µια δοµή που περιέχει τρία πεδία: από τα πεδία αυτά το MPI_SOURCE περιέχει τη τάξη της διεργασίας αποστολέα, το MPI_TAG περιέχει την ετικέτα του µηνύµατος που έχει παραληφθεί, και το MPI_ERROR περιέχει τον κωδικό του σφάλµατος που έχει λάβει χώρα, εάν έχει καταγραφεί ένα τέτοιο σφάλµα. Αν και οι πληροφορίες σχετικά µε την τάξη της διαδικασίας αποστολέα και της ετικέτας του µηνύµατος µπορούν να ανακτηθούν και από τα αντίστοιχα ορίσµατα της συνάρτησης MPI_Recv, εν τούτοις, η δοµή MPI_Status είναι ιδιαίτερα χρήσιµη σε περιπτώσεις κατά τις οποίες οι πληροφορίες αυτές δεν έχουν καθορισθεί (αυτό σηµαίνει πως ως τιµές στα πεδία sourcerank και messagetag χρησιµοποιήθηκαν οι τιµές MPI_ANY_SOURCE και MPI_ANY_TAG). Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Recv, είναι η κλήση της µε τη µορφή MPI_Recv (&a, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, status) η οποία παραλαµβάνει από τη διεργασία µε τάξη 0, την τιµή της µεταβλητής a. Ένα άλλο θέµα που θα πρέπει να αναφέρουµε στο σηµείο αυτό είναι ο ρόλος του ορίσµατος count που είναι το δεύτερο από τα ορίσµατα της συνάρτησης MPI_Recv. Αυτό το όρισµα δεν αναφέρεται στο ακριβές πλήθος των στοιχείων που περιλαµβάνονται στο µήνυµα που πρόκειται να παραληφθεί, αλλά στο µέγιστο πλήθος αυτών των στοιχείων. Εάν σε αυτό το όρισµα καταχωρήσουµε µια ακέραια µεταβλητή Ν, αυτό σηµαίνει πως το µήνυµα που θα παραλάβουµε θα πρέπει να περιέχει το πολύ Ν στοιχεία στην αντίθετη περίπτωση η συνάρτηση παραλαβής δεν θα ολοκληρωθεί µε επιτυχία αλλά θα επιστρέψει ένα κωδικό σφάλµατος. Αξίζει επίσης να σηµειωθεί πως η χρήση του ορίσµατος count µας επιτρέπει να εκφράσουµε το µέγεθος του µηνύµατος, όχι σε bytes αλλά σε πλήθος στοιχείων που περιλαµβάνονται σε αυτό. Η τεχνική αυτή καθιστά την εφαρµογή µας ανεξάρτητη από την αρχιτεκτονική στην οποία εκτελείται και υπό αυτή την έννοια της προσδίδει πολύ µεγαλύτερο βαθµό φορητότητας (portability). Ας σηµειωθεί πως είναι δυνατή η αποστολή µε µηδενικό πλήθος στοιχείων αυτό σηµαίνει πως το όρισµα count έχει τιµή ίση µε το µηδέν. Στην περίπτωση αυτή η διεργασία αποστολέας αποστέλλει µόνο την επικεφαλίδα του µηνύµατος ενώ το τµήµα των δεδοµένων (data section) δεν υφίσταται.

14 Το περιβάλλον προγραµµατισµού MPI 14 Στο σηµείο αυτό έχουµε ολοκληρώσει την πρώτη ποιοτική περιγραφή των έξι βασικών συναρτήσεων του MPI, και είναι καιρός να περάσουµε στην αυστηρή περιγραφή της λειτουργίας τους και του τρόπου µε τον οποίο καλούνται. Σε γενικές γραµµές λοιπόν, οι συναρτήσεις MPI_Init, MPI_Finalize, MPI_Comm_rank, MPI_Comm_size, MPI_Send και MPI_Recv χαρακτηρίζονται από τις ακόλουθες ιδιότητες: MPI_Init: Η συνάρτηση αυτή αρχικοποιεί το πρότυπο MPI και δηµιουργεί όλες τις δοµές δεδοµένων που είναι αναγκαίες για τη λειτουργία του (όπως είναι για παράδειγµα ο προεπιλεγµένος Communicator MPI_COMM_WORLD). Όπως έχει ήδη αναφερθεί, η συνάρτηση αυτή θα πρέπει να κληθεί µία και µοναδική φορά, πριν την κλήση οποιασδήποτε άλλης συνάρτησης του MPI η κλήση της για δεύτερη φορά µέσα από την εφαρµογή θα προκαλέσει την εµφάνιση µηνύµατος λάθους. Το πρωτότυπο της συνάρτησης MPI_Init έχει τη µορφή MPI_Init (int * argc, char ** arcv[]) όπου argc και argv είναι τα ορίσµατα που χρησιµοποιούµε κατά την κλήση της συνάρτησης main. Από τα ορίσµατα αυτά το πρώτο αναφέρεται στο πλήθος των ορισµάτων µε τα οποία καλείται το εκτελέσιµο αρχείο της εφαρµογής, ενώ το δεύτερο είναι ένας πίνακας συµβολοσειρών ή ισοδύναµα ένας δισδιάστατος πίνακας χαρακτήρων που περιέχει τα ονόµατα αυτών των ορισµάτων. MPI_Finalize: η συνάρτηση MPI_Finalize είναι η τελευταία συνάρτηση που θα πρέπει να κληθεί και ο ρόλος της είναι ο τερµατισµός της λειτουργίας του προτύπου MPI. Αυτό σηµαίνει πως κάθε φορά που χρησιµοποιούµε συναρτήσεις MPI µέσα από ένα πρόγραµµα C, θα πρέπει υποχρεωτικά να χρησιµοποιούµε τη συνάρτηση MPI_Finalize για να απελευθερώσουµε τη µνήµη που δεσµεύεται από τις δοµές δεδοµένων του προτύπου και γενικά για να τερµατίσουµε τη λειτουργία του. Η συνάρτηση MPI_Finalize καλείται χωρίς ορίσµατα. MPI_Comm_rank: η συνάρτηση MPI_Comm_rank επιστρέφει την τάξη της τρέχουσας διεργασίας. Η κλήση της συνάρτησης χαρακτηρίζεται από τη σύνταξη MPI_Comm_rank (MPI_comm comm, int * rank) όπου η µεταβλητή comm χρησιµοποιείται για τον καθορισµό του Communicator στον οποίο ανήκει η διεργασία, ενώ η µεταβλητή rank είναι µια ακέραια µεταβλητή που µετά την επιτυχή κλήση της συνάρτησης θα περιέχει την τάξη της τρέχουσας διεργασίας. Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Comm_rank είναι η κλήση της µε τη µορφή MPI_Comm_rank (MPI_COMM_WORLD, &rank) η οποία επιστρέφει στη µεταβλητή rank την τάξη της τρέχουσας διεργασίας που ανήκει στον προεπιλεγµένο Communicator MPI_COMM_WORLD. MPI_Comm_size: η συνάρτηση MPI_Comm_size επιστρέφει το µέγεθος ενός Communicator, δηλαδή το πλήθος των διεργασιών που περιλαµβάνονται σε αυτόν. Η κλήση αυτής της συνάρτησης χαρακτηρίζεται από τη σύνταξη MPI_Comm_size (MPI_comm comm, int * size) όπου η µεταβλητή comm χρησιµοποιείται για τον καθορισµό του Communicator του οποίου το µέγεθος θέλουµε να ανακτήσουµε, ενώ η µεταβλητή size είναι µια ακέραια µεταβλητή που µετά την επιτυχή κλήση της συνάρτησης θα περιέχει το πλήθος των διεργασιών που περιλαµβάνονται στον τρέχοντα Communicator. Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Comm_size είναι η κλήση της µε τη µορφή MPI_Comm_size (MPI_COMM_WORLD, &size) η οποία επιστρέφει στη µεταβλητή size το πλήθος

15 Παράλληλα και Κατανεµηµένα Συστήµατα 15 των διεργασιών που ανήκουν στον προεπιλεγµένο Communicator MPI_COMM_WORLD. MPI_Send: η συνάρτηση MPI_Send χρησιµοποιείται για την αποστολή ενός µηνύµατος σε κάποια από τις διεργασίες που περιλαµβάνονται στον τρέχοντα Communicator. Ας σηµειωθεί πως αυτή η συνάρτηση ανήκει στις επονοµαζόµενες παρεµποδιστικές συναρτήσεις, οι οποίες κατά το χρονικό διάστηµα της λειτουργίας τους, αναστέλλουν τη λειτουργία της διεργασίας που τις καλεί. Το πρωτότυπο της συνάρτησης MPI_Send έχει τη µορφή MPI_Send (void * buf, int count, MPI_Datatype datatype, int destrank, int mesagetag, MPI_Comm comm). Από τα ορίσµατα αυτά της συνάρτησης, τα τρία πρώτα ταυτοποιούν τα χαρακτηριστικά του µηνύµατος προς αποστολή. Πιο συγκεκριµένα το πρώτο όρισµα περιέχει τη διεύθυνση της περιοχής µνήµης στην οποία βρίσκονται τα δεδοµένα προς αποστολή, το δεύτερο όρισµα περιέχει το πλήθος των στοιχείων προς αποστολή, ενώ το τρίτο όρισµα περιέχει τον τύπο δεδοµένων για αυτά τα στοιχεία. Τα επόµενα τρία ορίσµατα αφορούν (µε τη σειρά µε την οποία αναγράφονται) την τάξη της διεργασίας προς την οποία πρόκειται να αποσταλεί το µήνυµα (διεργασία παραλήπτης), την ετικέτα του µηνύµατος που µας επιτρέπει να ξεχωρίσουµε αυτό το µήνυµα από τα υπόλοιπα (εάν δεν θέλουµε να καθορίσουµε κάποια ετικέτα µπορούµε να καταχωρήσουµε σε αυτό το όρισµα την τιµή MPI_ANY_TAG) και τον Communicator στον οποίο ανήκουν οι διεργασίες αποστολέας και παραλήπτης. Η ετικέτα του µηνύµατος είναι ένας ακέραιος αριθµός που παίρνει τιµές στο διάστηµα [0, UB], όπου η τιµή της σταθεράς UB εξαρτάται από την υλοποίηση που χρησιµοποιείται σε κάθε περίπτωση. Προκειµένου να ανακτήσουµε την τιµή αυτής της σταθεράς, θα πρέπει να ζητήσουµε από το σύστηµα να µας επιστρέψει την τιµή του µεγέθους MPI_TAG_UB. Είναι προφανές πως εφ όσον η ετικέτα είναι ένας ακέραιος αριθµός, η τιµή αυτού του µεγέθους δεν µπορεί να είναι µικρότερη από Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Send είναι η κλήση της µε τη µορφή MPI_Send (buffer, 100, MPI_CHAR, 1, 0, MPI_COMM_WORLD) η οποία προκαλεί την αποστολή µιας συµβολοσειράς 100 χαρακτήρων στη διεργασία µε τιµή τάξης ίση µε 1. Αυτή η συµβολοσειρά περιλαµβάνεται σε ένα µήνυµα η ετικέτα του οποίου έχει την τιµή 0, ενώ και οι δύο διεργασίες ανήκουν στον προεπιλεγµένο Communicator MPI_COMM_WORLD. Είναι προφανές πως η περιοχή της ενδιάµεσης µνήµης στην οποία βρίσκονται αποθηκευµένα τα δεδοµένα προς αποστολή, αποτελείται από count συνεχόµενα στοιχεία τύπου datatype, µε το πρώτο όρισµα της συνάρτησης MPI_Send (που περιγράφεται από το όνοµα buf) να είναι ένας δείκτης προς το πρώτο από αυτά τα συνεχόµενα στοιχεία. Εφ όσον ο τύπος δεδοµένων για αυτά τα συνεχόµενα στοιχεία είναι γνωστός, είναι πάρα πολύ εύκολο να υπολογίσουµε το συνολικό µέγεθος των δεδοµένων προς αποστολή. Στο παραπάνω παράδειγµα η ενδιάµεση περιοχή µνήµης που περιέχει τα δεδοµένα του µηνύµατος, περιλαµβάνει 100 συνεχόµενους χαρακτήρες, και εποµένως το µέγεθος της περιοχής buffer είναι ίσο µε 100 bytes. Είναι προφανές πως εφ όσον το δεύτερο όρισµα της συνάρτησης MPI_Send αναφέρεται στο πλήθος των στοιχείων που περιλαµβάνονται στην ενδιάµεση µνήµη,

16 Το περιβάλλον προγραµµατισµού MPI 16 και όχι στο µέγεθός της σε bytes, είναι δυνατή η µεταφορά των προγραµµάτων MPI και σε αρχιτεκτονικές που δεν είναι οργανωµένες µε βάση το byte. MPI_Recv: η συνάρτηση MPI_Recv χρησιµοποιείται για την παραλαβή ενός µηνύµατος από κάποια από τις διεργασίες που ανήκουν στον τρέχοντα Communicator. Ας σηµειωθεί πως η συνάρτηση αυτή είναι µια παρεµποδιστική συνάρτηση, κάτι που σηµαίνει πως κατά τη διάρκεια της παραλαβής κάποιου µηνύµατος, λαµβάνει χώρα αναστολή της διεργασίας που την καλεί. Η χρήση της συνάρτησης MPI_Recv χαρακτηρίζεται από µια κλήση της µορφής MPI_Recv (void * buf, int count, MPI_Datatype datatype, int sourcerank, int messagetag, MPI_Comm comm, MPI_Status status) και εποµένως η εν λόγω συνάρτηση χρησιµοποιείται µε τον ίδιο σχεδόν τρόπο όπως η MPI_Send. Στην περίπτωση αυτή βέβαια το τέταρτο όρισµα αναφέρεται στην τάξη της διεργασίας αποστολέα, ενώ υπάρχει και ένα επιπλέον όρισµα που δεν εµφανίζεται στη συνάρτηση MPI_Send, και το οποίο όπως έχουµε ήδη αναφέρει επιτρέπει την ανάκτηση πληροφοριών σχετικά µε την κατάσταση παραλαβής του µηνύµατος. Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Recv είναι η κλήση της µε τη µορφή MPI_Recv (buffer, 50, MPI_DOUBLE, 4, MPI_ANY_TAG, MPI_COMM_WORLD, status) η οποία διαβάζει ένα µήνυµα που περιέχει 50 πραγµατικούς αριθµούς διπλής ακρίβειας από τη διεργασία µε τιµή τάξης ίση µε 4. Οι δύο διεργασίες του εν λόγω παραδείγµατος ανήκουν στον προεπιλεγµένο Communicator MPI_COMM_WORLD ενώ η ετικέτα που µηνύµατος που παραλαµβάνεται δεν µας ενδιαφέρει, και για το λόγο αυτό ως τιµή στο αντίστοιχο όρισµα χρησιµοποιείται η σταθερά MPI_ANY_TAG. Είναι προφανές πως η επιτυχής παραλαβή ενός µηνύµατος απαιτεί τη δέσµευση του κατάλληλου σε κάθε περίπτωση αποθηκευτικού χώρου. Πιο συγκεκριµένα, το µέγεθος του µηνύµατος προς παραλαβή θα πρέπει να είναι µικρότερο ή ίσο µε το µέγεθος του χώρου ενδιάµεσης αποθήκευσης το όνοµα του οποίου περνάµε ως πρώτο όρισµα στη συνάρτηση MPI_Recv. Εάν το µέγεθος του µηνύµατος (το οποίο ας υποθέσουµε πως είναι ίσο µε Ν) είναι µικρότερο από το µέγεθος του αποθηκευτικού χώρου, το µήνυµα θα καταλάβει τις Ν πρώτες θέσεις της µνήµης, ενώ το υπόλοιπο τµήµα του ενδιάµεσου αποθηκευτικού χώρου θα παραµείνει αµετάβλητο. Αντίθετα εάν το µήνυµα είναι µεγαλύτερο από το µέγεθος του εν λόγω χώρου, η παραλαβή του δεν θα ολοκληρωθεί σωστά, και η MPI_Recv θα επιστρέψει ένα κωδικό σφάλµατος. Μια χρήσιµη συνάρτηση που χρησιµοποιείται σε συνδυασµό µε την MPI_Recv, είναι η συνάρτηση MPI_Get_count η οποία µας επιτρέπει να ανακτήσουµε το µέγεθος του µηνύµατος που έχει παραληφθεί από την MPI_Recv, δηλαδή το πλήθος των στοιχείων που περιλαµβάνονται σε αυτό. Η σύνταξη της MPI_Get_count έχει τη µορφή MPI_Get_count (MPI_Status * status, MPI_Datatype datatype, int * count) όπου status είναι το τελευταίο όρισµα της MPI_Recv και περιέχει πληροφορίες σχετικά µε τη διαδικασία παραλαβής του µηνύµατος, datatype είναι ο τύπος δεδοµένων των στοιχείων που έχουν παραληφθεί, ενώ count είναι µια ακέραια µεταβλητή που µετά την κλήση της MPI_Get_count θα περιέχει το πλήθος αυτών των στοιχείων. Τυπικό παράδειγµα συνδυασµένης χρήσης των συναρτήσεων MPI_Recv και MPI_Get_count παρουσιάζεται στη συνέχεια: MPI_Recv (&value,1,mpi_int,rank-1,0, MPI_COMM_WORLD, &status ); MPI_Get_count (status, MPI_INT, &items)

17 Παράλληλα και Κατανεµηµένα Συστήµατα 17 Στον παραπάνω κώδικα, το όρισµα status (που ανήκει στον τύπο δεδοµένων MPI_Status) είναι εκείνο που επιστρέφεται από την MPI_Recv, ενώ items είναι µια ακέραια µεταβλητή η οποία µετά την κλήση της MPI_Get_count θα περιέχει το πλήθος των στοιχείων που περιέχονται στο µήνυµα που έχει παραληφθεί. Τα πρώτα προγράµµατα MPI Μετά την παρουσίαση των έξι βασικών συναρτήσεων του MPI ας παρουσιάσουµε τώρα µερικά παραδείγµατα χρήσης τους σε πρακτικές εφαρµογές προκειµένου να κατανοήσουµε το ρόλο τους και τον τρόπο µε τον οποίο χρησιµοποιούνται. Για κάθε ένα από τα προγράµµατα που θα παραθέσουµε θα εξηγήσουµε µε αναλυτικό τρόπο τη δοµή τους και τη λειτουργία τους προκειµένου ο αναγνώστης να εξοικειωθεί µε τη χρήση των συναρτήσεων MPI στη διαδικασία ανάπτυξης παράλληλων εφαρµογών. Ως ένα πρώτο παράδειγµα εφαρµογής MPI ας εξετάσουµε τον επόµενο κώδικα που επιτρέπει την ανταλλαγή µηνυµάτων µεταξύ δύο διεργασιών. #include <mpi.h> #include <stdio.h> int main (int argc, char * argv[]) { int rank, size, retval; char inmessage, outmessage='x'; MPI_Status status; retval = MPI_Init(&argc,&argv); if (retval!= 0) { printf ("Error starting MPI program. Terminating.\n"); MPI_Abort (MPI_COMM_WORLD, retval); } MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); if (rank == 0) { MPI_Send(&outMessage,1,MPI_CHAR,1,MPI_ANY_TAG, MPI_COMM_WORLD); MPI_Recv(&inMessage,1,MPI_CHAR, 1,MPI_ANY_TAG, MPI_COMM_WORLD, &status); } else if (rank == 1) { MPI_Recv(&inMessage,1,MPI_CHAR,source,tag, MPI_COMM_WORLD, &Stat); MPI_Send(&outMessage,1,MPI_CHAR,dest,tag, MPI_COMM_WORLD); } MPI_Finalize(); return (0); }

18 Το περιβάλλον προγραµµατισµού MPI 18 Στην πρώτη γραµµή του προγράµµατος δηλώνουµε τις µεταβλητές που θα χρησιµοποιήσουµε. Στην προκειµένη περίπτωση χρειαζόµαστε τρεις ακέραιες µεταβλητές, εκ των οποίων στη µεταβλητή rank θα καταχωρήσουµε την τάξη της τρέχουσας διεργασίας, στη µεταβλητή size θα καταχωρήσουµε το πλήθος των διεργασιών του τρέχοντος Communicator, ενώ η µεταβλητή retval χρησιµοποιείται για την ανάκτηση των κωδικών σφάλµατος (error codes) που επιστρέφονται από τις συναρτήσεις του MPI. Εκτός από τις παραπάνω µεταβλητές, θα χρειαστούµε δύο µεταβλητές τύπου χαρακτήρα που θα περιέχουν τα µηνύµατα προς αποστολή και λήψη (οι µεταβλητές inmessage και outmessage) ενώ είναι αναγκαία και η χρήση της µεταβλητής status που ανήκει στον τύπο δεδοµένων MPI_Status και χρησιµοποιείται από τη συνάρτηση MPI_Recv. Σε πλήρη εφαρµογή της θεωρίας που παρουσιάσαµε στις προηγούµενες ενότητες, η πρώτη συνάρτηση που καλείται πριν την κλήση οποιασδήποτε συνάρτησης MPI, είναι η MPI_Init, η οποία δέχεται ως ορίσµατα δύο δείκτες προς τα αντίστοιχα ορίσµατα της συνάρτησης main. Ωστόσο στην προκειµένη περίπτωση δεν περιοριζόµαστε στην απλή κλήση της εν λόγω συνάρτησης, αλλά ανακτούµε τον κωδικό σφάλµατος που επιστρέφεται από αυτή, προκειµένου να ελέγξουµε εάν η διαδικασία αρχικοποίησης του MPI έχει περατωθεί οµαλά. Σύµφωνα µε τις προδιαγραφές του εν λόγω προτύπου, εάν η αρχικοποίηση του MPI ολοκληρωθεί χωρίς πρόβληµα, η συνάρτηση MPI_Init επιστρέφει τιµή ίση µε το µηδέν (η τιµή αυτή αντιστοιχεί στη σταθερά MPI_SUCCESS), ενώ εάν παρουσιαστεί κάποιο σφάλµα, αυτή η επιστρεφόµενη τιµή είναι διάφορη του µηδενός. Στην τελευταία περίπτωση θα πρέπει να καλέσουµε τη συνάρτηση MPI_Abort η οποία τερµατίζει όλες τις διεργασίες που περιλαµβάνονται στον τρέχοντα Communicator και χαρακτηρίζεται από µια σύνταξη της µορφής MPI_Abort (MPI_Comm comm, int errorcode). Μιλώντας γενικά, η συνάρτηση MPI_Abort θα πρέπει να καλείται κάθε φορά που η MPI_Init αποτύχει να διαµορφώσει µε επιτυχία το περιβάλλον του MPI. Στην περίπτωση κατά την οποία η εκκίνηση του MPI περατωθεί οµαλά, χρησιµοποιούµε δύο εντολές οι οποίες καλούνται σε όλες σχεδόν τις περιπτώσεις: την εντολή MPI_Comm_rank για να ανακτήσουµε την τάξη της τρέχουσας διεργασίας και την εντολή MPI_Comm_size για να ανακτήσουµε το πλήθος των διεργασιών που περιλαµβάνονται στον τρέχοντα Communicator. Σύµφωνα µε τον κώδικα του προηγούµενου παραδείγµατος, οι εν λόγω τιµές µετά την εκτέλεση αυτών των δύο εντολών θα βρίσκονται καταχωρηµένες στις µεταβλητές rank και size αντίστοιχα. Οι επόµενες οµάδες εντολών που χαρακτηρίζονται από τις συνθήκες ελέγχου if (rank==0) και if (rank==1) αποτελούν ένα πρώτο παράδειγµα εφαρµογής της τάξης µιας διεργασίας. Όπως έχει ήδη αναφερθεί, µετά τη δηµιουργία του εκτελέσιµου αρχείου και τη χρήση της εντολής mpirun για τη δηµιουργία του επιθυµητού σε κάθε περίπτωση πλήθους διεργασιών, η κάθε διεργασία χαρακτηρίζεται από τη δική της τάξη, το δικό της χώρο µνήµης και τη δική της οµάδα µεταβλητών. Εάν για παράδειγµα χρησιµοποιήσουµε την εντολή mpirun np 2 example.exe όπου example.exe είναι το όνοµα του εκτελέσιµου αρχείου τότε θα λάβει χώρα δηµιουργία δύο διεργασιών η πρώτη εκ των οποίων θα έχει τάξη ίση µε το µηδέν, ενώ η δεύτερη θα έχει τάξη ίση µε 1. Εποµένως, λαµβάνοντας υπ όψιν πως ο κώδικας του ανωτέρω παραδείγµατος θα εκτελεστεί δύο φορές µια για την κάθε διεργασία είναι προφανές πως στην περίπτωση της πρώτης διεργασίας (που έχει τιµή τάξης ίση µε το µηδέν) θα εκτελεστεί η οµάδα εντολών που αντιστοιχεί στη

19 Παράλληλα και Κατανεµηµένα Συστήµατα 19 συνθήκη ελέγχου if (rank==0), ενώ στην περίπτωση της δεύτερης διεργασίας (που έχει τιµή τάξης ίση µε 1) θα εκτελεστεί η οµάδα εντολών που αντιστοιχεί στη συνθήκη ελέγχου if (rank==1). Με τον τρόπο αυτό είναι δυνατή η χρήση διαφορετικών συναρτήσεων και η υλοποίηση διαφορετικών διαδικασιών για κάθε µια από τις διεργασίες του συστήµατος, ανάλογα µε την τιµή της τάξης η οποία αποδίδεται σε αυτές από το περιβάλλον του MPI. Ας περάσουµε τώρα στο είδος της διαδικασίας που υλοποιείται σε κάθε περίπτωση. Στην περίπτωση της διεργασίας µε τιµή τάξης ίση µε το µηδέν, λαµβάνει χώρα αποστολή ενός απλού χαρακτήρα στη διεργασία µε τάξη 1, και λήψη ενός απλού χαρακτήρα από την εν λόγω διεργασία. Με εντελώς ανάλογο τρόπο, η διεργασία µε τάξη ίση 1, διαβάζει ένα απλό χαρακτήρα από τη διεργασία µε τάξη µηδέν, και κατόπιν αποστέλλει σε αυτή, το δικό της απλό χαρακτήρα. Εποµένως το παραπάνω πρόγραµµα το µόνο που κάνει είναι να δηµιουργεί δύο διεργασίες οι οποίες ανταλλάσσουν υπό τη µορφή µηνύµατος ένα απλό χαρακτήρα. Στο παράδειγµα του παραπάνω κώδικα η ετικέτα του µηνύµατος είναι µία παράµετρος που δεν µας ενδιαφέρει και για το λόγο αυτό χρησιµοποιείται η σταθερά MPI_ANY_TAG. Όσον αφορά τον Communicator δια µέσου του οποίου επικοινωνούν οι δύο διεργασίες, αυτός είναι ο προεπιλεγµένος Communicator που ταυτοποιείται από τον κωδικό MPI_COMM_WORLD. Στο τελευταίο βήµα της διαδικασίας καλούµε κατά τα γνωστά τη συνάρτηση MPI_Finalize για να τερµατίσει το περιβάλλον του MPI και παράλληλα ολοκληρώνουµε τη λειτουργία της συνάρτησης main µε την εντολή return (0). Ας περάσουµε τώρα σε ένα δεύτερο παράδειγµα χρήσης των συναρτήσεων του MPI. Για να το κάνουµε αυτό ας υποθέσουµε πως διαθέτουµε ένα πλήθος Ν διεργασιών οι οποίες έχουν τάξεις µε τιµές από 0 έως Ν-1. Από αυτές τις διεργασίες, αυτή που έχει τάξη όση µε το µηδέν, διαβάζει από το πληκτρολόγιο ένα θετικό αριθµό και στη συνέχεια τον αποστέλλει σε όλες τις διεργασίες που υπάρχουν στο σύστηµα. Η κάθε µια από αυτές τις διεργασίες, παραλαµβάνει τον εν λόγω αριθµό και εκτυπώνει την τιµή του µαζί µε την τάξη της. Αυτή η διαδικασία συνεχίζεται µέχρι ο χρήστης καταχωρήσει από το πληκτρολόγιο ένα αρνητικό αριθµό. Ο πηγαίος κώδικας που υλοποιεί την παραπάνω διαδικασία, παρουσιάζεται στη συνέχεια. #include <stdio.h> #include <mpi.h> int main (int argc, char * argv[]) { int rank, input; MPI_Init (&argc, &argv); MPI_Comm_rank ( MPI_COMM_WORLD, &rank ); do { if (rank==0) scan f("enter input value : %d", &input); MPI_Bcast (&input, 1, MPI_INT, 0, MPI_COMM_WORLD ); printf ( "Process %d got input %d\n", rank, input);

20 Το περιβάλλον προγραµµατισµού MPI 20 MPI_Finalize (); return (0); } } while (input>=0); Στον παραπάνω κώδικα παρουσιάζεται ένα ακόµη παράδειγµα διαφοροποίησης της διαδικασίας που πραγµατοποιείται µέσα σε κάποια διεργασία, µε κριτήριο την τιµή της τάξης της: εάν η τάξη της τρέχουσας διεργασίας είναι ίση µε το µηδέν, τότε η διεργασία αυτή είναι και εκείνη που θα αναλάβει να διαβάσει από το πληκτρολόγιο την τιµή που καταχωρεί ο χρήστης. Στη συνέχεια η εν λόγω τιµή διαβιβάζεται σε όλες τις υπόλοιπες διεργασίες του συστήµατος, οι οποίες την διαβάζουν και την εκτυπώνουν µαζί µε την τιµή της τάξης τους. Οι υπόλοιπες συναρτήσεις του MPI που χρησιµοποιούνται στο παραπάνω κώδικα είναι οι MPI_Init και MPI_Finalize που χρησιµοποιούνται για την αρχικοποίηση και τον τερµατισµό της λειτουργίας του MPI, καθώς και η συνάρτηση MPI_Comm_rank που επιστρέφει την τάξη της τρέχουσας διεργασίας. Η νέα συνάρτηση που εµφανίζεται για πρώτη φορά στην παρούσα ανάλυση, είναι η συνάρτηση MPI_Bcast η οποία αποτελεί και το πρώτο παράδειγµα συλλογικής επικοινωνίας. Η συνάρτηση αυτή αποστέλλει το µήνυµα κάποιας διεργασίας, σε όλες τις διεργασίες του συστήµατος, και εποµένως η διαδικασία που λαµβάνει χώρα δια της χρήσεως αυτής της συνάρτησης, είναι µια διαδικασία εκποµπής της πληροφορίας. Η σύνταξη αυτής της συνάρτησης έχει τη µορφή MPI_Bcast (void * buffer, int count, MPI_Datatype datatype, int srcrank, MPI_Comm comm). Από τα πέντε ορίσµατα που δέχεται η εν λόγω συνάρτηση, τα τρία πρώτα ορίσµατα χρησιµοποιούνται για τον καθορισµό των χαρακτηριστικών του µηνύµατος, και πιο συγκεκριµένα της διεύθυνσης µνήµης που περιέχει τα δεδοµένα προς αποστολή, καθώς επίσης το πλήθος και τον τύπο αυτών των δεδοµένων. Το τέταρτο όρισµα της συνάρτησης αναφέρεται στην τάξη της διεργασίας που εκπέµπει το µήνυµα (source rank). Η πληροφορία αυτή είναι αρκετή για να περιγράψει πλήρως τη διαδικασία της επικοινωνίας δεδοµένου πως το µήνυµα θα αποσταλεί σε όλες τις διεργασίες, δεν απαιτείται ο καθορισµός της τάξης της διαδικασίας παραλήπτη. Το τελευταίο όρισµα της συνάρτησης MPI_Bcast αναφέρεται στον Communicator στον οποίο ανήκουν οι παραπάνω διεργασίες. Εάν δεν έχουµε ορίσει κάποιον άλλο Communicator, τότε χρησιµοποιείται ο προεπιλεγµένος Communicator MPI_COMM_WORLD. Παράδειγµα χρήσης της συνάρτησης MPI_Bcast είναι η κλήση της µε τη µορφή MPI_Bcasr (&a, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD) η οποία επιτρέπει την εκποµπή της τιµής της πραγµατικής µεταβλητής a από τη διεργασία µε τιµή τάξης 0 σε όλες τις διεργασίες του συστήµατος. Ας σηµειωθεί πως µετά τον τερµατισµό της λειτουργίας αυτής της συνάρτησης, όλες οι ενδιάµεσες µνήµες των διεργασιών της εφαρµογής έχουν τα ίδια περιεχόµενα αυτό σηµαίνει πως δεν είναι αναγκαία η χρήση της συνάρτησης MPI_Recv για την παραλαβή του µηνύµατος, καθώς αυτό έχει ήδη αναγνωσθεί. Επιστρέφοντας στο παραπάνω παράδειγµα, δεν είναι δύσκολο να καταλάβουµε πως εκείνο που κάνει η συνάρτηση MPI_Bcast είναι να εκπέµπει προς όλες τις διεργασίες του συστήµατος την τιµή της µεταβλητής input η οποία διαβάστηκε από το πληκτρολόγιο από τη διεργασία µε τιµή τάξης ίση µε το µηδέν. Εάν δηµιουργήσουµε το εκτελέσιµο αρχείο και στη συνέχεια δηµιουργήσουµε 5

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

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

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

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

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

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

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

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

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

Message Passing Interface (MPI)

Message Passing Interface (MPI) Message Passing Interface (MPI) Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων Αθήνα, εκέµβριος 2002 Τι είναι το MPI; Είναι πρότυπο, όχι συγκεκριµένη υλοποίηση Βιβλιοθήκη ανταλλαγής

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

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

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

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

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. MPI Απλές εντολές 03/13/2016. Οδηγίες αποστολής / παραλαβής μηνυμάτων, Υπολογισμός του π (

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. MPI Απλές εντολές 03/13/2016. Οδηγίες αποστολής / παραλαβής μηνυμάτων, Υπολογισμός του π ( Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Αναπληρωτής Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr MPI Οδηγίες αποστολής / παραλαβής μηνυμάτων, Υπολογισμός

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

Εισαγωγή. E-03: Λειτουργικά Συστήµατα ΙΙ 6. Εαρινό Εξάµηνο SUN RPC. Κλήση Αποµακρυσµένων ιαδικασιών (RPC) Σύνδεση: Port Mapper.

Εισαγωγή. E-03: Λειτουργικά Συστήµατα ΙΙ 6. Εαρινό Εξάµηνο SUN RPC. Κλήση Αποµακρυσµένων ιαδικασιών (RPC) Σύνδεση: Port Mapper. Εισαγωγή Ε-03: Λειτουργικά Συστήµατα ΙΙ Εαρινό Εξάµηνο 2005-06 Sun RPC MPI «Sun RPC & MPI» ρ. Παναγιώτης Χατζηδούκας (Π..407/80) E-03: Λειτουργικά Συστήµατα ΙΙ 1 E-03: Λειτουργικά Συστήµατα ΙΙ 2 Κλήση

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

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

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

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

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

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

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

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

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

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

Message Passing Interface (MPI)

Message Passing Interface (MPI) Message Passing Interface (MPI) Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων Αθήνα, Νοέµβριος 2003 24/11/2003 Message Passing Interface (MPI) 1 Παράλληλες αρχιτεκτονικές Αρχιτεκτονική

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

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ ΣΤO MESSAGE PASSING INTERFACE - MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β.

ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ ΣΤO MESSAGE PASSING INTERFACE - MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΕΚΔΟΣΗ 1.0 ΟΚΤΩΒΡΙΟΣ, 2017 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ ΣΤO MESSAGE PASSING INTERFACE - MPI ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ CONTENTS ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ... 2 Εισαγωγή...

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

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ. Της φοιτήτριας Αριστέας Χρονοπούλου Αρ. Μητρώου: 01 / Επιβλέπων Καθηγητής Αθανάσιος Μάργαρης

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ. Της φοιτήτριας Αριστέας Χρονοπούλου Αρ. Μητρώου: 01 / Επιβλέπων Καθηγητής Αθανάσιος Μάργαρης ΑΛΕΞΑΝ ΡΕΙΟ Τ.Ε.Ι. ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΤΟ ΜΟΝΤΕΛΟ ΜΕΤΑΒΙΒΑΣΗΣ ΜΗΝΥΜΑΤΩΝ MESSAGE PASSING INTERFACE (MPI) Της φοιτήτριας Αριστέας Χρονοπούλου Αρ.

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

Αρχιτεκτονική κοινής μνήμης

Αρχιτεκτονική κοινής μνήμης Αρχιτεκτονική κοινής μνήμης Οι επεξεργαστές έχουν κοινή μνήμη Κάθε επεξεργαστής διαθέτει τοπική ιεραρχία κρυφών μνημών Συνήθως η διασύνδεση γίνεται μέσω διαδρόμου μνήμης (memory bus) Αλλά και πιο εξελιγμένα

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

Επικοινωνία. Message-Passing Interface (MPI) Βασικές Κλήσεις για Sockets. Μοντέλο Μεταβίβασης Μηνυµάτων. Μοντέλα Παράλληλου Υπολογισµού

Επικοινωνία. Message-Passing Interface (MPI) Βασικές Κλήσεις για Sockets. Μοντέλο Μεταβίβασης Μηνυµάτων. Μοντέλα Παράλληλου Υπολογισµού Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 Επικοινωνία Πολλάκατανεµηµένα συστήµατα υλοποιούνται πάνω από ένα απλό µοντέλο µηνυµάτων επικοινωνίας,

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

Συστήµατα Παράλληλης Επεξεργασίας. Message Passing Interface (MPI)

Συστήµατα Παράλληλης Επεξεργασίας. Message Passing Interface (MPI) Message Passing Interface (MPI) Αρχιτεκτονική κοινής µνήµης Οι επεξεργαστές έχουν κοινή µνήµη Κάθε επεξεργαστής διαθέτει τοπική ιεραρχία κρυφών µνηµών Συνήθως η διασύνδεση γίνεται µέσω διαδρόµου µνήµης

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

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

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

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

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 10/3/2017

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 10/3/2017 Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr Εισαγωγή στο MPI Εγκατάσταση του Message Passing Interface,

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

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

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

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

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών Υπολογισμός με βάση το πέρασμα μηνυμάτων Προγραμματισμός με πέρασμα μηνυμάτων ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών που θα εκτελούνται σε διαφορετικούς υπολογιστές. 2.

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

MPI: Message Passing Interface

MPI: Message Passing Interface Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων MPI: Message Passing Interface 9 ο Εξάμηνο Αρχιτεκτονική κοινής μνήμης Οι επεξεργαστές

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

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

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

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

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

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 3: MPI_Get_count, non blocking send/recv, εμφάνιση και αποφυγή αδιεξόδων Δρ. Μηνάς Δασυγένης mdasyg@ieee.org

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

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι Εισαγωγή Στον Προγραµµατισµό «C» Πίνακες Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Πίνακες στη C Ένας πίνακας στη C είναι

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

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

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Βασικά Στοιχεία Το αλφάβητο της C Οι βασικοί τύποι της C Δηλώσεις μεταβλητών Είσοδος/Έξοδος Βασικές εντολές της C Αλφάβητο

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

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

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

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

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

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

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

Οι δείκτες στη γλώσσα C

Οι δείκτες στη γλώσσα C Οι δείκτες στη γλώσσα C Δείκτης είναι µία µεταβλητή η οποία περιέχει σαν τιµή µία διεύθυνση της µνήµης Η τιµή ενός δείκτη δείχνει σε µία άλλη µεταβλητή, η οποία µπορεί να προσεγγισθεί έµµεσα µε τους ειδικούς

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

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128] ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

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

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C Τµήµα Πληροφορικής και Τηλεπικοινωνιών Περιεχόµενα Εισαγωγή Πρόγραµµα Φάσεις Υλοποίησης µε χρήση του εργαλείου DEV C + + οµή Προγράµµατος Η συνάρτηση main Μεταβλητές Τι είναι

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

Message Passing Interface (MPI)

Message Passing Interface (MPI) Message Passing Interface (MPI) Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων Αθήνα, Οκτώβριος 2009 21/10/2009 Message Passing Interface (MPI) 1 Παράλληλες αρχιτεκτονικές Αρχιτεκτονική

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

Προγραµµατισµός µε ανταλλαγή µηνυµάτων Ι. Εισαγωγή στο MPI. Εφαρµογές Ανεξάρτητου Παραλληλισµού.

Προγραµµατισµός µε ανταλλαγή µηνυµάτων Ι. Εισαγωγή στο MPI. Εφαρµογές Ανεξάρτητου Παραλληλισµού. Προγραµµατισµός µε ανταλλαγή µηνυµάτων Ι. Εισαγωγή στο MPI. Εφαρµογές Ανεξάρτητου Παραλληλισµού. Λογισµικό & Προγραµµατισµός Συστηµάτων Υψηλής Επίδοσης Οµάδα Παράλληλων & Κατανεµηµένων Συστηµάτων http://pdsgroup.hpclab.ceid.upatras.gr/

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

Message Passing Interface (MPI)

Message Passing Interface (MPI) Message Passing Interface (MPI) Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων Αθήνα, Νοέµβριος 2004 22/11/2004 Message Passing Interface (MPI) 1 Παράλληλες αρχιτεκτονικές Αρχιτεκτονική

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 8.7 Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 17-1 Εισαγωγή Στις προηγούµενες διαλέξεις µάθαµε πώς να δηλώνουµε, αρχικοποιούµε και να επεξεργαζόµαστε πίνακες. Σήµερα θα µελετήσουµε

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

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. Γρήγορος οδηγός αναφοράς 1/4/2017

Κατανεμημένος και Παράλληλος Προγραμματισμός MPI. Γρήγορος οδηγός αναφοράς 1/4/2017 Κατανεμημένος και Παράλληλος Προγραμματισμός Ηλίας Κ. Σάββας Καθηγητής Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Θεσσαλίας Email: savvas@teilar.gr MPI Διαμοίραση (MPI_Scatter) και συλλογή δεδομένων (MPI_Gather)

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

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης H ΓΛΩΣΣΑ C Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C ηµήτρης Ψούνης 2 Περιεχόµενα Μαθήµατος Α. Θεωρία 1. Κύκλος Ανάπτυξης Προγράµµατος 1. Συγγραφή και Μεταγλώττιση ενός προγράµµατος 2. Εκτέλεση του προγράµµατος

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

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 3: Είσοδος / Έξοδος, Βασικοί Τύποι, Δήλωση Μεταβλητών Ένα Ακόμα Παράδειγμα #include int main(int argc, char* argv[]) { } putchar('h'); putchar('e'); putchar('l');

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

Υπολογιστικές Μέθοδοι Ανάλυσης και Σχεδιασµού Υπολογιστικό Εργαστήριο Μάθηµα 1 Εισαγωγή στο MPI http://ecourses.chemeng.ntua.gr/courses/computational_methods Αρχιτεκτονικές Παράλληλων Υπολογιστών Shared

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

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 2 ο Τύποι Δεδοµένων Δήλωση Μεταβλητών Έξοδος Δεδοµένων Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Μνήµη και Μεταβλητές Σχέση Μνήµης Υπολογιστή και Μεταβλητών Η µνήµη (RAM) ενός

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 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 στην

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

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

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

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

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

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

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

Επεξεργασία Αρχείων Κειµένου

Επεξεργασία Αρχείων Κειµένου Επεξεργασία Αρχείων Κειµένου Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Αρχεία Κειµένου Γενικά Συναρτήσεις Επεξεργασίας Αρχείων Κειµένου ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1 Αρχεία Γενικά

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

Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 12-1 Ανασκόπηση οµής Προγράµµατος µε Συναρτήσεις #include 1 void PrintMessage (); Πρότυπο ( ήλωση) Συνάρτησης (

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

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD Σε ορισµένες περιπτώσεις είναι ιδιαίτερα χρήσιµη η δηµιουργία ιστοσελίδων ενηµερωτικού περιεχοµένου οι οποίες στη συνέχεια µπορούν να δηµοσιευθούν σε κάποιο τόπο

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf(%u\n, x); Β. unsigned char ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Β Περιόδου 2015 (8/9/2015) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

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

MPI: Message Passing Interface

MPI: Message Passing Interface Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων MPI: Message Passing Interface 9ο Εξάμηνο Αρχιτεκτονική κοινής μνήμης Οι επεξεργαστές έχουν

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

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

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 3.1,3.3-3.4: Συναρτήσεις I ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 11-1 Μη- οµηµένος Προγραµµατισµός Το πρόγραµµα στα αριστερά δεν είναι Αρθρωτό (δεν έχει σωστή δοµή). Όλη η λειτουργικότητα

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων Δομημένος Προγραμματισμός Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr 2 Ορισμός

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

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

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

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

είκτες και Πίνακες (2)

είκτες και Πίνακες (2) είκτες και Πίνακες (2) Στην ενότητα αυτή θα µελετηθούν τα εξής θέµατα: Πολυδιάστατοι πίνακες Πέρασµα παραµέτρων σε προγράµµατα C ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-1 Πίνακες εικτών Πίνακας δεικτών είναι

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 8.7 Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Πολυδιάστατοι πίνακες Μέχρι τώρα µιλούσαµε για Μονοδιάστατους Πίνακες. ή π.χ. int age[5]= {31,28,31,30,31; για Παράλληλους πίνακες,

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

Προγραμματισμός με Μεταβίβαση Μηνυμάτων

Προγραμματισμός με Μεταβίβαση Μηνυμάτων 5 Προγραμματισμός με Μεταβίβαση Μηνυμάτων Σε αυτό το κεφάλαιο του βιβλίου θα ασχοληθούμε με το προγραμματιστικό μοντέλο μεταβίβασης μηνυμάτων (message passing model), κατά πολλούς το πιο ευρέως χρησιμοποιούμενο

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

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

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

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

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες Σκοπός της Άσκησης ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση με τη χρήση των δεικτών (pointers). Οι δείκτες δίνουν την δυνατότητα σε προγράμματα να προσομοιώνουν τη

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

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

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

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

char name[5]; /* define a string of characters */

char name[5]; /* define a string of characters */ Συµβολοσειρές (Strings) Συµβολοσειρά (string) είναι µια σειρά αλφαριθµητικών χαρακτήρων (γενικά εκτυπώσιµων συµβόλων ASCII). Όταν λέµε σειρά εννοούµε διαδοχικές θέσεις µνήµης που µπορούν να αντιµετωπισθούν

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

ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C

ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C Σκοπός της Άσκησης ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η ανάλυση των βασικών χαρακτηριστικών της Γλώσσας Προγραµµατισµού C: τη δοµή των προγραµµάτων της,

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C Εισαγωγή στην C Μορφή Προγράµµατος σε γλώσσα C Τµήµα Α Με την εντολή include συµπεριλαµβάνω στο πρόγραµµα τα πρότυπα των συναρτήσεων εισόδου/εξόδου της C.Το αρχείο κεφαλίδας stdio.h είναι ένας κατάλογος

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

Κλάσεις και Αντικείµενα

Κλάσεις και Αντικείµενα Κλάσεις και Αντικείµενα Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Κλάσεις και Αντικείµενα 2 Τα αντικείµενα σε µια αντικειµενοστρεφή γλώσσα προγραµµατισµού, µοντελοποιούν

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ Μέρος 2ο ΝΙΚΟΛΑΟΣ ΣΤΕΡΓΙΟΥΛΑΣ ΤΜΗΜΑ ΦΥΣΙΚΗΣ ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ 1 ΣΦΑΛΜΑΤΑ ΜΕΤΑΓΛΩΤΤΙΣΗΣ Η γλώσσα C κάνει αυστηρή διάκριση μεταξύ πεζών

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

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1 ΑΕΜ ΒΑΘΜΟΣ 449 PASS 451 PASS 476-1733 PASS 1779-1899 FAIL 1900 FAIL Page 1 1901 PASS 1904 PASS 1908 PASS 1909 PASS 1910 - Page 2 1911 PASS 1914 Οριακό PASS 1915 PASS 1926 PASS Page 3 1927 PASS 1928 Οριακό

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

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο 2015-2016 Δεύτερη Προγραμματιστική Εργασία Γενική περιγραφή Στη δεύτερη προγραμματιστική εργασία καλείστε να υλοποιήσετε ένα διομότιμο σύστημα (Peer-to-

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

Η βασική συνάρτηση προγράμματος main()

Η βασική συνάρτηση προγράμματος main() Η βασική συνάρτηση προγράμματος main() HEADER FILES main(){ ΔΗΛΩΣΕΙΣ ΜΕΤΑΒΛΗΤΩΝ ΕΝΤΟΛΕΣ (σειριακές, επιλογής ή επανάληψης) ΕΠΙΣΤΡΕΦΟΜΕΝΟΣ ΤΥΠΟΣ (return 0;) Συναρτήσεις Η συνάρτηση είναι ένα υποπρόγραμμα

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

Τφποι δεδομζνων MPI. Κώςτασ Διαμαντάρασ Τμιμα Πλθροφορικισ ΤΕΙ Θεςςαλονίκθσ

Τφποι δεδομζνων MPI. Κώςτασ Διαμαντάρασ Τμιμα Πλθροφορικισ ΤΕΙ Θεςςαλονίκθσ Τφποι δεδομζνων MPI Κώςτασ Διαμαντάρασ Τμιμα Πλθροφορικισ ΤΕΙ Θεςςαλονίκθσ MPI datatypes Σκοπόσ MPI datatypes: θ ςυνεργαςία μεταξφ ετερογενών υπολογιςτών και αρχιτεκτονικών Η χριςθ μθ ςυνεχών κζςεων μνιμθσ.

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

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

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

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

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

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

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

Non-blocking Επικοινωνίεσ και Buffering. Κώςτασ Διαμαντάρασ ΤΕΙ Θεςςαλονίκθσ 2011

Non-blocking Επικοινωνίεσ και Buffering. Κώςτασ Διαμαντάρασ ΤΕΙ Θεςςαλονίκθσ 2011 Non-blocking Επικοινωνίεσ και Buffering Κώςτασ Διαμαντάρασ ΤΕΙ Θεςςαλονίκθσ 2011 Η χριςθ buffer Ροφ πάνε τα δεδομζνα μετά το send? Διεργασία 1 Διεργασία 2 A Buffer Δίκτσο Buffer B 2 Κ. Διαμαντάρας ΤΕΙ

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

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά Α. Μ. Βαθμός Σχόλια 1183 1194 1238 1239 1240 1241 - Καλή δουλειά 1242 1243 1244 1245 - Κακή χρήση συναρτήσεων. Κάνεις τον ίδιο έλεγχο και εντός και εκτός της συνάρτησης. Θα έπρεπε να έχεις βρεί ένα τρόπο

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1 ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Μάθημα 1ο Τμήμα Διοίκησης Επιχειρήσεων α εξάμηνο Β. Φερεντίνος Ορισμός Wikipedia.org 2 Δομημένος προγραμματισμός (structured programming) ή διαδικαστικός προγραμματισμός (procedural

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

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης H ΓΛΩΣΣΑ C Μάθηµα 7: Πίνακες ηµήτρης Ψούνης 2 Περιεχόµενα Μαθήµατος Α. Πίνακες 1. Μονοδιάστατοι Πίνακες 1. ήλωση Πίνακα 2. Παράδειγµα Χρήσης Πίνακα 3. Αρχικοποίηση πίνακα κατά τη δήλωση 4. Στατική έσµευση

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

ΕΚΔΟΣΗ 1.1 ΑΠΡΙΛΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΤΟ ΠΡΩΤΟΚΟΛΛΟ ECHO ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ

ΕΚΔΟΣΗ 1.1 ΑΠΡΙΛΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΤΟ ΠΡΩΤΟΚΟΛΛΟ ECHO ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ ΕΚΔΟΣΗ 1.1 ΑΠΡΙΛΙΟΣ, 2018 ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΕΠΙΜΕΛΕΙΑ: Β. ΤΣΑΚΑΝΙΚΑΣ, Β. ΤΑΜΠΑΚΑΣ CONTENTS ΕΙΣΑΓΩΓΗ ΣΤΑ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ... 2 Το πρωτόκολλο ECHO... 2 Εισαγωγή... 2 Το πρωτόκολλο

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 4: Δείκτες και Πίνακες Στην ενότητα αυτή θα μελετηθούν τα εξής θέματα: Πίνακες Δεικτών, Παραδείγματα, Πολυδιάστατοι πίνακες Πέρασμα παραμέτρων σε προγράμματα C Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες:

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

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι 1 ΕΙΣΑΓΩΓΗ Η γλώσσα προγραµµατισµού Java είναι ισχυρά τυποποιηµένη (strongly typed), που σηµαίνει ότι κάθε µεταβλητή και κάθε έκφραση έχει κάποιο τύπο, ο οποίος πρέπει να είναι γνωστός κατά το χρόνο της

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

Παράλληλος προγραµµατισµός

Παράλληλος προγραµµατισµός Το Message Passing Interface (MPI) και η υποστήριξή του στο EGEE Grid Vasileios Karakasis GRNET S.A., ICCS bkk@cslab.ece.ntua.gr Issues on Grid Technologies, Univ. of Patras, 2/3/2010 Σύνοψη παρουσίασης

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

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

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

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

Κεφάλαιο VIΙΙ Β. Δημακόπουλος

Κεφάλαιο VIΙΙ Β. Δημακόπουλος Μεταβίβαση μηνυμάτων Κεφάλαιο VIΙΙ Β. Δημακόπουλος Προγραμματίζοντας με μεταβίβαση μηνυμάτων Δεν υπάρχουν κοινές μεταβλητές διεργασίες και μηνύματα Θεωρείται το πιο δύσκολο Μπορεί, όμως, να γίνει πιο αποδοτικό

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου) ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου) 1. Εισαγωγή Χαρακτηριστικά της γλώσσας Τύποι δεδοµένων Γλώσσα προγραµµατισµού

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

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT Αντικειμενοστραφείς Γλώσσες Προγραμματισμού Ιωάννης Παπαδόπουλος Τμήμα Φυσικής, Πανεπιστήμιο Ιωαννίνων Οκτώβριος 2018 1/28 1 (implicit) μετατροπές 2 (Functions) 3 (Pointers) 4 (Arrays) 2/28 (implicit)

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

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων Σκοπός της Άσκησης ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση µε τη χρήση πινάκων σαν διατάξεις αποθήκευσης δεδοµένων της Γλώσσας Προγραµµατισµού C. H συγκεκριµένη άσκηση

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19) Κεφάλαιο 8.7 Πολυδιάστατοι Πίνακες (Διάλεξη 19) Πολυδιάστατοι πίνακες Μέχρι τώρα μιλούσαμε για Μονοδιάστατους Πίνακες. ή π.χ. int age[5]= {31,28,31,30,31; για Παράλληλους πίνακες, π.χ. int id[5] = {1029,1132,1031,9991,1513;

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

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

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

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

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 3: Είσοδος / Έξοδος, Βασικοί Τύποι, Δήλωση Μεταβλητών Βασικοί τύποι της C 2 Όνομα Τύπος / Κωδικοποίηση Μέγεθος (bytes) char Χαρακτήρας 1 int Ακέραιος 2 ή 4 (*) float Πραγματικός

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

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση της C είκτες Πίνακες

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

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

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

1. ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++

1. ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ Email: liliadis@fmenr.duth.gr 1. ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ Τα προγράµµατα αποτελούνται από εντολές οι οποίες γράφονται σε έναν απλό επεξεργαστή που προσφέρει και το Περιβάλλον της Visual C++. Οι εντολές

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

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

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

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

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

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

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ IΙ Λύβας Χρήστος chrislibas@ssl-unipi.gr Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος >_ ΣΥΝΑΡΤΗΣΕΙΣ ΣΤΗ C (1/3) +- Στη C χρησιμοποιούμε συχνα τις συναρτήσεις (functions),

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

Προγραμματισμό για ΗΜΥ

Προγραμματισμό για ΗΜΥ ΕΠΛ 34: Εισαγωγή στον Προγραμματισμό για ΗΜΥ Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy Κεφάλαιο 12 Πίνακες εικτών (Pointers Arrays) Θέματα ιάλεξης Στην ενότητα

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

Εισαγωγή στην γλώσσα προγραμματισμού C

Εισαγωγή στην γλώσσα προγραμματισμού C Εισαγωγή στην γλώσσα προγραμματισμού C Χαρακτηριστικά της C Ιδιαίτερα δημοφιλής Έχει χρησιμοποιηθεί για τον προγραμματισμό ευρέος φάσματος συστημάτων και εφαρμογών Γλώσσα μετρίου επιπέδου Φιλοσοφία: Ο

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

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

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

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( ) ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Μορφές μεταβίβασης ορισμάτων σε συναρτήσεις (και μεθόδους) και οι επιπτώσεις τους Επιστροφή τιμών από κλήση συναρτήσεων Υπερφόρτωση

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ Μέρος 3ο ΝΙΚΟΛΑΟΣ ΣΤΕΡΓΙΟΥΛΑΣ ΤΜΗΜΑ ΦΥΣΙΚΗΣ ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ 1 ΕΚΤΥΠΩΣΗ ΚΕΙΜΕΝΟΥ Ένα κείμενο μπορεί να εκχωρηθεί ως τιμή μιας μεταβλητής

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Α Β Γ static; printf(%c\n, putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf(*); ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2016 (1/2/2016) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

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

a = 10; a = k; int a,b,c; a = b = c = 10;

a = 10; a = k; int a,b,c; a = b = c = 10; C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 4 ο Τελεστές Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Ο τελεστής εκχώρησης = Ο τελεστής = χρησιµοποιείται για την απόδοση τιµής (ή αλλιώς ανάθεση τιµής) σε µία µεταβλητή Π.χ.

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