Παράλληλος προγραµµατισµός: Σχεδιασµός παράλληλων προγραµµάτων
Αρχιτεκτονικές Αξιολόγηση επίδοσης Σχεδιασµός παράλληλων προγραµµάτων task centric data centric function centric Σύνοψη παρουσίασης ιαµοιρασµός δεδοµένων επικοινωνία - συγχρονισµός
SISD Single Instruction Single Data SIMD Single Instruction Multiple Data MISD Multiple Instruction Single Data MIMD Multiple Instruction Multiple Data Παράλληλεςαρχιτεκτονικές: Flynn s taxonomy
Παράλληλεςαρχιτεκτονικές: Flynn s taxonomy
Οργάνωση µνήµης Κοινής µνήµης (shared memory) Παράλληλεςαρχιτεκτονικές: Οργάνωση µνήµης UMA (Uniform memory access): Χρόνος προσπέλασης ανεξάρτητος του επεξεργαστή και της θέσης µνήµης NUMA (Non-uniform memory access): Χρόνος προσπέλασης εξαρτάται από τον επεξεργαστή και τη θέση µνήµης cc-numa (cache-coherent NUMA): NUMA µε συνάφεια κρυφής µνήµης (περισσότερα σε επόµενα µαθήµατα) Κατανεµηµένης µνήµης (distributed memory) Υβριδική
Αρχιτεκτονική κοινής µνήµης Οι επεξεργαστές έχουν κοινή µνήµη Κάθε επεξεργαστής διαθέτει τοπική ιεραρχία κρυφών µνηµών Συνήθως η διασύνδεση γίνεται µέσω διαδρόµου µνήµης (memory bus) Αλλά και πιο εξελιγµένα δίκτυα διασύνδεσης Οµοιόµορφη ή µη-οµοιόµορφη προσπέλαση στη µνήµη (Uniform Memory Access UMA, Non-uniform Memory Access NUMA) Η κοινή µνήµη διευκολύνει τον παράλληλο προγραµµατισµό ύσκολα κλιµακώσιµη αρχιτεκτονική τυπικά µέχρι λίγες δεκάδες κόµβους (δεν κλιµακώνει το δίκτυο διασύνδεσης)
Αρχιτεκτονική κατανεµηµένης µνήµης Κάθε επεξεργαστής έχει τη δική του τοπική µνήµη και ιεραρχία τοπικών µνηµών ιασυνδέεται µε τους υπόλοιπους επεξεργαστές µέσω δικτύου διασύνδεσης Η κατανεµηµένη µνήµη δυσκολεύει τον προγραµµατισµό Η αρχιτεκτονική κλιµακώνει σε χιλιάδες υπολογιστικούς κόµβους Κόµβος 1 Κόµβος 2 Κόµβος Ν $ $ $ CPU CPU... CPU M M M ίκτυο ιασύνδεσης (π.χ. Ethernet, Myrinet, SCI)
Υβριδική αρχιτεκτονική Συνδυάζει τις δύο παραπάνω αρχιτεκτονικές: κόµβοι µε αρχιτεκτονική κοινής µνήµης διασυνδέονται µε ένα δίκτυο διασύνδεσης σε αρχιτεκτονική κατανεµηµένης µνήµης Τυπική αρχιτεκτονική των σύγχρονων συστοιχιών-υπερυπολογιστών
Επιτάχυνση και αποδοτικότητα Χρόνος καλύτερου σειριακού αλγορίθµου: T s Χρόνος παράλληλου αλγορίθµου: T p Επιτάχυνση (speedup) S = T s / T p είχνει πόσες φορές πιο γρήγορο είναι το παράλληλο πρόγραµµα από το σειριακό linear (perfect) speedup σε p επεξεργαστές: p Τυπικά: S p Αν S > p superlinear speedup (πρέπει να το ερµηνεύσουµε προσεκτικά αν προκύψει στις µετρήσεις µας) Αποδοτικότητα (efficiency) E = S / p είχνει πόσο επιτυχηµένη είναι η παραλληλοποίηση τι ποσοστό του χρόνου κάθε επεξεργαστής κάνει χρήσιµη δουλειά Τυπικά Ε 1
Ο (αµείλικτος) νόµος του Amdahl Χρόνος καλύτερου σειριακού αλγορίθµου: T s f το κλάσµα του χρόνου ενός σειριακού προγράµµατος που δεν παραλληλοποιείται Νόµος του Amdahl: T p S= = ft T T s p s = + f ( 1- f) + 1 p T s ( 1- f) p Έστω ότι ένα πρόγραµµα µπορεί να µοιραστεί σε 5 παράλληλες εργασίες εκ των οποίων η µία απαιτεί διπλάσιο χρόνο από τις υπόλοιπες 4 f = 1/6 Αν p = 5 (αναθέτουµε κάθε µία από τις παράλληλες εργασίες σε έναν επεξεργαστή) S = 3, E=0,6 Συνέπεια του νόµου του Amdahl: παραλληλοποιούµε (και γενικά βελτιστοποιούµε) τµήµατα του κώδικα που καταλαµβάνουν το µεγαλύτερο ποσοστό του χρόνου εκτέλεσης
1 st and 2 nd rule in code optimization Γενικοί κανόνες βελτιστοποίησης κώδικα DON T DO IT! Because premature optimization is the root of all evil D. Knuth
Εφαρµογές µε ανάγκη για παράλληλο υπολογισµό Παραδοσιακά HPC applications, π.χ. seven dwarves 1. Dense Linear Algebra 2. Sparse Linear Algebra 3. Spectral Methods 4. N-Body Methods 5. Structured Grids 6. Unstructured Grids 7. MapReduce New HPC applications 1. Combinational Logic 2. Find Nearest Neighbors 3. Graph Traversal 4. Dynamic Programming 5. Back-track/Branch & Bound 6. Graphical Model Inference 7. Finite State Machine Σχεδιασµός παράλληλων προγραµµάτων Desktop/server/gaming applications for multicore platforms
Σχεδιασµός παράλληλων προγραµµάτων Στόχος: κατανοµή των υπολογισµών και των δεδοµένων σε επεξεργαστικά στοιχεία Τι να µοιράσωπρώτα; Υπολογισµούς ή δεδοµένα; Προσέγγιση παραλληλοποίησης task centric: πρώτα µοιράζονται οι υπολογισµοί και βάσει αυτού τα δεδοµένα data centric: πρώτα µοιράζονται τα δεδοµένα, και βάζει αυτού οι υπολογισµοί function centric: η κατανοµή γίνεται µε βάση τις συναρτήσεις (διαφορετικές λειτουργίες) Τελικά θα προκύψουν tasks και κατανοµή δεδοµένων Παράδειγµα: Πολλαπλασιασµός πινάκων (C = A B) task centric: διαµοιρασµός των υπολογισµών µε βάση τα γινόµενα διανυσµάτων, δηλ. 1 task = έναγινόµενοδιανυσµάτων data centric: διαµοιρασµόςτωνυπολογισµώνανάστοιχείοτουπίνακα C, δηλ. 1 task = πράξειςπουχρειάζονταιγιατονυπολογισµόενόςστοιχείου C ij του πίνακα C function centric: διαµοιρασµός των υπολογισµών ανά πράξη: 1 task = πολλαπλασιαµός, 1 task = πρόσθεση
Επιλογή στρατηγικής ανάλογα µε τον αλγόριθµο Η task centric προσέγγιση είναι η πιο γενική Σχεδιασµός παράλληλων προγραµµάτων Οι task centric και data centric µπορεί να οδηγήσουν σε ακριβώς την ίδια κατανοµή Η task centric και function centric προσέγγιση αφορούν και οι δύο υπολογισµούς. Η function centric µπορεί να θεωρηθεί υποπερίπτωση της task centric Trial and error διαδικασία Θυµηθείτε: ο παράλληλος προγραµµατισµός είναι περισσότερο τέχνη παρά επιστήµη! Απαιτήσεις: Ευελιξία (ανεξαρτησία από απαιτήσεις υλοποίησης) Αποδοτικότητα (Μεγιστοποίηση παραλληλίας, ελαχιστοποίηση επιβαρύνσεων λόγω διαχείρισης tasks, συγχρονισµού, επικοινωνίας) Απλότητα
Αναλογία: παρασκευήπίτσας Μάγειρας Processing element Υλικά (ζύµη, σάλτσα, topping) data Στόχος: παραλληλοποίηση της παρασκευής Ν ταψιών πίτσας Υπόθεση: Συνεργάζονται >1 µάγειρες task centric προσέγγιση: «µοιράζω τη δουλειά» 1 task = παρασκευή 1 ταψιού πίτσας data centric προσέγγιση: «µοιράζω τα δεδοµένα (υλικά)» η κατανοµή της δουλειά προκύπτει σαν φυσικό επακόλουθο του διαµοιρασµού των δεδοµένων µοιράζω τα υλικά σε τµήµατα (σε Κ µέρη / ανά µάγειρα / ανά πίτσα, θα αποφασιστεί αργότερα) function centric προσέγγιση: διαχωρίζω τις διαφορετικές δουλειές παρασκευή ζύµης, παρασκευή σάλτσας, προετοιµασία topping, άπλωµα ζύµης, τοποθέτηση σάλτσας, τοποθέτηση topping
task centric Πρόβληµα: πώς µπορεί να διαµοιραστεί ένα πρόβληµα σε tasks που µπορούν να εκτελεστούν ταυτόχρονα; Προσέγγιση: αναζήτηση tasks που να µπορούν να εκτελεστούν ταυτόχρονα Βήµατασχεδιασµού: 1οβήµα: Αναγνώριση του µεγαλύτερου δυνατού αριθµού από tasks 2 ο βήµα: Κατανοµή δεδοµένων 3 ο βήµα: Αναγνώριση εξαρτήσεων 4 ο βήµα: Οµαδοποίηση tasks
Παράδειγµα: Εξίσωσηθερµότητας Αλγόριθµος του 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]) 1 task = υπολογισµός θερµότητας για κάθε σηµείο του χωρίου 1 task = υπολογισµός θερµότητας για κάθε χρονικό βήµα 1 task = υπολογισµός θερµότητας για µία γραµµή / στήλη / block του δισδιάστατου πλέγµατος για όλες τις χρονικές στιγµές 1 task = υπολογισµός θερµότητας για µία γραµµή / στήλη / block του δισδιάστατου πλέγµατος για µία χρονική στιγµή Κατανοµήδεδοµένων: Κάθε task κατέχει (owns) τα δεδοµένα που γράφει
Παράδειγµα: Εξίσωσηθερµότητας Σειριακή υλοποίηση: 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]) Παράλληλη υλοποίηση (OpenMP tasks) #pragma omp parallel #pragma omp single for (steps=0; steps < T; steps++){ for (i=1; i<x-1; i++) for (j=1; j<y-1, j++) #pragma omp task A[step+1][i][j] = 1/5 (A[step][i][j] + A[step][i-1][j] + #pragma omp taskwait } A[step][i+1][j] + A[step][i][j-1] + A[step][i][j+1])
Εξαρτήσεις Εξαρτήσεις δεδοµένων υπάρχουν ήδη από το σειριακό πρόγραµµα Εξάρτηση υπάρχει όταν 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) Γράφος εξαρτήσεων (data dependence graph): κορυφές tasks, ακµές εξαρτήσεις
Εξαρτήσεις στην εξίσωση θερµότητας 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])
Εξαρτήσεις στην εξίσωση θερµότητας 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])
Εξαρτήσεις στην εξίσωση θερµότητας 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])
Εξαρτήσεις στην εξίσωση θερµότητας 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])
Οµαδοποίηση tasks Η οµαδοποίηση των tasks κάνει τη συνέχεια της υλοποίησης πιο ευέλικτη (π.χ. ανεξάρτητη από το µέγεθος του προβλήµατος) Π.χ. στην εξίσωση διάχυσης η οµαδοποίηση tasks σε δύο διαστάσεις του χωρικού πλέγµατος παραµετρικά (π.χ. B 1 B 2 αρχικά tasks δηµιουργούν ένα νέο task) παρέχει ευελιξία στη συνέχεια της υλοποίησης
Οµαδοποίηση tasks Κατάλληλη οµαδοποίηση tasks µπορεί να οδηγήσει σε µείωση ή και σε εξάλειψη εξαρτήσεων (ελαχιστοποίηση αναγκών συγχρονισµού επικοινωνίας)
Οµαδοποίηση tasks Κατάλληλη οµαδοποίηση tasks µπορεί να οδηγήσει σε µείωση ή και σε εξάλειψη εξαρτήσεων (ελαχιστοποίηση αναγκών συγχρονισµού επικοινωνίας)
Οµαδοποίηση tasks Κατάλληλη οµαδοποίηση tasks µπορεί να οδηγήσει σε µείωση ή και σε εξάλειψη εξαρτήσεων (ελαχιστοποίηση αναγκών συγχρονισµού επικοινωνίας)
Αλγοριθµικές δοµές Γραµµική δοµή (task parallelism) Κατάλληλη για προβλήµατα όπου ο αριθµός των tasks είναι προβλέψιµος (π.χ. εξίσωση θερµότητας) οµή «ιαίρει και βασίλευε» Κατάλληλη για προβλήµατα ή πράξεις σε δοµές δεδοµένων που έχουν αναδροµική φύση function merge_sort(m) if length(m) 1 return m var list left, right, result var integer middle = length(m) / 2 for each x in m up to middle add x to left for each x in m after middle add x to right #create left = new merge_sort(left) task right left = = merge_sort(left) merge_sort(right) #create result new = merge(left, task right) return right = result merge_sort(right) #synchronize tasks result = merge(left, right) return result
data centric Ο σχεδιασµός του παράλληλου προγράµµατοςξεκινά από την κατανοµή των δεδοµένων Πρόβληµα: πώς µπορούν να διαµοιραστούν τα δεδοµένα του προβλήµατος ώστε οι πράξεις που διεξάγονται σε αυτά να εκτελούνται παράλληλα; Προσέγγιση: Εξέταση κεντρικών δοµών δεδοµένων στις οποίες εφαρµόζονται οι υπολογισµοί. Τυπικές περιπτώσεις: Πίνακες (π.χ. αλγεβρικοί πίνακες, πλέγµατα, κλπ) Αναδροµικές δοµές δεδοµένων (λίστες, δέντρα, κλπ) Βήµατασχεδιασµού: 1οβήµα: Κατανοµή δεδοµένων 2 ο βήµα: Αναγνώριση του µεγαλύτερου δυνατού αριθµού από tasks 3 ο βήµα: Αναγνώριση εξαρτήσεων 4 ο βήµα: Οµαδοποίηση tasks Παρατήρηση: σχεδιασµός όµοιος µε task centric, µε τα βήµατα 1 και 2 αντιστραµµένα
Παράδειγµα: Εξίσωσηθερµότητας Σειριακή υλοποίηση: 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]) Παράλληλη υλοποίηση (OpenMP parallel for) #pragma omp parallel private (steps) for (steps=0; steps < T; steps++) #pragma omp for private (j) 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]) Κατανοµή των γραµµών του πλέγµατος µέσω του parallel for (ουσιαστικά κατανοµή του «χώρου δεικτών» του i loop)
Αλγοριθµικές δοµές Γεωµετρική δοµή Αφορά αλγορίθµους µε πράξεις σε πίνακες και πλέγµατα Σχήµατα κατανοµής δεδοµένων: κατά στοιχείο / γραµµές / στήλες / µπλοκ / κυκλικά Συνεργασία µεταξύ περιορισµένου αριθµού από tasks (εξίσωση θερµότητας) Αναδροµική δοµή Αφορά αλγορίθµους σε αναδροµικές δοµές (λίστες, δέντρα, γράφους) Περιλαµβάνει τροποποίηση του (πιθανά εγγενώς σειριακού) αλγορίθµου προκειµένου να βελτιωθεί ο παραλληλισµός
Αναδροµικήδοµή: Παράδειγµα Εύρεση ρίζας όλων των κόµβων σε ένα δάσος Ν κόµβων 4 12 4 12 12 12 4 12 4 4 12 4 4 12 Σειριακός αλγόριθµος: tree traversal N βήµατα εγγενώς σειριακός ευκαιρίες για παραλληλισµό: ανά δέντρο, ανά παιδί
Αναδροµικήδοµή: Παράδειγµα Εναλλακτικός αλγόριθµος while!finished do if (my_successor s_successor!= my_successor) my_successor = my_successor s_successor finished = false O (NlogN) Αλλά: Παραλληλοποιείται πιο εύκολα! while!finished in parallel do if (my_successor s_successor!= my_successor) my_successor = my_successor s_successor atomic finished = false
Αναδροµικήδοµή: Παράδειγµα
Αναδροµικήδοµή: Παράδειγµα
Αναδροµικήδοµή: Παράδειγµα
Αναδροµικήδοµή: Παράδειγµα
function centric Ο σχεδιασµός του παράλληλου προγράµµατοςξεκινά από την κατανοµή των πράξεων σε διαφορετικές λειτουργίες Πρόβληµα: πώς µπορούν να διαµοιραστούν οι υπολογισµοί σε διακριτές λειτουργίες πάνω στα δεδοµένα ώστε να επιτυγχάνεται ταυτόχρονη εκτέλεση; Προσέγγιση κατάλληλη για ροές δεδοµένων (data streams), όπου εφαρµόζονται διαδοχικά διαφορετικές λειτουργίες Λογική pipelining για regular ροές δεδοµένων Γενική περίπτωση: event-based προσέγγιση
pipelining Αφορά κανονικές ροές δεδοµένων Π.χ. signal processing (video streams) Ένας αριθµός από πράξεις (φίλτρα) εφαρµόζεται διαδοχικά σε κάθε δεδοµένο
Γράφοι εξαρτήσεων independent streams e.g. offline frame video processing e.g. streaming frame video processing
Παράδειγµα: video frame processing Σειριακός αλγόριθµος: for (frame=1; frame<n; frame++){ f1(video[frame]); f2(video[frame]); f3(video[frame]); f4(video[frame]); }
Παράδειγµα: independent streams #pragma omp parallel #pragma omp single for (frame=1; frame<n; frame++) #pragma omp task { #pragma omp task if (0) f1(video[frame]); #pragma omp task if (0) f2(video[frame]); #pragma omp task if (0) f3(video[frame]); #pragma omp task if (0) f4(video[frame]); }
#pragma omp parallel #pragma omp single for (frame=1; frame<n; frame++) #pragma omp task { } #pragma omp task if (0) f1(video[frame]); #pragma omp task if (0) f2(video[frame]); #pragma omp task if (0) f3(video[frame]); #pragma omp taskwait for (frame=1; frame<n; frame++) f1(video[frame]); Παράδειγµα: offline video frame processing Πιο αυστηρός συγχρονισµός από ότι απαιτείται!
Παράδειγµα: streaming video frame processing #pragma omp parallel #pragma omp single #pragma omp task if(0) f1(video[1]); #pragma omp task if (0){ #pragma omp task f2(video[1]); #pragma omp task f1(video[2]); #pragma omp taskwait } for (frame=4; frame<n-4; frame++) #pragma omp task { #pragma omp task f1(video[frame]); #pragma omp task f2(video[frame-1]); #pragma omp task if (0) f3(video[frame-2]); #pragma omp task if (0) f4(video[frame-3]); } // lead out code...
Stream processing on the Cell B/E Ο επεξεργαστής του PS3 Ετερογενής αρχιτεκτονική: 1 PPE, 8 SPE SPE: απλός in-order επεξεργαστής µε software managed local store (περιορισµένου µεγέθους-256κβ) και δυνατότητα για διανυσµατικούς υπολογισµούς Πολύ γρήγορη διασύνδεση µεταξύ SPE και µνήµης: ~25GB/s ανά link, ~200GB/s συνολικό
Stream processing on the Cell B/E Έστω ότι σε µία ροή δεδοµένων εφαρµόζονται διαδοχικά οι συναρτήσεις f1, f2, f8 Η αρχιτεκτονική του cell ευνοεί την παραλληλοποίηση µε τη λογική του pipeline γιατί: σε κάθε local store φορτώνεται ο κώδικας για µία εκ των f1, f2,, f8 αφήνοντας περισσότερο χώρο για δεδοµένα ο διάδροµος διασύνδεσης επιτρέπει την ταυτόχρονη και πολύ γρήγορη ροή δεδοµένων ανάµεσα στα SPE
event based Αποτελεί τη γενικότερη προσέγγιση για παραλληλοποίηση Εφαρµόζεται όταν καµία άλλη προσέγγιση δεν οδηγεί σε καλή λύση Τα tasks µπορεί να είναι όµοια ή διαφορετικά Τα tasks δηµιουργούνται δυναµικά Τα tasks λαµβάνουν και στέλνουν events
ιαµοιρασµός δεδοµένων Όλες οι προσεγγίσεις καταλήγουν σε µία κατανοµή υπολογισµών και δεδοµένων Τα δεδοµένα µπορεί να είναι: Μοιραζόµενα (shared): όλα τα tasks έχουν ισότιµη πρόσβαση σε όλα τα δεδοµένα µε τις ίδιες εντολές (π.χ. load / store) Κατανεµηµένα (distributed): κάθε task έχει πρόσβαση σε ένα υποσύνολο των δεδοµένων Αντιγραµµένα (replicated): υπάρχουν αντίγραφα των δεδοµένων στα tasks Ο διαµοιρασµός των δεδοµένων είναι µία κρίσιµη παράµετρος που επηρεάζει: το χρόνο των υπολογισµών το χρόνο επικοινωνίας και συγχρονισµού το χρόνο αρχικοποίησης Είναι αναγκαίο να ληφθεί υπόψη η αρχιτεκτονική Κοινή µνήµη: µπορεί να υποστηρίξει και τα τρία σχήµατα (shared, distributed, replicated) Κατανεµηµένη µνήµη: χρειάζεται στρώµα λογισµικού για shared δεδοµένα
C = A B (C, A, B πίνακες Ν Ν) Παράδειγµα: πολλαπλασιασµός πινάκων Κατανοµή υπολογισµών σε P tasks (P<N): κάθε task αναλαµβάνει τον υπολογισµό Ν/P γραµµών του πίνακα C (έστω ότι το P διαιρεί το Ν) Κάθε task χρειάζεται: τις Ν/P γραµµές του C στις οποίες θα γράψει τις αντίστοιχες N/P γραµµές του Α από τις οποίες θα διαβάσει όλο τον πίνακα Β Προσέγγιση για αρχιτεκτονική κοινής µνήµης: C, B, A shared Προσέγγιση για αρχιτεκτονική κατανεµηµένης µνήµης: C distributed, A distributed, B replicated
Επικοινωνία και συγχρονισµός Η κατανοµή των υπολογισµών και των δεδοµένων δηµιουργεί ανάγκες για επικοινωνία και συγχρονισµό Επικοινωνία: Κατανεµηµένα δεδοµένα 1 task χρειάζεται να διαβάσει δεδοµένα που κατέχει ένα άλλο task Συγχρονισµός: ιατήρηση των εξαρτήσεων: σειριοποίηση µεταξύ tasks Αµοιβαίος αποκλεισµός: ελεγχόµενη πρόσβαση σε shared δεδοµένα Συχνή επικοινωνία / συγχρονισµός µπορούν να «σκοτώσουν» την επίδοση ενός παράλληλου προγράµµατος Βελτιστοποίηση επικοινωνίας Κατάλληλη κατανοµή δεδοµένων µείωση αναγκών επικοινωνίας Επικάλυψη υπολογισµών-επικοινωνίας Ζητήµατα συγχρονισµού ύσκολη υλοποίηση ορθά συγχρονισµένων προγραµµάτων Κόστος εκτέλεσης: fine-grain vs coarse-grain συγχρονισµός Εναλλακτικές προσεγγίσεις: Non-blocking data structures Transactional memory
Σύνοψη σχεδιασµού παράλληλων προγραµµάτων εν υπάρχει ξεκάθαρη µεθοδολογία παραλληλοποίησης προγραµµάτων ύο σηµαντικά βήµατα (συχνά όχι σειριακά): Σχεδιασµός Αναζήτηση παραλληληλίας (κατανοµή υπολογισµού και δεδοµένων σε tasks) εν λαµβάνονται ιδιαίτερα υπόψη τα εργαλεία προγραµµατισµού και η πλατφόρµα εκτέλεσης Υλοποίηση Έκφραση παραλληλίας Επιλογή προγραµµατιστικού µοντέλου και εργαλείων Λαµβάνεται υπόψη η πλατφόρµα εκτέλεσης 2 βασικές προσεγγίσειςσχεδιασµού: task parallelism: κατανέµονται πρώτα οι υπολογισµοί και µετά τα δεδοµένα data parallelism: κατανέµονται πρώτα τα δεδοµένα και µετά οι υπολογισµοί Σηµαντική προσέγγιση: functional parallelism (υποπερίπτωση του task parallelism) Επιλογή προσέγγισης ανάλογα µε τα χαρακτηριστικά της εφαρµογής
Σύνοψη σχεδιασµού παράλληλων προγραµµάτων serial algorithm for (i=0; i<n; i++){ A(data[i]); B(data[i]); C(data[i]); }
Σύνοψη σχεδιασµού παράλληλων προγραµµάτων task parallel approach #pragma omp parallel #pragma omp single for (i=0; i<n; i++){ #pragma omp task A(data[i]); B(data[i]); C(data[i]); }
Σύνοψη σχεδιασµού παράλληλων προγραµµάτων data parallel approach #pragma omp parallel for for (i=0; i<n; i++){ A(data[i]); B(data[i]); C(data[i]); }
task/function parallel approach Σύνοψη σχεδιασµού παράλληλων προγραµµάτων #pragma omp parallel #pragma omp single for (i=0; i<n; i++){ #pragma omp task A(data[i]); #pragma omp task B(data[i]); #pragma omp task C(data[i]); }