Λ10 Παράλληλος & Κατανεμημένος Προγραμματισμός 2009 Μάθημα 10 ο 15/12/2009 Κατανεμημένη κοινή μνήμη (DSM Distributed Shared Memory) Β. Δημακόπουλοσ
Γιατί; Συςτιματα κατανεμθμζνθσ μνιμθσ: Αρχιτεκτονικι: κλιμακώςιμη Προγραμματιςμόσ (MPI): αρκετά δφςκολοσ αλλά και δυνατότθτα επιδόςεων Συςτιματα κοινισ μνιμθσ (SMPs): Αρχιτεκτονικι: δφςκολα κλιμακώςιμη Προγραμματιςμόσ: ςχετικά εφκολοσ Το ιδεϊδεσ: Κλιμακϊςιμεσ αρχιτεκτονικζσ που να προγραμματίηονται εφκολα (αλλά μθν ξεχνάμε και τισ επιδόςεισ) Μετά το ςειριακό, το πιο εφκολο είναι ο προγραμματιςμόσ κοινισ μνιμθσ (π.χ. OpenMP) Λφςθ: «εξομοίωςη» κοινήσ μνήμησ πάνω από το ςφνολο των ιδιωτικών μνημών με hardware με software #2
Hardware κόμβοσ ςυςτιματοσ ΜΝΗΜΗ (ΤΟΠΙΚΗ) CPU ROUTER #3
Hardware ελεγκτισ DSM ΕΛΕΓΚΤΗΣ DSM CPU ΜΝΗΜΗ (ΤΟΠΙΚΗ) ROUTER Η CPU προςπελαφνει όλο τον χϊρο διευκφνςεων ενιαία Η τοπικι μνιμθ ζχει μόνο ζνα μικρό κομμάτι του χϊρου Ο ελεγκτισ DSM ελζγχει κάκε διεφκυνςθ που προςπελαφνει θ CPU (1) Αν είναι για τθν τοπικι μνιμθ δεν κάνει τίποτε (2) Αν όχι, αναλαμβάνει τθν επικοινωνία με τον κόμβο που τθν χειρίηεται, ςτζλνοντασ κατάλλθλο μινυμα. Μόλισ ζρκει θ απάντθςθ, δίνει δεδομζνα ςτθ CPU ςαν να ιταν αποκθκευμζνο τοπικά Το μόνο που καταλαβαίνει θ CPU είναι θ διαφορά ςτθν ταχφτθτα προςπζλαςθσ κάποιων δεδομζνων (τα απομακρυςμζνα κάνουν πολφ παραπάνω χρόνο να ζρκουν) NUMA (non-uniform memory access) Χριςθ cache ςτον ελεγκτι για τα απομακρυςμζνα δεδομζνα ccnuma (cache coherent NUMA) #4
Software DSM Σε clusters? Δεν υπάρχει δυνατότθτα επζμβαςθσ ςτο hardware Μόνο λφςεισ software Κλαςικι υλοποίθςθ: page-based sdsm Χωρίσ παρεμβάςεισ ςτο Λ.Σ. (είναι μία απλι εφαρμογι ςε επίπεδο χριςτθ) Όλοι οι ςυμμετζχοντεσ κόμβοι «δεςμεφουν» ζναν χϊρο μνιμθσ (πολλζσ ςελίδεσ) που κα τον ζχουν ωσ κοινόχρθςτο Τα κοινόχρθςτα δεδομζνα κα τοποκετοφνται ςε αυτό τον χϊρο Κακζνασ «μαρκάρει» τισ ςελίδεσ ωσ «απαγορευμζνθσ προςπζλαςθσ» και ορίηει ζναν χειριςτι ςθμάτων για το ςιμα SIGSEGV Η εφαρμογι ξεκινά και οι προςπελάςεισ ςτον κοινόχρθςτο χϊρο οδθγοφν ςε ςφάλματα μνιμθσ που εκκινοφν τον χειριςτι για το SIGSEGV. O χειριςτισ: επικοινωνεί με τον κόμβο που διακζτει το δεδομζνο, φζρνοντασ ολόκλθρθ τθ ςελίδα που το περιζχει μετά τθ λιψθ και τθν τοποκζτθςθ ςτθ ςωςτι κζςθ, αλλάηει τα δικαιϊματα τθσ ςελίδασ (π.χ. επιτρζπεται πλζον θ ανάγνωςθ) τελειϊνει, επανεκτελϊντασ τθν εντολι που προκάλεςε τθ διακοπι #5
Ιδζεσ για υλοποιιςεισ page-based sdsm Μία ςελίδα p κα υπάρχει μόνο ςε ζναν κόμβο Κεντρικόσ server που γνωρίηει ποιοσ κόμβοσ ζχει ποια ςελίδα Απορρίπτεται μεγάλθ κίνθςθ ςτον server Κατανεμθμζνα & προκακοριςμζνα π.χ. ο κόμβοσ p % N είναι υπεφκυνοσ για γνωρίηει που βρίςκεται θ ςελίδα p Καλφτερο, μιασ και κάκε κόμβοσ μπορεί να ρωτιςει κατευκείαν αυτόν που πρζπει Αν υπάρχουν πολλοί readers, ςε κάκε προςπζλαςθ «ςελίδεσ πάνε κι ζρχονται» Λφςθ: πολλαπλά αντίγραφα ςελίδων (page replication) Απλοφςτερθ υλοποίθςθ: multi-readers Ή 1single-writer Αν εμφανιςτεί writer, τότε όλα τα read-only copies ακυρϊνονται Στο write υπάρχει μεγάλο overhead Πολφ καλό αν υπάρχουν πολλά reads και ελάχιςτα writes Καλφτερθ (ςε γενικζσ γραμμζσ) υλοποίθςθ: multi-readers ΚΑΙ multi-writers Πιο δφςκολοσ ο χειριςμόσ των πολλαπλϊν εγγραφζων #6
Πρωτόκολλα home-based (multi-writer) Home-based Ζνασ κόμβοσ (ςυνικωσ ο πρϊτοσ που κα γράψει ςτθ ςελίδα) επιλζγεται να είναι το «ςπίτι» τθσ ςελίδασ αυτισ Κατά την εγγραφή, οι άλλοι κόμβοι ςτζλνουν τισ αλλαγζσ ςτον home node. Ο home node ςτζλνει ακυρώςεισ (invalidations) ςε όλα τα άλλα αντίγραφα Τι ςτζλνουν οι writers ςτον home node ;? Τθν νζα ςελίδα: απλό, αλλά μεγάλο false sharing Diffs (μόνο τισ αλλαγζσ): ταχφτερο, αλλά ο κάκε κόμβοσ πρζπει να φυλάει και δεφτερο αντίγραφο ( twin ) από τισ ςελίδεσ που τροποποιεί για να βρίςκει τισ αλλαγζσ που ζκανε Κατά την ανάγνωςη, οι άλλοι κόμβοι παίρνουν τθν ςελίδα (ι τισ αλλαγζσ) απευκείασ από τον home node. Πικανι βελτιςτοποίθςθ: adaptive (floating/migrating home) #7
Συνζπεια μνιμθσ (memory consistency) Κανονικά ςε κάκε εγγραφι κα πρζπει να γίνεται ενθμζρωςθ του home και ακφρωςθ των αντιγράφων που υπάρχουν ςτο δίκτυο Μπορεί να είναι υπερβολικι θ κίνθςθ που δθμιουργείται, πράγμα που μειϊνει πολφ τισ επιδόςεισ Η λφςθ είναι να «χαλαρϊςουν» λίγο οι απαιτιςεισ, αποφεφγοντασ να ενημερώνουμε τουσ υπόλοιπουσ κόμβουσ όταν κάνουμε μία εγγραφή Πλζον οι τροποποιήςεισ ΔΕΝ ανακοινώνονται ςτην ώρα τουσ αλλά κάποτε αργότερα «Χαλαρϊνει» το μοντζλο τθσ μνιμθσ μιασ και πλζον οι προςπελάςεισ ςτισ κοινζσ μεταβλθτζσ είναι κάπωσ ανεξζλεγκτεσ, π.χ. ςτο παρακάτω Initially A = B = 0 Process P1 A = 1; /* write(a) */ B = 1; /* write(b) */ Process P2 printf( %d, B); /* read(b) */ printf( %d, A); /* read(a) */ κα μποροφςαμε άνετα να δοφμε εκτφπωςθ 10! #8
Εάν χαλαρϊςουμε τθ ςυνζπεια Ο αλγόρικμοσ του Dekker για αμοιβαίο αποκλειςμό δουλεφει; Initially A = B = 0 Process P1 A = 1; if (B == 0) <critical section> Process P2 B = 1; if (A == 0) <critical section> Η αυςτθρι ςυνζπεια (strict consistency) είναι ο «ορκόσ» τρόποσ λειτουργίασ Όλεσ οι ενζργειεσ (reads & writes) ολοκληρώνονται με τη ςειρά που ξεκίνηςαν Δφςκολο να υλοποιθκεί. Π.χ. ςτο NFS ο χριςτθσ Α ςϊηει κάτι πριν το χριςτθ Β (ο οποίοσ ςϊηει ςε άλλο αρχείο) αλλά λόγω κακυςτζρθςθσ ςτο δίκτυο, θ αίτθςθ του Β φτάνει πρϊτθ. Απαιτεί timestamps και πολλαπλά ςυγχρονιςμζνα ρολόγια Θεωρθτικό ενδιαφζρον μόνο #9
Sequential Consistency Η ακολουθιακή ςυνζπεια (sequential consistency) είναι λογικόσ τρόποσ λειτουργίασ Όλεσ οι διεργαςίεσ εκτελοφν και ολοκληρώνουν τισ εντολζσ (r/w) με τθ τοπική/ιδιωτική ςειρά προγράμματοσ και τα writes είναι ατομικά. Συνολικά θ ςειρά γεγονότων είναι «τυχαία» αλλά πάντωσ προκφπτει από κάποιο interleaving των εντολϊν των διεργαςιϊν (είναι όμωσ μία, δθλαδι όλεσ οι διεργαςίεσ αντιλαμβάνονται τθν ίδια ςειρά γεγονότων) Δεν απαιτοφνται ςυγχρονιςμζνα ρολόγια Όμωσ, τα writes μεταδίδονται ςε όλουσ άμεςα Αν και πολφ πιο πρακτικι από τθν αυςτθρι ςυνζπεια, μειϊνει πολφ τισ επιδόςεισ όπωσ είπαμε λόγω του υψθλοφ επικοινωνιακοφ φόρτου #10
Relaxed Consistency ΛΥΣΗ: Χαλάρωμα τθσ ςυνζπειασ για επιδόςεισ, αλλά αλλάηει πολφ τα δεδομζνα για τον προγραμματιςτι, ο οποίοσ πρζπει να είναι πολφ προςεκτικόσ: Δεν πρζπει κοινζσ μεταβλθτζσ να προςπελαφνονται εκτόσ κρίςιμων περιοχϊν Τα «χαλαρά» μοντζλα μνιμθσ και τα αντίςτοιχα πρωτόκολλα που χρθςιμοποιοφνται παρζχουν «ορκι» λειτουργία μόνο όταν οι προςπελάςεισ γίνονται μζςα ςε κρίςιμεσ περιοχζσ (lock/unlock ι acquire/release). Επομζνωσ, οι εγγραφζσ ςε κοινζσ ςελίδεσ είναι μόνο γνωςτζσ ςτον κόμβο που τισ ζκανε οι υπόλοιποι ενημερώνονται μόνο ςε κατάλληλα ςημεία ςυγχρονιςμοφ / αμοιβαίου αποκλειςμοφ Λειτουργεί μιασ και εκτόσ κρίςιμων περιοχϊν ο προγραμματιςτισ εφαρμογϊν δεν (πρζπει να) προςπελαφνει αυτζσ τισ ςελίδεσ. Αν κάποιοσ χρειαςτεί να προςπελάςει κοινζσ μεταβλθτζσ εκτόσ κρίςιμων περιοχϊν κα πρζπει «με το χζρι» να φροντίςει να μεταδοκοφν οι όποιεσ αλλαγζσ ζγιναν. #11
Release Consistency (RC) (Eager) RC: Οι αλλαγζσ μεταδίδονται μόνο κατά την ζξοδο από τθν κρίςιμθ περιοχι (κατά το unlock/release) Στα home-based ςυςτιματα τα diffs των τροποποιθμζνων ςελίδων πάνε ςτο αντίςτοιχο home ΚΑΙ ενθμερϊνονται/ακυρϊνονται τα άλλα αντίγραφα ςτουσ υπόλοιπουσ κόμβουσ Στα homeless, ενθμερϊνονται κατευκείαν όλοι LRC (Lazy Release Consistency): Οι αλλαγζσ μεταδίδονται οριςτικά κατά την είςοδο ςτθν κρίςιμθ περιοχι (κατά το lock/acquire) Στο release ςτζλνονται οι αλλαγζσ μόνο ςτο home Όποιοσ κάνει acquire, επικοινωνεί με το home και τότε παίρνει τισ αλλαγζσ Μειϊνει τθν κίνθςθ ςτο release π.χ. Treadmarks (δεν ιταν όμωσ home-based) Στα ςθμεία κακολικοφ ςυγχρονιςμοφ (barriers) ενθμερϊνονται τα πάντα #12
Παράδειγμα: HLRC (Home-based Lazy Release Consistency) Στο release Υπολογιςμόσ diffs (από τα twin που ζχει κάκε κόμβοσ) Αποςτολι diffs ςτον home node Ο home node: Εφαρμόηει τα diffs όπωσ ζρχονται, ενθμερϊνοντασ τθ ςελίδα Στο acquire Ο κόμβοσ ηθτά από τον home node τθν νζα ςελίδα #13
ScC (Scope Consistency) Παρόμοιο με το LRC μόνο που για κάκε scope (κρίςιμθ περιοχι ορίηεται από τθν κλειδαριά τθσ) οι ενθμερϊςεισ αφοροφν μόνο τισ ςελίδεσ που τροποποιήθηκαν ςτο scope αυτό. Ενϊ ςτο LRC, ςτο release μεταδίδονται όλεσ οι αλλαγζσ ςε όλεσ τισ ςελίδεσ, ακόμα και αυτζσ που ζγιναν πριν τθν κρίςιμθ περιοχι Πλιρθσ ενθμζρωςθ μόνο ςτα barriers #14