Εθνικό Μετςόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιςτών Εργαςτήριο Υπολογιςτικών Συςτημάτων Transactional Memory 9 ο Εξάμθνο
Τακτικζσ Συγχρονιςμοφ Κλειδϊματα (locks) Coarse-grain Fine-grain Non-blocking Lock-free Wait-free Transactional Memory 2
Δυςκολία προγραμματιςμοφ εφκολο να κάνουμε coarse-grain υλοποιιςεισ Συγχρονιςμόσ Γιατί δε μασ αρζςουν τα locks... για να εκμεταλλευτοφμε όμωσ τον παραλλθλιςμό πρζπει να κάνουμε fine-grain υλοποιιςεισ...... και εκεί ξεκινάει ο εφιάλτθσ Convoying ζνα νιμα που κρατάει ζνα lock γίνεται schedule out τα υπόλοιπα νιματα περιμζνουν τθν απελευκζρωςθ του lock ακόμα και μετά τθν απελευκζρωςθ του lock υπάρχει μία ουρά από νιματα που περιμζνουν να πάρουν το lock 3
Αντιςτροφι προτεραιοτιτων (Priority inversion) ζνα νιμα T1 υψθλισ προτεραιότθτασ περιμζνει να ελευκερωκεί κάποιο lock ζνα άλλο νιμα T2 χαμθλότερθσ προτεραιότθτασ εκτελείται πριν το T1 Συγχρονιςμόσ Γιατί δε μασ αρζςουν τα locks... Mars Pathfinder (1997) αποςτολι τθσ NASA για αποςτολι του εξερευνθτικοφ οχιματοσ Sojourner ςτον Άρθ λίγεσ μζρεσ μετά τθν προςεδάφιςθ ςτον Άρθ το λογιςμικοφ του ςυςτιματοσ κάνει επανεκκινιςεισ Γιατί; Priority inversion Concurrent programming is hard: After the failure, JPL engineers spent hours and hours running the system on the exact spacecraft replica in their lab with tracing turned on, attempting to replicate the precise conditions under which they believed that the reset occurred. Early in the morning, after all but one engineer had gone home, the engineer finally reproduced a system reset on the replica. Analysis of the trace revealed the priority inversion. Πηγή: wikipedia Πηγή:http://research.microsoft.com/en-us/um/people/mbj/Mars_Pathfinder/Mars_Pathfinder.html 4
Συγχρονιςμόσ Γιατί δε μασ αρζςουν τα locks... Composability void transfer (account A, account B, int amount) { lock(a); lock(b); withdraw(a, amount); deposit(b, amount); unlock(b); unlock(a); } Νήμα 1: transfer(a, B, 10); lock(a); lock(b); Θ ςφνκεςθ κλειδωμάτων είναι δφςκολθ. DEADLOCK! Χρειάηεται κακολικι πολιτικι για το κλείδωμα Νήμα 2: transfer(b, A, 20); lock(b); lock(a); δεν μπορεί πάντα να αποφαςιςτεί εκ των προτζρων Fine-grain locking: εκμετάλλευςθ παραλλθλιςμοφ, καλι επίδοςθ και κλιμακϊςιμο, αλλά δυςκολία προγραμματιςμοφ. 5
Συγχρονιςμόσ Γιατί δε μασ αρζςουν τα locks... Composability void transfer (account A, account B, int amount) { lock(bank); withdraw(a, amount); deposit(b, amount); unlock(bank); } Νήμα 1: transfer(a, B, 10); lock(bank);... critical section... Θ ςφνκεςθ κλειδωμάτων είναι δφςκολθ. Χρειάηεται κακολικι πολιτικι για το κλείδωμα No Concurrency! Νήμα 2: transfer(c, D, 20); lock(bank);... stall... δεν μπορεί πάντα να αποφαςιςτεί εκ των προτζρων Fine-grain locking: εκμετάλλευςθ παραλλθλιςμοφ, καλι επίδοςθ και κλιμακϊςιμο, αλλά δυςκολία προγραμματιςμοφ. Coarse-grain locking: δεν υπάρχει παραλλθλία, χαμθλι επίδοςθ 6
Παράδειγμα: Java 1.4 HashMap Map: key value (-) δεν είναι thread-safe 7
Θ λφςθ τθσ Java 1.4: synchronized layer ρθτό, coarse-grain locking από τον προγραμματιςτι Synchronized HashMap Coarse-grain synchronized HashMap (+) thread-safe, εφκολο ςτον προγραμματιςμό (-) περιορίηει τον (όποιον) ταυτοχρονιςμό, χαμθλι κλιμακωςιμότθτα μόνο ζνα thread μπορεί να επεξεργάηεται το HashMap κάκε φορά Fine-grain locking HashMap (Java 5) ζνα lock ανά bucket (+) καλι επίδοςθ και κλιμακωςιμότθτα (-) δυςκολία προγραμματιςμοφ 8
Επίδοςη: Locks 9
Ιδανικά κα κζλαμε: Transactional Memory (TM) προγραμματιςτικι ευκολία αντίςτοιχθ με coarse-grain locking απόδοςθ ςυγκρίςιμθ με fine-grain locking Transactional memory ο χριςτθσ ςθμειϊνει κομμάτια κϊδικα τα οποία πρζπει να εκτελεςτοφν ατομικά (transactions) το TM ςφςτθμα είναι υπεφκυνο για τθν ςωςτι εκτζλεςθ Μεταφζρουμε τθν πολυπλοκότθτα του fine-grain ςυγχρονιςμοφ ςτο TM ςφςτθμα. 10
Προγραμματιςμόσ με ΤΜ void transfer (account A, account B, int amount) { lock(a); lock(b); withdraw(a, amount); deposit(b, amount); unlock(b); unlock(a); } Προςτακτικόσ vs. Δθλωτικόσ προγραμματιςμόσ Περιγραφι ςυγχρονιςμοφ ςε υψθλό επίπεδο void transfer (account A, account B, int amount) { tx_begin(); withdraw(a, amount); deposit(b, amount); tx_end(); } ο προγραμματιςτισ λζει τι, όχι πϊσ Το υποκείμενο ςφςτθμα υλοποιεί το ςυγχρονιςμό εξαςφαλίηει ατομικότθτα, απομόνωςθ & ςειριοποίθςθ Επίδοςθ; εξαρτάται από το κρίςιμο τμιμα και τθν υλοποίθςθ του TM 11
Memory transaction μία ατομική και απομονωμζνη ακολουκία λειτουργιϊν μνιμθσ εμπνευςμζνθ από τισ δοςολθψίεσ ςτισ Βάςεισ Δεδομζνων Ατομικότθτα (Atomicity) κα γίνουν είτε όλεσ οι εγγραφζσ ςτθ μνιμθ ι καμία (all or nothing) commit, όλεσ οι εγγραφζσ ςτθ μνιμθ abort, καμία εγγραφι ςτθ μνιμθ Απομόνωςθ (Isolation) Transactions κανζνα άλλο τμιμα κϊδικα δεν μπορεί να δεί τισ εγγραφζσ ενόσ transaction πριν το commit Σειριοποίθςθ (Serializability) τα αποτελζςματα των transactions είναι ςυνεπι (ίδια με αυτά τθσ ςειριακισ/ςειριοποιθμζνθσ εκτζλεςθσ) τα transactions φαίνονται ότι κάνουν commit ςειριακά θ ςυγκεκριμζνθ ςειρά ωςτόςο δεν είναι εγγυθμζνθ 12
Νήμα 1 Νήμα 2 Νήμα 3 Νήμα 1 Νήμα 2 Νήμα 3 Locks vs. TM 3 νήμαηα εκηελούν ένα κπίζιμο ημήμα lock(l) lock(l) lock(l) acq. unlock(l) acq. tx_begin() wr A tx_end() tx_begin() rd B wr B tx_end() tx_begin() rd A x conflict tx_begin() unlock(l) acq. tx_end() unlock(l) Αναμενόμενο κζρδοσ ςε περίπτωςθ μθ-conflict Επιβράδυνςθ ςε conflicts (R-W ι W-W) λόγω χαμζνθσ δουλείασ 13
Tree update από 2 νήματα Σηόσορ: ηποποποίηζη κόμβων 3 και 4 με thread-safe ηπόπο Hand-over-hand locking 1 2 3 4 Ακόμα και fine-grain ςλοποιήζειρ μποπεί να μην εκμεηαλλεύονηαι πλήπωρ ηον παπαλληλιζμό Παπάδειγμα: ένα lock ζηον κόμβο 1 μπλοκάπει νήμαηα πος θα μποπούζαν να εκηελεζηούν ηαςηόσπονα 14
Tree update από 2 νήματα Σηόσορ: ηποποποίηζη κόμβων 3 και 4 με thread-safe ηπόπο Transactions 1 2 3 4 Transaction A Transaction B READ 1,2,3 READ 1,2,4 WRITE 3 WRITE 4 Τα δύο updates μποπούν να γίνοςν ηαςηόσπονα: δεν ςπάπσει conflict 15
Transactional HashMap Απλά εςωκλείουμε τθ λειτουργία ςε ζνα atomic block το ςφςτθμα εξαςφαλίηει τθν ατομικότθτα Transactional HashMap (+) thread-safe, εφκολο ςτον προγραμματιςμό Καλι επίδοςθ & κλιμακωςιμότθτα? Εξαρτάται από τθν υλοποίθςθ του TM και το ςενάριο εκτζλεςθσ, αλλά τυπικά ναι 16
Επίδοςη: Locks vs. TM 17
Ευκολία προγραμματιςμοφ παραπλιςια με αυτι των coarse-grain locks ο προγραμματιςτισ δθλϊνει, το ςφςτθμα υλοποιεί Επίδοςθ παραπλιςια με αυτι των fine-grain locks Πλεονεκτήματα ΤΜ εκμεταλλεφεται αυτόματα τον fine-grain ταυτοχρονιςμό δεν υπάρχει tradeoff ανάμεςα ςτθν απόδοςθ & τθν ορκότθτα Failure atomicity & recovery δεν «χάνονται» locks όταν ζνα νιμα αποτυγχάνει failure recovery = transaction abort + restart Composability ςφνκεςθ επιμζρουσ ατομικϊν λειτουργιϊν / software modules ςε μία ενιαία ατομικι λειτουργία αςφαλισ & κλιμακϊςιμθ 18
Υλοποίηςη ΤΜ Τα ΤΜ ςυςτιματα πρζπει να παρζχουν ατομικότθτα και απομόνωςθ χωρίσ να κυςιάηεται ο ταυτοχρονιςμόσ Ηθτιματα υλοποίθςθσ Data versioning (ϊςτε να μπορεί να γίνει abort/rollback) Conflict detection & resolution (για να ανιχνεφουμε πότε πρζπει να γίνει abort) Επιλογζσ Hardware transactional memory (HTM) Software transactional memory (STM) Hybrid transactional memory Hardware accelerated STMs Dual-mode systems 19
Data Versioning Διαχείριςθ uncommitted (νζων) και committed (παλιϊν) εκδόςεων δεδομζνων για ταυτόχρονα transactions 1. Lazy versioning (write-buffer based) 2. Eager versioning (undo-log based) 20
Lazy versioning Καταγραφή των αλλαγών ςε write buffer, ενημζρωςη τησ μνήμησ κατά το commit Begin Transaction Thread Write X = 15 Thread Write Buffer X: 15 Write Buffer X: 10 Memory X: 10 Memory Commit Transaction Thread Abort Transaction Thread X: 10 15 Memory X: 15 Write Buffer X: 10 Memory X: 15 Write Buffer 21
Eager versioning Άμεςη ενημζρωςη μνήμησ, διατήρηςη undo log για την περίπτωςη abort Begin Transaction Thread Write X = 15 Thread Undo Log X:10 Undo Log X: 10 Memory X: 10 15 Memory Commit Transaction Thread Abort Transaction Thread X: 15 Memory X:10 Undo Log X: 15 10 Memory X:10 Undo Log 22
Lazy versioning (write-buffer based) Data versioning καταγραφι νζων δεδομζνων ςε write-buffer μζχρι το commit πραγματικι ενθμζρωςθ μνιμθσ κατά το commit (+) γριγορο abort, fault tolerant (απλά «πετάμε» τον writer-buffer) (-) αργά commits (πρζπει τα δεδομζνα να γραφτοφν ςτθ μνιμθ) Eager versioning (undo-log based) απευκείασ ενθμζρωςθ μνιμθσ διατιρθςθ undo πλθροφορίασ ςε log (+) γριγορο commit (τα δεδομζνα είναι ιδθ ςτθ μνιμθ) (-) αργό abort, ηθτιματα fault tolerance (τι γίνεται αν ζνα thread αποτφχει κατά τθ διάρκεια ενόσ transaction) 23
Conflict detection Ανίχνευςθ και διαχείριςθ conflicts ανάμεςα ςε transactions read-write conflict: ζνα transaction A διαβάηει τθ διεφκυνςθ X, θ οποία ζχει γραφτεί από ζνα τρζχων transaction B. write-write conflict: δφο transactions γράφουν ςτθν ίδια διεφκυνςθ μνιμθσ X Πρζπει να παρακολουκοφνται το read-set & write-set ενόσ transaction read-set: οι διευκφνςεισ που διαβάηονται εντόσ του transaction write-set: οι διευκφνςεισ που γράφονται εντόσ του transaction Conflict resolution τι γίνεται όταν ανιχνευκεί ζνα conflict διάφορεσ πολιτικζσ stall writer wins committer wins... 24
1. Pessimistic (eager) detection Ζλεγχοσ για conflicts ςε κάκε load ι store Conflict detection Χριςθ contention manager για να αποφαςίςει να κάνει stall ι abort Απαιςιοδοξία: «Θα ζχω conflicts οπότε ασ ελζγχω μετά από κάκε πρόςβαςθ ςτθ μνιμθ... Αν χρειαςτεί να γίνει abort κα γλιτϊςω άςκοπθ δουλειά.» 2. Optimistic (lazy) detection Ζλεγχοσ για conflicts κατά το commit Σε περίπτωςθ conflict, προτεραιότθτα ςτο committing transaction Αιςιοδοξία: «Δεν κα ζχω conflicts οπότε ελζγχω μόνο κατά τθν διάρκεια του commit.» 25
Pessimistic detection Τ0 Case 1 Case 2 Case 3 Case 4 Τ1 Τ0 Τ1 Τ0 Τ1 Τ0 Τ1 TIME rd A wr C wr B commit wr A rd A stall commit rd A restart rd A wr A commit rd A wr A restart rd A wr A rd A wr A restart commit commit commit rd A wr A restart Success Early Detect Abort No progress 26
Optimistic detection Case 1 Case 2 Case 3 Case 4 Τ0 Τ1 Τ0 Τ1 Τ0 Τ1 Τ0 Τ1 TIME rd A wr B wr C commit commit wr A commit rd A restart rd A rd A commit wr A commit rd A wr A restart rd A wr A rd A wr A commit commit commit Success Abort Success Forward progress 27
1. Pessimistic conflict detection (+) ανιχνεφει τα conflicts νωρίσ Conflict Detection Tradeoffs αναιρεί λιγότερθ δουλειά, μετατρζπει μερικά aborts ςε stalls (-) δεν εγγυάται τθν πρόοδο προσ τα εμπρόσ, πολλά aborts ςε κάποιεσ περιπτϊςεισ 2. Optimistic conflict detection (+) εγγυάται τθν πρόοδο προσ τα εμπρόσ (-) ανιχνεφει τα conflicts αργά, άςκοπθ δουλειά (-) starvation 28
ΘΤΜ ςυςτιματα Lazy + optimistic: Stanford TCC Lazy + pessimistic: MIT LTM, Intel VTM, Sun s Rock Eager + pessimistic: Wisconsin LogTM TM Implementation Space (παραδείγματα) STM ςυςτιματα Lazy + optimistic (rd/wr): Sun TL2 Lazy + optimistic (rd) / pessimistic (wr): MS OSTM Eager + optimistic (rd) / pessimistic (wr): Intel STM Eager + pessimistic (rd/wr): Intel STM 29
Hardware TM 2011 IBM Blue Gene/Q 2012 IBM zec12 mainframe 2013 Intel TSX (Haswell, Broadwell ) 2014 IBM Power8 Κοινά χαρακτθριςτικά εκμετάλλευςθ των ιδθ υπάρχοντων μθχανιςμϊν για coherency conflict detection ςε επίπεδο cache line false sharing περιοριςμζνο μζγεκοσ read/write sets aborts για διάφορουσ λόγουσ εκτόσ από data conflict cache line eviction, interrupt best-effort: δεν εγγυϊνται forward progress ζνα transaction μπορεί να μθν κάνει commit ποτζ είναι ευκφνθ του χριςτθ να εγγυθκεί forward progress με ζνα non-transactional path 30
Intel TSX Διακζςιμο ςτουσ επεξεργαςτζσ Haswell και μεταγενζςτερουσ. Θ πρϊτθ υλοποίθςθ HTM διακζςιμθ ςε εμπορικοφσ επεξεργαςτζσ. Στισ πρϊτεσ εκδόςεισ επεξεργαςτϊν Haswell και Broadwell το TSX είναι buggy Αφγουςτοσ 2014: «Errata prompts Intel to disable TSX in Haswell, early Broadwell CPUs» http://techreport.com/news/26911/errata-prompts-intel-to-disable-tsx-in-haswell-early-broadwell-cpus HSW136. Software Using Intel TSX May Result in Unpredictable System Behavior http://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/xeon-e3-1200v3-spec-update.pdf Λφςη; Απενεργοποίθςθ του TSX από το BIOS. 31
Παρζχονται δφο interfaces για τθν χριςθ του 1. Restricted Transactional Memory (RTM) 4 νζεσ εντολζσ assembly για τθ διαχείριςθ transactions Intel TSX interfaces μεγαλφτερθ ευελιξία ο προγραμματιςτισ επιλζγει τι κα γίνει ςε περίπτωςθ abort 2. Hardware Lock Elision (HLE) 2 νζα προκζματα εντολϊν assembly ζνα critical section προςτατεφετεται από ζνα lock, το ςφςτθμα προςπακεί πρϊτα να το εκτελζςει ςε transaction, αν αποτφχει εκτελείται με τθν απόκτθςθ του lock ο κϊδικασ που προκφπτει εκτελείται και ςε παλιότερουσ επεξεργαςτζσ χωρίσ TSX (τα προκζματα αντιμετωπίηονται ςαν nops) 32
XBEGIN <fallback address> δθλϊνει τθν αρχι ενόσ transaction Intel TSX - RTM <fallback address>: θ διεφκυνςθ του κϊδικα που κα εκτελεςτεί ςε περίπτωςθ abort XEND δθλϊνει το τζλοσ ενόσ transaction XTEST δείχνει αν εκτελείται transaction ι όχι XABORT <abort code> αναγκάηει το τρζχων transaction να κάνει abort <abort code>: χρθςιμοποιείται για τθν διάκριςθ μεταξφ διαφορετικϊν λόγων για abort 33
Ξεκίνα ένα transaction Intel TSX RTM example int aborts = MAX_TX_RETRIES; lock_t = fallback_global_lock; start_tx: int status = TX_BEGIN(); if (status == TX_BEGIN_STARTED) { if (fallback_global_lock is locked) TX_ABORT();... Critical Section... Commit TX_END(); } else { /* status!= TX_BEGIN_STARTED */ if (--aborts > 0) /* retry transaction */ goto start_tx; } acquire_lock(fallback_global_lock);... Critical Section... release_lock(fallback_global_lock); Το transaction ξεκίνηζε επιηςσώρ Πποζθήκη ηος fallback lock ζηο read-set Transactional path ζε πέπίπηωζη abort ηο hardware αναλαμβάνει να κάνει rollback και η ποή ηος ππογπάμμαηορ επιζηπέθει ζηην κλήζη ηηρ TX_BEGIN() Transaction aborted Αν δεν έσει ξεπεπαζηεί ηο όπιο ηων aborts κάνοςμε retry ηο transaction Αλλιώρ «κλείδωζε» ηο lock και εκηέλεζε ηο κπίζιμο ημήμα non-transactional path 34
Intel TSX HLE 2 νζα προκζματα εντολϊν assembly XACQUIRE XRELEASE Παράδειγμα: elision ενόσ TAS lock /* acquire lock */ while ( sync_lock_test_and_set(&lock_var) == 0) /* do nothing */;... Critical section with lock acquired... /* release lock */ sync_lock_release(&lock_var); /* elide lock */ while ( hle_acquire_test_and_set(&lock_var) == 0) /* do nothing */;... Critical section with lock acquired... /* release lock */ hle_release_clear(&lock_var); Το ζύζηημα εκηελεί απσικά ηο κπίζιμο ημήμα με transaction Αν γίνει abort παίπνει ηο lock και επανεκηελεί ηο κπίζιμο ημήμα 35