Εθνικό Μετσόβιο Πολυτεχνείο
Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών
Εργαστήριο Υπολογιστικών Συστημάτων
Παράλληλος προγραμματισμός:
Σχεδίαση και υλοποίηση παράλληλων προγραμμάτων
Συστήματα Παράλληλης Επεξεργασίας
9ο Εξάμηνο
Σύνοψη παρουσίασης
 Παράλληλες υπολογιστικές πλατφόρμες
PRAM: Η ιδανική παράλληλη πλατφόρμα
Η ταξινόμηση του Flynn
Συστήματα κοινής μνήμης
Συστήματα κατανεμημένης μνήμης
 Ανάλυση παράλληλων προγραμμάτων
 Μετρικές αξιολόγησης επίδοσης
 Ο νόμος του Amdahl
 Μοντελοποίηση παράλληλων προγραμμάτων
 Σχεδίαση παράλληλων προγραμμάτων
2
Κατανομή υπολογισμών και δεδομένων
Σχεδιασμός αλληλεπίδρασης ανάμεσα στα tasks
Απεικόνιση των tasks σε διεργασίες (ή threads)
Ενορχήστρωση της επικοινωνίας ή/και του συγχρονισμού
Συστήματα Παράλληλης Επεξεργασίας
Σύνοψη παρουσίασης
 Παράλληλα προγραμματιστικά μοντέλα
 Κοινού χώρου διευθύνσεων
 Ανταλλαγής μηνυμάτων
 Παράλληλες προγραμματιστικές δομές
 SPMD
 fork / join
 task graphs
 parallel for
 Γλώσσες και εργαλεία
 POSIX threads, MPI, OpenMP, Cilk, Cuda, Γλώσσες PGAS
 Αλληλεπίδραση με το υλικό
 Συστήματα κοινής μνήμης
 Συστήματα κατανεμημένης μνήμης και υβριδικά
3
Συστήματα Παράλληλης Επεξεργασίας
PRAM: Η ιδανική παράλληλη
μηχανή
 Η θεωρητική ανάλυση και αξιολόγηση σειριακών αλγορίθμων βασίζεται στη
χρήση ενός υπολογιστικού μοντέλου:
 Random Access Machine (RAM)
 Turing machine
 Γιατί να μην κάνουμε το ίδιο και για τους παράλληλους αλγόριθμους;
 Ας ορίσουμε μια παράλληλη υπολογιστική μηχανή που θα μας βοηθάει να
αναλύουμε και να συγκρίνουμε παράλληλους αλγορίθμους:
 PRAM: Parallel Random Access Machine
 n υπολογιστικές μονάδες (n όσο μεγάλο απαιτεί το
προς επίλυση πρόβλημα)
 Κοινή μνήμη απεριόριστου μεγέθους
 Ομοιόμορφη πρόσβαση στη μνήμη από όλους τους
επεξεργαστές
4
Συστήματα Παράλληλης Επεξεργασίας
PRAM: Ταυτόχρονη πρόσβαση σε
δεδομένα
 Τι συμβαίνει όταν δύο επεξεργαστές αποπειρώνται να προσπελάσουν την
ίδια θέση μνήμης ταυτόχρονα;
 4 διαφορετικές προσεγγίσεις (διαφορετικά μοντέλα):
 Exclusive Read – Exclusive Write (EREW):
 Κάθε θέση μνήμης μπορείς να αναγνωστεί/εγγραφεί από μόνο έναν
επεξεργαστή (σε μια δεδομένη χρονική στιγμή)
 Αν συμβεί ταυτόχρονη πρόσβαση το πρόγραμμα τερματίζει
 Πρόκειται για πολύ περιοριστικό μοντέλο
 Concurrent Read – Exclusive Write (CREW):
 Επιτρέπεται ταυτόχρονη ανάγνωση αλλά όχι εγγραφή
 Exclusive Read – Concurrent Write (ERCW):
 Δεν παρουσιάζει θεωρητικό ή πρακτικό ενδιαφέρον
 Concurrent Read – Concurrent Write (CRCW)
 Ισχυρή μηχανή που επιτρέπει ταυτόχρονες αναγνώσεις / εγγραφές
 Ταυτόχρονες εγγραφές: (common, arbitrary, priority, reduction)
5
Συστήματα Παράλληλης Επεξεργασίας
PRAM: Προβλήματα
 Η πλατφόρμα PRAM κάνει κάποιες σοβαρές υπεραπλουστεύσεις που την
απομακρύνουν από τις πραγματικές μηχανές:
 Απεριόριστος αριθμός επεξεργαστών (όσους έχει ανάγκη το πρόγραμμα)
 Απεριόριστο μέγεθος μνήμης
 Ομοιόμορφος χρόνος πρόσβασης στη μνήμη
 Για να συνδυαστούν τα παραπάνω απαιτείται ένα τεράστιας
πολυπλοκότητας και κόστους δίκτυο διασύνδεσης με διακόπτες
 Τέτοια δίκτυα διασύνδεσης με την παρούσα τεχνολογία είναι ρεαλιστικά
για λίγες δεκάδες επεξεργαστές
 Η θεωρητική ανάλυση σε ένα μοντέλο PRAM δεν μας δίνει ασφαλή
συμπεράσματα για την εκτέλεση σε ένα πραγματικό παράλληλο σύστημα
(π.χ. κοινής μνήμης)
 Το μοντέλο PRAM έχει θεωρητικό ενδιαφέρον και δεν χρησιμοποιείται στην
πράξη
6
Συστήματα Παράλληλης Επεξεργασίας
Flynn’s taxonomy
 SISD
 Single Instruction Single Data
 SIMD
 Single Instruction Multiple Data
 MISD
 Multiple Instruction Single Data
 MIMD
 Multiple Instruction Multiple Data
7
Συστήματα Παράλληλης Επεξεργασίας
Flynn’s taxonomy
8
Συστήματα Παράλληλης Επεξεργασίας
Παράλληλες αρχιτεκτονικές:
Οργάνωση μνήμης
 Κοινής μνήμης (shared memory)
 UMA (Uniform memory access): Χρόνος προσπέλασης ανεξάρτητος του
επεξεργαστή και της θέσης μνήμης
 NUMA (Non-uniform memory access): Χρόνος προσπέλασης εξαρτάται από τον
επεξεργαστή και τη θέση μνήμης
 cc-NUMA (cache-coherent NUMA): NUMA με συνάφεια κρυφής μνήμης
 Κατανεμημένης μνήμης (distributed memory)
 Υβριδική
9
Συστήματα Παράλληλης Επεξεργασίας
Αρχιτεκτονική κοινής μνήμης
 Οι επεξεργαστές έχουν κοινή μνήμη
 Κάθε επεξεργαστής διαθέτει τοπική ιεραρχία κρυφών μνημών
 Συνήθως η διασύνδεση γίνεται μέσω διαδρόμου μνήμης (memory bus)
 Αλλά και πιο εξελιγμένα δίκτυα διασύνδεσης
 Ομοιόμορφη ή μη-ομοιόμορφη προσπέλαση στη μνήμη (Uniform Memory
Access – UMA, Non-uniform Memory Access – NUMA)
 Η κοινή μνήμη διευκολύνει τον παράλληλο προγραμματισμό
 Δύσκολα κλιμακώσιμη αρχιτεκτονική – τυπικά μέχρι λίγες δεκάδες κόμβους
(δεν κλιμακώνει το δίκτυο διασύνδεσης)
$
$
CPU
CPU
$
...
CPU
Διάδρομος Μνήμης (memory bus)
M
10
Συστήματα Παράλληλης Επεξεργασίας
SMP vs NUMA
Symmetric Multiprocessing (SMP)
Uniform Memory Access (UMA)
Non-Uniform Memory Access (NUMA)
Images taken from:
http://www.sqlskills.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/
11
Συστήματα Παράλληλης Επεξεργασίας
Αρχιτεκτονική κατανεμημένης μνήμης
 Κάθε επεξεργαστής έχει τη δική του τοπική μνήμη και ιεραρχία τοπικών
μνημών
 Διασυνδέεται με τους υπόλοιπους επεξεργαστές μέσω δικτύου διασύνδεσης
 Η κατανεμημένη μνήμη δυσκολεύει τον προγραμματισμό
 Η αρχιτεκτονική κλιμακώνει σε χιλιάδες υπολογιστικούς κόμβους
Κόμβος 1
Κόμβος 2
$
$
CPU
CPU
M
Κόμβος Ν
$
...
M
Δίκτυο Διασύνδεσης (π.χ. Ethernet, Myrinet, SCI)
12
Συστήματα Παράλληλης Επεξεργασίας
CPU
M
Υβριδική αρχιτεκτονική
 Συνδυάζει τις δύο παραπάνω αρχιτεκτονικές: κόμβοι με αρχιτεκτονική
κοινής μνήμης διασυνδέονται με ένα δίκτυο διασύνδεσης σε αρχιτεκτονική
κατανεμημένης μνήμης
 Τυπική αρχιτεκτονική των σύγχρονων συστοιχιών-υπερυπολογιστών, data
centers και υποδομών cloud
SMP κόμβος 1
$
CPU0
...
$
$
CPUΚ
CPU0
M
SMP κόμβος Ν
SMP κόμβος 2
$
...
CPUΚ
$
...
CPU0
M
Δίκτυο Διασύνδεσης (π.χ. Ethernet, Myrinet, SCI)
13
Συστήματα Παράλληλης Επεξεργασίας
$
...
CPUΚ
M
Μετρικές αξιολόγησης επίδοσης:
Επιτάχυνση (Speedup)
 Χρόνος καλύτερου σειριακού αλγορίθμου: Ts
 Χρόνος παράλληλου αλγορίθμου: Tp
 Επιτάχυνση (speedup) S = Ts / Tp
14
Δείχνει πόσες φορές πιο γρήγορο είναι το παράλληλο πρόγραμμα από το σειριακό
linear (perfect) speedup σε p επεξεργαστές: p
Τυπικά: S ≤ p
Αν S > p → superlinear speedup (πρέπει να το ερμηνεύσουμε προσεκτικά αν
προκύψει στις μετρήσεις μας)
Συστήματα Παράλληλης Επεξεργασίας
Αποδοτικότητα (efficiency) και
κλιμακωσιμότητα (scalability)
 Αποδοτικότητα (efficiency) E = S / p
 Δείχνει πόσο επιτυχημένη είναι η παραλληλοποίηση – τι ποσοστό του χρόνου κάθε
επεξεργαστής κάνει χρήσιμη δουλειά
 Τυπικά Ε ≤ 1
 H κλιμακωσιμότητα (scalability) εκφράζει ποιοτικά την ικανότητα ενός
προγράμματος (συστήματος) να βελτιώνει την επίδοσή του με την προσθήκη
επιπλέον επεξεργαστών (πόρων)
 Strong scaling: Κρατάμε το συνολικό μέγεθος του προβλήματος σταθερό
 Weak scaling: Κρατάμε το μέγεθος ανά επεξεργαστή σταθερό
15
Συστήματα Παράλληλης Επεξεργασίας
Ο (αμείλικτος) νόμος του Amdahl
 Χρόνος καλύτερου σειριακού αλγορίθμου: Ts
 f το κλάσμα του χρόνου ενός σειριακού προγράμματος που δεν παραλληλοποιείται
 Νόμος του Amdahl:
T p = fT s
(
1- f ) Ts
+
p
T
1
S= s =
T p f + (1 - f )
p
 Έστω ότι ένα πρόγραμμα μπορεί να μοιραστεί σε 5 παράλληλες εργασίες εκ των οποίων η μία
απαιτεί διπλάσιο χρόνο από τις υπόλοιπες 4
 f = 1/6
 Αν p = 5 (αναθέτουμε κάθε μία από τις παράλληλες εργασίες σε έναν επεξεργαστή) → S = 3,
E=0,6
 Συνέπειες του νόμου του Amdahl:
 Παραλληλοποιούμε (και γενικά βελτιστοποιούμε) τμήματα του κώδικα που
καταλαμβάνουν το μεγαλύτερο ποσοστό του χρόνου εκτέλεσης
 Αναζητούμε παραλληλία παντού! (π.χ. 1% σειριακός κώδικας → μέγιστο speedup 100!)
16
Συστήματα Παράλληλης Επεξεργασίας
Γιατί δεν κλιμακώνει το
πρόγραμμά μου;
1.
2.
3.
Δεν έχει παραλληλοποιήθεί το κατάλληλο τμήμα κώδικα (υπάρχει μεγάλο
σειριακό κομμάτι, βλ. Νόμος του Amdahl)
Υπάρχει ανισοκατανομή φορτίου (load imbalance)
Κόστος συγχρονισμού / επικοινωνίας
4.
17
Μπορεί να οδηγήσει ακόμα και σε αύξηση του χρόνου εκτέλεσης
Συμφόρηση στο διάδρομο μνήμης (για αρχιτεκτονικές κοινής μνήμης)
Συστήματα Παράλληλης Επεξεργασίας
Γενικοί κανόνες βελτιστοποίησης
κώδικα
 1st and 2nd rule in code optimization…
18
Συστήματα Παράλληλης Επεξεργασίας
Γενικοί κανόνες βελτιστοποίησης
κώδικα
 1st and 2nd rule in code optimization…
DON’T DO IT!
Because…
“premature optimization is the root of all evil…” D. Knuth
19
Συστήματα Παράλληλης Επεξεργασίας
Μοντελοποίηση επίδοσης
 Η μοντελοποίηση της επίδοσης είναι ιδιαίτερα δύσκολη σε ένα πολύπλοκο
σύστημα όπως είναι η εκτέλεση μιας εφαρμογής σε μία παράλληλη
πλατφόρμα
 Θέλουμε το μοντέλο να είναι απλό και ακριβές
 Συνήθως καθοδηγεί σχεδιαστικές επιλογές (π.χ. συγκρίνει διαφορετικές
στρατηγικές)
 Συχνά αρκεί να έχουμε άνω και κάτω όρια στην επίδοση
 Ο παράλληλος χρόνος εκτέλεσης καταναλώνεται σε:
 Χρόνο υπολογισμού (Tcomp)
 Χρόνο επικοινωνίας (Tcomm)
 Άεργο χρόνο (Τidle)
 Παράλληλος χρόνος εκτέλεσης:
 Τ = Tcomp + Tcomm + Tidle
20
Συστήματα Παράλληλης Επεξεργασίας
Χρόνος υπολογισμών
 Κλασικό μοντέλο πρόβλεψης:
 Τcomp = ops * CPU speed
 Θεωρεί ότι η CPU μπορεί να τροφοδοτείται με δεδομένα από το υποσύστημα μνήμης
 Μοντέλο roofline
21
Λαμβάνει υπόψη το υποσύστημα μνήμης
Operational intensity (OI σε ops/byte)
Τcomp = ops * max (CPU speed, 1/(ΟΙ * memory bandwidth))
Συσχετίζει την εφαρμογή με την αρχιτεκτονική
Συστήματα Παράλληλης Επεξεργασίας
Μοντέλο roofline
Image taken from http://lorenabarba.com/news/new-paper-published-cise-journal
22
Συστήματα Παράλληλης Επεξεργασίας
Χρόνος υπολογισμών
Παράδειγμα: LU decomposition
for(k = 0; k < N-1; k++)
for(i = k+1; i < N; i++){
L[i] = A[i][k] / A[k][k];
for(j = k+1; j < N; j++)
A[i][j] = A[i][j] - L[i]*A[j][i];
}
 Operations = N3 / 3 πολλαπλασιασμοί, Ν3/3 προσθέσεις
 Μπορούμε να αγνοήσουμε τις προσθέσεις
 Operational intensity (ops/byte):
23
Μας αφορούν δεδομένα που έρχονται από την κύρια μνήμη (όχι από την cache)
Μπορούμε να αγνοήσουμε το διάνυσμα L
Μέγεθος Α = 8*Ν2 (θεωρούμε διπλή ακρίβεια, 8 bytes για κάθε στοιχείο του Α)
Αν ο A χωράει στην cache: ΟΙ = (N3/ 3) / (8*Ν2) = Ν/24 muls/byte
Αν ο Α >> cache size: Ας θεωρήσουμε ότι σε κάθε βήμα k ο Α φορτώνεται από τη μνήμη (γιατί
δεν είναι τυπικά σωστό αυτό?). ΟΙ = 1/24 muls/byte
Συστήματα Παράλληλης Επεξεργασίας
Χρόνος υπολογισμών
Παράδειγμα: LU decomposition
 Έστω επεξεργαστής με:
 CPU speed 5*108 muls/sec ή 2*10-9 sec/mul (500MFlops)
 Bandwidth διαδρόμου μνήμης: 4GB/sec = 4*109 bytes /sec
 4MB L2 cache
 N = 100 (ο Α χωράει στην cache, OI = 4,16 muls/byte)
 Παραδοσιακό μοντέλο:
 Τcomp = ops * CPU speed = 0.33*106 muls * 2*10-9 sec/mul = 0.66msec
 Μοντέλο roofline:
 Tcomp = ops * min (CPU speed, 1/(ΟΙ * memory bandwidth)) =
0.33*106 muls * max (2*10-9 sec/mul , (4,16 muls/byte * 4*109 bytes/sec)-1)=
0.33*106 muls * max (2*10-9 sec/mul , 6*10-11 sec/mul) = 0.66msec
 N = 2000 (ο Α δεν χωράει στην cache, OI = 0,042 muls/byte)
 Παραδοσιακό μοντέλο:
 Τcomp = ops * CPU speed = 2.66*109 muls * 2 *10-9 sec/mul = 5.33sec
 Μοντέλο roofline:
 Tcomp = ops * max (CPU speed, 1/(ΟΙ * memory bandwidth)) =
2.66*109 muls * max (2 *10-9 sec/mul , (0,042 muls/byte* 4 *109 bytes /sec)-1) =
2.66*109 muls * max (2 *10-9 sec/mul , 5,95*10-9) = 15.9sec
24
Συστήματα Παράλληλης Επεξεργασίας
Χρόνος επικοινωνίας
 Χρόνος επικοινωνίας (point to point):
 Startup time (ts)
 Per-hop time (th)
 Per word transfer time (tw)
 Tcomm = ts + lth + mtw (l = number of hops, m = message size)
 Το lth είναι συνήθως μικρό και μπορεί να ενσωματωθεί στο ts, άρα:
 Tcomm = ts + mtw
 Χρόνος επικοινωνίας (broadcast σε P κόμβους)
 P διαφορετικά μηνύματα
 Tcomm = P(ts + mtw)
 Δενδρική υλοποίηση:
 Tcomm = log2P(ts + mtw)
25
Συστήματα Παράλληλης Επεξεργασίας
Παράδειγμα:
Nearest-neighbor communication
 2 διάστατο υπολογιστικό χωρίο L1 * L2
 Κάθε επεξεργαστής επικοινωνεί με τους γειτονικούς του και
ανταλλάζει τις οριακές επιφάνειες
 Ποια τοπολογία επεξεργαστών ελαχιστοποιεί το κόστος
επικοινωνίας;
1D
26
2D
Συστήματα Παράλληλης Επεξεργασίας
Παράδειγμα:
Nearest-neighbor communication
 Αριθμός επεξεργαστών: P = 100
 1D = 100*1
 2D = 10*10
 διπλή ακρίβεια (8 bytes)
 L1 =104, L2 = 103
 ts = 6*10-6 sec
 bandwidth = 500MB/sec → tw=1.9*10-9 sec/byte
 1D
 2 γείτονες, 1 μήνυμα ανά γείτονα, 2 μηνύματα ανά διεργασία
 Μέγεθος μηνύματος: m=8L2 = 8*103 bytes
 Tcomm = ts + mtw = 2 (6*10-6 sec + 8*103 bytes * 1.9*10-9 sec/byte) = 42.4usec
 2D
 4 μηνύματα ανά διεργασία
 m1=8L1 /10= 8*103 bytes, m2=8L2 /10= 8*102 bytes
 Tcomm = ts + mtw = 4 (6*10-6 sec) + 2(8*103 bytes * 1.9*10-9 sec/byte) + 2(8*102 bytes * 1.9*10-9
sec/byte) = 24us + 30,4us + 3,04us = 57,4us
27
Συστήματα Παράλληλης Επεξεργασίας
Χρόνος επικοινωνίας
(στον πραγματικό κόσμο)
 Συστήματα μεγάλης κλίμακας με χιλιάδες κόμβους, δεκάδες πυρήνες ανά
κόμβο
 Παράμετροι που επηρεάζουν την επικοινωνία:
 Μέγεθος μηνύματος
 Διαφορετικό bandwidth για μικρά/μεσαία/μεγάλα μηνύματα λόγω χρήσης
διαφορετικού πρωτοκόλλου δικτύου
 Τοπικός ανταγωνισμός στο εσωτερικό του κόμβου για πρόσβαση στο δίκτυο
 Ανταγωνισμός στο δίκτυο κορμού
 Μπορεί να οφείλεται και σε άλλες εφαρμογές!
 Απόσταση μεταξύ των κόμβων που επικοινωνούν
 Εξαρτάται από τη διάθεση κόμβων από τον scheduler του συστήματος
 Αριθμός μηνυμάτων
28
Συστήματα Παράλληλης Επεξεργασίας
Άεργος χρόνος
 Ο άεργος χρόνος μπορεί να μοντελοποιηθεί δύσκολα
 Προκύπτει συνήθως από ανισοκατανομή του φόρτου εργασίας (load
imbalance)
 Μπορεί να οφείλεται σε αναμονή για δεδομένα
 Σε αυτή την περίπτωση μπορεί να μοντελοποιηθεί σας μέρος του ts στο χρόνο
επικοινωνίας
 Συχνά δεν είναι απλό να διαχωριστεί από το χρόνο επικοινωνίας
 Π.χ. στην παρακάτω περίπτωση 2 διεργασιών που επικοινωνούν, δεν είναι ξεκάθαρο
ποιο κομμάτι του χρόνου θα πρέπει να χαρακτηριστεί ως άεργος χρόνος και ποιο ως
χρόνος επικοινωνίας
29
Συστήματα Παράλληλης Επεξεργασίας
Σχεδιασμός παράλληλων
προγραμμάτων
 Δεν υπάρχει αυστηρά ορισμένη διαδικασία για το σχεδιασμό και την
υλοποίηση παράλληλων προγραμμάτων
 “It’s more art than science”
 Μετρικές αξιολόγησης:
 Επίδοση του παραγόμενου κώδικα
 Επιτάχυνση
 Αποδοτικότητα
 Κλιμακωσιμότητα
 Παραγωγικότητα (code productivity)
 Χαμηλός χρόνος υλοποίησης
 Μεταφερσιμότητα (portability)
 Ευκολία στη συντήρηση (maintainability)
30
Συστήματα Παράλληλης Επεξεργασίας
Στάδια σχεδιασμού
4 βασικά στάδια (όχι τελείως ανεξάρτητα)
Στάδιο 1: Κατανομή υπολογισμών και δεδομένων
Στάδιο 2: Σχεδιασμός αλληλεπίδρασης ανάμεσα στα tasks
Στάδιο 3: Απεικόνιση των tasks σε διεργασίες (ή threads)
Στάδιο 4: Ενορχήστρωση της επικοινωνίας ή/και του συγχρονισμού
 Σημείωση: Πολλές από τις επιλογές σε κάθε στάδιο εξαρτώνται από την
τελική πλατφόρμα εκτέλεσης
31
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 1: Κατανομή υπολογισμών και
δεδομένων
 Στόχος: κατανομή των υπολογισμών και των δεδομένων σε επεξεργαστικά στοιχεία
 Τι να μοιράσω πρώτα; Υπολογισμούς ή δεδομένα;
 Προσέγγιση παραλληλοποίησης
 task centric: πρώτα μοιράζονται οι υπολογισμοί και βάσει αυτού τα δεδομένα
 data centric: πρώτα μοιράζονται τα δεδομένα, και βάσει αυτού οι υπολογισμοί
 Τελικά θα προκύψουν tasks και κατανομή δεδομένων
 Παράδειγμα: Πολλαπλασιασμός πινάκων (C = A * B)
 task centric: διαμοιρασμός των υπολογισμών με βάση τα γινόμενα διανυσμάτων,
δηλ. 1 task = ένα γινόμενο διανυσμάτων
 data centric: διαμοιρασμός των στοιχείων του πίνακα C, δηλ. 1 task = πράξεις που
χρειάζονται για τον υπολογισμό ενός στοιχείου Cij του πίνακα C
 Ειδική περίπτωση της task centric προσέγγισης είναι η function centric: η κατανομή
γίνεται με βάση τις συναρτήσεις (διαφορετικές λειτουργίες/στάδια)
 function centric: διαμοιρασμός των υπολογισμών ανά πράξη: 1 task = πολλαπλασιαμός, 1
task = πρόσθεση
32
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 1: Κατανομή υπολογισμών και
δεδομένων
 Επιλογή στρατηγικής ανάλογα με τον αλγόριθμο
 Η task centric προσέγγιση είναι η πιο γενική
 Οι task centric και data centric μπορεί να οδηγήσουν σε ακριβώς την ίδια
κατανομή
 Απαιτήσεις:
 Επίδοση
 Μεγιστοποίηση παραλληλίας
 Ελαχιστοποίηση επιβαρύνσεων λόγω διαχείρισης tasks, συγχρονισμού, επικοινωνίας
 Ισοκατανομή φορτίου
 Απλότητα
 Μικρός χρόνος υλοποίησης
 Ευκολία στην επέκταση και τη συντήρηση
 Ευελιξία (ανεξαρτησία από απαιτήσεις υλοποίησης)
33
Συστήματα Παράλληλης Επεξεργασίας
Αναλογία: παρασκευή πίτσας
Μάγειρας → Processing element
Υλικά (ζύμη, σάλτσα, τυρί,…) → data
Στόχος: παραλληλοποίηση της παρασκευής Ν ταψιών πίτσας
Υπόθεση: Συνεργάζονται >1 μάγειρες
task centric προσέγγιση:
 «μοιράζω τη δουλειά»
 1 task = παρασκευή 1 ταψιού πίτσας
 data centric προσέγγιση:
 «μοιράζω τα δεδομένα (υλικά)»
 η κατανομή της δουλειάς προκύπτει σαν φυσικό επακόλουθο του διαμοιρασμού των
δεδομένων
 μοιράζω τα υλικά σε τμήματα (σε Κ μέρη / ανά μάγειρα / ανά πίτσα, θα αποφασιστεί
αργότερα)
 function centric προσέγγιση:
 διαχωρίζω τις διαφορετικές δουλειές
 παρασκευή ζύμης, παρασκευή σάλτσας, προετοιμασία λοιπών υλικών, άπλωμα
ζύμης, τοποθέτηση σάλτσας, τοποθέτηση topping
34
Συστήματα Παράλληλης Επεξεργασίας
Rule of thumb
 Αλγόριθμοι σε κανονικές δομές δεδομένων (π.χ. regular computational grids,
αλγεβρικοί πίνακες) ευνοούν τη data centric κατανομή:
 Πολλαπλασιασμός πινάκων (γενικά βασικές αλγεβρικές ρουτίνες)
 Επίλυση γραμμικών συστημάτων
 Stencil computations
 Όταν μπορεί να εφαρμοστεί, η data centric προσέγγιση οδηγεί σε κομψές λύσεις:
δοκιμάζουμε πρώτα την data centric και αν δεν πετύχει, καταφεύγουμε στην task
centric
35
Συστήματα Παράλληλης Επεξεργασίας
Κατανομή κανονικών δομών
1-dimensional
2-dimensional
+ Απλή στην υλοποίηση
- Περιοριστική
(το task που προκύπτει εξαρτάται
από το Ν του πίνακα)
36
- Δυσκολότερη στην υλοποίηση
+ Πιο ευέλικτη
(ο προγραμματιστής ελέγχει το
μέγεθος του task)
Συστήματα Παράλληλης Επεξεργασίας
Rule of thumb
 H task centric προσέγγιση αποτελεί λύση για πιο δυναμικούς αλγορίθμους σε
ακανόνιστες δομές δεδομένων (irregular data structures)
 Αλγόριθμοι σε λίστες, δέντρα, γράφους, κλπ
 Αναδρομικοί αλγόριθμοι
 Event-based εφαρμογές
37
Συστήματα Παράλληλης Επεξεργασίας
Rule of thumb
 H function centric προσέγγιση μπορεί να υιοθετηθεί όταν υπάρχουν
διακριτές φάσεις και «ροή δεδομένων»
 Υπάρχει κάποιου είδους υποστήριξη στο υλικό για κάθε φάση
 Η παραλληλοποίηση σε κάθε φάση με την data centric προσέγγιση δεν οδηγεί σε
ικανοποιητική αξιοποίηση των πόρων (π.χ. δεν κλιμακώνει στο διαθέσιμο αριθμό
πυρήνων λόγω συμφόρησης στο διάδρομο μνήμης)
38
Συστήματα Παράλληλης Επεξεργασίας
Rule of thumb
 H function centric προσέγγιση μπορεί να υιοθετηθεί όταν υπάρχουν
διακριτές φάσεις και «ροή δεδομένων»
 Υπάρχει κάποιου είδους υποστήριξη στο υλικό για κάθε φάση
 Η παραλληλοποίηση σε κάθε φάση με την data centric προσέγγιση δεν οδηγεί σε
ικανοποιητική αξιοποίηση των πόρων (π.χ. δεν κλιμακώνει στο διαθέσιμο αριθμό
πυρήνων λόγω συμφόρησης στο διάδρομο μνήμης)
data centric:
π.χ. 32 threads ανά φάση
load image
scale image
filter image
display image
39
Συστήματα Παράλληλης Επεξεργασίας
Rule of thumb
 H function centric προσέγγιση μπορεί να υιοθετηθεί όταν υπάρχουν
διακριτές φάσεις και «ροή δεδομένων»
 Υπάρχει κάποιου είδους υποστήριξη στο υλικό για κάθε φάση
 Η παραλληλοποίηση σε κάθε φάση με την data centric προσέγγιση δεν οδηγεί σε
ικανοποιητική αξιοποίηση των πόρων (π.χ. δεν κλιμακώνει στο διαθέσιμο αριθμό
πυρήνων λόγω συμφόρησης στο διάδρομο μνήμης)
data centric:
π.χ. 32 threads ανά φάση
load image
scale image
filter image
display image
40
Συστήματα Παράλληλης Επεξεργασίας
Αν κάθε φάση κλιμακώνει μέχρι
τα 8 threads, έχουμε προφανή
σπατάλη πόρων
Rule of thumb
 H function centric προσέγγιση μπορεί να υιοθετηθεί όταν υπάρχουν
διακριτές φάσεις και «ροή δεδομένων»
 Υπάρχει κάποιου είδους υποστήριξη στο υλικό για κάθε φάση
 Η παραλληλοποίηση σε κάθε φάση με την data centric προσέγγιση δεν οδηγεί σε
ικανοποιητική αξιοποίηση των πόρων (π.χ. δεν κλιμακώνει στο διαθέσιμο αριθμό
πυρήνων λόγω συμφόρησης στο διάδρομο μνήμης)
load image (#4)
8 threads
scale image (#3)
8 threads
filter image (#2)
8 threads
display image (#1)
8 threads
41
Συστήματα Παράλληλης Επεξεργασίας
Παράδειγμα: Εξίσωση θερμότητας
 Αλγόριθμος του Jacobi (2-διάστατο πλέγμα Χ * Υ)
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] +
A[step][i+1][j] + A[step][i][j-1] +
A[step][i][j+1])
Data centric
Μοιράζουμε τα δεδομένα ανά σημείο / γραμμή /
στήλη / μπλοκ
Κάθε task αναλαμβάνει να υπολογίσει την τιμή
σε κάθε διαμοιρασμένο δεδομένο
42
Task centric
1 task = υπολογισμός θερμότητας για κάθε
σημείο του χωρίου
1 task = υπολογισμός θερμότητας για κάθε
χρονικό βήμα
1 task = υπολογισμός θερμότητας για μία
γραμμή / στήλη / block του δισδιάστατου
πλέγματος για όλες τις χρονικές στιγμές
1 task = υπολογισμός θερμότητας για μία γραμμή
/ στήλη / block του δισδιάστατου πλέγματος για
μία χρονική στιγμή
Κατανομή δεδομένων: Κάθε task κατέχει (owns)
τα δεδομένα που γράφει
Συστήματα Παράλληλης Επεξεργασίας
Ανάθεση δεδομένων
 Τα δεδομένα του προβλήματος μπορούν να ανατεθούν ως:
 Μοιραζόμενα δεδομένα (shared data):
 Μπορεί να υποστηριχθεί μόνο από προγραμματιστικά μοντέλα κοινού χώρου
διευθύνσεων
 Αποτελεί ένα πολύ βολικό τρόπο «κατανομής»
 Χρειάζεται ιδιαίτερη πρόνοια όταν τα δεδομένα εγγράφονται από διαφορετικά tasks
(race conditions, ανάγκη συγχρονισμού)
 Κατανεμημένα δεδομένα (distributed data):
 Τα δεδομένα κατανέμονται ανάμεσα στα tasks
 Αποτελεί τη βασική προσέγγιση στα προγραμματιστικά μοντέλα ανταλλαγής
μηνυμάτων
 Επιβάλλει επιπλέον προγραμματιστικό κόστος
 Αντιγραμμένα δεδομένα (replicated data):
 Για αντιγραφή μικρών read-only δομών δεδομένων
 Για αντιγραφή υπολογισμών
43
Συστήματα Παράλληλης Επεξεργασίας
Ομαδοποίηση/παραμετροποίηση
tasks
 Η ομαδοποίηση των tasks κάνει τη συνέχεια της υλοποίησης πιο ευέλικτη
 Ανεξάρτητη από το μέγεθος του προβλήματος
 «Παραμετροποιήσιμη» (tunable) σε σχέση με τις απαιτήσεις της πλατφόρμας
εκτέλεσης
 Π.χ. στην εξίσωση διάχυσης η ομαδοποίηση tasks σε δύο διαστάσεις του χωρικού
πλέγματος παραμετρικά (π.χ. B1 * B2 αρχικά tasks δημιουργούν ένα νέο task) παρέχει
ευελιξία στη συνέχεια της υλοποίησης.
44
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 2: Σχεδιασμός
αλληλεπίδρασης ανάμεσα στα tasks
 Ανάγκη για αλληλεπίδραση:
 Δεδομένα που ανήκουν ή παράγονται σε ένα task πρέπει να προσπελαστούν
από ένα άλλο task
 Σε κοινά δεδομένα:
 Race condition: Το αποτέλεσμα της (παράλληλης) εκτέλεσης εξαρτάται από τη
σειρά με την οποία τα tasks προσπελαύνουν τα κοινά δεδομένα
 Π.χ. producer – consumer (counter++, counter--)
 critical section
 Εξάρτηση ανάμεσα σε tasks:
 Η σημασιολογικά ορθή εκτέλεση απαιτεί συγκεκριμένα σειρά πρόσβασης
στα δεδομένα
 ordering
 Σε κατανεμημένα δεδομένα:
 Ένα task χρειάζεται να διαβάσει δεδομένα που παράγει/κατέχει ένα άλλο task
 Δημιουργείται ανάγκη για επικοινωνία
45
Συστήματα Παράλληλης Επεξεργασίας
Εξαρτήσεις
 Εξαρτήσεις δεδομένων υπάρχουν ήδη από το σειριακό πρόγραμμα
 Εξάρτηση υπάρχει όταν 2 εντολές αναφέρονται στα ίδια δεδομένα (θέση
μνήμης)
 4 είδη εξαρτήσεων
Read-After-Write (RAW) ή true dependence
Write-After-Read (WAR) ή anti dependence
Write-After-Write (WAW) ή output dependence
Read-After-Read (not really a dependence)
 Η παράλληλη εκτέλεση πρέπει να σεβαστεί τις εξαρτήσεις του προβλήματος
 Η κατανομή των δεδομένων στα tasks δημιουργεί κατά κανόνα εξαρτήσεις
ανάμεσα στα tasks (π.χ. το task1 πρέπει να διαβάσει δεδομένα που παράγει
το task2)
46
Συστήματα Παράλληλης Επεξεργασίας
Γράφος εξαρτήσεων
(task dependence graph)
 Ή απλά task graph
 Κορυφές: tasks
 Label κορυφής: κόστος υπολογισμού του task
 Ακμές: εξαρτήσεις ανάμεσα στα tasks
 Βάρος ακμής: όγκος δεδομένων που πρέπει να μεταφερθούν (στην
περίπτωση της επικοινωνίας)
47
Συστήματα Παράλληλης Επεξεργασίας
Task graphs: βασικές ιδιότητες
 Τ1: Συνολική εργασία (work), ο χρόνος που
απαιτείται για την εκτέλεση σε 1 επεξεργαστή
 Tp: Χρόνος εκτέλεσης σε p επεξεργαστές
 Κρίσιμο μονοπάτι (critical path): Το μέγιστο
μονοπάτι ανάμεσα στην πηγή και τον προορισμό
του γράφου
 T ∞ : Χρόνος εκτέλεσης σε ∞ επεξεργαστές (span)
και χρόνος εκτέλεσης του κρίσιμου μονοπατιού
 Ισχύει:
 Tp ≥ T1 / p
 Tp ≥ T∞
 Μέγιστο speedup T1 / T∞
48
Συστήματα Παράλληλης Επεξεργασίας
Εξαρτήσεις στην εξίσωση θερμότητας
 1 task = υπολογισμός θερμότητας για κάθε σημείο του χωρίου
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j]
+ A[step][i][j-1] + A[step][i][j+1])
49
Συστήματα Παράλληλης Επεξεργασίας
Εξαρτήσεις στην εξίσωση θερμότητας
 1 task = υπολογισμός θερμότητας για κάθε χρονικό βήμα
Δεν υπάρχουν ταυτόχρονα tasks!
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j]
+ A[step][i][j-1] + A[step][i][j+1])
50
Συστήματα Παράλληλης Επεξεργασίας
Εξαρτήσεις στην εξίσωση θερμότητας
 1 task = υπολογισμός θερμότητας για μία γραμμή του δισδιάστατου
πλέγματος για όλες τις χρονικές στιγμές
Δεν υπάρχει έγκυρη παράλληλη εκτέλεση!
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j]
+ A[step][i][j-1] + A[step][i][j+1])
51
Συστήματα Παράλληλης Επεξεργασίας
Εξαρτήσεις στην εξίσωση θερμότητας
 1 task = υπολογισμός θερμότητας για μία γραμμή του δισδιάστατου
πλέγματος για μία χρονική στιγμή
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + A[step][i+1][j]
+ A[step][i][j-1] + A[step][i][j+1])
52
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 3: Απεικόνιση των tasks σε
διεργασίες (ή threads)
 O τρόπος με τον οποίο ανατίθενται τα tasks σε οντότητες εκτέλεσης (διεργασίες ή
νήματα) μπορεί να επηρεάσει δραματικά την εκτέλεση:
 Παραλληλισμός
 Τοπικότητα δεδομένων
 Κόστος συγχρονισμού και επικοινωνίας
53
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 3: Απεικόνιση των tasks σε
διεργασίες (ή threads)
 O τρόπος με τον οποίο ανατίθενται τα tasks σε οντότητες εκτέλεσης (διεργασίες ή
νήματα) μπορεί να επηρεάσει δραματικά την εκτέλεση:
 Παραλληλισμός
 Τοπικότητα δεδομένων
 Κόστος συγχρονισμού και επικοινωνίας
54
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 3: Απεικόνιση των tasks σε
διεργασίες (ή threads)
 O τρόπος με τον οποίο ανατίθενται τα tasks σε οντότητες εκτέλεσης (διεργασίες ή
νήματα) μπορεί να επηρεάσει δραματικά την εκτέλεση:
 Παραλληλισμός
 Τοπικότητα δεδομένων
 Κόστος συγχρονισμού και επικοινωνίας
55
Συστήματα Παράλληλης Επεξεργασίας
Στατική vs. Δυναμική απεικόνιση
tasks
 Στατική απεικόνιση:
 Διαμοιρασμός των tasks σε threads πριν την έναρξη της εκτέλεσης
 Καλή πρακτική: Αν η εφαρμογή το επιτρέπει, συνηθίζουμε να έχουμε 1 task /
thread (προσαρμόζοντας κατάλληλα το σχεδιασμό μας και στο Στάδιο 1)
 Κατάλληλη στρατηγική για εφαρμογές με:
 ομοιόμορφη και γνωστή εξαρχής κατανομή φορτίου
 ανομοιόμορφη αλλά προβλέψιμη κατανομή φορτίου
 Πλεονεκτήματα :
 Απλή στην υλοποίηση
 Καλή επίδοση για «κανονικές εφαρμογές»
 Μηδενικό overhead
 Μειονεκτήματα:
 Κακή επίδοση για δυναμικές και ακανόνιστες εφαρμογές
56
Συστήματα Παράλληλης Επεξεργασίας
Στατική vs. Δυναμική απεικόνιση
tasks
 Δυναμική απεικόνιση:
 Διαμοιρασμός των tasks σε threads κατά την εκτέλεση
 Κατάλληλη στρατηγική για εφαρμογές με:
 μη προβλέψιμο φορτίο
 δυναμικά δημιουργούμενα tasks
 Πλεονεκτήματα:
 Εξισορρόπηση φορτίου σε δυναμικές και ακανόνιστες εφαρμογές
 Μειονεκτήματα:
 Δύσκολη στην υλοποίηση (συνήθως το αναλαμβάνει το run-time σύστημα)
 Μπορεί να δημιουργήσει bottleneck σε περίπτωση υλοποίησης με ένα κεντρικό
scheduling thread (απαιτούνται κατανεμημένοι αλγόριθμοι)
57
Συστήματα Παράλληλης Επεξεργασίας
Σχετικά ζητήματα απεικόνισης
(δρομολόγησης)
 Δρομολόγηση εργασιών σε ένα υπερυπολογιστικό σύστημα
 N κόμβοι, c πυρήνες ανά κόμβο
 Κ jobs, κάθε job i ζητάει Νi κόμβους και ci πύρήνες
 Στατικές προσεγγίσεις
 Δρομολόγηση παράλληλων εφαρμογών σε επίπεδο λειτουργικού
 Πολυπύρηνο σύστημα
 Κ εφαρμογές με διαφορετικός αριθμό από threads η κάθε μία
 Οι τρέχουσες προσεγγίσεις δεν είναι ικανοποιητικές
 Δρομολόγηση των tasks μίας παράλληλης εφαρμογής σε ένα πολυπύρηνο
σύστημα
 Επαναλήψεις ενός παράλληλου loop
 Tasks μίας παράλληλης εφαρμογής
58
Συστήματα Παράλληλης Επεξεργασίας
data centric, στατική απεικόνιση
1-dim
sequential
59
2-dim
(block)
cyclic
sequential
Συστήματα Παράλληλης Επεξεργασίας
cyclic
Παράδειγμα: Επιλογή
απεικόνισης για LU και stencil
//LU decomposition kernel
for(k=0; k<N-1; k++)
for(i=k+1; i<N; i++){
L[i] = A[i][k] / A[k][k];
for(j=k+1; j<N; j++)
A[i][j]=A[i][j]-L[i]*A[j][i];
}
//stencil
for (t=1; t<T; t++){
for (i=1; i<X; i++)
for (j=1; j<Y; j++)
A[t][i][j] = 0.2*(A[t-1][i][j] + A[t-1][i-1][j] +
A[t-1][i+1][j] + A[t-1][i][j-1] +
A[t-1][i][j]);
}
60
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 4: Ενορχήστρωση της
επικοινωνίας ή/και του συγχρονισμού
 Η κατανομή των υπολογισμών και των δεδομένων δημιουργεί ανάγκες για
επικοινωνία και συγχρονισμό
 Επικοινωνία:
 Κατανεμημένα δεδομένα
 1 task χρειάζεται να διαβάσει δεδομένα που κατέχει ένα άλλο task
 Σημείο-προς-σημείο και συλλογική
 Συγχρονισμός:
 Διατήρηση των εξαρτήσεων: σειριοποίηση μεταξύ tasks
 Αμοιβαίος αποκλεισμός: ελεγχόμενη πρόσβαση σε shared δεδομένα
 Τυπικά patterns συγχρονισμού:
61
critical section
ordering
barrier
readers – writers
Συστήματα Παράλληλης Επεξεργασίας
Στάδιο 4: Ενορχήστρωση της
επικοινωνίας ή/και του συγχρονισμού
 Συχνή επικοινωνία / συγχρονισμός μπορούν να «σκοτώσουν» την επίδοση
ενός παράλληλου προγράμματος
 Βελτιστοποίηση επικοινωνίας
 Κατάλληλη κατανομή δεδομένων → μείωση αναγκών επικοινωνίας
 Επικάλυψη υπολογισμών-επικοινωνίας
 Ζητήματα συγχρονισμού
 Δύσκολη υλοποίηση ορθά συγχρονισμένων προγραμμάτων
 Κόστος εκτέλεσης: fine-grain vs coarse-grain συγχρονισμός
 Εναλλακτικές προσεγγίσεις:
 Non-blocking data structures
 Transactional memory
62
Συστήματα Παράλληλης Επεξεργασίας
Σύνοψη σχεδιασμού παράλληλων
προγραμμάτων
 Δεν υπάρχει ξεκάθαρη μεθοδολογία παραλληλοποίησης προγραμμάτων
 Δύο σημαντικά βήματα (συχνά όχι σειριακά):
 Σχεδιασμός
 Αναζήτηση παραλληληλίας (κατανομή υπολογισμού και δεδομένων σε tasks)
 Δεν λαμβάνονται ιδιαίτερα υπόψη τα εργαλεία προγραμματισμού και η πλατφόρμα
εκτέλεσης
 Υλοποίηση
 Έκφραση παραλληλίας
 Επιλογή προγραμματιστικού μοντέλου και εργαλείων
 Λαμβάνεται υπόψη η πλατφόρμα εκτέλεσης
 2 βασικές προσεγγίσεις σχεδιασμού:
 task centric: κατανέμονται πρώτα οι υπολογισμοί και μετά τα δεδομένα
 data centric: κατανέμονται πρώτα τα δεδομένα και μετά οι υπολογισμοί
 Σημαντική προσέγγιση: functional parallelism (υποπερίπτωση του task parallelism)
 Επιλογή προσέγγισης ανάλογα με τα χαρακτηριστικά της εφαρμογής
63
Συστήματα Παράλληλης Επεξεργασίας
«Μιλώντας» παράλληλα
 Πρώτο βήμα: σχεδιασμός παράλληλων προγραμμάτων = σκέψη
 Δεύτερο βήμα: υλοποίηση παράλληλων προγραμμάτων = ομιλία
 Όπως και στις φυσικές γλώσσες, η σκέψη και η ομιλία είναι δύο στενά
συνδεδεμένες λειτουργίες
 Ερώτημα 1: Τι προγραμματιστικές δομές χρειάζομαι για να μιλήσω
παράλληλα;
 Ερώτημα 2: Τι υποστήριξη χρειάζεται (από την αρχιτεκτονική, το
λειτουργικό, τη γλώσσα προγραμματισμού, τη βιβλιοθήκη χρόνου
εκτέλεσης της γλώσσας) για να υλοποιηθούν οι παραπάνω δομές με
αποδοτικό τρόπο;
 2 κρίσιμα ζητήματα απόδοσης
 Υψηλή επίδοση του παραγόμενου κώδικα (performance)
 Γρήγορη και εύκολη υλοποίηση (productivity)
64
Συστήματα Παράλληλης Επεξεργασίας
Προγραμματιστικά μοντέλα
 Κοινού χώρου διευθύνσεων
Υποστηρίζει κοινά δεδομένα ανάμεσα στα νήματα
Επιταχύνει τον προγραμματισμό
Μπορεί να οδηγήσει σε δύσκολα ανιχνεύσιμα race conditions
Δεν μπορεί να υλοποιηθεί αποδοτικά σε πλατφόρμες που δεν παρέχουν
πρόσβαση σε κοινή μνήμη στο υλικό
 Κατάλληλο για συστήματα κοινής μνήμης
 Περιορισμένος συνολικός αριθμός νημάτων
 Ανταλλαγής μηνυμάτων
 Κάθε διεργασία (νήμα) βλέπει μόνο τα δικά της δεδομένα
 Τα δεδομένα μπορεί να είναι μόνο distributed ή replicated
 Οδηγεί σε χρονοβόρο προγραμματισμό ακόμα και για απλά προγράμματα
(fragmented κώδικας)
 Μπορεί να υποστηριχθεί από πολύ μεγάλης κλίμακας συστήματα
 Υβριδικό: συνδυασμός των παραπάνω 2
65
Συστήματα Παράλληλης Επεξεργασίας
Παράλληλες προγραμματιστικές δομές
 Με αύξουσα ανάγκη σε υποστήριξη από το run-time σύστημα
της γλώσσας
SPMD
parallel for
fork / join
Task graphs
66
Συστήματα Παράλληλης Επεξεργασίας
SPMD
SPMD = Single program multiple data
Όλες οι διεργασίες εκτελούν το ίδιο τμήμα κώδικα
Κάθε διεργασία έχει το δικό της σύνολο δεδομένων
Το αναγνωριστικό της διεργασίας χρησιμοποιείται για να διαφοροποιήσει
την εκτέλεσή της
 Αποτελεί ευρύτατα διαδεδομένη προγραμματιστική τεχνική για παράλληλα
προγράμματα
 Έχει υιοθετηθεί από το MPI
67
Συστήματα Παράλληλης Επεξεργασίας
SPMD
 Ταιριάζει σε εφαρμογές όπου εκτελούνται όμοιες λειτουργίες σε
διαφορετικά δεδομένα (data parallelism)
 Απαιτεί σχήματα συγχρονισμού και ανταλλαγής δεδομένων μεταξύ των
διεργασιών
 Σε πρωτόγονο επίπεδο τα παραπάνω παρέχονται από το λογισμικό
συστήματος
 Το μοντέλο SPMD μπορεί να υλοποιηθεί χωρίς επιπρόσθετη υποστήριξη
 Παρόλα αυτά το MPI διευκολύνει τον προγραμματισμό παρέχοντας μη
πρωτόγονες ρουτίνες και ανεξαρτησία από την πλατφόρμα εκτέλεσης
 Θεωρείται κοπιαστική προσέγγιση (non-productive) καθώς τα αφήνει
(σχεδόν) όλα στον προγραμματιστή
 Μπορεί να οδηγήσει σε υψηλή επίδοση καθώς ο προγραμματιστής έχει τον
(σχεδόν) πλήρη έλεγχο της υλοποίησης
68
Συστήματα Παράλληλης Επεξεργασίας
Βήματα υλοποίησης στο σχήμα SPMD
 Αρχικοποίηση
 Λήψη αναγνωριστικού
 Εκτέλεση του ίδιου κώδικα σε όλους τους κόμβους και
διαφοροποίηση ανάλογα με το αναγνωριστικό
 Εναλλακτικές ροές ελέγχου
 Ανάληψη διαφορετικών επαναλήψεων σε βρόχο
 Κατανομή δεδομένων
 Τερματισμός
69
Συστήματα Παράλληλης Επεξεργασίας
Παράδειγμα: εξίσωση θερμότητας
for (steps=0; steps < T; steps++)
for (i=1; i<X-1; i++)
for (j=1; j<Y-1, j++)
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] +
A[step][i+1][j] + A[step][i][j-1] +
A[step][i][j+1])
myid = get_my_id_from_system();
chunk = X / NUM_PRCS; // υποθέτει X % NUM_PRCS == 0
mystart = myid*chunk + 1;
myend = myend = mystart + chunk;
for (steps=0; steps < T; steps++){
for (i=mystart; i<myend; i++)
for (j=1; j<Y-1, j++)
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] +
A[step][i+1][j] + A[step][i][j-1] +
A[step][i][j+1])
synchronize_or_communicate(…);
}
70
Συστήματα Παράλληλης Επεξεργασίας
parallel for
 Η παραλληλοποίηση των for-loops αποτελεί σημαντικότατη προσέγγιση στο
σχεδιασμό ενός παράλληλου προγράμματος
 Όπως είδαμε, μπορεί να επιτευχθεί στο μοντέλο SPMD αλλά για
προγραμματιστική ευκολία έχει ενσωματωθεί σε γλώσσες και εργαλεία:
 OpenMP
 Cilk
 ΤΒΒs
 PGAS
 Χρειάζεται υποστήριξη από το σύστημα
 Αυτόματη μετάφραση του parallel for σε κώδικα
 Διαχείριση των δεδομένων
 Δρομολόγηση των νημάτων/εργασιών
 Είναι ευθύνη του προγραμματιστή να αποφασίσει αν ένα loop είναι
παράλληλο
71
Συστήματα Παράλληλης Επεξεργασίας
automatic parallelization
 Η εύρεση των παράλληλων for αποτελεί τον κυριότερο στόχο της
αυτόματης παραλληλοποίησης
 Ειδικά περάσματα optimizing compilers αναζητούν:
 Αν ένα loop είναι παράλληλο
 Αν αξίζει να παραλληλοποιηθεί
 Η “απόδειξη” της παραλληλίας ενός loop είναι πολύ δύσκολη και βασίζεται
στα λεγόμενα dependence tests
72
Συστήματα Παράλληλης Επεξεργασίας
dependence analysis
 Πότε ένα loop είναι παράλληλο;
 Όταν δεν υπάρχουν εξαρτήσεις ανάμεσα στις επαναλήψεις του
 Τέλεια φωλιασμένοι βρόχοι:
for i1 = 1 to U1
for i2 = 1 to U2
…
for in = 1 to Un
…
 Διανύσματα εξαρτήσεων d εκφράζουν τις εξαρτήσεις σε κάθε επίπεδο του
φωλιάσματος
 Πίνακας εξαρτήσεων D, περιέχει κατά στήλες τα διανύσματα εξάρτησης
 Διανύσματα απόστασης (distance vectors)
 Στοιχεία του πίνακα D dij είναι σταθεροί ακέραιοι αριθμοί
 Διανύσματα κατεύθυνσης (direction vectors):
 > (υπάρχει εξάρτηση από προσβάσεις στη μνήμη προηγούμενων επαναλήψεων)
 < (υπάρχει εξάρτηση από προσβάσεις στη μνήμη επόμενων επαναλήψεων)
 * (υπάρχει εξάρτηση από προσβάσεις στη μνήμη προηγούμενων ή επόμενων επαναλήψεων)
73
Συστήματα Παράλληλης Επεξεργασίας
Παράδειγμα: εξίσωση θερμότητας
for (steps=0; steps < T; steps++)
for (i=1; i<X-1; i++)
for (j=1; j<Y-1, j++)
A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] +
A[step][i+1][j] + A[step][i][j-1] +
A[step][i][j+1])
1 1 1 1 1 
D = 0 1 − 1 0 0 
0 0 0 1 − 1
74
Συστήματα Παράλληλης Επεξεργασίας
Παράδειγμα: Floyd-Warshall
for (k=0; k<N; k++)
for (i=0; i<N; i++)
for (j=0; j<N, j++)
A[(k+1)%2][i][j] = min(A[k%2][i][j], A[k%2][i][k] + A[k%2][k][j])
1 1 1
D = 0 0 *
0 * 0
75
Συστήματα Παράλληλης Επεξεργασίας
Κανόνες παραλληλίας loop
 Ένας βρόχος στο επίπεδο i ενός φωλιασμένου βρόχου είναι
παράλληλος αρκεί να ισχύει οτιδήποτε από τα παρακάτω:
1. το i-οστό στοιχείο ΟΛΩΝ των διανυσμάτων εξάρτησης είναι 0
2. ΟΛΑ τα υποδιανύσματα από 0 εως i-1 να είναι λεξικογραφικά
ΘΕΤΙΚΑ (= το πρώτο μη μηδενικό στοιχείο είναι θετικό)
 Επισήμανση: Για τον εξωτερικότερο βρόχο (i=0) μπορεί να
εφαρμοστεί μόνο ο πρώτος κανόνας (δεν υπάρχουν
υποδιανύσματα από 0 εως -1)
 Άσκηση: Ποια loops παραλληλοποιούνται στην εξίσωση
θερμότητας και στον αλγόριθμο FW?
76
Συστήματα Παράλληλης Επεξεργασίας
fork / join
Αφορά εφαρμογές με δυναμική ανάγκη για δημιουργία / τερματισμό tasks
Τα tasks δημιουργούνται (fork) και τερματίζονται (join) δυναμικά
Π.χ. αλγόριθμος σχεδιασμένος με την Divide and Conquer στρατηγική
OpenMP tasks
 #pragma omp task
 #pragma omp taskwait
 Cilk
 spawn
 sync
77
Συστήματα Παράλληλης Επεξεργασίας
Παράδειγμα fork - join
A
B
C
D
E
F
G
78
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task A();
#pragma omp task if (0)
{
#pragma omp task B();
#pragma omp task if (0)
{
#pragma omp task C();
D();
#pragma omp taskwait
E();
}
#pragma omp taskwait
F();
}
#pragma omp taskwait
G();
}
}
Συστήματα Παράλληλης Επεξεργασίας
Task graphs
 Η fork-join δομή δεν μπορεί να περιγράψει όλα τα task graphs
 Όταν ένα task graph είναι γνωστό στατικά, τότε μπορούμε να
το περιγράψουμε άμεσα
79
Συστήματα Παράλληλης Επεξεργασίας
graph g;
source_node s;
//source node
Παράδειγμα task graph
//each node executes a different function body
node a( g, body_A() );
node b( g, body_B() );
node c( g, body_C() );
node d( g, body_D() );
node e( g, body_E() );
node f( g, body_F() );
node h( g, body_H() );
node i( g, body_I() );
node j( g, body_J() );
//create edges
make_edge( s, a
make_edge( s, b
make_edge( s, c
make_edge( a, d
make_edge( b, e
make_edge( c, f
make_edge( d, h
make_edge( e, h
make_edge( f, i
make_edge( h, j
make_edge( i, j
);
);
);
);
);
);
);
);
);
);
);
s.start(); // start parallel execution of task graph
g.wait_for_all(); //wait for all to complete
80
Συστήματα Παράλληλης Επεξεργασίας
POSIX threads
 Αποτελούν πρωτόγονο τρόπο πολυνηματικού προγραμματισμού για
systems programming
 Συνδυαζόμενα με TCP/IP sockets αποτελούν την πιο βασική πλατφόρμα
εργαλείων για παράλληλο προγραμματισμό
 SPMD ή Master / Slave
 + : ο χρήστης έχει απόλυτο έλεγχο της εκτέλεσης
 - : ιδιαίτερα κοπιαστικός και επιρρεπής σε σφάλματα τρόπος
προγραμματισμού
81
Συστήματα Παράλληλης Επεξεργασίας
MPI
 Μοντέλο ανταλλαγής μηνυμάτων για συστήματα κατανεμημένης μνήμης
 Αποτελεί τον de facto τρόπο προγραμματισμού σε υπερυπολογιστικά
συστήματα
 SPMD (και Master / Slave)
 Απλοποιεί την υλοποίηση της επικοινωνίας σε σχέση με τη βιβλιοθήκη των
sockets καθώς υποστηρίζει μεγάλο αριθμό από χρήσιμες ρουτίνες
 Βελτιστοποιεί την επικοινωνία (κυρίως σε collective επικοινωνία)
 Ο χρήστης αναλαμβάνει το διαμοιρασμό των δεδομένων και την
επικοινωνία μέσω μηνυμάτων
 “fragmented” τρόπος προγραμματισμού
82
Συστήματα Παράλληλης Επεξεργασίας
OpenMP
 Προγραμματιστικό εργαλείο που βασίζεται σε οδηγίες (directives) προς το
μεταγλωττιστή
 Αφορά κατά κύριο λόγο αρχιτεκτονικές κοινής μνήμης
 Μπορεί να αξιοποιηθεί για την εύκολη παραλληλοποίηση ήδη υπάρχοντος
σειριακού κώδικα
 Παρέχει ευελιξία στο προγραμματιστικό στυλ:
 SPMD
 Master / Workers
 parallel for
 Fork / Join (ενσωμάτωση των tasks, 2008)
83
Συστήματα Παράλληλης Επεξεργασίας
Cilk
 Πολυνηματικός προγραμματισμός για αρχιτεκτονικές κοινής μνήμης
 Επεκτείνει τη C με λίγες επιπλέον λέξεις κλειδιά
 Κάθε πρόγραμμα γραμμένο σε Cilk έχει ορθή σειριακή σημασιολογία (μπορεί να εκτελεστεί
σωστά σειριακά)
 Σχεδιασμός προγραμμάτων με χρήση αναδρομής
 Σχήμα Fork / Join
 Υποστήριξη parallel for
 Βασικές λέξεις κλειδιά: cilk, spawn, sync
C
void vadd (real *A, real *B, int n){
int i; for (i=0; i<n; i++) A[i]+=B[i];
}
Cilk
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;
}
Συστήματα Παράλληλης Επεξεργασίας
84
CUDA
 Compute Unified Device Architecture
 Παράλληλη αρχιτεκτονική που
προτάθηκε από την NVIDIA
 Βασίζεται σε GPUs (GP-GPUs =
General Purpose-Graphical
processing Units)
 Προγραμματισμός: C extensions για
αρχιτεκτονικές CUDA
 Ανάθεση υπολογιστικά απαιτητικών
τμημάτων του κώδικα στην κάρτα
γραφικών
 GPU = accelerator
 massively data parallel
 Manycore system
85
Συστήματα Παράλληλης Επεξεργασίας
Προγραμματισμός σε περιβάλλον
CUDA
SIMT = Single Instruction Multiple Threads
Τα threads δρομολογούνται σε ομάδες που λέγονται warps
Το κόστος δρομολόγησης των threads είναι μηδενικό
Σε κάθε κύκλο όλα τα threads εκτελούν την ίδια εντολή
 Εκτελούνται όλα τα control paths
 Τα μη έγκυρα control paths ματαιώνονται (aborted) στο τέλος
 Οι αλγόριθμοι πρέπει να σχεδιάζονται με data parallel λογική
 Τα branches και ο συγχρονισμός κοστίζουν
 Η χωρική τοπικότητα αξιοποιείται κατά μήκος των threads και όχι εντός
μιας CPU όπως γίνεται στους συμβατικούς επεξεργαστές
 Αρκετά «σκιώδη» ζητήματα επηρεάζουν την επίδοση και χρήζουν
ιδιαίτερης προσοχής
 Παραλληλισμός
 Πρόσβαση στα δεδομένα
 Συγχρονισμός
86
Συστήματα Παράλληλης Επεξεργασίας
Γλώσσες PGAS
 Partitioned Global Address Space
 Προσπαθεί να έχει τα θετικά και από τους δύο κόσμους:
 Προγραμματιστική ευκολία όπως το μοντέλο του κοινού χώρου διευθύνσεων
 Επίδοση και κλιμακωσιμότητα όπως το μοντέλο της ανταλλαγής μηνυμάτων
 Υποθέτει καθολικό χώρο διευθύνσεων (global address space) που κατανέμεται
(partitioned) στις τοπικές μνήμες των επεξεργαστών ενός συστήματος
κατανεμημένης μνήμης
 Απαιτεί πολύ ισχυρό run-time σύστημα
 Για προσβάσεις σε δεδομένα που βρίσκονται σε απομακρυσμένη μνήμη
χρησιμοποιεί 1-sided communication
 Υλοποιήσεις:
87
UPC
Fortress
Co-array Fortrean
X10
Chapel
Συστήματα Παράλληλης Επεξεργασίας
Languages and tools
SPMD
MPI
√
OpenMP
√
Task graph
Cilk
TBB
√
CUDA
√
88
√
Συστήματα Παράλληλης Επεξεργασίας
parallel for
fork / join
√
√
√ (Cilk++)
√
√
√
Αλληλεπίδραση με το υλικό:
κοινή μνήμη
 Κρίσιμος πόρος: ιεραρχία μνήμης
 Οργάνωση μνήμης (UMA / NUMA) και κρυφών μνημών (επίπεδα διαμοιράσματος)
 Συνάφεια κρυφής μνήμης (cache coherence)
 Διαμοιρασμός δεδομένων:
 true sharing
 false sharing
 cache coherence overheads
 Σε κοινή cache:
 Constructive sharing
 Destructive sharing
 Συγχρονισμός:
 Critical sections: περιορισμός παραλληλίας
 Lock contention
 Locking overhead
 Κορεσμός του διαδρόμου μνήμης
 Ανταγωνισμός για τη μνήμη πολλών νημάτων μπορεί να περιορίσει την κλιμακωσιμότητα
89
Συστήματα Παράλληλης Επεξεργασίας
Αλληλεπίδραση με το υλικό:
κατανεμημένη μνήμη
 Κρίσιμος πόρος: δίκτυο διασύνδεσης
 Κατανομή δεδομένων
 Παραλληλία
 Συνολική δουλειά
 Επικοινωνία
 Τεχνικές μείωσης του κόστους επικοινωνίας
Coarse-grain (bulk) communication
Point-to-point vs. collective
Overlapping
Communication avoiding algorithms
 Διαμοιρασμός πόρων σε υβριδικά συστήματα
 Π.χ. σε ένα σύστημα με Ν κόμβους και c πυρήνες σε κάθε κόμβο, πόσες MPI
διεργασίες και OpenMP threads/διεργασία πρέπει να επιλέξω;
90
Συστήματα Παράλληλης Επεξεργασίας
                
    
            
    
                © Copyright 2025 Paperzz