Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 151 7. Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση Για να κατανοήσουμε την αρχιτεκτονικές επιλογές και τα προβλήματα που σχετίζονται με την παράλληλη επεξεργασία πρέπει να έχουμε μια ιδέα γύρω από τις εφαρμογές που εκτελούνται σε μια παράλληλη μηχανή. Σαν προγραμματιστές μιας κλασσικής σειριακής μηχανής θεωρούμε την εκτέλεση ενός προγράμματος δεδομένη: σε μια τέτοια μηχανή υπάρχει μόνο ένας επεξεργαστής, μόνο μια κεντρική μνήμη, και οι εντολές εκτελούνται σειριακά, δηλαδή η μια μετά την άλλη. Σε μια τέτοια περίπτωση, η σχεδίαση του υπολογιστή είναι σχεδόν ανεξάρτητη από τις εφαρμογές που θα εκτελεστούν σ' αυτόν. Για το λόγο αυτό άλλωστε οι σειριακοί υπολογιστές, δηλαδή οι υπολογιστές με ένα επεξεργαστή, καλούνται και μηχανές γενικού σκοπού. Στην ανάπτυξη του παράλληλου λογισμικού υπάρχει μια πολύ πιο δυναμική σχέση μεταξύ sotware και αρχιτεκτονικής. Αφού η παράλληλη επεξεργασία έχει σαν κύριο στόχο την μεγιστοποίηση της επίδοσης (=ελαχιστοποίηση του χρόνου εκτέλεσης) ο προγραμματιστής τείνει να εκμεταλλεύεται κάθε αρχιτεκτονικό χαρακτηριστικό που του προσφέρει η συγκεκριμένη μηχανή. Επίσης έχει περισσότερες παραμέτρους στα χέρια του για να βελτιστοποιήσει τον κώδικα (πλήθος επεξεργαστών, κόστος επικοινωνίας, κλπ). Έτσι ο προγραμματιστής είναι υποχρεωμένος να γνωρίζει την αρχιτεκτονική του μηχανήματος αν θέλει να μεγιστοποιήσει τις επιδόσεις του κώδικα. Εντελώς αντίστοιχα, και ο αρχιτέκτονας μιας παράλληλης μηχανής δε μπορεί να αγνοεί τις εφαρμογές που πρόκειται να εκτελεστούν στον υπολογιστή που σχεδιάζει. 7.1 Εφαρμογές παράλληλων υπολογιστών Οι παράλληλοι υπολογιστές χρησιμοποιούνται σε μεγάλη ποικιλία προβλημάτων, από εμπορικές εφαρμογές έως μεγάλες επιστημονικές εφαρμογές που απαιτούν τεράστια υπολογιστική ισχύ. Ήδη διάφοροι υπολογιστές που κυκλοφορούν στο εμπόριο με στόχο την αγορά μεσαίου κόστους και υψηλής απόδοσης εφαρμόζουν παράλληλη επεξεργασία. Αν και το πλήθος των επεξεργαστών δεν είναι πολύ μεγάλο όταν μιλάμε για μεσαίο κόστος (πχ. 4 επεξεργαστές στο Quad Pentium) η χρήση τέτοιων μηχανημάτων είναι πλέον αρκετά διαδεδομένη. Φυσικά υπάρχουν ήδη από τη δεκαετία του '70 μεγάλοι παράλληλοι υπολογιστές με δεκάδες ή εκατοντάδες επεξεργαστές οι οποίοι όμως ανήκουν στην κατηγορία high-end και απευθύνονται μόνο σε μεγάλες επιχειρήσεις ή μεγάλους οργανισμούς. Οι παράλληλοι εμπορικοί υπολογιστές συνήθως χρησιμοποιούνται σαν servers από μεσαίες ή μεγάλες επιχειρήσεις/οργανισμούς με σκοπό την αύξηση των πελατών που εξυπηρετούνται σε μια μονάδα χρόνου. Υπάρχει σχέση ευθείας αναλογίας μεταξύ του μεγέθους της επιχείρησης και της επίδοσης του παράλληλου συστήματος που
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 152 χρησιμοποιείται από αυτή. Ένας χαρακτηριστικός δείκτης επίδοσης είναι οι συναλλαγές ανά λεπτό (transactions per minute - tpm) που χρησιμοποιείται για την αξιολόγηση της επίδοσης ενός υπολογιστικού συστήματος ως προς την ταχύτητα προσπέλασης μιας βάσης δεδομένων. Το κριτήριο tpm έχει άμεση συνάφεια με επιχειρήσεις των οποίων η δραστηριότητα εξαρτάται άμεσα από την αποδοτική διαχείριση δεδομένων, όπως λογαριασμούς πελατών (τράπεζες, χρηματιστηριακοί οίκοι), πελατολόγια (πωλητές), μισθοδοσία (όλες οι εταιρείες), αποθήκες (super-markets, μεγάλα καταστήματα), κλπ. Το benchmark TPC-C του Transaction Processing Council (TPC) σχεδιάστηκε ακριβώς με σκοπό την μέτρηση της επίδοσης συστημάτων σε διεκπεραίωση σύνθετων ερωτημάτων (complex queries). Το συγκεκριμένο benchmark εξομοιώνει ένα μεγάλο περιβάλλον καταχώρησης δεδομένων από πολλούς περιφερειακούς σταθμούς σε μια μεγάλη βάση δεδομένων της τάξης των 3000GB. Ένας άλλος δείκτης επίδοσης με αυξανόμενη σημασία τα τελευταία χρόνια είναι οι Web συναλλαγές ανά δευτερόλετπο (Web interactions per second). Η ραγδαίως αυξανόμενη δημοτικότητα του διαδικτύου οδήγησε το TPC στην πρόταση του TPC-W Web benchmark για τη μέτρηση αυτού του δείκτη. Το συγκεκριμένο benchmark βασίζεται στην προσπέλαση μέσω web κατανεμημένης πληροφορίας μεγέθους 500 GB. Οι επιστημονικές εφαρμογές αποτελούν το άλλο μεγάλο πεδίο εφαρμογής της παράλληλης επεξεργασίας. Η παράλληλη επεξεργασία αποτελεί βασικό εργαλείο σε προβλήματα εξομοίωσης φυσικών φαινομένων με πάρα πολύ μεγάλους αριθμούς παραμέτρων. Τυπικά παραδείγματα αποτελούν η πρόγνωση του καιρού για μεγάλα χρονικά διαστήματα, οι κινήσεις των αστέρων, η ατομική δομή των υλικών, η μελέτη των μηχανών εσωτερικής καύσεως, η αεροδυναμική μελέτη αυτοκινήτων ή αεροπλάνων, η συμπεριφορά μικροηλεκτρονικών διατάξεων, κα. Οι εφαρμογές αυτές έχουν πολύ μεγάλες απαιτήσεις πράξεων ανά δευτερόλεπτο (> 1 GFLOPS) καθώς επίσης και πολύ μεγάλες απαιτήσεις χώρου αποθήκευσης δεδομένων (> 1 GB). Όταν οι απαιτήσεις ξεπερνούν τα 100 GFLOPS και τα 100 GB τότε μιλάμε για τις μεγάλες προκλήσεις της επιστήμης των υπολογιστών (Grand Challenges).
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 153 Μεγάλες Προκλήσεις της Επιστήμης Υπολογιστών (Grand Challenge Problems) Μεταβολή του κλίματος του πλανήτη Ανάλυση των γονιδίων του ανθρώπου Μελέτη ροής ρευστών Αεροδυναμική μελέτη οχημάτων Εξομοίωση ωκεανών Μοντελοποίηση υπεραγωγών Κβαντική Χρωμοδυναμική Όραση των υπολογιστών Μερικές επιστημονικές εφαρμογές υψηλών απαιτήσεων περιγράφονται πιο λεπτομερώς παρακάτω. Αυτές είναι η εξομοίωση των ωκεανών, η γραφική απεικόνιση τρισδιάστατων σκηνών, η εξομοίωση της κίνησης των αστεριών σε ένα γαλαξία, και η εξόρυξη δεδομένων από μια βάση δεδομένων. Εξομοίωση ρευμάτων των ωκεανών Σημαντικό ρόλο στη διαμόρφωση του κλίματος παίζει η αλληλεπίδραση μεταξύ ατμόσφαιρας και ωκεανών καθώς οι τελευταίοι αποτελούν τα τρία τέταρτα της επιφάνειας της γης. Τα καλά μοντέλα της συμπεριφοράς των ωκεανών είναι πολύ περίπλοκα. Η κατάσταση του ωκεανού μια συγκεκριμένη στιγμή εξαρτάται από την κατάστασή του στο παρελθόν καθώς και από τις παρούσες συνθήκες ενώ όλες οι παράμετροι υπεισέρχονται σε ένα πολύπλοκο σύστημα εξισώσεων που λύνεται μόνο αριθμητικά με τη χρήση υπολογιστή. Επειδή οι ωκεανοί είναι τεράστιοι σε έκταση δεν είναι δυνατό να περιγράψουμε την κατάσταση κάθε μορίου ύδατος. Αυτό που γίνεται είναι ότι ο ωκεανός τεμαχίζεται σε πάρα πολλούς κύβους (πχ. 20Km20Km0.1Km) που αποτελούν τις ελάχιστες μονάδες όγκου που μελετάμε. Θεωρούμε ότι οι κύβοι αυτοί σε κάθε χρονική στιγμή έχουν μια συγκεκριμένη θερμοκρασία, πίεση, κλπ, και οι παράμετροι αυτές αλληλεπιδρούν με τις παραμέτρους των διπλανών κύβων. Έτσι αν θέλουμε να βρούμε τη θερμοκρασία του ωκεανού για τα επόμενα 5 έτη, πρέπει να τεμαχίσουμε το διάστημα αυτό σε μικρότερα χρονικά βήματα, πχ. των 8 ωρών και να υποθέσουμε ότι η θερμοκρασία του κύβου <x,y,z> τη χρονική στιγμή t εξαρτάται από τη θερμοκρασία (και άλλες παραμέτρους) των γειτονικών κύβων της προηγούμενης στιγμής t1. Για ένα ωκεανό όπως ο Ατλαντικός διαστάσεων 2000Km πλάτος 2000Km μήκος 8Km βάθος, χρειάζονται 10010080 = 800000 κύβοι. Για 5 έτη με χρονική διακριτότητα 8 ωρών χρειάζονται 53653=5500 χρονικές επαναλήψεις. Από τα νούμερα αυτά γίνεται ξεκάθαρο ότι είναι απαραίτητη η χρήση πολυεπεξεργασίας αν θέλουμε τα αποτελέσματα του αλγορίθμου να είναι διαθέσιμα μέσα σε ένα εύλογο χρονικό διάστημα. Ο αλγόριθμος έχει μεγάλο βαθμό
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 154 παραλληλισμού καθώς τα αποτελέσματα κάθε κύβου εξαρτώνται από τα αποτελέσματα των διπλανών του κύβων. Έτσι αν σε κάθε κύβο αντιστοιχεί ένας επεξεργαστής οι πράξεις μπορούν να εκτελεστούν παράλληλα ενώ μόνο οι γειτονικοί επεξεργαστές ανταλλάσσουν δεδομένα. Γραφική απεικόνιση τρισδιάστατων σκηνών (ray-tracing) Η απεικόνιση τρισδιάστατων αντικειμένων στην οθόνη καλείται 3-D rendering και χρησιμεύει στη ρεαλιστική απεικόνιση συνθετικών σκηνών στο επίπεδο, λαμβάνοντας υπ' όψη τα δεδομένα βάθους, τη σκίαση, την επικάλυψη των αντικειμένων, το φωτισμό, το χρώμα των αντικειμένων, κλπ. Οι εφαρμογές της επεξεργασίας αυτής είναι πάρα πολλές ξεκινώντας από την εικονική πραγματικότητα και φθάνοντας μέχρι τις ταινίες του Hollywood. Το πρόβλημα, όπως φαίνεται και στο παρακάτω σχήμα, είναι η εύρεση του σημείου P' της οθόνης στο οποίο απεικονίζεται το σημείο P ενός αντικειμένου στον τρισδιάστατο χώρο. Αυτό γίνεται με απλές γεωμετρικές πράξεις αρκεί να σχεδιάσουμε την ακτίνα (ray) που συνδέει το κέντρο Ο του οπτικού άξονα με το σημείο P. Αν κάποιο άλλο σημείο, πχ. το Q, βρίσκεται στην ίδια ακτίνα αλλά σε μεγαλύτερο βάθος, δηλαδή πιο πίσω από το σημείο P, τότε το σημεία αυτό δεν εμφανίζεται στην οθόνη αφού επικαλύπτεται από το P (εφόσον βέβαια δεν είναι διαφανές το αντικείμενο στο οποίο ανήκει το P). Με απλά λόγια, αυτό που πρέπει να γίνει είναι το "σκανάρισμα" (tracing) της ακτίνας για να βρεθούν όλα τα σημεία που ανήκουν σ αυτή και τελικά να απεικονιστεί το σημείο με το μικρότερο βάθος. Η όλη διαδικασία λέγεται ray-tracing και είναι ιδιαίτερα χρονοβόρα, όπως κανείς μπορεί να καταλάβει αν σκεφτεί πόσες ακτίνες πρέπει να σκαναριστούν για να συμπληρωθεί μια οθόνη, πχ. 10241024 pixels. P Q P' O Το ευχάριστο είναι ότι οι ακτίνες είναι ανεξάρτητες μεταξύ τους. Έτσι οι πράξεις που πρέπει να γίνουν για την ακτίνα Χ δεν έχουν σχέση με τις πράξεις που πρέπει να γίνουν για μια οποιαδήποτε άλλη ακτίνα Υ. Αυτό μας δίνει μεγάλη ευελιξία ως προς τον παραλληλισμό των πράξεων. Έτσι διαφορετικοί επεξεργαστές μπορούν να απασχολούνται σε διαφορετικές ακτίνες χωρίς να χρειάζεται μεγάλος όγκος επικοινωνίας μεταξύ τους.
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 155 Εξομοίωση της κίνησης των Γαλαξιών Ένα άλλο πεδίο επιστημονικής εφαρμογής της παράλληλης επεξεργασίας είναι η αστρονομία και συγκεκριμένα η μελέτη της κίνησης των αστεριών. Το επιστημονικό υπόβαθρο, δηλαδή οι νόμοι της φυσικής για την κίνηση των σωμάτων είναι δεδομένοι. Το πρόβλημα είναι η εκτίμηση της τροχιάς των άστρων μέσα σε κάποιο χρονικό διάστημα. Η λύση δίνεται από την ανάλυση των δυνάμεων βαρύτητας που ασκούνται μεταξύ τους, από την αρχική ταχύτητα κίνησης, καθώς και από την αρχική θέση των άστρων. Αν και το πρόβλημα φαίνεται μια άσκηση ρουτίνας πάνω σε γνωστές εξισώσεις μια πιο προσεκτική ματιά δείχνει ότι οι υπολογιστικές απαιτήσεις είναι τεράστιες. Σε ένα γαλαξία με n αστέρια απαιτείται ο υπολογισμός O(n 2 ) δυνάμεων από το γνωστό τύπο της φυσικής: F = Gm 1 m 2 /r 2. Έτσι, αν μελετάμε 1 εκατομμύριο αστέρια χρειάζεται ο υπολογισμός περίπου 1 τρισεκατομμυρίου (!) δυνάμεων για να βρούμε την έλξη που ασκείται από κάθε άστρο προς κάθε άλλο άστρο. Ευτυχώς οι δυνάμεις βαρύτητας εξασθενίζουν αντιστρόφως ανάλογα με το τετράγωνο τις απόστασης και έτσι μπορεί προσεγγιστικά να αγνοηθεί η επίδραση άστρων σε πολύ μεγάλη απόσταση μεταξύ τους. Αυτή η απλή προσέγγιση μπορεί να μειώσει τις υπολογιστικές απαιτήσεις κατά 10000 έως 100000 φορές, ωστόσο η ανάγκη πολυεπεξεργασίας είναι προφανής. Αν σε κάθε άστρο αντιστοιχεί και ένας επεξεργαστής τότε, λόγω μεγάλης αλληλεπίδρασης μεταξύ πολλών άστρων, απαιτείται η επικοινωνία μεταξύ πολλών επεξεργαστών και όχι μόνο μεταξύ λίγων γειτόνων. Εξόρυξη δεδομένων από Βάσεις Δεδομένων (Data mining) Η εξαγωγή χρήσιμης γνώσης από μια βάση δεδομένων (ΒΔ) καλείται εξόρυξη δεδομένων (data mining). Για παράδειγμα, η εκτίμηση των προτιμήσεων και των ενδιαφερόντων ενός πελάτη βιβλιοπωλείου από τους τίτλους ή άλλα στοιχεία των βιβλίων που έχει αγοράσει είναι μια χρήσιμη γνώση για τον βιβλιοπώλη ο οποίος μπορεί να ταξινομήσει τους πελάτες ανάλογα με τα αγοραστικά τους πρότυπα, να κάνει εξειδικευμένες διαφημιστικές καμπάνιες σε συγκεκριμένα άτομα ή ομάδες πληθυσμού, κλπ. Η εξόρυξη δεδομένων διαφέρει από την απλή ερώτηση (query) σε μια βάση δεδομένων. Έτσι το να βρει κανείς ποιοι πελάτες αγόρασαν βιβλία μαγειρικής την περασμένη εβδομάδα δεν αποτελεί εξόρυξη δεδομένων αλλά μια απλή ερώτηση στη ΒΔ του βιβλιοπωλείου. Αντίθετα, η εύρεση σχέσεων ανάμεσα σε βιβλία (πχ. βιβλία που συχνά οι πελάτες τα αγοράζουν μαζί) ή η εύρεση συσχέτισης ανάμεσα σε μια ηλικιακή ομάδα (πχ. νέοι άνδρες) και κάποιο είδος βιβλίου (πχ. μουσική, αθλητισμός, κλπ) αποτελεί εξόρυξη πληροφορίας. Από υπολογιστικής απόψεως, το πρόβλημα έχει ως εξής: Δίνεται μια βάση δεδομένων όπου υπάρχουν εγγραφές κάποιων συναλλαγών. Στη συγκεκριμένη περίπτωση μια συναλλαγή ορίζεται από ένα κωδικό, τα στοιχεία του πελάτη και τα στοιχεία των βιβλίων που αγόρασε μια συγκεκριμένη στιγμή. Ζητάμε να βρούμε ποια υποσύνολα του συνόλου των στοιχείων συμβαίνουν ταυτόχρονα με κάποια συχνότητα πάνω από κάποιο
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 156 προκαθορισμένο όριο. Το υποσύνολο καλείται itemset και περιέχει k στοιχεία όπου kn και n είναι το πλήθος των στοιχείων που περιέχει μια εγγραφή. Το πλήθος των πιθανών υποσυνόλων που πρέπει να μελετήσουμε αυξάνει εκθετικά με το πλήθος n των στοιχείων μιας εγγραφής, ενώ η στατιστική μελέτη και ο υπολογισμός των συχνοτήτων εμφάνισης κάποιου συνδυασμού αυξάνει γραμμικά με το πλήθος των εγγραφών, δηλαδή με το μέγεθος της ΒΔ. Για πολύ μεγάλες βάσεις δεδομένων ( 100000 εγγραφές) και μεγάλο πλήθος στοιχείων ανά εγγραφή είναι προφανής η ανάγκη χρησιμοποίησης παράλληλων υπολογιστικών μοντέλων έτσι ώστε να παραχθεί το αποτέλεσμα σε εύλογο χρονικό διάστημα. 7.2 Η διαδικασία παραλληλοποίησης του προγράμματος Η μετατροπή ενός αλγορίθμου σε μορφή κατάλληλη για την εκτέλεσή του από ένα παράλληλο υπολογιστή απαιτεί διάφορα βήματα, κάποια από τα οποία εκτελούνται από τον προγραμματιστή, κάποια άλλα από το μεταφραστή (compiler), και κάποια άλλα από το λειτουργικό σύστημα. Η ιδανική περίπτωση είναι αυτή κατά την οποία ο προγραμματιστής γράφει τον κώδικα στη μορφή που τον βολεύει καλύτερα (πχ. με τη χρήση μιας σειριακής γλώσσας υψηλού επιπέδου όπως η C++) και όλα τα υπόλοιπα βήματα γίνονται αυτόματα από το μεταφραστή και από το λειτουργικό σύστημα. Αυτό το φιλόδοξο σενάριο δεν έχει ακόμα υλοποιηθεί 100% με αποτέλεσμα οι προγραμματιστές να είναι αυτοί που εκτελούν το μεγαλύτερο μέρος της διαδικασίας με τη βοήθεια του μεταφραστή και του περιβάλλοντος εκτέλεσης του προγράμματος. Τα βήματα που απαιτούνται για την παράλληλη εκτέλεση του προγράμματος είναι τρία όπως περιγράφονται παρακάτω: 1. Αποσύνθεση του αλγορίθμου σε εργασίες (tasks) 2. Απεικόνιση εργασιών σε διεργασίες (processes) 3. Χρονοδρομολόγηση των διεργασιών σε επεξεργαστές (processors). Το βήμα αυτό υποδιαιρείται σε 2 υποβήματα: 3.α. Αντιστοίχηση κάθε διεργασίας (process) με ένα επεξεργαστή (processor) 3.β. Απόφαση πότε θα εκτελεστεί κάθε εργασία (task) στο συγκεκριμένο επεξεργαστή που αντιστοιχήθηκε στο βήμα 3.α. Το παρακάτω Σχήμα δείχνει γραφικά τη διαδικασία παραλληλοποίησης σειριακού κώδικα:
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 157 Α π ο σ ύ ν θ ε σ η Ε 1 Ε 2 Ε Ν Ε 3 Εργασίες (tasks) Α π ε ι κ ό ν ι σ η Δ 1 Δ 2 Δ 3 Δ 4 Διεργασίες (processes) Χ ρ ο ν ο δ ι ά γ ρ α μ μ α P 1 P 2 P 3 P 4 Επεξεργαστές (processors) Πριν προχωρήσουμε στην ανάλυση των παραπάνω βημάτων, πρέπει να ξεκαθαρίσουμε τρεις βασικές έννοιες (α) την εργασία (task) (β) τη διεργασία (process ή thread) και (γ) τον επεξεργαστή (processor). (Α) Εργασία λέμε το μικρότερο κομμάτι ενιαίου κώδικα που δε διασπάται. Αυτό ορίζεται μεν αυθαίρετα, αλλά συνήθως προκύπτει εύκολα από την εφαρμογή που μελετάμε. Για παράδειγμα, στο πρόβλημα της γραφικής απεικόνισης 3-D αντικειμένων μπορούμε να ορίσουμε την επεξεργασία μιας ακτίνας ως μια στοιχειώδη εργασία. Στην επεξεργασία ωκεανών μπορούμε να πούμε ότι εργασία είναι η επεξεργασία ενός κύβου ύδατος μια χρονική στιγμή. Αντίστοιχα μπορούμε να ορίσουμε μια εργασία στην εφαρμογή της κίνησης των αστεριών ως την επεξεργασία ενός άστρου, κλπ. Γενικά, όπως φαίνεται και στο Σχήμα, έχουμε Ν εργασίες οι οποίες αλληλεπιδρούν μεταξύ τους ώστε τα αποτελέσματα μιας εργασίας μπορεί να αποτελούν είσοδο σε μια άλλη δημιουργώντας έτσι ένα γράφο εξάρτησης. Αν το ποσό του κώδικα που υπάρχει μέσα στις εργασίες είναι μεγάλο τότε λέμε ότι η εργασία είναι χοντροκομμένη (coarse grain). Αντίθετα, αν η εργασία είναι μικρή τότε λέγεται ψιλοκομμένη (ine grain). (Β) Διεργασία λέμε την ομαδοποίηση πολλών εργασιών σε ένα κομμάτι κώδικα (thread) το οποίο εκτελείται σε ένα επεξεργαστή. Καθώς οι εργασίες είναι συνήθως πολύ περισσότερες από τους επεξεργαστές πρέπει αυτές να ομαδοποιηθούν ώστε να εκτελεστούν αποδοτικά. Για παράδειγμα, στον αλγόριθμο ray-tracing, για μια εικόνα 10241024 pixels απαιτούνται 1 εκατομμύριο ακτίνες. Αν μια ακτίνα είναι μια εργασία τότε υπάρχουν 1 εκατομμύριο εργασίες που πρέπει να εκτελεστούν. Μια διεργασία θα μπορούσε να είναι η επεξεργασία των ακτίνων που αντιστοιχούν σε μια σειρά 1024 pixels. Δεν υπάρχει ένας μοναδικός τρόπος ομαδοποίησης εργασιών σε διεργασίες. Μια άλλη επιλογή θα μπορούσε πχ. να αναθέσει ένα μπλοκ 1616 ακτίνων σε μια διεργασία, κλπ. Όπως και αν ομαδοποιήσουμε τις εργασίες σε διεργασίες, ένα βασικό χαρακτηριστικό των διεργασιών παραμένει αναλλοίωτο: κάθε διεργασία εκτελείται από ένα και μόνο ένα επεξεργαστή. Μπορεί να υπάρχουν περισσότερες διεργασίες από επεξεργαστές. Στην περίπτωση αυτή κάθε επεξεργαστής εκτελεί περισσότερες από μια διεργασίες.
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 158 (Γ) Επεξεργαστής λέγεται ο φυσικός εκείνος πόρος που εκτελεί διεργασίες. Ένα παράλληλο πρόγραμμα αναπαριστάται πρώτα σαν ένας γράφος εξάρτησης διεργασιών και κατόπιν ο γράφος αυτός απεικονίζεται σε επεξεργαστές. Τα τρία βήματα της παραλληλοποίησης ενός σειριακού κώδικα περιγράφονται τώρα ως εξής: 7.2.1 Βήμα 1: Αποσύνθεση αλγορίθμου σε εργασίες. Στο βήμα αυτό ο κώδικας χωρίζεται σε εργασίες που από δω και πέρα θα θεωρούνται αδιάσπαστες. Το βασικότερο πρόβλημα που έχουμε να αντιμετωπίσουμε εδώ είναι η ανάθεση τμημάτων κώδικα σε ξεχωριστές εργασίες έτσι ώστε να αποκαλυφθεί όσο το δυνατόν περισσότερος παραλληλισμός. Με άλλα λόγια θέλουμε οι εργασίες να είναι όσο το δυνατόν πιο ανεξάρτητες μεταξύ τους ώστε να μπορούν να εκτελεστούν παράλληλα. Αυτό γίνεται με τη μείωση του μέγιστου μονοπατιού στο γράφο εξάρτησης όπως φαίνεται στο παρακάτω παράδειγμα. Παράδειγμα 1. Θεωρήστε ένα πρόγραμμα το οποίο χωρίζεται σε δύο φάσεις: στην πρώτη φάση υπολογίζεται μια συνάρτηση (x) πάνω σε διαφορετικά δεδομένα, και στη δεύτερη φάση τα αποτελέσματα προστίθενται σε ένα συνολικό άθροισμα: or (i=1 to 6) { /*Φάση 1*/ y[i] = (x[i]); } sum = 0; or (i=1 to 6) { /*Φάση 2*/ sum = sum + y[i]; } Έστω ότι κάθε εντολή είναι και μια εργασία. Αυτός είναι και ο πλέον ψιλός τεμαχισμός που μπορεί να γίνει. Τότε έχουμε τον ακόλουθο γράφο εξάρτησης εργασιών x[1] x[2] x[3] x[4] x[5] x[6] Φάση 1 Φάση 2 0 + + + + + + sum Από τη μελέτη του παραπάνω γράφου εξάρτησης γίνεται φανερό ότι η πρώτη φάση του αλγορίθμου μπορεί να εκτελεστεί τελείως παράλληλα ενώ η δεύτερη φάση απαιτεί σειριακή εκτέλεση, αφού κάθε πρόσθεση απαιτεί το αποτέλεσμα της προηγούμενης
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 159 πρόσθεσης. Αν υποθέσουμε ότι μια πράξη (x) απαιτεί χρόνο Τ όσο και μια πρόσθεση τότε η σειριακή εκτέλεση απαιτεί χρόνο Τ σειρ = 12Τ. Επειδή το μέγιστο μονοπάτι του γράφου έχει μήκος 7 ο χρόνος εκτέλεσης σε μια παράλληλη μηχανή είναι Τ παρ 7Τ. Έτσι, η μέγιστη επιτάχυνση που μπορούμε να πετύχουμε είναι Ε max = [Τ σειρ /Τ παρ ] max = 12/7 = 1.7. Στην περίπτωση αυτή λέμε ότι η αποσύνθεση του αλγορίθμου φανέρωσε παραλληλισμό 1.7. Παρατηρούμε ωστόσο ότι μια απλή παραλλαγή του γράφου εξάρτησης, η οποία αφήνει το αποτέλεσμα του αλγόριθμου αναλλοίωτο, δίνει καλύτερα αποτελέσματα: x[1] x[2] x[3] x[4] x[5] x[6] Φάση 1 + + + Φάση 2 + + sum Η ιδέα εδώ είναι η σταδιακή/ιεραρχική άθροιση των αποτελεσμάτων η οποία αυξάνει τον παραλληλισμό. Τώρα το μέγιστο μονοπάτι έχει μήκος 4 και η μέγιστη επιτάχυνση είναι Ε max = 11/4 = 2.75. Η νέα αυτή αποσύνθεση του αλγορίθμου σε στοιχειώδεις εργασίες φανερώνει περισσότερο παραλληλισμό στον κώδικα και επομένως προτιμάται σε σχέση με την προηγούμενη αποσύνθεση. Γενικά, το πρόβλημα της αποσύνθεσης δεν έχει αυτόματη λύση εκτός από ειδικές περιπτώσεις. Συχνά χρησιμοποιείται η εμπειρία και οι γνώσεις του προγραμματιστή για να βελτιωθεί ο γράφος εξάρτησης και να χωριστεί ο κώδικας σε εργασίες με τέτοιο τρόπο ώστε να φανερώνεται η μεγαλύτερη παραλληλισιμότητα. 7.2.2 Βήμα 2: Απεικόνιση εργασιών σε διεργασίες. Στο βήμα αυτό αναζητείται η βέλτιστη ομαδοποίηση των εργασιών έτσι ώστε κάθε ομάδα που καλείται "διεργασία" να εκτελείται σε ένα μόνο επεξεργαστή. Οι στόχοι της απεικόνισης είναι τρεις: (i) η εξισορρόπηση του φόρτου εργασίας, (ii) η ελαχιστοποίηση της επικοινωνίας μεταξύ των διεργασιών, και (iii) η μείωση του χρόνου που απαιτείται για τη διαχείριση της απεικόνισης. Οι στόχοι αυτοί περιγράφονται πιο διεξοδικά παρακάτω.
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 160 (i) Εξισορρόπηση του φόρτου εργασίας ανάμεσα στις διάφορες διεργασίες (load balancing). Η εξισορρόπηση αυτή σχετίζεται με το ποσοστό του κώδικα που εκτελεί κάθε διεργασία, με τη χρήση της εισόδου και της εξόδου, με τη χρήση της μνήμης, και με την επικοινωνία μεταξύ των διεργασιών. Δεν θέλουμε μια διεργασία να έχει πάρα πολύ φόρτο δουλειάς σε σχέση με όλες τις υπόλοιπες διεργασίες διότι αυτό σημαίνει κακό τεμαχισμό του προβλήματος και άρα φτωχή παράλληλη επίδοση. Για παράδειγμα, αν ομαδοποιήσουμε τις εργασίες ενός προγράμματος σε τρεις διεργασίες έτσι ώστε η διεργασία Δ1 να εκτελεί το 90% του προγράμματος, ενώ οι διεργασίες Δ2, Δ3 να εκτελούν μόλις το 5% η κάθε μια, τότε η μέγιστη επιτάχυνση που μπορούμε να περιμένουμε είναι 100/90 = 1.1, αφού η παράλληλη εκτέλεση θα τελειώσει όταν τελειώσει και η βραδύτερη διεργασία, δηλαδή η Δ1, η οποία τελειώνει στο 90% του χρόνου της σειριακής εκτέλεσης. Προφανώς, η καλύτερη ομαδοποίηση των εργασιών σε τρεις διεργασίες είναι η ισόποση, έτσι ώστε και η Δ1, και η Δ2, και η Δ3 να εκτελούν το 33.3% του σειριακού κώδικα. Τότε η μέγιστη επιτάχυνση που μπορούμε να πετύχουμε είναι 100/33.3 = 3, που είναι και η μέγιστη δυνατή για 3 διεργασίες. (ii) Ελαχιστοποίηση της επικοινωνίας μεταξύ των διεργασιών (interprocess communication). Η επικοινωνία μεταξύ διεργασιών συνεπάγεται τελικά επικοινωνία μεταξύ επεξεργαστών. Αυτή η επικοινωνία κοστίζει τόσο σε χρήμα (καλώδια επικοινωνίας) όσο και σε χρόνο, κάτι που είναι ιδιαίτερα σημαντικό στην παράλληλη επεξεργασία. Πολλές φορές, η τοπολογία του δικτύου είναι τέτοια που η επικοινωνία μεταξύ των επεξεργαστών δε γίνεται σε ένα βήμα αλλά σε πολλά (multi-hop communication). Επί πλέον, η συχνή ανταλλαγή μηνυμάτων προκαλεί κυκλοφοριακή συμφόρηση στο δίκτυο και πρέπει να μειώνεται στο ελάχιστο δυνατό. Αν κάποιες εργασίες τροφοδοτούν η μια την άλλη με σειριακό τρόπο (δηλαδή δημιουργούν αλυσίδα στο γράφο εξάρτησης) τότε είναι προτιμότερο αυτές να εκτελούνται από τον ίδιο επεξεργαστή αφού η επικοινωνία ενός επεξεργαστή με τον εαυτό του είναι πολύ πιο γρήγορη σε σχέση με την επικοινωνία με άλλους επεξεργαστές και επί πλέον δε φορτώνει το δίκτυο. Για παράδειγμα, ας θεωρήσουμε τις εργασίες που φαίνονται στον παρακάτω γράφο εξάρτησης
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 161 Δύο πιθανές ομαδοποιήσεις των εργασιών σε 4 διεργασίες είναι οι εξής: Απεικόνιση εργασιών: τρόπος Α Δ1 Απεικόνιση εργασιών: τρόπος B Δ1 Δ2 Δ3 Δ4 Ως προς το κόστος επικοινωνίας, η απεικόνιση Β είναι σαφώς καλύτερη σε σχέση με την απεικόνιση Α διότι μόνο 3 γραμμές επικοινωνίας συνδέουν τις τέσσερεις διεργασίες μεταξύ τους. Αντίθετα στην απεικόνιση Α οι περισσότερες γραμμές επικοινωνίας είναι μεταξύ των διεργασιών (12 γραμμές στο σύνολο). Βλέπουμε ότι στο εσωτερικό των διεργασιών της απεικόνισης Β υπάρχουν σειριακές αλυσίδες εργασιών που μοιάζουν με νήματα. Η εσωτερική επικοινωνία μέσα στην ίδια διεργασία προτιμάται σε σχέση με την επικοινωνία μεταξύ διεργασιών, γι' αυτό και προσπαθούμε να βάζουμε κάθε σειριακό μονοπάτι (νήμα) μέσα σε μια διεργασία και όχι να το σπάμε ανάμεσα σε διαφορετικές διεργασίες όπως γίνεται στην απεικόνιση Α. (iii) Μείωση του χρόνου που απαιτείται για τη διαχείριση της απεικόνισης. Δ2 Δ3 Δ4 Η απόφαση της απεικόνισης εργασιών σε ομάδες, γίνεται στατικά, ημι-στατικά, ή δυναμικά. Η στατική απεικόνιση γίνεται από το μεταφραστή ο οποίος γνωρίζει τόσο την αποσύνθεση του αλγορίθμου σε εργασίες όσο και την τοπολογία του Γράφου Εξάρτησης (ΓΕ) των εργασιών. Η ομαδοποίηση των εργασιών είναι προφανής όταν υπάρχουν ανεξάρτητες σειριακές αλυσίδες (νήματα) που διακρίνονται σαφώς μέσα στον ΓΕ. Στην περίπτωση αυτή η διαδικασία απεικόνισης είναι ταχύτατη διότι η επιλογή είναι προφανής. Στην αντίθετη περίπτωση πρέπει να χρησιμοποιηθούν ευρηστικές μέθοδοι (heuristics) οι οποίες βρίσκουν το βέλτιστο ή περίπου βέλτιστο τρόπο ομαδοποίησης. Η εξαντλητική αναζήτηση όλων των δυνατών ομαδοποιήσεων είναι απαγορευτική λόγω του τεράστιου υπολογιστικού κόστους. Οι ευρηστικές μέθοδοι χρησιμοποιούν κανόνες που επιλέγουν πιθανές ομαδοποιήσεις προς μελέτη μέσα από το σύνολο των ομαδοποιήσεων με στόχο την επιλογή τελικά της βέλτιστης. Στην ημι-στατική απεικόνιση οι εργασίες ομαδοποιούνται αρχικά με κάποιο ευρηστικό αλγόριθμο, αλλά οι ομαδοποιήσεις ξανα-υπολογίζονται περιοδικά και είναι δυνατό να αλλάξουν. Οι νέες ομαδοποιήσεις υπολογίζονται με βάση τον
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 162 πραγματικό υπολογιστικό φόρτο του κάθε υπολογιστή όπως αυτός μετρήθηκε κατά τον αμέσως προηγούμενο χρόνο εκτέλεσης. Η δυναμική απεικόνιση χρησιμοποιείται σε εφαρμογές όπου ο υπολογισμός του φόρτου εργασίας είναι αδύνατος λόγω της απρόβλεπτης εξέλιξης των εργασιών. Για παράδειγμα, στην γραφική απεικόνιση μιας 3-D σκηνής είναι αδύνατο να προβλέψουμε πόσος φόρτος εργασίας απαιτείται για την απεικόνιση μιας ακτίνας πριν εκτελεστεί ο κώδικας. Ακόμα και αν είναι προβλέψιμη η διάρκεια μιας εργασίας διάφοροι άλλοι λόγοι μπορούν να δημιουργήσουν απρόβλεπτες ανισορροπίες φόρτου εργασίας. Έτσι, αν ένας επεξεργαστής έχει περισσότερα cache-misses από τους υπόλοιπους ή αν κάποια μνήμη κάνει πιο συχνά swap με το δίσκο αυτό έχει αντίκτυπο στην ταχύτητα εκτέλεσης της εργασίας του συγκεκριμένου επεξεργαστή, οπότε ακόμα και αν είναι τελείως εξισορροπημένος ο φόρτος εργασίας πριν την εκτέλεση, μπορεί κατά τη διάρκεια της εκτέλεσης να παρουσιαστούν σημαντικές αποκλίσεις. Για όλους τους παραπάνω λόγους η δυναμική απεικόνιση είναι μια σημαντική μέθοδος που χρησιμοποιείται συχνά. Η λύση δίνεται με τη χρήση ουρών (queues). Οι εργασίες μπαίνουν σε κάποια ουρά και οι διεργασίες προσθέτουν ή αφαιρούν εργασίες από την ουρά αυτή Υπάρχουν δύο κεντρικές επιλογές (α) η χρήση μιας κεντρικής ουράς από την οποία όλες οι διεργασίες αφαιρούν ή προσθέτουν εργασίες και (β) η χρήση πολλών κατανεμημένων ουρών όπως φαίνεται στο παρακάτω σχήμα: Όλες οι διεργασίες προσθέτουν εργασίες Η Δ1 προσθέτει εργασίες Η Δ2 προσθέτει εργασίες Η Δ3 προσθέτει εργασίες Κεντρικ ή ουρά Q Όλες οι διεργασίες αφαιρούν εργασίες Η Δ1 αφαιρεί εργασίες Η Δ2 αφαιρεί εργασίες Η Δ3 αφαιρεί εργασίες (Α) Κεντρική ουρά εργασιών (Β) Κατανεμημένες ουρές εργασιών Όταν υπάρχει μια κεντρική ουρά εργασιών αποφασίζεται κατά τη διάρκεια της εκτέλεσης ποια διεργασία θα αφαιρέσει την επόμενη εργασία από την ουρά και θα
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 163 την εκτελέσει. Το πλεονέκτημα είναι η απλότητα της μεθόδου, αλλά το πρόβλημα είναι το γεγονός ότι όλες οι διεργασίες προσπελαύνουν την ίδια ουρά και έτσι αυξάνεται η επικοινωνία και οι επεξεργαστές ανταγωνίζονται για την πρόσβαση σ' αυτή. Με τις κατανεμημένες ουρές εργασιών κάθε διεργασία Δi έχει μια τοπική ουρά Qi στην οποία προσθέτει εργασίες έτοιμες προς εκτέλεση και από την οποία αφαιρεί εργασίες για να τις εκτελέσει. Αν μια άλλη διεργασία Δj έχει τελειώσει τις δικές της εργασίες και η ουρά της είναι κενή μπορεί να "κλέψει" εργασίες από την Qi και να τις εκτελέσει αυτή (task stealing). Η κλοπή εργασιών συνεπάγεται αύξηση της επικοινωνίας μεταξύ επεξεργαστών και άρα διάφορα θέματα πρέπει να αντιμετωπισθούν όπως: πώς να ελαχιστοποιήσουμε τις κλοπές, πώς να αποφασίσουμε ποιος θα κλέψει και από πού, πόσες και ποιες διεργασίες πρέπει να κλαπούν κάθε φορά, κλπ. Επίσης εισάγεται το πρόβλημα της ανίχνευσης του τερματισμού του προγράμματος: πώς ξέρουμε πότε να πάψουμε να ψάχνουμε για εργασίες προς κλοπή λόγω τερματισμού του προγράμματος με δεδομένο ότι οι εργασίες μπορούν να παράγουν δυναμικά άλλες εργασίες και να εισάγονται δυναμικά στις ουρές; Διάφορες πρακτικές μέθοδοι λειτουργούν καλά στην πράξη αν και οι βέλτιστες μέθοδοι απαιτούν πολύ πυκνή επικοινωνία μεταξύ των κόμβων. Κατανεμημένες δυναμικές ουρές εργασιών χρησιμοποιούνται συχνά τόσο σε παράλληλες μηχανές με κοινή μνήμη όσο και σε μηχανές που λειτουργούν με ανταλλαγή μηνυμάτων. 7.2.3 Βήμα 3: Χρονοδρομολόγηση Το σύνολο των διεργασιών που παρήχθησαν στα βήματα 1 και 2 αποτελούν ένα πλήρες παράλληλο πρόγραμμα. Το ίδιο το πρόγραμμα μπορεί να επιλέξει την εκτέλεση των διεργασιών του σε συγκεκριμένους επεξεργαστές ή μπορεί να αφήσει την απόφαση στο λειτουργικό σύστημα. Και πάλι (όπως και στην απεικόνιση εργασιών σε διεργασίες) έχουμε μια επιλογή μεταξύ στατικής απεικόνισης όπου οι διεργασίες "καρφώνονται" σε κάποιους επεξεργαστές (pinning) και δυναμικής απεικόνισης όπου υπάρχει δυνατότητα καλύτερης διαχείρισης των πόρων του συστήματος λαμβανομένου υπ' όψη του φόρτου εργασίας των επεξεργαστών. Σε οποιαδήποτε περίπτωση, η αυτοματοποίηση της απεικόνισης απαιτεί αλγορίθμους οι οποίοι πρέπει να χειρίζονται δύο ερωτήσεις (α) "πού;" και (β) "πότε;". Η τοπική ερώτηση (δηλαδή το "πού") αφορά την απεικόνιση των διεργασιών σε επεξεργαστές, πχ. "Πού θα τρέξω τη διεργασία Δ9;". Η χρονική ερώτηση (δηλαδή το "πότε") αφορά το χρόνο εκτέλεσης των εργασιών και τα θέματα συγχρονισμού μεταξύ διαφορετικών διεργασιών, πχ. "Πότε θα εκτελεστεί η εργασία Ε7 της διεργασίας Δ4;". Η απάντηση στο "πού" και στο "πότε" καλείται χρονοδιάγραμμα και η κατάρτιση ενός χρονοδιαγράμματος εκτέλεσης των εργασιών καλείται χρονοδρομολόγηση (scheduling). Πολλές φορές το θέμα της χρονοδρομολόγησης αντιμετωπίζεται μαζί με το θέμα της απεικόνισης εργασιών σε διεργασίες, δηλαδή τα βήματα 3 και 2 αντιμετωπίζονται ως ένα ενιαίο πρόβλημα. Το θέμα της χρονοδρομολόγησης, σε συνδυασμό με την απεικόνιση, είναι πολύ σημαντικό στον προγραμματισμό παράλληλων και κατανεμημένων
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 164 προγραμμάτων και για το λόγο αυτό αναπτύσσεται με περισσότερη λεπτομέρεια παρακάτω. 7.3 Απεικόνιση και χρονοδρομολόγηση Όπως είδαμε, ένας αλγόριθμος που σχεδιάζεται για να εκτελεστεί είτε από ένα παράλληλο είτε από ένα κατανεμημένο σύστημα υλοποιείται από ένα σύνολο εργασιών (tasks) οι οποίες πρέπει να εκτελεστούν από τους διάφορους υπολογιστικούς κόμβους του συστήματος. Προφανώς, είναι πολύ σημαντικό να αναθέσουμε τις εργασίες στους κατάλληλους επεξεργαστές την κατάλληλη χρονική στιγμή έτσι ώστε να ελαχιστοποιηθεί ο συνολικός χρόνος εκτέλεσης του αλγορίθμου. Εδώ εμπλέκεται τόσο το βήμα 2 της απεικόνισης εργασιών σε διεργασίες όσο και το βήμα 3 της χρονοδρομολόγησης. Γενικά, η αντιστοίχηση εργασιών σε εξυπηρετητές εμφανίζεται σε διάφορες περιπτώσεις όπου απαιτείται διαχείριση (management) ενός συστήματος και όχι μόνο στην παράλληλη/κατανεμημένη επεξεργασία. Για παράδειγμα, μια εργασία σε ένα εργοστάσιο εξυπηρετείται από μια μηχανή ή από ένα εργάτη. Συνήθως υπάρχει ένας μεγάλος αριθμός εργασιών που πρέπει να εκτελεστούν για να παραχθεί το τελικό προϊόν, όπως επίσης υπάρχει και ένας μεγάλος αριθμός μηχανημάτων ή εργατών που εκτελούν αυτές τις εργασίες. Ο διαχειριστής (manager) του εργοστασίου πρέπει να αποφασίσει τη σειρά εκτέλεσης των εργασιών και την ανάθεσή τους στον κατάλληλο εξυπηρετητή για την όσο το δυνατό ταχύτερη παραγωγή του τελικού προϊόντος. Αντίστοιχα σε ένα παράλληλο ή κατανεμημένο υπολογιστικό σύστημα οι εργασίες (tasks) εξυπηρετούνται από επεξεργαστές. Όπως και στην περίπτωση του εργοστασίου η σειρά εκτέλεσης των εργασιών πρέπει να τακτοποιηθεί έτσι ώστε να ελαχιστοποιείται ο συνολικός χρόνος εκτέλεσης. Συνήθως οι εργασίες είναι αλληλοεξαρτώμενες οπότε υπάρχουν συγκεκριμένες λογικές δεσμεύσεις στη σειρά της εκτέλεσής τους. Ο χρονοδρομολογητής (scheduler) δηλαδή το πρόγραμμα που αποφασίζει πού και πότε θα εκτελεστούν οι εργασίες πρέπει να σεβαστεί τις δεσμεύσεις αυτές. Οι μέθοδοι χρονοδρομολόγησης κατατάσσονται σε ντετερμινιστικές και σε μη ντετερμινιστικές. Στις ντετερμινιστικές μεθόδους θεωρούμε ότι ο χρόνος εκτέλεσης όλων των εργασιών είναι σταθερός και γνωστός εκ των προτέρων. Αυτό ωστόσο μπορεί να μην ισχύει στην πράξη. Για παράδειγμα, μια εργασία η οποία περιέχει μέσα της ένα άλμα υπό συνθήκη συνήθως χρειάζεται διαφορετικό χρόνο για να εκτελεστεί αν το άλμα γίνει, και διαφορετικό χρόνο αν το άλμα δε γίνει. Στην περίπτωση αυτή δε μπορούμε να ξέρουμε από πριν το χρόνο εκτέλεσης της εργασίας αφού η απόφαση σχετικά με το άλμα παίρνεται ενώ το πρόγραμμα τρέχει και όχι νωρίτερα. Τότε χρειάζεται να χρησιμοποιηθεί ένας μη ντετερμινιστικός αλγόριθμος χρονοδρομολόγησης ο οποίος να λαμβάνει υπ' όψη του την ασάφεια αυτή. Άλλες πηγές ασάφειας του χρόνου εκτέλεσης είναι οι αποτυχίες της cache οι οποίες καθυστερούν την μεταφορά δεδομένων από και προς τον επεξεργαστή, τα swaps του δίσκου τα οποία καθυστερούν τη μεταφορά δεδομένων από και προς τη μνήμη, κλπ. Μια άλλη διάκριση των αλγορίθμων δρομολόγησης σχετίζεται με την δυναμική της απεικόνισης των εργασιών. Οι στατικοί αλγόριθμοι αποφασίζουν τη στιγμή της
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 165 μετάφρασης του προγράμματος (compile time) σε ποιον επεξεργαστή θα εκτελεστεί κάθε διεργασία και κάθε φορά που η διεργασία αυτή πρόκειται να εκτελεστεί ανατίθεται στον ίδιο επεξεργαστή ανεξαρτήτως του φόρτου εργασίας του τη δεδομένη στιγμή. Αντίθετα, οι δυναμικοί αλγόριθμοι αποφασίζουν την απεικόνιση την ώρα της εκτέλεσης του προγράμματος λαμβάνοντας υπ' όψη, συν τοις άλλοις, και το φόρτο εργασίας του κάθε επεξεργαστή. Το πλεονέκτημα των στατικών αλγορίθμων δρομολόγησης είναι η ταχύτητα απόφασης αφού η απεικόνιση έχει προαποφασιστεί και δεν αλλάζει, σε αντίθεση με τους δυναμικούς αλγορίθμους οι οποίοι σπαταλάνε χρόνο εκτέλεσης για να αποφασίσουν εκείνη τη στιγμή τις αναθέσεις. Βέβαια οι δυναμικοί αλγόριθμοι έχουν το προφανές πλεονέκτημα ότι κάνουν καλύτερη διαχείριση του συστήματος αφού η ευελιξία τους στην απεικόνιση διεργασιών εξισορροπεί το φόρτο λειτουργίας των επεξεργαστών και διευκολύνει την καλύτερη απόδοση του συστήματος. 7.3.1 Μοντέλο Α: ντετερμινιστικό, με μηδενικό χρόνο επικοινωνίας Κατ' αρχήν θα μελετήσουμε το πιο απλό μοντέλο χρονοδρομολόγησης όπου θα κάνουμε δύο προσεγγίσεις: (α) οι χρόνοι εκτέλεσης των εργασιών είναι εκ των προτέρων γνωστοί και δεν εξαρτώνται από αστάθμητους παράγοντες όπως αποτυχίες της cache, disk swaps, κλπ. Στην περίπτωση αυτή λέμε ότι το μοντέλο είναι ντετερμινιστικό, δηλαδή δεν υπεισέρχεται ο παράγων τύχη. (β) ο χρόνος επικοινωνίας μεταξύ των επεξεργαστών είναι μηδενικός. Για να καταλάβουμε τη σημασία του συνδυασμού απεικόνισης και χρονοδρομολόγησης ακόμη και στην απλή αυτή περίπτωση ας θεωρήσουμε τον αλγόριθμο που περιγράφεται από τον παρακάτω ντετερμινιστικό Γράφο Εξάρτησης Ε1 100 Ε2 100 Ε3 400 Ε4 200 Ε5 300 Ε6 100 Κάθε κόμβος του γράφου είναι και μια διαφορετική εργασία (task) η οποία μπορεί να εξαρτάται από τα αποτελέσματα κάποιων άλλων εργασιών ενώ ταυτόχρονα μπορεί να τροφοδοτεί άλλες εργασίες με τα δικά της αποτελέσματα. Δίπλα σε κάθε εργασία αναγράφεται και ο χρόνος εκτέλεσής της σε υποθετικές μονάδες χρόνου οι οποίες προφανώς δε μας ενδιαφέρουν εδώ. Οι μονάδες χρόνου θα μπορούσε να είναι είτε nsec,
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 166 είτε κύκλοι επεξεργαστή, είτε κάτι άλλο που δεν αλλάζει σε τίποτα την ανάλυση που ακολουθεί. Στο παρακάτω Σχήμα δίνονται δύο διαφορετικές αναθέσεις και χρονοδιαγράμματα εκτέλεσης σε ένα σύστημα με τρεις επεξεργαστές: P1, P2, P3, με βάση τις παραπάνω παραδοχές: P1 P2 P3 Ε1 Ε2 Ε4 Χρονοδιάγραμμα 1 Ε3 Ε5 Ε6 0 100 200 300 400 500 600 700 P1 P2 P3 Ε1 Ε2 Χρονοδιάγραμμα 2 Ε4 Ε5 Ε3 Ε6 Στην πρώτη απεικόνιση 0 100 200 300 400 500 600 Χρόνος οι εργασίες Ε1, Ε2, Ε3, Ε6 αποτελούν την πρώτη διεργασία η οποία εκτελείται στον επεξεργαστή P1, η εργασία Ε4 αποτελεί τη δεύτερη διεργασία που εκτελείται στον P2, η εργασία Ε5 αποτελεί την τρίτη διεργασία που εκτελείται στον P3. Στη δεύτερη απεικόνιση έχουμε (Ε1, Ε2, Ε4, Ε6) πρώτη διεργασία επεξεργαστής P1, (E5) δεύτερη διεργασία επεξεργαστής P2, (E3) τρίτη διεργασία επεξεργαστής P3. Είναι φανερό ότι οι διαφορετικές αναθέσεις σε συνδυασμό με τα διαφορετικά χρονοδιαγράμματα δίνουν διαφορετικά αποτελέσματα ως προς το συνολικό χρόνο εκτέλεσης Τ του αλγορίθμου. Ο πρώτος τρόπος χρονοδρομολόγησης δίνει Τ=700, ενώ ο δεύτερος δίνει Τ=600. Πώς λοιπόν, με δεδομένα (α) το γράφο εξάρτησης των διεργασιών, (β) τους χρόνους εκτέλεσης της κάθε εργασίας, και (γ) το πλήθος των επεξεργαστών, μπορούμε να βρούμε την καλύτερη απεικόνιση και το καλύτερο χρονοδιάγραμμα; Το πρόβλημα είναι γενικά πολύ δύσκολο, ακόμα και με τις παραπάνω απλοποιητικές παραδοχές και δεν υπάρχει μια βέλτιστη λύση παρά μόνο σε ειδικές περιπτώσεις. Όπως
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 167 είδαμε, στην περίπτωση των συστολικών αλγορίθμων η βέλτιστη λύση δίνεται με μια μεθοδολογία "τυφλοσούρτη" όπου το "ποιος", "πού", και "πότε" αποφασίζεται με τη χρήση των διανυσμάτων προβολής d, και του διανύσματος χρονοδιαγράμματος s. Στη γενική περίπτωση, λύση τυφλοσούρτης δεν υπάρχει. Υπάρχουν όμως βέλτιστες στρατηγικές σε διάφορες ειδικές περιπτώσεις (και όχι μόνο σε συστολικούς επεξεργαστές) όπως θα περιγράψουμε παρακάτω. Επίσης στη γενική περίπτωση υπάρχουν στρατηγικές που, αν και όχι βέλτιστες, αποδίδουν καλά αποτελέσματα στη μεγάλη πλειοψηφία των περιπτώσεων. 7.3.1.1 Ειδική Περίπτωση 1: ο ΓΕ είναι δάσος εισόδου ή δάσος εξόδου. Ορισμός. Ένας γράφος εξάρτησης (ΓΕ) καλείται δάσος εισόδου όταν κάθε κόμβος έχει μόνο μια ακμή εξόδου. Αντίστοιχα καλείται δάσος εξόδου αν κάθε κόμβος έχει μόνο μια ακμή εισόδου. Παράδειγμα. Ο παρακάτω ΓΕ είναι ένα δάσος εισόδου (διότι κάθε κόμβος έχει μια μόνο έξοδο ενώ οι είσοδοι κάθε κόμβου αποτελούν ένα "δάσος"). Κόμβος Προτεραιότητα Α Β Γ Α 5 Β 5 Α Α Γ 5 Δ νά Ε νά Ζ Η Δ 4 θε θε Ε 4 Α ση ση Α Α Ζ 4 νά ερ Θ νά ερ Ι νά Κ Η 4 θε γα γα θε θε Θ 3 ση σι Α ση σι Α ση Α ερ Ι 3 νά ώ Λ ερ ώ νά ερ Μ νά γα Κ 3 θε ν: γα ν: θε γα θε σι Λ 2 ση τρ Ατρ σι ση σι Αση ώ όπ ερ Μ 2 νάόπ ώ ερ ών νάερ ν: γα ος Ν 1 θεος ν: γα ν: θεγα τρ σι Β ση τρ Β σι τρα ση σι Αλγόριθμος απεικόνισης όπ ώκαι ερόπ δρομολόγησης ώ όπνάερώ για δάσος εισόδου. ος ν: γαος ν: ος Όταν ο γράφος μας είναι ένα δάσος θεγαν: Β εισόδου και όλοι οι κόμβοι έχουν τον ίδιο χρόνο τρ σιβ τρ Β εκτέλεσης, τότε μπορούμε να ση σι τρ κάνουμε βέλτιστη απεικόνιση και βέλτιστη όπ ώ όπ χρονοδρομολόγηση χρησιμοποιώντας ερώ όπ την έννοια της προτεραιότητας. Συγκεκριμένα ος ν: ος δίνουμε μεγαλύτερη προτεραιότητα στους γαν: ος κόμβους ανάλογα με την απόστασή τους από Β τρ Β τον τελευταίο κόμβο του γράφου. σι τρβ Στο συγκεκριμένο παράδειγμα, ο κόμβος Ν είναι όπ τελευταίος και άρα παίρνει προτεραιότητα ώόπ 1. Οι κόμβοι Λ, Μ, του αμέσως προηγούμενου ος επιπέδου παίρνουν προτεραιότητα 2. ν: ος Οι κόμβοι Θ, Ι, Κ, του πιο πάνω επιπέδου παίρνουν Β προτεραιότητα 4, κλπ. Ο πίνακας όλων τρβ των προτεραιοτήτων που προκύπτουν με τον τρόπο αυτό φαίνεται στα δεξιά του γράφου. όπ ος Κατόπιν αναθέτουμε την εκτέλεση Β των εργασιών με σειρά προτεραιότητας στους διαθέσιμους επεξεργαστές σεβόμενοι πάντα τις ακμές εξάρτησης. Για παράδειγμα, αν έχουμε 3 επεξεργαστές P1, P2, P3, τότε ο πίνακας χρονισμού έχει ως εξής
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 168 t=1 t=2 t=3 t=4 t=5 t=6 P1 Α 5 Δ 4 Η 4 Ι 3 Λ 2 Ν 1 P2 Β 5 Ε 4 Θ 3 Μ 2 P3 Γ 5 Ζ 4 Κ 3 Ο δείκτης που αναγράφεται σε κάθε εργασία αντιστοιχεί στην προτεραιότητά της. Τα γκρίζα βελάκια αντιστοιχούν στις εξαρτήσεις μεταξύ των εργασιών (σύμφωνα με το γράφο εξάρτησης). Η χρονοδρομολόγηση γίνεται, όπως είπαμε, αναθέτοντας πρώτα τις εργασίες με τη μεγαλύτερη προτεραιότητα στους επεξεργαστές που είναι διαθέσιμοι και κατόπιν τις εργασίες με τη μικρότερη προτεραιότητα. Έτσι, αναθέτουμε πρώτα τις τρεις εργασίες Α, Β, Γ με τη μεγαλύτερη προτεραιότητα στους τρεις επεξεργαστές κατά τον κύκλο t=1. Έπειτα αναθέτουμε τις εργασίες Δ, Ε, Ζ, κατά τον κύκλο t=2. Στον κύκλο t=3 αναθέτουμε μόνο τις εργασίες Η, Θ, Κ, και όχι την εργασία Ι διότι πρέπει να προηγείται η Η από τη Ι (δες το βελάκι εξάρτησης μεταξύ Η, Ι). Στον κύκλο 4 δε μπορούμε να εκτελέσουμε την Λ διότι εξαρτάται από την Ι, ενώ στον κύκλο 5 δεν μπορούμε να εκτελέσουμε τη Ν διότι εξαρτάται από τη Λ. Έτσι ο πίνακας χρονισμού που προκύπτει είναι ο καλύτερος δυνατός όσον αφορά το συνολικό χρόνο εκτέλεσης του αλγορίθμου. Ο αλγόριθμος απεικόνισης και δρομολόγησης ενός δάσους εξόδου είναι ακριβώς ανάλογος με τον παραπάνω αλγόριθμο και έτσι θα τον παραλείψουμε. 7.3.1.2 Ειδική Περίπτωση 2: Μόνο δύο επεξεργαστές Μια άλλη ειδική περίπτωση όπου υπάρχουν βέλτιστοι αλγόριθμοι απεικόνισης και χρονοδρομολόγησης είναι η περίπτωση των δύο επεξεργαστών. Και εδώ η βασική ιδέα είναι η απεικόνιση προτεραιότητας στους κόμβους. Το μόνο που αλλάζει είναι ο τρόπος απεικόνισης προτεραιότητας. Αλγόριθμος απεικόνισης και δρομολόγησης σε δύο επεξεργαστές. Ο αλγόριθμος γίνεται καλύτερα κατανοητός με ένα παράδειγμα. Έστω ο παρακάτω γράφος εξάρτησης.
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 169 Βήμα 1. Δίνουμε αυθαίρετα προτεραιότητες 1, 2,..., Μ στα φύλλα του γράφου, δηλαδή στους κόμβους που δεν έχουν παιδιά. Στη συγκεκριμένη περίπτωση οι κόμβοι αυτοί είναι δύο: Ι, Κ. Χρωματίζουμε τους κόμβους αυτούς γκρι. Α Β Γ Δ Ε Ζ Η Θ 1 Ι Κ 2 Βήμα 2. Βρίσκουμε όλους τους κόμβους που έχουν όλα τους τα παιδιά γκρι. Στο παράδειγμά μας είναι οι κόμβοι Ζ, Η, Θ. Τους κόμβους αυτούς τους κατατάσσουμε σε σειρά ανάλογα με τη μεγαλύτερη προτεραιότητα των παιδιών τους. Έτσι ο Θ έχει μεγαλύτερη προτεραιότητα από τους Ζ, Η, διότι το παιδί του Θ, το Κ, έχει προτεραιότητα 2 ενώ τα παιδιά των Ζ, Η, έχουν προτεραιότητα 1. Δίνουμε στους κόμβους αυτούς προτεραιότητες Μ+1,..., Μ', δηλαδή, Ζ=3, Η=4, Θ=5. Χρωματίζουμε τους κόμβους Ζ, Η, Θ, γκρι. Α Β Γ Δ Ε Ζ 3 Η 4 Θ 5 1 Ι Κ 2 Βήμα 3. Επαναλαμβάνουμε το Βήμα 2 μέχρι όλοι οι κόμβοι να χρωματιστούν γκρι οπότε έχουν όλοι και μια διαφορετική προτεραιότητα. Έτσι τελικά παίρνουμε τις παρακάτω Α Β Γ Δ Ε Ζ Η Θ Ι Κ προτεραιότητες
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 170 8 Α Β 10 Γ 9 6 Δ 7 Ε Ζ 3 Η 4 Θ 5 1 Ι Κ 2 Βήμα 4. Αναθέτουμε τις εργασίες με σειρά προτεραιότητας (μεγαλύτερη προτεραιότητα πρώτα) στον πρώτο επεξεργαστή που είναι ελεύθερος. Έτσι παίρνουμε το παρακάτω χρονοδιάγραμμα: t=1 t=2 t=3 t=4 t=5 P1 Β 10 Α 8 Δ 6 Η 4 Κ 2 P2 Γ 9 Ε 7 Θ 5 Ζ 3 Ι 1 Ο συνδυασμός αυτός απεικόνισης και χρονοδιαγράμματος είναι προφανώς βέλτιστος αφού δε σπαταλιέται ούτε ένας κύκλος επεξεργαστή. Ωστόσο η απόδειξη ότι ο αλγόριθμος είναι βέλτιστος για τη γενική περίπτωση δε θα μας απασχολήσει εδώ. 7.3.2 Μοντέλο Β: ντετερμινιστικό, αλλά όχι αμελητέος χρόνος επικοινωνίας Στην περίπτωση αυτή υποθέτουμε ότι ο χρόνος εκτέλεσης κάθε εργασίας είναι γνωστός και δεν εξαρτάται τυχαίες παραμέτρους, αλλά το κόστος (δηλ. ο χρόνος) επικοινωνίας μεταξύ των διεργασιών δεν είναι αμελητέο. Ο χρόνος επικοινωνίας μεταξύ διεργασιών είναι ουσιαστικά ο χρόνος που απαιτείται για την ανταλλαγή δεδομένων μεταξύ των επεξεργαστών που εκτελούν αυτές τις εργασίες. Αν οι εργασίες Α, Β δεν ανταλλάσσουν δεδομένα ή αν εκτελούνται στον ίδιο επεξεργαστή τότε θεωρούμε ότι ο χρόνος επικοινωνίας Α-Β είναι μηδενικός. Αν υπάρχει ακμή που ενώνει τον κόμβο Α με τον κόμβο Β του ΓΕ τότε οι εργασίες Α, Β ανταλλάσσουν δεδομένα μεταξύ τους. Στην περίπτωση αυτή υπάρχει μη μηδενικό κόστος επικοινωνίας Α-Β αν και μόνο αν οι εργασίες Α, Β εκτελούνται σε διαφορετικούς επεξεργαστές. Όταν λοιπόν κάνουμε απεικόνιση και δρομολόγηση εργασιών προσπαθούμε να βάλουμε τις χρονοβόρες ακμές μέσα στην ίδια διεργασία έτσι ώστε να εκτελεστούν από τον ίδιο επεξεργαστή και να μηδενιστεί το κόστος επικοινωνίας. Η χρονοδρομολόγηση γίνεται τώρα πιο πολύπλοκη απ' ότι στην περίπτωση όπου δε λαμβάναμε υπ' όψη μας το κόστος επικοινωνίας (μοντέλο Α). Παρ' όλ' αυτά το μοντέλο αυτό είναι πιο ρεαλιστικό από το μοντέλο Α. Η εύρεση της βέλτιστης απεικόνισης και της βέλτιστης χρονοδρομολόγησης είναι δύσκολη. Στην περίπτωση αυτή
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 171 χρησιμοποιούνται ευρηστικές μέθοδοι (heuristics) οι οποίες προσπαθούν να καλύψουν το κόστος επικοινωνίας και να αναθέσουν τις εργασίες στους διάφορους επεξεργαστές. Παραλληλισμός και κόστος επικοινωνίας Έστω ότι έχουμε τον παρακάτω γράφο εξάρτησης όπου δίπλα σε κάθε κόμβο αναγράφεται ο χρόνος εκτέλεσης κάθε εργασίας και δίπλα σε κάθε ακμή αναγράφεται ο χρόνος επικοινωνίας αν η ακμή αυτή μεταφέρει δεδομένα ανάμεσα σε δύο διαφορετικούς επεξεργαστές. Α 10 5 20 Β 15 Γ 20 Γενικά, είναι προτιμότερο να αναθέτουμε τους κόμβους που συνδέουν ακμές με μεγάλο κόστος επικοινωνίας, όπως η ακμή Α-Γ, στην ίδια διεργασία έτσι ώστε οι κόμβοι Α και Γ να εκτελεστούν τελικά στον ίδιο επεξεργαστή και να μην πληρώσουμε το κόστος επικοινωνίας Α-Γ. Υποθέτουμε ότι ο χρόνος που χρειάζεται ένας επεξεργαστής για να επικοινωνήσει με τον εαυτό του είναι μηδενικός. Έστω για παράδειγμα ότι έχουμε δύο επεξεργαστές P1, P2. Δύο πιθανές αναθέσεις με τα αντίστοιχα χρονοδιαγράμματα έχουν ως εξής: P1 P2 Α Χρονοδιάγραμμα 1 Β Επικοινωνία Α-Γ Γ P1 P2 0 10 20 30 40 50 Χρονοδιάγραμμα 2 Α Γ Α-Β Β Α-Γ 0 10 20 30 40 50 Χρόνος Προφανώς το χρονοδιάγραμμα 2 είναι καλύτερο διότι αναθέτουμε τις εργασίες Α, Γ οι οποίες έχουν πολύ μεγάλο κόστος επικοινωνίας στον ίδιο επεξεργαστή και έτσι το κόστος επικοινωνίας μεταξύ τους μηδενίζεται. Διπλή εκτέλεση εργασιών (task duplication)
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 172 Μια άλλη μέθοδος για την μείωση του χρόνου επικοινωνίας είναι η διπλή εκτέλεση μιας διεργασίας σε δύο διαφορετικούς επεξεργαστές. Η εφαρμογή της μεθόδου αυτής γίνεται φανερή με το παρακάτω χρονοδιάγραμμα που αναφέρεται στον προηγούμενο γράφο εξάρτησης P1 P2 Χρονοδιάγραμμα 3 (διπλή εκτέλεση Α) Α Γ Α Β 0 10 20 30 40 50 Χρόνος Το χρονοδιάγραμμα αυτό έχει συνολικό χρόνο εκτέλεσης Τ=30 σε αντίθεση με το χρον/μμα 1 που έχει Τ=50, και το χρον/μμα 2 που έχει Τ=35. Αυτό επετεύχθη εκτελώντας την εργασία Α δύο φορές, μια στον επεξεργαστή P1, και μια στον P2. Έτσι αποφεύγουμε τελείως και το κόστος επικοινωνίας Α-Γ, και το κόστος επικοινωνίας Α-Β, αφού οι Α, Γ εκτελούνται στον ίδιο επεξεργαστή P1 ενώ οι Α, Β, εκτελούνται στον ίδιο επεξεργαστή P2. 7.3.2.1 Ευρηστικοί Αλγόριθμοι Παρακάτω περιγράφουμε δύο βασικούς ευρηστικούς αλγορίθμους που χρησιμοποιούνται όταν υπάρχει μη αμελητέο κόστος επικοινωνίας. Οι αλγόριθμοι περιγράφονται πολύ γενικά για να πάρουμε μια ιδέα για τις βασικές μεθόδους που χρησιμοποιούνται και όχι για να τις αναλύσουμε σε βάθος. Άλλωστε ο τομέας αυτός είναι πεδίο έντονης ερευνητικής δραστηριότητας τα τελευταία χρόνια. Δρομολόγηση με λίστα προτεραιότητας (list scheduling) Κάθε κόμβος του γράφου παίρνει μια τιμή προτεραιότητας. Δημιουργείται μια ουρά με εργασίες έτοιμες προς εκτέλεση οι οποίες κατατάσσονται με σειρά προτεραιότητας. Μια εργασία λέγεται έτοιμη προς εκτέλεση αν έχουν εκτελεστεί όλες οι εργασίες από τις οποίες λαμβάνει είσοδο. Για όσο η ουρά δεν είναι άδεια κάνε τα εξής: Πάρε την εργασία που βρίσκεται στην κορυφή της ουράς Επέλεξε ένα επεξεργαστή που τώρα δεν εργάζεται και ανάθεσε την εργασία σ' αυτόν Πρόσθεσε μια εργασία στην ουρά όταν είναι έτοιμη, δηλαδή όταν έχουν εκτελεστεί όλες οι εργασίες που την τροφοδοτούν με αποτελέσματα.
Κεφάλαιο 7: Παραλληλοποίηση Κώδικα, Χρονοδρομολόγηση 173 Δρομολόγηση με ομαδοποίηση (clustering) Βήμα 1: Απεικόνιση. Ομαδοποίησε τις εργασίες με κάποιο κριτήριο ελαχιστοποίησης των ακμών επικοινωνίας μεταξύ των ομάδων. Οι ακμές αυτές αντιστοιχούν σε επικοινωνία μεταξύ επεξεργαστών η οποία κοστίζει πολύ σε χρόνο. Βήμα 2: Απεικόνιση των ομάδων σε N επεξεργαστές. Αν υπάρχουν περισσότερες από Ν ομάδες (clusters) ένωσε κάποιες ομάδες μεταξύ τους ώστε να φτιαχτούν Ν ομάδες. Αντιστοίχησε κάθε ομάδα σε ένα διαφορετικό επεξεργαστή. Βήμα 3: Χρονοδρομολόγηση. Για κάθε επεξεργαστή όρισε μια σειρά εκτέλεσης των εργασιών έτσι ώστε να γίνονται σεβαστές οι ακμές εξάρτησης.