1 Επισκόπηση 2 Cilk 3 Threading Building Blocks 4 UPC 5 Charm++ 2 1/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 Cilk 3 Threading Building Blocks 4 UPC 5 Charm++ 3 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Επισκόπηση Αρχιτεκτονικές και Προγραμματιστικά Μοντέλα από την Οπτική του Προγραμματιστή Προγραμματιστικά Μοντέλα Κοινού Χώρου Διευθύνσεων με Πέρασμα Μηνυμάτων Αρχιτεκτονικές Κοινής μνήμης Κατανεμημένης Μνήμης + Ευκολία Υλοποίησης + Προγραμματιστική Ευκολία + Προγραμματιστική Ευκολία - Δυσκολία Υλοποίησης + Υψηλή Επίδοση - Χαμηλή Επίδοση + Ευκολία Υλοποίησης + Ευκολία Υλοποίησης + Υψηλή Επίδοση + Υψηλή Επίδοση - Προγραμματιστική Δυσκολία - Προγραμματιστική Δυσκολία 4 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Επισκόπηση Ο Xάρτης των Eργαλείων και Γλωσσών Παράλληλου Προγραμματισμού Προγραμματιστικά Μοντέλα Κοινού Χώρου Διευθύνσεων με Πέρασμα Μηνυμάτων Αρχιτεκτονικές Κοινής μνήμης Κατανεμημένης Μνήμης POSIX Threads, OpenMP, CoArray Fortran, Threading Building Blocks, Unified Parallel C, Cilk, OmpSs Chapel and other PGAS Ομοίως με πέρασμα MPI, PVM (obsolete), μηνυμάτων σε κατανεμημένη Charm++ μνήμη 5 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Σύνοψη Παρουσίασης Προγραμματιστικά εργαλεία για Αρχιτεκτονικές Κοινής Μνήμης Cilk Threading Building Blocks Προγραμματιστικά εργαλεία για Αρχιτεκτονικές Κατανεμημένης Μνήμης Partitioned Global Address Space Languages (PGAS) Unified Parallel C (UPC) Active Messages Charm++ 6 1/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 Cilk 3 Threading Building Blocks 4 UPC 5 Charm++ 7 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Εισαγωγή Επέκταση της C με λίγα keywords Επικεφαλής της ομάδας ο καθ. Charles E. Leiserson (MIT) Ισχυρό θεωρητικό υπόβαθρο φράγματα για χρόνο και χώρο παράληλης εκτέλεσης έμφαση στην αποδοτική χρονοδρομολόγηση Ιστορία 1994: Πρώτη έκδοση (Cilk-1) 1998: Implementation of the Cilk-5 Multithreaded Language paper 2006: Cilk Arts 2008: Cilk++ 1.0 2009: Αγορά Cilk arts από Intel 2010: Release of Intel Cilk Plus 2011: Cilk Plus for GCC4.7 2013: Cilk Plus for GCC4.8 201?: Cilk Plus merged into mainline (target GCC4.9) 8 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Keywords cilk: Ορισμός συναρτήσεων που ορίζουν Cilk διεργασίες spawn: Δημιουργία Cilk διεργασίας Ο πατέρας και το παιδί μπορούν να εκτελεστούν παράλληλα sync: Αναμονή ολοκλήρωσης Cilk διεργασιών Τα αποτελέσματα των παιδιών είναι έτοιμα cilk int fib(int n) { if (n < 2) return (n); x = spawn fib(n - 1); y = spawn fib(n - 2); sync; return (x + y); } 9 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Advanced Keywords cilk: Ορισμός συναρτήσεων που ορίζουν Cilk διεργασίες spawn: Δημιουργία Cilk διεργασίας Ο πατέρας και το παιδί μπορούν να εκτελεστούν παράλληλα sync: Αναμονή ολοκλήρωσης Cilk διεργασιών Τα αποτελέσματα των παιδιών είναι έτοιμα inlet: Function ορισμένο εσωτερικά σε μια Cilk διεργασία Επιτρέπει το χειρισμό της τιμής του spawned thread - Εγγυάται atomicity abort: Ασφαλής τερματισμός Cilk διεργασιών μέσα σε inlet SYNCHED: Ο προγραμματιστής μπορεί να ελέγξει αν μια cilk procedure είναι synched ή όχι, ελέγχοντας την τιμή της ψευδομεταβλητής SYNCHED. 10 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Ο γράφος διεργασιών αναδιπλώνεται δυναμικά (στο χρόνο εκτέλεσης) cilk int fib(int n) { if (n < 2) return (n); x = spawn fib(n - 1); y = spawn fib(n - 2); sync; return (x + y); } 11 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Ο γράφος διεργασιών αναδιπλώνεται δυναμικά (στο χρόνο εκτέλεσης) cilk int fib(int n) { if (n < 2) return (n); x = spawn fib(n - 1); y = spawn fib(n - 2); sync; return (x + y); } f(4) 11 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Ο γράφος διεργασιών αναδιπλώνεται δυναμικά (στο χρόνο εκτέλεσης) cilk int fib(int n) { if (n < 2) return (n); x = spawn fib(n - 1); y = spawn fib(n - 2); sync; return (x + y); } f(4) f(3) f(2) 11 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Ο γράφος διεργασιών αναδιπλώνεται δυναμικά (στο χρόνο εκτέλεσης) cilk int fib(int n) { if (n < 2) return (n); x = spawn fib(n - 1); y = spawn fib(n - 2); sync; return (x + y); } f(4) f(3) f(2) f(2) f(1) f(1) f(0) f(1) f(0) 11 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Ο γράφος διεργασιών αναδιπλώνεται δυναμικά (στο χρόνο εκτέλεσης) cilk int fib(int n) { if (n < 2) return (n); x = spawn fib(n - 1); y = spawn fib(n - 2); sync; return (x + y); } f(4) f(3) f(2) f(2) f(1) f(1) f(0) f(1) f(0) 11 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Μοντέλο Επίδοσης T p : χρόνος εκτέλσης σε P επεξ. 12 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Μοντέλο Επίδοσης T p : χρόνος εκτέλσης σε P επεξ. T 1 : work (κόστος εκτέλεσης όλων των κόμβων) 12 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Μοντέλο Επίδοσης T p : χρόνος εκτέλσης σε P επεξ. T 1 : work (κόστος εκτέλεσης όλων των κόμβων) T : span (κόστος εκτέλεσης για επεξ.) 12 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Μοντέλο Επίδοσης T p : χρόνος εκτέλσης σε P επεξ. T 1 : work (κόστος εκτέλεσης όλων των κόμβων) T : span (κόστος εκτέλεσης για επεξ.) Κάτω όρια: T p T 1 /P, T p T Μέγιστο speedup: T 1 /T 12 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Μοντέλο Επίδοσης T p : χρόνος εκτέλσης σε P επεξ. T 1 : work (κόστος εκτέλεσης όλων των κόμβων) T : span (κόστος εκτέλεσης για επεξ.) Κάτω όρια: T p T 1 /P, T p T Μέγιστο speedup: T 1 /T To speedup που πετυχαίνουμε είναι: linear αν T 1 /T P P perfect linear αν T 1 /T P = P superlinear αν T 1 /T P P 12 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Μοντέλο Επίδοσης T p : χρόνος εκτέλσης σε P επεξ. T 1 : work (κόστος εκτέλεσης όλων των κόμβων) T : span (κόστος εκτέλεσης για επεξ.) Κάτω όρια: T p T 1 /P, T p T Μέγιστο speedup: T 1 /T To speedup που πετυχαίνουμε είναι: linear αν T 1 /T P P perfect linear αν T 1 /T P = P superlinear αν T 1 /T P P (ΑΔΥΝΑΤΟ!) 12 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Cilk Time & Space Bounds Ο χρόνοδρομολογητής της Cilk επιτυγχάνει T p = T 1 /P + O(T ) (γραμμικό speedup εάν P T 1 /T ) απαιτεί S p P S 1 χώρο στη στοίβα έχει καλή επίδοση και στην πράξη 13 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Parallel slack (task grain) P T 1 /T parallel slack: (T 1 /T ) /P Παραλληλισμός προγράμματος T 1 /T Παραλληλισμός μηχανήματος P Χρειάζεται τάξης μεγέθους περισσότερος παραλληλισμός στο πρόγραμμα από ότι στο πραγματικό σύστημα. Διαισθητικά: + Πρόγραμμα δεν εξαρτάται από αριθμό επεξεργαστών + Συνεισφέρει στην αποδοτική χρονοδρομολόγηση + Επιτρέπει καλύτερη κατανομή φόρτου (load balancing) αλλά: - Αν το μέγεθος δουλειάς της κάθε εργασίας μικρό, τότε οι επιβαρύνσεις του συστήματος επηρεάζουν σημαντικά 14 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Ισοκατανομή φόρτου (load balancing) - μέγεθος εργασίας (task grain) κόστος uniform εργασίες Σταθερό κόστος εκτέλεσης: 1 εργασία / πραγματικό επεξεργαστή 15 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Ισοκατανομή φόρτου (load balancing) - μέγεθος εργασίας (task grain) κόστος? uniform εργασίες Σταθερό κόστος εκτέλεσης: 1 εργασία / πραγματικό επεξεργαστή Το κόστος εκτέλεσης είναι μη-σταθερό και άγνωστο Μεγάλο parallel slack 15 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Χρονοδρομολόγηση στο χώρο χρήστη (user-level scheduling) Αριθμός εργασιών T P επεξεργαστές (kernel threads) Η κάθε εργασία μπορεί να παράγει άλλες... να περιμένει την ολοκλήρωση των παιδιών της. Στόχοι Ισοκατανομή φόρτου εργασίας Αποδοτική χρήση χώρου Μικρή επιβάρυνση (ανεξάρτητη του T ) Πότε εκτελείται ο ΧΔ; 16 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Χρονοδρομολόγηση στο χώρο χρήστη (user-level scheduling) Αριθμός εργασιών T P επεξεργαστές (kernel threads) Η κάθε εργασία μπορεί να παράγει άλλες... να περιμένει την ολοκλήρωση των παιδιών της. Στόχοι Ισοκατανομή φόρτου εργασίας Αποδοτική χρήση χώρου Μικρή επιβάρυνση (ανεξάρτητη του T ) Πότε εκτελείται ο ΧΔ; Εισάγονται κατάλληλες κλήσεις στις spawn/sync/κλπ 16 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Τακτικές χρονοδρομολόγησης work sharing: Όταν δημιουργούνται νέες εργασίες ο ΧΔ προσπαθεί να τις στείλει σε ανενεργούς επεξεργαστές. work stealing: Οι ανενεργοί επεξεργαστές προσπαθούν να κλέψουν εργασίες. Γενικά προτιμάται η τακτική work stealing (στη Cilk και όχι μόνο) καλύτερο locality μικρότερη επιβάρυνση συγχρονισμού Βέλτιστα θεωρητικά όρια ως προς χρόνο, χώρο [Blumofe and Leiserson 99] 17 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Χρονοδρομολόγηση - work stealing P 2 Μια ουρά ΧΔ ανά P deque (double-ended queue) pushbot popbot poptop top bot T x T y T z T p P 1 18 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Χρονοδρομολόγηση - work stealing P 2 Μια ουρά ΧΔ ανά P deque (double-ended queue) pushbot popbot poptop top bot T x T y T z T p T c T p spawn task T c pushbot(tp ) execute(t c ) (FAST!) P 1 18 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Χρονοδρομολόγηση - work stealing P 2 Μια ουρά ΧΔ ανά P deque (double-ended queue) pushbot popbot poptop top bot T y T z T p T c T p spawn task T c pushbot(tp ) execute(t c ) (FAST!) P 1 P 1 ανενεργός Τυχαία επιλογή επεξεργαστή p p->poptop() Εκτέλεση task που προέκυψε (SLOW!) T x 18 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Υλοποίηση ΧΔ χώρου χρήστη Για να υποστηρίζεται η κλοπή εργασίων πρέπει η κάθε εργασία να μπορεί να μεταφερθεί σε διαφορετικό επεξεργαστή Τι χρείαζεται η κάθε διεργασία για να εκτελεστεί; Κώδικα (πχ δείκτη σε συνάρτηση) Θέση στον κώδικα Δεδομένα: Στοίβα Σωρός Η Cilk υλοποιεί cactus stack 19 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Cilk Cilk Plus Επέκταση της C και της C++ σχεδιασμένη για multithreaded parallel computing Ιστορία 2009: Αγορά Cilk arts από Intel 2010: Release of Intel Cilk Plus. Περιλαμβάνει array extensions και είναι integrated με τα Intel tools(compilers, debuggers, etc). 2011: Cilk Plus for GCC4.7 (maintained by Intel) 2013: Cilk Plus for GCC4.8 201?: Cilk Plus merged into mainline (target GCC4.9) Execution on Xeon Phi Τρία keywords cilk_spawn cilk_sync cilk_for 20 1/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 Cilk 3 Threading Building Blocks 4 UPC 5 Charm++ 21 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Εισαγωγή C++ template library για αποδοτικό και εύκολο παράλληλο προγραμματισμό σε πλατφόρμες μοιραζόμενης μνήμης Αναπτύσσεται από την Intel από το 2004 (open-source από το 2007) Δεν είναι καινούργια γλώσσα ή επέκταση Μεταφέρσιμη στους περισσότερους C++ compilers, λειτουργικά συστήματα και αρχιτεκτονικές Παρέχει ένα πλούσιο σύστημα από παραμετροποιήσιμα (templated) ready to use αλγοριθμικά μοτίβα και δομές (αντίστοιχα με τη C++ STL) Εκμεταλλεύεται τα lambda expressions της C++11 από το 2008 (gcc>=4.5) 22 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Βασικά Χαρακτηριστικά Ο προγραμματιστής ορίζει tasks αντί για threads Επικεντρώνεται στην έκφραση του παραλληλισμού Η βιβλιοθήκη υλοποιεί τον παραλληλισμό: - διάσπαση συνολικής δουλειάς σε επιμέρους εργασίες - δρομολόγηση εργασιών - συγχρονισμός - ισοκατανομή φορτίου - διαχείριση πόρων συστήματος και εσωτερικών μηχανισμών Είναι σχεδιασμένη για κλιμακωσιμότητα Η συνολική δουλειά σπάει σε πολλά μικρά κομμάτια (tasks), συνήθως πολύ περισσότερα από τον αριθμό των επεξεργαστών ( parallel slack ) Εξασφαλίζεται ότι πάντα θα υπάρχει διαθέσιμη δουλειά για κάθε επιπλέον επεξεργαστή που προστίθεται Ο μηχανισμός load balancing εξασφαλίζει την κλιμακώσιμη απόδοση Εκμεταλλεύεται τη δύναμη και την ευελιξία του γενικευμένου προγραμματισμού 23 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks TBB 4.0 Components Generic Parallel Algorithms parallel_for parallel_reduce parallel_scan parallel_do pipeline, parallel_pipeline parallel_sort parallel_invoke Concurrent Containers concurrent_unordered_map concurrent_unordered_set concurrent_unordered_hash_map concurrent_queue concurrent_bounded_queue concurrent_priority_queue concurrent_vector Synchronization Primitives atomic mutex, recursive_mutex spin_mutex, spin_rw_mutex queueing_mutex, queueing_rw_mutex Raw Tasking task task_group task_list task_scheduler_observer Flow Graph graph function_node broadcast_node... Memory Allocation tbb_allocator, cache_aligned_allocator, scalable_allocator 24 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Tasks Εκφράζουν μια στοιχειώδη ανεξάρτητη εργασία στο πρόγραμμα του χρήστη πολύ πιο lightweight από τα native threads του λειτουργικού (user-level, small-sized, non-preemptible, short-lived) parallel algorithms tasks scheduler Δυνατότητα άμεσης χρήσης των tasks από τον προγραμματιστή δημιουργία αυθαίρετα πολύπλοκων γράφων διεργασιών 25 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Task Objects (Templates) long SerialFib(long n) { if (n<2) return n; else return SerialFib(n-1) +SerialFib(n-2); } long n, sum; FibTask& r = *new ( allocate_root()) FibTask(n,&sum); spawn_root_and_wait(r); cout << sum; class FibTask: public task { const long n; long *const_sum; FibTask(long n_, long* sum_) { n=n_; sum=sum_; } task* execute() { if (n < cutoff) *sum = SerialFib(n); else { long x,y; FibTask& a = *new (allocate_child()) FibTask(n-1,&x); FibTask& b = *new (allocate_child()) FibTask(n-2,&y); set_ref_count(3); spawn(b); spawn(a); wait_for_all(); * sum = x+y; } return NULL; } } 26 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Tasks (Lambdas) long SerialFib(long n) { if (n<16) return n; else { int x,y; tbb::task_group g; g.run ( [&] { x = ParallelFib(n-1); } ); g.run ( [&] { y = ParallelFib(n-2); } ); g.wait(); return x+y; } } 27 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Task groups S A B C D E F 28 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Nested Task Groups S A B C D E F S(); task_group g; g.run ( [&] { C(); E(); }); g.run ( [&] { task_group g1; g1.run ( [&] { A(); } ); g1.run ( [&] { B(); } ); g1.wait(); D(); }); g.wait(); F(); 29 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Generic Task Graphs - Flow graph graph g; broadcast_node <continue_msg> s; S A B C D E F continue_node <continue_msg> a(g,a()); continue_node <continue_msg> a(g,b()); continue_node <continue_msg> a(g,c()); continue_node <continue_msg> a(g,d()); continue_node <continue_msg> a(g,e()); continue_node <continue_msg> a(g,f()); make_edge(s,a); make_edge(s,b); make_edge(s,c); make_edge(a,d); make_edge(b,d); make_edge(c,e); make_edge(d,f); make_edge(e,f); S(); s.try_put(continue_msg()); g.wait_for_all(); //fire! 30 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Task Objects + Reference counts 0 1 1 1 1 1 1 2 2 2 2 2 2 MeshTask* Mesh[4][4]; //for all tasks in mesh: //allocate //initialize south, east pointers //set reference counters Mesh[3][3]-> spawn_and_wait_for_all(*mesh[0][0]); //execute last task Mesh[3][3]->execute(); 2 2 2 class MeshTask: public task { public: const int i,j; //coordinates MeshTask * south, east; task* execute() { double north_val = (i==0)? 0 : A[i-1][j]; double west_val = (i==0)? 0 : A[i][j-1]; A[i][j]=do_work(north_val,west_val); if (south!=null) if (!south->decrement_ref_count()) spawn(*south); if (west!=null) if (!west->decrement_ref_count()) spawn(*east); return NULL; } } 31 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Load balancing Το runtime των ΤBBs υλοποιεί δύο μηχανισμούς για load-balancing: 1. Work stealing: Εξασφαλίζει ισοκατανομή φορτίου 2. Recursive splitting: Επιτρέπει την επεξεργασία πάνω σε αυθαίρετα μικρά κομμάτια και τη βέλτιστη εκμετάλλευση της cache 32 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks parallel_for και partitioners parallel_for (blocked_range<size_t>(0,n,g), []()..., some partitioner()) Grainsize G: το κομμάτι δουλειάς που θα αναλάβει κάθε task Δύο optional ορίσματα σε loop partitioners: Chunking: το μέγεθος στον οποίο σταματά η αναδρομική διάσπαση Τύπος partitioner Partitioners: simple_partitioner recursive binary splitting affinity_partitioner ανάθεση με τρόπο ώστε να μεγιστοποιείται το cache locality auto_partitioner αυτόματη επιλογή grainsize με ευριστική μέθοδο ελαχιστοποίση του range splitting, σε σημείο που να εξασφαλίζεται καλό load balancing 33 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A Με parallel_for στον πίνακα Α το range του πίνακα διασπάται αναδρομικά μέχρι να γίνει Grainsize Σε κάθε εκτέλεση της αναδρομής το range διασπάται σε δύο subranges και δημιουργούνται 2 tasks Τα worker threads διατηρούν double-ended queues με τα tasks Κάθε worker παίρνει το task από τη βάση της ουράς και το εκτελεί Αν δεν το βρει, τότε κλέβει κάποιο από την κορυφή της ουράς ενός τυχαίου worker A P0 P1 P2 P3 34 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A A P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A N/2 N B B P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C N/2 N B B C P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C B B P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C B B D D P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C B B D E 0 N/4 E D P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C B B D E 0 N/4 E D P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C B D E B 0 N/4 E D P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C B D B 0 N/4 E D P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C B D 0 N/4 E D F B F P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C 0 N/4 E D B D F G B N/8 G F P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C 0 N/4 E D B D F G B N/8 G F P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Threading Building Blocks Work Stealing και Recursive Splitting 0 N A 0 N/2 C 0 N/4 E D B F G B D N/8 G F P0 P1 P2 P3 35 1/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 Cilk 3 Threading Building Blocks 4 UPC 5 Charm++ 36 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Εισαγωγή Unified Parallel C (UPC): Παράλληλη επέκταση της ANSI C Γλώσσα προγραμματισμού κατανεμημένης κοινής μνήμης Έχει τη φιλοσοφία της C Προγραμματισμός κοντά στο hardware για performance, αλλά με τα προβλήματα της C Όμοια σύνταξη και semantics Ιστορία Ξεκίνησε το 1999 από το IDA, το UCB και το LLNL UPC consortium: ARSC, Compaq, CSC, Cray Inc., Etnus, GMU, HP, IDA CCS, Intrepid Technologies, LBNL, LLNL, MTU, NSA, SGI, Sun Microsystems, UCB, U. Florida, US DOD PI η Kathy Yelick από το UCB Σήμερα: Berkeley UPC, GNU UPC, IBM XL UPC Compilers, Cray UPC, HP UPC κ.ά. 37 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC PGAS Languages Global Address Space: ένα thread μπορεί απευθείας να διαβάσει/γράψει απομακρυσμένα δεδομένα Κρύβει τη διάκριση μεταξύ κοινής/κατανεμημένης μνήμης Partitioned Global Address Space (PGAS): τα δεδομένα επισημαίνονται ως local ή global Δεν κρύβει τη διάκριση: κρίσιμο για locality και scaling Χαρακτηριστικά των PGAS γλωσσών: Global address space όπως στα threads (programmability) SPMD παραλληλισμός όπως στο MPI (performance) Διάκριση local/global data (performance) 38 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Μοντέλο εκτέλεσης Μοντέλο εκτέλεσης: Threads δουλεύουν ανεξάρτητα σε SPMD μοντέλο Το πλήθος των threads καθορίζεται στο χρόνο μεταγλώττισης ή στο χρόνο εκτέλεσης μεταβλητή προγράμματος για πλήθος threads: THREADS μεταβλητή προγράμματος για thread id: MYTHREAD upc_barrier: Συγχρονισμός για όλα τα threads (all wait) Δύο επιλογές μεταγλώττισης: Στατικά threads H μεταβλητή THREADS καθορίζεται από το χρήστη στο χρόνο μεταγλώττισης Το πρόγραμμα μπορεί να χρησιμοποιήσει τη μεταβλητή THREADS ως σταθερά Δυναμικά threads O μεταγλωττισμένος κώδικας μπορεί να τρέξει με οποιοδήποτε αριθμό από threads 39 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Shared vs Private variables Private variables:δεσμεύονται στον private χώρο μνήμης του thread, όπως στη C Shared variables: δεσμεύονται μία φορα, με το thread 0 shared int ours; /*use shared variables sparingly*/ int mine; Οι shared μεταβλητές δεν μπορούν να έχουν dynamic lifetime: σε συναρτήσεις μπορούν να χρησιμοποιηθούν μόνο αν δηλωθούν ως static Thread0 Thread1 ThreadN Global Address Space ours:... mine: mine:... mine: Shared Private 40 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Pointers in UPC Στη UPC υπάρχουν 4 τύποι pointers, ανάλογα με το πού βρίσκονται και το πού δείχνουν. Πού βρίσκεται ο pointer Πού δείχνει ο pointer Local Shared Private p1 p2 Shared p3 p4 int * p1; /*private pointer to local memory*/ shared int * p2; /*private pointer to shared space*/ int * shared p3; /*shared pointer to local memory*/ shared int * shared p4; /*shared pointer to shared space*/ int * p1: γρήγορος, χρησιμοποιείται για πρόσβαση σε τοπικά δεδομένα σε κώδικα που εκτελεί τοπική δουλειά shared int * p2: χρησιμοποιείται για πρόσβαση σε απομακρυσμένα δεδομένα, αργός γιατί μπορεί να περιλαμβάνει communication int * shared p3: δεν προτείνεται shared int * shared p4: χρησιμοποιείται για μοιραζόμενες δομές δεδομένων 41 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Shared arrays Οι scalar μεταβλητές που είναι shared αποθηκεύονται στο χώρο μνήμης του thread 0 Οι πίνακες που είναι shared κατανέμονται μεταξύ των threads (default: κυκλική ανάθεση) shared int x[threads]; /*1 element per thread*/ shared int y[3][threads]; /*3 elements per thread*/ shared int z[3][3]; /*2-3 elements per thread*/ Για διαφορετική ανάθεση, χρησιμοποιούνται οι layout specifiers: shared int x[n]: κυκλική ανάθεση shared int [*] x[n]: ανάθεση κατά blocks shared int [0] x[n]: όλος ο πίνακας στο thread 0 shared int [b1][b2]...[bn] x[n]: συγκεκριμένο block size (b1,b2,...,bn) για κάθε thread 42 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Κατανομή εργασίας - upc_forall upc_forall(init; test; loop; affinity) statement; Επανάληψη πάνω σε όλα τα στοιχεία - Δουλειά στα στοιχεία που ανήκουν στον επεξεργαστή Ο προγραμματιστής ορίζει ότι οι επαναλήψεις είναι ανεξάρτητες Απροσδιόριστο αν υπάρχουν εξαρτήσεις μεταξύ των threads Παράδειγμα: Πρόσθεση Διανυσμάτων #define N 100*THREADS shared int v1[n], v2[n], sum[n]; /*default:cyclic distribution*/ void main() { int i; upc_forall( i=0; i<n; i++; i) sum[i]=v1[i]+v2[i]; } 43 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Collective communication Όπως και το MPI, και η UPC υποστηρίζει collective communication. Collectives για υπολογισμούς TYPE bupc_allv_reduce(type, TYPE value, int rootthread, upc_op_t reductionop) TYPE bupc_allv_reduce_all(type, TYPE value, upc_op_t reductionop) Collectives για μεταφορά δεδομένων TYPE bupc_allv_broadcast(type, TYPE value, int rootthread) TYPE bupc_allv_scatter(type, int rootthread, TYPE *rootsrcarray) TYPE bupc_allv_gather(type, TYPE value, int rootthread, TYPE *rootdestarray) TYPE bupc_allv_gather_all(type, TYPE value, TYPE *destarray) Άλλες εκδόσεις της UPC υποστηρίζουν αυτά και πολλά άλλα collectives (με διαφορετική σύνταξη). 44 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Άλλα χαρακτηριστικά Dynamic Memory Allocation shared void * upc_global_alloc(size_t nblocks, size_t nbytes) Καλείται από ένα thread - Ένα thread δεσμεύει shared μνήμη shared void * upc_all_alloc(size_t nblocks, size_t nbytes) Καλείται από όλα τα threads - Επιστρέφει τον ίδιο shared pointer void upc_free(shared void *ptr) Global synchronization upc_barrier Blocking barrier upc_notify, upc_wait Non-blocking barrier Locks upc_lock_t *upc_all_lock_alloc(void), *upc_global_lock_alloc(void) void upc_lock(upc_lock_t *l), void upc_unlock(upc_lock_t *l) void upc_lock_free(upc_lock_t *ptr) 45 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Παράδειγμα: Jacobi-1D - simple & dummy εκδοχή shared[*] double u_old[n], u[n]; /*block layout*/ void jacobi_sweeps(int T) { int i, t; upc_barrier; for (t=0; t<t; ++t) { upc_forall(i=1; i<n-1; ++i; &(u[i])) u[i]=(u_old[i-1]+u_old[i+1])/2; upc_barrier; upc_forall(i=0; i<n; ++i; &(u[i])) u_old[i]=u[i]; upc_barrier; } } 46 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code UPC-to-C translator 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code UPC-to-C translator Translator Generated C code 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code UPC-to-C translator Translator Generated C code UPC Runtime System 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code UPC-to-C translator Translator Generated C code UPC Runtime System GASNet Communication System 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code UPC-to-C translator Translator Generated C code UPC Runtime System GASNet Communication System Network Hardware 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code UPC-to-C translator network-independent Translator Generated C code UPC Runtime System GASNet Communication System Network Hardware language-independent 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Implementation UPC code UPC-to-C translator platform-independent network-independent Translator Generated C code UPC Runtime System GASNet Communication System Network Hardware compiler-independent language-independent 47 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC UPC-to-C translator Μεταγλώττιση σε 2 φάσεις Φάση 1: Μετάφραση της UPC σε C, όπου τα features της UPC μεταφράζονται σε κλήσεις στο runtime Φάση 2: Μεταγλώττιση του κώδικα με τον C compiler του συστήματος και σύνδεση με το runtime system 48 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Runtime system Το runtime system της UPC περιλαμβάνει λειτουργίες όπως: Δημιουργία και διαχείριση των threads Διαχείριση μνήμης Προσβάσεις στη μνήμη (τοπική ή απομακρυσμένη) Συγχρονισμό Polling στο δίκτυο 49 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC One-sided Communication Η UPC χρησιμοποιεί one-sided επικοινωνία: Message = address + data Two-sided: Message = message id + data Δύο βασικά blocking memory-to-memory operations: 1. put (upc_memput): ανανέωση των shared δεδομένων με δεδομένα από τον ιδιωτικό χώρο μνήμης του thread 2. get (upc_memget): αντιγραφή shared δεδομένων στον ιδιωτικό χώρο μνήμης ενός thread Πλεονέκτημα: αν το network interface υποστηρίζει RDMA, το get/put δεν κάνει interrupt στη CPU, ούτε απαιτεί buffering Το MPI επίσης υποστηρίζει one-sided επικοινωνία... 50 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC Translator+Runtime: Βελτιστοποιήσεις στον παραγόμενο κώδικα Στη UPC, ο προγραμματιστής δεν ορίζει explicitly την ανταλλαγή δεδομένων Το runtime αναλαμβάνει να πραγματοποιήσει την ανταλλαγή δεδομένων με one-sided communication Ο UPC-to-C translator ενορχηστρώνει τον κώδικα με τις κατάλληλες κλήσεις στο runtime Βασικά optimizations στο translation/compilation: 1. Redundancy elimination: Περιττά accesses στη UPC ενδεχομένως σημαίνουν επικοινωνία πάνω από το δίκτυο 2. Split-phase communication: Διαχωρισμός του communication init και του communication sync για computation/communication overlapping και message pipelining 3. Message coalescing: Πολλά put/get με μικρό μεγέθος μηνύματος συνενώνονται σε μεγάλα μηνύματα 51 1/2015 Συστήματα Παράλληλης Επεξεργασίας
UPC GASNet Το GASNet είναι σύστημα επικοινωνίας σχεδιασμένο για PGAS γλώσσες Υποστηρίζει πολλά δίκτυα διασύνδεσης υψηλής επίδοσης (Infiniband, SGI Altix, Cray, Quadrics, Ethernet-UDP) To GASNet core API παρέχει βασικά network primitives Η υλοποίηση βασίζεται σε active messages Active messages: κάθε μήνυμα έχει στο header του τη διεύθυνση ενός user-space handler, που εκτελείται με την άφιξη του μηνύματος, με στόχο να απελευθερωθεί γρήγορα το δίκτυο και να μην μπλοκάρει η CPU Το GASNet extended API παρέχει λειτουργίες put/get, collectives, split-phase barriers κ.α. 52 1/2015 Συστήματα Παράλληλης Επεξεργασίας
1 Επισκόπηση 2 Cilk 3 Threading Building Blocks 4 UPC 5 Charm++ 53 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Εισαγωγή Βιβλιοθήκη ανεξάρτητη της πλατφόρμας Αντικειμενοστρεφής προγραμματισμός object-based, message-driven, over-decomposed, runtime-assisted Χρήση με C++, C, Fortran Παράλληλα αντικείμενα (chares) επικοινωνούν με ασύγχρονες κλήσεις μεθόδων (entry methods) Ένα ισχυρό runtime system τοποθετεί τα chares στους επεξεργααστές και χρονοδρομολογεί την εκτέλεση των entry methods (όπως τα active messages ή οι actors) Αναπτύσσεται από το Parallel Programming Laboratory του UIUC με επικεφαλής τον Laxmikant Kale Ιστορία Chare Kernel (1.0) στα τέλη της δεκαετίας του 80 Charm 4.0 (Charm++) το 1993 Στην Charm 4.5 διαχωρίζεται το runtime system από την υλοποίηση της γλώσσας Newest Stable Release: Charm 6.5.1 (2013) 54 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ User view vs System view User View System View 55 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Chares mainchare Chare: Ένα αντικείμενο της C++ με μεθόδους που μπορούν να κληθούν απομακρυσμένα Mainchare: To chare από το οποίο ξεκινά η εκτέλεση Chare array: Μια συλλογή από chares ίδιου τύπου Τυπικά, το mainchare θα δημιουργήσει (spawn) ένα chare array από workers chare array (1D,2D,3D,...) 0... N 56 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ (Over)decomposition Ένα chare στην Charm++ είναι η μονάδα εργασίας/δεδομένων Η φιλοσοφία της Charm++ είναι η διαίρεση της εργασίας σε πολλές μονάδες (chares»cores) Overdecomposition! Ο χρήστης πρέπει να επιλέγει το μέγεθος της δουλειάς/των δεδομένων της μονάδας ανεξάρτητα από το πλήθος των επεξεργαστών, αλλά σε σχέση με το πρόβλημά του Σε σχέση με το MPI: Αποφεύγονται οι κύκλοι compute/communicate Το δίκτυο χρησιμοποιείται συνεχώς Επιτυγχάνεται overlapping των computation/communication 57 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ File Structure Τα αντικείμενα της C++ (chares ή όχι) βρίσκονται σε κανονικά αρχεία.h και.cpp Τα chares, τα μηνύματα και οι entry methods ορίζονται σε ένα αρχείο.ci (Charm++ interface) και υλοποιούνται σε.cpp αρχείο Chare class files:.h,.cpp,.ci Class files:.h,.cpp 58 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Επικοινωνία Τα chares βρίσκονται σε πολλούς επεξεργαστές (όχι απαραίτητα με κοινή μνήμη) Είναι αδύνατη η απευθείας κλήση μεθόδων Proxies: lightweight handles σε πιθανόν απομακρυσμένα chares τοπικά στο Chare A Proxy for Chare B τοπικά ή απομακρυσμένα Chare B Chare A Proxy for Chare C Chare C 59 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Proxy Μια κλάση proxy παράγεται για κάθε chare Τα proxies γνωρίζουν πού θα βρουν ένα chare στο σύστημα Οι μέθοδοι που καλούνται στο proxy πακετάρουν τις παραμέτρους εισόδου και τις στέλνουν στον επεξεργαστή όπου βρίσκεται το chare. Η πραγματική μέθοδος καλείται στον επεξεργαστή-προορισμό. 60 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ readonly variables Η Charm++ δεν επιτρέπει global variables Για διαμοιρασμό δεδομένων μεταξύ όλων των αντικειμένων, επιτρέπει τον ορισμό readonly μεταβλητών, που αρχικοποιούνται στη main του mainchare Το runtime αναλαμβάνει να κάνει broadcast την τιμή της readonly μεταβλητής σε όλα τα chares Ο χρήστης πρέπει να φροντίσει να μη γίνει ανάθεση τιμής σε readonly μεταβλητή 61 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Chare Arrays Τα chare arrays οργανώνουν τα chares σε indexed collections Ένα όνομα για κάθε collection Κάθε chare του πίνακα έχει ένα proxy για όλα τα άλλα chares του πίνακα Οι δείκτες του πίνακα μπορεί να είναι integers, tuples (π.χ. 2D array) κ.ά. Η εισαγωγή και διαγραφή στοιχείων γίνεται on the fly Η τοποθέτηση των chares του array στους επεξεργαστές γίνεται από το runtime, Ο χρήστης μπορεί να επιλέξει τρόπο τοποθέτησης: round-robin, block-cyclic κ.ά. 62 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Broadcast Broadcast: κλήση της ίδιας entry method από όλα τα αντικείμενα σε ένα chare array arr[3].method() //point-to-point message to element 3 arr.method() //broadcast to every element 63 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Reduction Κάθε chare θα στείλει τα δεδομένα του σε κάποιον και τα δεδομένα θα συνδυαστούν με κάποια πράξη Naive τρόπος: ένας master μετράει πόσα μηνύματα πρέπει να παραληφθούν Πρόβλημα: bottleneck στον master Το runtime system χτίζει ένα δέντρο για το reduction Ο χρήστης καθορίζει την πράξη του reduction Στη ρίζα του δέντρου, γίνεται trigger ένα callback callback Chare7 Chare5 Chare6 Chare1 Chare2 Chare3 Chare4 64 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Structured Dagger Τα chares είναι reactive στις κλήσεις μεθόδων Αν κληθεί η μία μέθοδος, θα κάνει τη μία δράση, αν κληθεί η άλλη μέθοδος θα κάνει την άλλη δράση κλπ. Τα chares έχουν έναν κύκλο ζωής: οι υπολογισμοί εξαρτώνται από κλήσεις απομακρυσμένων μεθόδων και από την ολοκλήρωση άλλων τοπικών υπολογισμών Ο κύκλος ζωής των chares είναι ένας κατευθυνόμενος ακυκλικός γράφος - DAG Η Charm++ προσφέρει στον προγραμματιστή ένα notation για να καθορίσει τον DAG, το Structured Dagger (script-like) Βασικά constructs του Structured Dagger: when: δήλωση των δράσεων όταν ληφθεί μια κλήση μεθόδου (κάτι σαν blocking receive) serial: δήλωση δράσεων που πρέπει να γίνουν χωρίς interruption/preemption if-then-else, for, forall, while: όπως στη C overlap: δήλωση ανεξάρτητων clauses που μπορούν να εκτελεστούν με οποιαδήποτε σειρά (ή και ταυτόχρονα) 65 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Παράδειγμα: Jacobi-1D -.ci file mainmodule1 jacobi1d { readonly CProxy Main mainproxy; readonly int blockdimx; readonly int numchares; } mainchare Main { entry Main(CkArgsMsg *m); } array [1D] Jacobi { entry Jacobi(void); entry void recvghosts(int iter, int dir, int size, double gh[si entry [reductiontarget] void isconverged(bool result); entry void run() {...see next slide; } } 66 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Παράδειγμα: Jacobi-1D -.ci file - συνέχεια while (!converged) { serial "send_to_neighbors" { iter++; top=(thisindex+1)%numchares; bottom=...; thisproxy(top).recvghosts(iter, BOTTOM, arraydimy,&value[1][1]); thisproxy(bottom).recvghosts(iter, TOP, arraydimy,&value[blockdimx][1]); } for (imsg=0; imsg<neighbors;imsg++) when recvghosts[iter] (int iter, int dir, int size, double gh[size]) serial "update_boundary" { int row=(dir==top)?0:blockdimx+1; for (int j=0;j<size;j++) value[row][j+1]=gh[j]; } } serial "do_work" { conv=check_and_compute(); CkCallback cb=ckcallback(ckreductiontarget(jacobi, isconverged), thisproxy); Contribute(sizeof(bool), &conv, CkReduction::logical_and, cb); } when isconverged(bool result) serial "check_converge" { converged=result; if (result && thisindex==0) CkExit(); } 67 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Ecosystem 68 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ Runtime System Κάθε επεξεργαστικό στοιχείο εκτελεί το δικό του instance του Charm++ Runtime System Τα instances του RTS είναι υπεύθυνα για το τοπικό τους επεξεργαστικό στοιχείο Επικοινωνούν μεταξύ τους κάθε φορά που χρειάζεται 69 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ RTS Components Machine Layer: Περιλαμβάνει κώδικα σχετικό με το σύστημα που χρησιμοποιούν ανώτερα στρώματα της Charm++ για βασικές λειτουργίες, όπως αποστολή μηνυμάτων Converse: Περιλαμβάνει abstractions των δυνατοτήτων του machine layer από τα ανώτερα στρώματα τoυ runtime. Επίσης παρέχει λειτουργικότητα που δεν υποστηρίζεται από κάποια machine layers. Τέλος, περιέχει τον scheduler και την ουρά μηνυμάτων Ουρά μηνυμάτων (message queue): Συλλέγει τα μηνύματα που παραλαμβάνονται από κάποιο επεξεργαστικό στοιχείο. Είναι μοιραζόμενη μεταξύ των chares που βρίσκονται στο επεξεργαστικό στοιχείο. Scheduler: Επιλέγει ένα μήνυμα από την ουρά και το εκτελεί. Κάθε μήνυμα περιέχει τα δεδομένα του μηνύματος, το chare στο οποίο απευθύνεται και την entry method που θα εκτελεστεί. Η entry method εκτελείται μέχρι να τελειώσει ή να επιστρέψει τον έλεγχο στο RTS (lock-free). 70 1/2015 Συστήματα Παράλληλης Επεξεργασίας
Charm++ RTS Decisions Διαμοιρασμός των chares στους φυσικούς επεξεργαστές Load Balancing (object migration) Message routing Checkpointing Fault-tolerance Δυναμική διαχείριση φυσικών πόρων Βελτιστοποιήση χρήσης φυσικών πόρων ως προς την κατανάλωση ενέργειας Ορισμένα από τα παραπάνω χρειάζονται hardware support, άλλα χρειάζονται ακριβή μοντέλα πρόβλεψης επίδοσης... 71 1/2015 Συστήματα Παράλληλης Επεξεργασίας