Λ10 Παράλληλος & Κατανεμημένος Προγραμματισμός Μάθημα 5 ο & 6 ο 19 & 24/11/2009

Σχετικά έγγραφα
ΠΛΕ-006 ΠΑΡΑΛΛΗΛΗ ΕΠΕΞΕΡΓΑΣΙΑ Project

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

Κατηγορίες Νηµάτων. Νήµατα Επιπέδου Πυρήνα. Νήµατα Επιπέδου Χρήστη. «Νήµατα Επιπέδου Χρήστη» Ε-85: Ειδικά Θέµατα Λογισµικού

Cilk: Φιλοσοφία και Χρήση

ΛΕΙΣΟΤΡΓΙΚΆ ΤΣΉΜΑΣΑ. 2 ο Εργαςτιριο Διαχείριςθ Διεργαςιϊν

Διεργασίες και Νήματα (2/2)

Η πολυνηματική γλώσσα προγραμματισμού Cilk

The Simply Typed Lambda Calculus

Instruction Execution Times

Cilk: Φιλοσοφία και Χρήση

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

Παράλληλη Επεξεργασία

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Περιγραφή και Έλεγχος ιεργασιών

Dynamic types, Lambda calculus machines Section and Practice Problems Apr 21 22, 2016

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΤΟΜΕΑΣ ΥΔΡΑΥΛΙΚΗΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΙΚΗΣ ΤΕΧΝΙΚΗΣ. Ειδική διάλεξη 2: Εισαγωγή στον κώδικα της εργασίας

HY150a Φροντιστήριο 3 24/11/2017

The challenges of non-stable predicates

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

Εισαγωγικά & Βασικές Έννοιες

Ειςαγωγή ςτην πληροφορική

Εισαγωγικά & Βασικές Έννοιες

ΕΝΟΤΗΤΑ 2: ΤΟ ΛΟΓΙΣΜΙΚΟ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ. ΚΕΦΑΛΑΙΟ 5: Γνωριμία με το λογιςμικό του υπολογιςτι

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

16. Πίνακεσ και Συναρτήςεισ

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Block Ciphers Modes. Ramki Thurimella

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Ταυτόχρονος Προγραμματισμός

Βασικές Έννοιες Πρ Ταο υγρ τόα χ μ ρ μ ο α ν τισμ ος Π ό ρ ςο ΙΙΙ γραμματισμός 1

Εγχειρίδιο Χριςθσ τθσ διαδικτυακισ εφαρμογισ «Υποβολι και παρακολοφκθςθ τθσ ζγκριςθσ Εκπαιδευτικών Πακζτων»

Παρουσίαση 5 ης Άσκησης:

Παρουσίαση 5 ης Άσκησης:

Λειτουργικά Συστήματα. Εισαγωγή

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

6.1. Dirac Equation. Hamiltonian. Dirac Eq.

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Εισαγωγή Βασικές εντολές Εκτέλεση βήµα-βήµα Εξέταση/Ανάθεση GDB-101. Νίκος Ντάρµος Τµήµα Πληροφορικής Πανεπιστήµιο Ιωαννίνων

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Physical DB Design. B-Trees Index files can become quite large for large main files Indices on index files are possible.

ΕΠΛ221: Οργάνωση Υπολογιστών και Συμβολικός Προγραμματισμός. Εργαστήριο Αρ. 2

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 6 C & Assembly

Statistical Inference I Locally most powerful tests

Ordinal Arithmetic: Addition, Multiplication, Exponentiation and Limit

Fractional Colorings and Zykov Products of graphs

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Στο εστιατόριο «ToDokimasesPrinToBgaleisStonKosmo?» έξω από τους δακτυλίους του Κρόνου, οι παραγγελίες γίνονται ηλεκτρονικά.

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ

Λειτουργικά Συστήματα

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 5: Component Adaptation Environment (COPE)

Τυπικζσ Γλϊςςεσ Περιγραφισ Υλικοφ Διάλεξθ 4

Hancock. Ζωγραφάκης Ιωάννης Εξαρχάκος Νικόλαος. ΕΠΛ 428 Προγραμματισμός Συστημάτων

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

Overview. Transition Semantics. Configurations and the transition relation. Executions and computation

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Second Order RLC Filters

Διάλεξη 5: Δείκτες και Συναρτήσεις

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Παράλληλος Προγραμματισμός με OpenCL

C.S. 430 Assignment 6, Sample Solutions

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Section 8.3 Trigonometric Equations

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Other Test Constructions: Likelihood Ratio & Bayes Tests

Κατανεμημένα Συστήματα. Javascript LCR example

Finite Field Problems: Solutions

EE512: Error Control Coding

3.4 SUM AND DIFFERENCE FORMULAS. NOTE: cos(α+β) cos α + cos β cos(α-β) cos α -cos β

HY437 Αλγόριθμοι CAD

ΤΕΧΝΙΚΕΣ ΑΥΞΗΣΗΣ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ I

Νιματα - Συγχρονιςμόσ

Προγραμματισμός Αναδρομή

Βάςεισ Δεδομζνων Ι. Ενότητα 7: Ειςαγωγή ςτην γλώςςα_sql. Δρ. Σςιμπίρθσ Αλκιβιάδθσ Σμιμα Μθχανικϊν Πλθροφορικισ ΣΕ

Δομθμζνοσ Προγραμματιςμόσ. Βαγγζλθσ Οικονόμου Εργαςτιριο 9

Phys460.nb Solution for the t-dependent Schrodinger s equation How did we find the solution? (not required)

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

TMA4115 Matematikk 3

Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές

CHAPTER 25 SOLVING EQUATIONS BY ITERATIVE METHODS

2 Composition. Invertible Mappings

ω ω ω ω ω ω+2 ω ω+2 + ω ω ω ω+2 + ω ω+1 ω ω+2 2 ω ω ω ω ω ω ω ω+1 ω ω2 ω ω2 + ω ω ω2 + ω ω ω ω2 + ω ω+1 ω ω2 + ω ω+1 + ω ω ω ω2 + ω

ΛΕΙΤΟΥΓΙΚΆ ΣΥΣΤΉΜΑΤΑ. 2 θ Διάλεξθ - Διεργαςίεσ

Επιτεύγµατα των Λ.Σ.

Multi Logo. Προγραμματιςμόσ Η/Υ με Multi Logo. Σχεδίαςη και ανάπτυξη εφαρμογήσ κίνηςησ αντικειμζνου

Συστήματα Διαχείρισης Βάσεων Δεδομένων

Αυτόματη δημιουργία στηλών Αντιστοίχηση νέων λογαριασμών ΦΠΑ

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΕΡΓΑΣΙΕΣ

Ειδικά Θζματα Βάςεων Δεδομζνων

Lecture 2. Soundness and completeness of propositional logic

ΛΕΙΣΟΤΡΓΙΚΆ ΤΣΉΜΑΣΑ. 9 θ & 10 θ Διάλεξθ Ιδεατι Μνιμθ Μζροσ Β

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

Εγκατάσταση λογισμικού και αναβάθμιση συσκευής Device software installation and software upgrade

Transcript:

Λ10 Παράλληλος & Κατανεμημένος Προγραμματισμός 2009 Μάθημα 5 ο & 6 ο 19 & 24/11/2009 Προγραμματισμός κοινής μνήμης: user-level threads, cilk Β. Δημακόπουλος

Νήματα επιπέδου χρήστη (user-level threads)

Κατθγορίεσ Νθμάτων Υπάρχουν δφο κατθγορίεσ νθμάτων Νιματα επιπζδου πυρινα (kernel level threads) Νιματα επιπζδου χριςτθ (user level threads) Η διαφορά τουσ βρίςκεται ςτο κατά πόςο το ίδιο το λειτουργικό γνωρίηει τθν φπαρξθ νθμάτων ι όχι #3

Νιματα Επιπζδου Πυρινα Τα ςφγχρονα λειτουργικά ςυςτιματα προςφζρουν τθ δυνατότθτα δθμιουργίασ νθμάτων επιπζδου πυρινα (kernel-level threads) Ο πυρινασ διαχωρίηει τθν ζννοια τθσ διεργαςίασ από τα νιματα Διεργαςία: οι πόροι που χρειάηεται ζνα πρόγραμμα για να εκτελεςτεί Νιματα: κατάςταςθ εκτζλεςθσ τθσ διεργαςίασ Ζνα πρόγραμμα αποτελείται από μία διεργαςία και από ζνα ι περιςςότερα νιματα επιπζδου πυρινα Το λειτουργικό ςφςτθμα προςφζρει μια επιπλζον κλιςθ ςυςτιματοσ για τθ δθμιουργία ενόσ νζου νιματοσ επιπζδου πυρινα ςτα πλαίςια μιασ διεργαςίασ Τα νιματα επιπζδου πυρινα είναι οντότθτεσ αναγνωρίςιμεσ από το λειτουργικό ςφςτθμα Ο χρονοπρογραμματιςτισ του λειτουργικοφ ανακζτει τα νιματα ςτουσ φυςικοφσ επεξεργαςτζσ για να εκτελεςτοφν #4

Νιματα Επιπζδου Πυρινα Η δθμιουργία, καταςτροφι και διαχείριςθ των νθμάτων επιπζδου πυρινα απαιτεί τθ χριςθ κατάλλθλων κλιςεων ςυςτιματοσ Υψθλόσ κόςτοσ λόγω τθσ μετάβαςθ του επεξεργαςτι από το επίπεδο χριςτθ ςτο επίπεδο πυρινα Κάποιεσ εφαρμογζσ απαιτοφν χριςθ μεγάλου αρικμοφ νθμάτων Εκμετάλλευςθ λεπτά καταμεριςμζνου παραλλθλιςμοφ (fine-grained parallelism) Εκτζλεςθ εμφωλευμζνων (nested) βρόχων παραλλθλιςμοφ Καλφτερθ εξιςορρόπθςθ φορτίου Αξιοποίθςθ αναδρομικϊν αλγορίκμων Επικάλυψθ υπολογιςμϊν με επικοινωνία Το κόςτοσ δθμιουργίασ διαχείριςθσ των νθμάτων επιπζδου πυρινα υπερκαλφπτει το όφελοσ χριςθσ τουσ #5

Νιματα Επιπζδου Χριςτθ Εναλλακτικι προςζγγιςθ: δθμιουργία νθμάτων ςτο επίπεδο χριςτθ Τα νιματα αποτελοφνται από ζνα περιγραφζα (descriptor) που περιζχει Τισ τιμζσ των καταχωρθτϊν του νιματοσ (registers, π.χ. τον program counter) Μια περιοχι μνιμθσ που χρθςιμοποιείται ωσ ςτοίβα (stack) Τα νιματα επιπζδου χριςτθ είναι οντότθτεσ μη αναγνωρίςιμεσ από το λειτουργικό ςφςτημα Δθμιουργοφνται, διαχειρίηονται, χρονοδρομολογοφνται και καταςτρζφονται αποκλειςτικά από τον χριςτθ #6

Νιματα Επιπζδου Χριςτθ Για κάκε εργαςία που μπορεί να εκτελεςτεί παράλλθλα δθμιουργείται ζνα νιμα επιπζδου χριςτθ Το νιμα αυτό εκτελείται από κάποιο νιμα επιπζδου πυρινα Τα νιματα επιπζδου πυρινα λειτουργοφν ωσ ιδεατοί επεξεργαςτζσ (virtual processors) οι οποίοι εκτελοφν νιματα επιπζδου χριςτθ Αντίςτοιχα οι φυςικοί επεξεργαςτζσ εκτελοφν νιματα επιπζδου πυρινα Επομζνωσ θ δθμιουργία και εκτζλεςθ πολλϊν νθμάτων επιπζδου χριςτθ με ζνα νιμα επιπζδου πυρινα δεν ςθμαίνει παράλλθλθ εκτζλεςθ Τα νιματα επιπζδου χριςτθ κα εκτελεςτοφν ςε ζναν φυςικό επεξεργαςτι #7

Βαςικζσ Ιδιότθτεσ Νιματα επιπζδου πυρινα Υψθλόσ κόςτοσ: οι πράξεισ νθμάτων είναι κλιςεισ ςυςτιματοσ Δρομολόγθςθ από το λειτουργικό ςφςτθμα Εκμετάλλευςθ πολλϊν επεξεργαςτϊν Αν ζνα νιμα μπλοκάρει, τα υπόλοιπα νιματα ςυνεχίηουν τθν εκτζλεςθ τουσ Νιματα επιπζδου χριςτθ Χαμθλό κόςτοσ: οι πράξεισ νθμάτων είναι απλζσ κλιςεισ ςυναρτιςεων Δρομολόγθςθ από τθ βιβλιοκικθ, ςτο χρόνο εκτζλεςθσ τθσ διεργαςίασ Δεν εκμεταλλεφονται πολλαπλοφσ επεξεργαςτζσ Αν ζνα νιμα μπλοκάρει, τότε μπλοκάρει όλθ θ διεργαςία Κατθγορίεσ δρομολόγθςθσ Χωρίσ προεκχϊρθςθ: με ελεγχόμενθ εναλλαγι (π.χ. yield) Με προεκχϊρθςθ: αυτόματθ εναλλαγι, π.χ. με κάποιον timer #8

Μοντζλα Υλοποίθςθσ Νθμάτων Μοντζλο ζνα-προσ-ζνα (1:1) Κάκε νιμα τθσ διεργαςίασ αντιςτοιχεί ςε ζνα νιμα επιπζδου πυρήνα Μοντζλο πολλά-προσ-ζνα (Μ:1) Κάκε νιμα τθσ διεργαςίασ αντιςτοιχεί ςε ζνα νιμα επιπζδου χρήςτη Υπάρχει ζνα νιμα επιπζδου πυρινα που λειτουργεί ωσ ιδεατόσ επεξεργαςτισ (virtual processor) Μοντζλο πολλά-προσ-πολλά (Μ:Ν) Υβριδικό μοντζλο: Κάκε νιμα τθσ διεργαςίασ αντιςτοιχεί ςε ζνα νιμα επιπζδου χρήςτη Υπάρχουν πολλαπλοί ιδεατοί επεξεργαςτζσ #9

Απεικόνιςθ ζνα-προσ-ζνα (1:1) Νιμα 1 Οντότθτα Πυρινα 1 Stack Stack Registers Registers Νιμα 2 Οντότθτα Πυρινα 2 CPU 1 Stack Stack Registers Registers Νιμα 3 Νιμα 4 Οντότθτα Πυρινα 3 Οντότθτα Πυρινα 4 CPU 2 Heap Data Code #10

Απεικόνιςθ πολλά-προσ-ζνα (Μ:1) Stack Νιμα 1 Stack Νιμα 2 Νιμα 3 Νιμα 4 Οντότθτα Πυρινα 1 CPU 1 CPU 2 Stack Stack Heap Data Code Registers #11

Απεικόνιςθ πολλά-προσ-πολλά (Μ:Ν) Νιμα 1 Stack Stack Registers Νιμα 2 Οντότθτα Πυρινα 1 CPU 1 Stack Stack Registers Νιμα 3 Νιμα 4 Οντότθτα Πυρινα 2 CPU 2 Heap Data Code #12

Νιματα Δφο Επιπζδων (Μ:Ν) Πλεονεκτιματα Εκμετάλλευςθ πολλαπλϊν επεξεργαςτϊν του ςυςτιματοσ Η διεργαςία μπλοκάρει αν μπλοκάρουν Ν νιματα Χαμθλό κόςτοσ διαχείριςθσ νθμάτων επιπζδου χριςτθ Δθμιουργία ςυγκεκριμζνου πλικουσ νθμάτων επιπζδου πυρινα Ίςοσ με τον πραγματικό επικυμθτό παραλλθλιςμό Τα νιματα αυτά (ιδεατοί επεξεργαςτζσ) διατθροφνται κακϋ όλθ τθ διάρκεια εκτζλεςθσ του προγράμματοσ Τερματίηουν όταν τελειϊςει όλο το πρόγραμμα Δρομολόγθςθ δφο επιπζδων Λειτουργικό ςφςτθμα ιδεατοί επεξεργαςτζσ Βιβλιοκικθ νθμάτων νιματα χριςτθ Δθμιουργία νθμάτων επιπζδου χριςτθ: όςα είναι απαραίτθτα για να εκφραςτεί ο παραλλθλιςμόσ τθσ εφαρμογισ #13

Παραδείγματα Υλοποιιςεων Επιπζδου πυρινα POSIX Threads ςε Linux, Solaris, Windows Win32 Threads Επιπζδου χριςτθ GNU Pth Windows fibers Υβριδικό μοντζλο (Μ:Ν) POSIX Threads ςε AIX (IBM), HPUX PM2 Marcel threads PSthreads #14

Μθχανιςμοί για υλοποίθςθ νθμάτων χριςτθ Μθχανιςμοί υλοποίθςθσ μθ-μεταφζρςιμοι (assembly) setjmp/longjmp ucontext_t operations (makecontext, swapcontext) #15

setjmp - longjmp #include <setjmp.h> jmpbuf context; int setjmp(jmp_buf env); Αποκθκεφει το context ςτον buffer env και επιςτρζφει 0 Όταν αποκαταςτακεί το context (από τθ longjmp()), κα ςυνεχίςει θ εκτζλεςθ από το ίδιο ςθµείο. Τότε θ setjmp() επιςτρζφει τθν τιµι του ορίςματοσ val τθσ longjmp(). void longjmp(jmp_buf env, int val); Αποκακιςτά το context που ζχει αποκθκευτεί ςτον buffer env από προθγοφμενθ κλιςθ τθσ setjmp() Αν val==0 τότε θ setjmp επιςτρζφει 1 Αν val!=0 τότε θ setjmp επιςτρζφει val #16

setjmp - longjmp #include<setjmp.h> #include<stdio.h> int main(void) { int value; jmp_buf environment_buffer; value=setjmp(environment_buffer); if(value!=0) { printf("reached this point with value=%d.\n",value); exit(0); printf("calling function.\n"); some_function(environment_buffer); return 0; void some_function(jmp_buf env_buf) { longjmp(env_buf,5); #17

setjmp - longjmp Χριςθ για εναλλαγι από old_thread ςε new_thread switch(old_thread, new_thread) { if (setjmp(old_thread->context)!= 0) { longjmp(new_thread->context, 1); /* δεν επιςτρέφει ποτέ εδώ*/ /* εδώ θα επιςτρέψει η εκτέλεςη του οld_thread μετά από µία κλήςη τησ ςυνάρτηςησ longjmp(old_thread->context, 1); */ old_thread_work(); #18

makecontext -swapcontext #include <ucontext.h> ucontext_t context; Πεδία δομισ (μερικά): stack_t uc_stack: Η ςτοίβα που χρθςιμοποιείται από το context ucontext_t uc_mcontext: αναπαράςταςθ ενόσ context που ζχει ςωκεί Κλιςεισ int int getcontext(ucontext_t *ucp); setcontext(const ucontext_t *ucp); void makecontext(ucontext_t *ucp, (void *f)(),int argc,...); int swapcontext(ucontext_t *oucp, const ucontext_t *ucp); #19

makecontext -swapcontext #include <ucontext.h> ucontext_t auc,buc,mainuc; int main(void) { printf("start\n"); /* Set up context for thread A */ getcontext(&auc); auc.uc_stack.ss_size = 16 * 1024; auc.uc_stack.ss_sp = malloc(auc.uc_stack.ss_size); makecontext(&auc, a, 0); void a() { int i; for (i = 0; i < 10; i++) { printf("a"); swapcontext(&auc, &buc); /* switch to thread B */ printf("\nswitching to main\n"); swapcontext(&auc, &mainuc); /* switch to main thread */ void b() { int i; /* Set up context for thread B */ getcontext(&buc); buc.uc_stack.ss_size = 16 * 1024; buc.uc_stack.ss_sp = malloc(buc.uc_stack.ss_size); makecontext(&buc, b, 0); for (i = 0; i < 10; i++) { printf("b"); swapcontext(&buc, &auc); /* switch to thread A */ /* Switch to A */ getcontext(&mainuc); /* Save the context of main thread */ swapcontext(&mainuc, &auc); /* Switch to thread A */ printf("done\n"); /* Execution control returned to main thread */ return 0; #20

A simple user-level threads facility #include <ucontext.h> ucontext_t context_create(void (*func)(void *), void *arg) { ucontext_t *uc = malloc(sizeof(ucontext_t); getcontext(uc); /* A copy of current context */ uc->uc_stack.ss_size = 65536; /* Change its values */ uc->uc_stack.ss_sp = malloc(65536); makecontext(uc, func, 1, arg); /* Ready to use */ return (uc); void context_switch(ucontext_t *from, ucontext_t *to) { if (from!= NULL) swapcontext(from, to); /* Save current in from */ else setcontext(to); /* Current context is lost */ What happens at thread_exit()? /* There is a ready queue of threads */ thread_create(void (*func)(void *), void *arg) { <enqueue>( context_create(func, arg) ); scheduler() { ucontext_t *uc = <dequeue>(); /* FIFO */ context_switch(current_uc, uc); thread_exit() { <must delete thread s stuff (e.g. stack)> scheduler(); /* Run another thread */ thread_yield() { scheduler(); /* Run another thread */ thread_join(...) { What if the thread function simply returns (i.e. does not call thread_exit())? #21

Βιβλιοκικθ PSthreads Παρζχει μθ προεκχωριςιμα (non-preemptive) νιματα επιπζδου χριςτθ Ζνα νιμα δεν μπορεί να ξεκινιςει τθν εκτζλεςι του όςο το προθγοφμενο νιμα δεν ζχει τερματίςει ι δεν ζχει παραχωριςει εκελοντικά τον επεξεργαςτι του Ο ενςωματωμζνοσ χρονοπρογραμματιςτισ καλείται μόνο ςε ςυγκεκριμζνα ςθμεία του κϊδικα τθσ βιβλιοκικθσ και όχι ςε τυχαίεσ χρονικζσ ςτιγμζσ με χριςθ κάποιου timer Εκμετάλλευςθ πολλαπλϊν επεξεργαςτϊν Διακεςιμότθτα http://cs.uoi.gr/~ompi/download.html#psthreads #22

Οργάνωςθ #23

Βιβλιοκικθ psthreads Υλοποιεί ζνα μοντζλο νθμάτων δφο επιπζδων Νιματα επιπζδου χριςτθ εκτελοφνται από νιματα POSIX επιπζδου πυρινα («εικονικοί επεξεργαςτζσ» virtual processors) Διακζτει μια τοπικι ουρά εκτζλεςθσ ανά ιδεατό επεξεργαςτι και μια κακολικι ουρά Τα νιματα επιπζδου χριςτθ ειςάγονται ςε κάποια ουρά εκτζλεςθσ Κάκε εικονικόσ επεξεργαςτισ επιλζγει ζνα νιμα από το ςφνολο των ουρϊν τθσ βιβλιοκικθσ, για να το εκτελζςει Ο αλγόρικμοσ επιλογισ νιματοσ (δρομολόγθςθσ) ενεργοποιείται ςε ςυγκεκριμζνα ςθμεία εκτζλεςθσ του προγράμματοσ (π.χ. τερματιςμόσ νιματοσ) #24

Βιβλιοκικθ psthreads Αλγόρικμοσ επιλογισ νιματοσ Αρχικά, ο ιδεατόσ επεξεργαςτισ προςπακεί να εξάγει ζνα νιμα από τθν αρχι τθσ τοπικισ του ουράσ Εφόςον θ τοπικι ουρά είναι άδεια, εξετάηει τθν κακολικι ουρά τθσ βιβλιοκικθσ Εφόςον θ κακολικι ουρά είναι άδεια, εξετάηει διαδοχικά τισ ουρζσ των υπόλοιπων ιδεατϊν επεξεργαςτϊν, προςπακϊντασ να εξάγει ζνα νιμα από το τζλοσ τθσ απομακρυςμζνθσ ουράσ αυτό ονομάηεται κλζψιμο δουλειάσ (work stealing) #25

Cilk

Cilk A C language for programming dynamic multithreaded applications on shared-memory multiprocessors. Cilk extends the C language with just a handful of keywords. Every Cilk program has a serial semantics. Not only is Cilk fast, it provides performance guarantees based on performance abstractions. Cilk is processor-oblivious. Cilk s provably good runtime system automatically manages low-level aspects of parallel execution, including protocols, load balancing, and scheduling. #27

Παράδειγμα Cilk is a faithful extension of C. A Cilk program s serial elision is always a legal implementation of Cilk semantics. Cilk provides no new data types. int fib (int n) { if (n<2) return (n); else { int x,y; x = fib(n-1); y = fib(n-2); return (x+y); C elision Cilk code cilk int fib (int n) { if (n<2) return (n); else { int x,y; x = spawn fib(n-1); y = spawn fib(n-2); sync; return (x+y); #28

Basic Cilk Keywords cilk int fib (int n) { if (n<2) return (n); else { int x,y; x = spawn fib(n-1); y = spawn fib(n-2); sync; return (x+y); Control cannot pass this point until all spawned children have returned. Identifies a function as a Cilk procedure, capable of being spawned in parallel. The named child Cilk procedure can execute in parallel with the parent caller. #29

Dynamic Multithreading cilk int fib (int n) { if (n<2) return (n); else { int x,y; x = spawn fib(n-1); y = spawn fib(n-2); sync; return (x+y); 3 Example: fib(4) 4 2 2 1 1 0 1 0 The computation dag unfolds dynamically. #30

Cilk DAG task graph initial thread final thread continue edge spawn edge return edge The dag G = (V, E) represents a parallel instruction stream. Each vertex v of V represents a (Cilk) thread: a maximal sequence of instructions not containing parallel control (spawn, sync, return). Every edge e of E is either a spawn edge, a return edge, or a continue edge. #31

Cactus Stack Cilk supports C s rule for pointers: A pointer to stack space can be passed from parent to child, but not from child to parent. (Cilk also supports malloc.) A A B C D E A A A A A B C C C C B E D E D Views of stack Cilk s cactus stack supports several views in parallel. #32

Parallelizing vector addition C void vadd (real *A, real *B, int n){ int i; for (i=0; i<n; i++) A[i]+=B[i]; Cilk void cilk vadd (real *A, real *B, int n){ if (n<=base) { int i; for (i=0; i<n; i++) A[i]+=B[i]; else { spawn vadd (A, B, n/2; vadd spawn(a+n/2, B+n/2, n-n/2; sync; Parallelization strategy: 1. Convert loops to recursion. 2. Insert Cilk keywords. Side benefit: D&C is generally good for caches! #33

Vector Addition cilk void vadd (real *A, real *B, int n){ if (n<=base) { int i; for (i=0; i<n; i++) A[i]+=B[i]; else { spawn vadd (A, B, n/2); spawn vadd (A+n/2, B+n/2, n-n/2); sync; #34

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. Spawn! P P P P #35

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. Spawn! Spawn! P P P P #36

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. Return! P P P P #37

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. Return! P P P P #38

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. Steal! P P P P When a processor runs out of work, it steals a thread from the top of a random victim s deque. #39

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. Steal! P P P P When a processor runs out of work, it steals a thread from the top of a random victim s deque. #40

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. P P P P When a processor runs out of work, it steals a thread from the top of a random victim s deque. #41

Cilk s Work-Stealing Scheduler Each processor maintains a work deque of ready threads, and it manipulates the bottom of the deque like a stack. Spawn! P P P P When a processor runs out of work, it steals a thread from the top of a random victim s deque. #42

Scheduling, cont. Με ποια ςειρά δθμιουργοφνται & εκτελοφνται τα νιματα/tasks? Απάντθςθ: Όταν ο γονζασ δθμιουργιςει ζνα νιμα, τοποκετεί τον εαυτό του ςτθν ουρά και εκτελεί αμέσως το νζο νιμα depth-first Μασ δίνει κάποιο πλεονζκτθμα αυτό; Απάντθςθ: Όλα (ςχεδόν) τα παιδιά ςτθν ίδια ςτοίβα (γριγορο, λίγθ μνιμθ) Πικανϊσ τοπικότθτα Μειονζκτθμα; Απάντθςθ: Δεν μπορεί να υπάρχει global barrier. cilk int fib (int n) { if (n<2) return (n); else { int x,y; x = spawn fib(n-1); y = spawn fib(n-2); sync; return (x+y); #43

Operating on Returned Values Programmers may sometimes wish to incorporate a value returned from a spawned child into the parent frame by means other than a simple variable assignment. Example: x += spawn foo(a,b,c); Cilk achieves this functionality using an internal function, called an inlet, which is executed as a secondary thread on the parent frame when the child returns. #44

Semantics of Inlets func() { int max, ix = -1; inlet void update ( int val, int index ) { if (idx == -1 val > max) { ix = index; max = val; for (i=0; i<1000000; i++) update ( spawn foo(i), i ); sync; /* ix now indexes the largest foo(i) */ The inlet keyword defines a void internal function to be an inlet. In the current implementation of Cilk, the inlet definition may not contain a spawn, and only the first argument of the inlet may be spawned at the call site. #45

Semantics of Inlets int max, ix = -1; inlet void update ( int val, int index ) { if (idx == -1 val > max) { ix = index; max = val; for (i=0; i<1000000; i++) { update ( spawn foo(i), i ); sync; /* ix now indexes the largest foo(i) */ 1. The non-spawn args to update() are evaluated. 2. The Cilk procedure foo(i) is spawned. 3. Control passes to the next statement. 4. When foo(i) returns, update() is invoked. #46

Semantics of Inlets int max, ix = -1; inlet void update ( int val, int index ) { if (idx == -1 val > max) { ix = index; max = val; for (i=0; i<1000000; i++) { update ( spawn foo(i), i ); sync; /* ix now indexes the largest foo(i) */ Cilk provides implicit atomicity among the threads belonging to the same frame, and thus no locking is necessary to avoid data races. #47

Compiling Cilk Cilk source cilk2c source-to-source translator The cilkc compiler encapsulates the process. C compiler C postsource gcc Cilk RTS cilk2c translates straight C code into identical C postsource. object code ld linking loader binary #48