Γιώργος Δημητρίου Ενότητα 10 η : Βελτιστοποιήσεις Τοπικότητας και Παραλληλισμού: Εξαρτήσεις και Μετασχηματισμοί Βρόχων
Επεξεργασία Πινάκων Παραλληλισμός επιπέδου βρόχου Λόγω παραλληλισμού δεδομένων Επιτυγχάνεται με καλή εκμετάλλευση της τοποθέτησης των πινάκων στη μνήμη Μετασχηματισμοί βρόχων Καλύτερος διαχωρισμός σε παράλληλα επεξεργαζόμενα μπλοκ δεδομένων Μείωση επικοινωνίας Καλύτερη απόδοση της μνήμης Καλύτερη δρομολόγηση εντολών
Εξαρτήσεις Δεδομένων και Παραλληλοποίηση Βρόχοι DOALL: βρόχοι των οποίων οι επαναλήψεις μπορούν να εκτελούνται ταυτόχρονα Όχι εξαρτήσεις δεδομένων μεταξύ επαναλήψεων Παράλληλη εκτέλεση
Παραδείγματα for i = 11, 20 a[i] = a[i] + 3 Παράλληλος! for i = 11, 20 a[i] = a[i-1] + 3 Παράλληλος;
Παραδείγματα for i = 11, 20 a[i] = a[i] + 3 Παράλληλος for i = 11, 20 a[i] = a[i-1] + 3 Σειριακός for i = 11, 20 a[i] = a[i-10] + 3 Παράλληλος;
ψευδοεξαρτήσεις Εξαρτήσεις Βαθμωτών Μεταβλητών Εξάρτηση ΑΜΕ (πραγματική εξάρτηση) a = = a Εξάρτηση ΕΜΑ (αντι-εξάρτηση) = a a = Εξάρτηση ΕΜΕ (εξάρτηση εξόδου) a = a =
Προσπελάσεις Πίνακα for i = 2, 5 a[i] = a[i] + 3 ανάγνωση a[2] a[3] a[4] a[5] εγγραφή a[2] a[3] a[4] a[5]
Αντι-εξαρτήσεις Πίνακα for i = 2, 5 a[i-2] = a[i] + 3 ανάγνωση a[2] a[3] a[4] a[5] εγγραφή a[0] a[1] a[2] a[3]
Πραγματικές Εξαρτήσεις Πίνακα for i = 2, 5 a[i] = a[i-2] + 3 ανάγνωση a[0] a[1] a[2] a[3] εγγραφή a[2] a[3] a[4] a[5]
Τεχνικές Ανάλυσης Νέες τεχνικές ανάλυσης για ανίχνευση παραλληλισμού Δε μας κάνουν οι τεχνικές της ανάλυσης ροής δεδομένων, επειδή αυτές: δε διαφοροποιούν τα μονοπάτια κατά την εκτέλεση του κώδικα Θυμηθείτε τη συνάρτηση meet! δε μελετάνε τις επιδράσεις μεταξύ επαναλήψεων ενός βρόχου Η πληροφορία συντίθεται επαναληπτικά για όλες τις επαναλήψεις μαζί (κλείσιμο)
Δυναμική Εξάρτηση Δεδομένων Έστω o και o δύο λειτουργίες μνήμης σε δυναμική εκτέλεση, όχι απαραίτητα διαφορετικές, πιθανά από διαφορετικές επαναλήψεις ενός βρόχου Υπάρχει εξάρτηση δεδομένων από τη λειτουργία o στην o, εάν και μόνο εάν μία από τις o, o είναι εγγραφή οι o και o μπορούν να αναφέρονται στην ίδια διεύθυνση η o εκτελείται πριν την o
Στατική Εξάρτηση Δεδομένων Έστω a και a δύο προσπελάσεις πίνακα σε στατική σειρά εντολών, όχι απαραίτητα διαφορετικών Υπάρχει εξάρτηση δεδομένων από την προσπέλαση a στην a, εάν και μόνο εάν μία από τις a, a είναι εγγραφή υπάρχουν δυναμικά στιγμιότυπα o της a και o της a τέτοια ώστε τα στιγμιότυπα o και o να μπορούν να αναφέρονται στην ίδια διεύθυνση το στιγμιότυπο o να εκτελείται πριν το o
Αναγνώριση Βρόχων DOALL Βρες τις εξαρτήσεις δεδομένων στο βρόχο Αν δεν υπάρχουν εξαρτήσεις βρόχου (δηλαδή εξαρτήσεις μεταξύ επαναλήψεων ή loop-carried dependences), τότε ο βρόχος είναι παράλληλος
Υπολογισμός Εξαρτήσεων for i = 2, 5 a[i-2] = a[i] + 3 Έχουμε εξάρτηση μεταξύ a[i] και a[i-2], εάν Υπάρχουν δύο επαναλήψεις i r και i w εντός του χώρου επαναλήψεων, τέτοιες ώστε οι i r και i w να διαβάζουν και να γράφουν, αντίστοιχα, το ίδιο στοιχείο πίνακα: i r, i w, 2 i r, i w 5, i r = i w -2
Υπολογισμός Εξαρτήσεων for i = 2, 5 a[i-2] = a[i] + 3 Έχουμε εξάρτηση μεταξύ a[i-2] και a[i-2], εάν Υπάρχουν δύο επαναλήψεις i v και i w εντός του χώρου επαναλήψεων, τέτοιες ώστε οι i v και i w να γράφουν το ίδιο στοιχείο πίνακα: i v, i w, 2 i v, i w 5, i v -2= i w -2
Παραλληλοποίηση for i = 2, 5 a[i-2] = a[i] + 3 Υπάρχει εξάρτηση βρόχου μεταξύ a[i] και a[i-2]; Υπάρχει εξάρτηση βρόχου μεταξύ a[i-2] και a[i-2];
Φωλιασμένοι Βρόχοι Ποιος βρόχος είναι παράλληλος; Είναι και οι δύο βρόχοι παράλληλοι; for i1 = 0, 5 for i2 = 0, 3 a[i1,i2] = a[i1-2,i2-1] + 3
Χώροι Επαναλήψεων Αναπαράσταση βρόχων όπου κάθε επανάληψη αναπαριστάται ως συντεταγμένες στο χώρο επαναλήψεων for i1 = 0, 5 for i2 = 0, 3 a[i1,i2] = 3 i1 i2
Σειρά Εκτέλεσης Σειριακή εκτέλεση των επαναλήψεων σε αλφαβητική σειρά: (0,0), (0,1),, (0,3), (1,0), (1,1),, (1,3), (2,0), Για φώλιασμα βάθους n: i1 Αν I = (i 1,i 2,,i n ) και I = (i 1,i 2,,i n ), τότε I I, εάν και μόνο εάν k τέτοιο ώστε (i 1,,i k-1 ) = (i 1,,i k-1 ) και i k < i k i2
Παράλληλοι Φωλιασμένοι Βρόχοι for i1 = 0, 5 for i2 = 0, 3 a[i1,i2] = a[i1-2,i2-1] + 3 Έχουμε εξάρτηση δεδομένων μεταξύ a[i1,i2] και a[i1-2,i2-1], εάν Υπάρχουν i1 r, i2 r, i1 w, i2 w, τέτοια ώστε 0 i1 r, i1 w 5, 0 i2 r, i2 w 3, i1 r - 2 = i1 w και i2 r - 1 = i2 w
Εξαρτήσεις βρόχου Εάν δεν υπάρχουν εξαρτήσεις βρόχου, ο βρόχος είναι παραλληλοποιήσιμος Εξάρτηση εξωτερικού βρόχου: i1 r i1 w Εξάρτηση εσωτερικού βρόχου: i1 r = i1 w i2 r i2 w Επέκταση για οποιοδήποτε βάθος φωλιάσματος k
Φωλιασμένοι Βρόχοι for i1 = 0, 5 for i2 = 0, 3 a[i1,i2] = a[i1-2,i2-1] + 3 Ποιος βρόχος έχει εξάρτηση βρόχου; i1 i2
Επίλυση των Εξαρτήσεων Πολλές φορές οι διευθύνσεις μνήμης δε μπορούν να υπολογιστούν από το μεταγλωττιστή! Παράδειγμα: read(n) for i = 0, 3 a[i] = a[n] + 3
Ανάλυση Εξαρτήσεων Δεδομένων Ανάλυση μόνο για όρια επαναλήψεων και δείκτες πινάκων που είναι ακέραιες γραμμικές συναρτήσεις μεταβλητών Παράδειγμα: for i1 = 1, n for i2 = 2*i1, 100 a[i1+2*i2+3][4*i1+2*i2][i1*i1] = = a[1][2*i1+1][i2] + 3 μη γραμμική συνάρτηση
Εξισώσεις for i1 = 1, n for i2 = 2*i1, 100 a[i1+2*i2+3][4*i1+2*i2][i1*i1] = = a[1][2*i1+1][i2] + 3 Έχουμε εξάρτηση δεδομένων, εάν Υπάρχουν i1 r, i2 r, i1 w, i2 w, τέτοια ώστε 0 i1 r,i1 w n, 2*i1 r i2 r 100, 2*i1 w i2 w 100, i1 w + 2*i2 w +3 = 1, 4*i1 w + 2*i2 w = 2*i1 r + 1 Σημειώστε: Δεν αναλύουμε μη γραμμικές συναρτήσεις!
Επίλυση Αν το σύστημα δεν έχει λύση: Δεν υπάρχει εξάρτηση δεδομένων Αν το σύστημα έχει λύση: Μπορεί να υπάρχει εξάρτηση δεδομένων
Ακριβής Επίλυση Εξισώσεων Με ακέραιο προγραμματισμό (integer programming): Αντικατάστησε ισότητες με ανισότητες: a =b a b και b a οπότε λαμβάνουμε τη σχέση προς επίλυση: int i, Ai b Όμως ο ακέραιος προγραμματισμός είναι NP-complete, και επομένως ακριβός για να υλοποιηθεί στα πλαίσια μεταγλωττιστή!
Μη Ακριβής Επίλυση Έλεγχος MKD (GCD) ή έλεγχος του Banerjee Δύο αποτελέσματα: ΟΧΙ καμία εξάρτηση ΔΕ ΓΝΩΡΙΖΟΥΜΕ υποθέτουμε ότι υπάρχει εξάρτηση Μπορούμε να περιορίσουμε την ανακρίβεια με επιπλέον περιορισμούς Θυσιάζουμε παραλληλισμό για καλύτερη απόδοση του μεταγλωττιστή!
Έλεγχος ΜΚΔ Έστω ο βρόχος: for i = 1, 100 a[2*i] = = a[2*i+1] + 3 Υπάρχει εξάρτηση στις αναφορές του a; Επίλυσε τη γραμμική Διοφαντική εξίσωση: 2*i w = 2*i r + 1
Θεώρημα ΜΚΔ Η γραμμική Διοφαντική εξίσωση a 1 x 1 a2x2... anx n c έχει ακέραια λύση (x 1, x 2,, x n ) εάν και μόνο εάν ο ΜΚΔ των a 1, a 2,, a n διαιρεί το c
Παραδείγματα Παράδειγμα 1: gcd(2,-2) = 2. Καμία λύση! 2x 2x2 1 1 Παράδειγμα 2: gcd(24,36,54) = 6. Πολλές λύσεις! 24x 36y 54z 30
Πολλαπλές Εξισώσεις x 2 y z 0 3x 2 y z 5 Εξίσωση 1: gcd(1,-2,1) = 1. Πολλές λύσεις Εξίσωση 2: gcd(3,2,1) = 1. Πολλές λύσεις Υπάρχει λύση που να ικανοποιεί ταυτόχρονα και τις δύο εξισώσεις;
Ακριβής Ανάλυση Στις περισσότερες περιπτώσεις οι αναφορές πινάκων οδηγούν σε απλά προβλήματα ακέραιου προγραμματισμού Μέθοδοι, βάσει των οποίων μπορούμε να απαντήσουμε με ακρίβεια αν υπάρχει ή όχι εξάρτηση: Εφαρμογή απαλοιφής Fourier-Motzkin + τεχνική branch-and-bound Omega package του University of Maryland
Μετασχηματισμοί Βρόχων για Εκμετάλλευση Τοπικότητας CPU C C Cache Memory
Τοπικότητα στην Κρυφή Μνήμη Αν ένας πίνακας Α αποθηκεύεται σε στήλες: A[1,1] A[2,1] A[1,2] A[2,2] A[1,3] for i = 1, 100 for j = 1, 200 A[i, j] = A[i, j] + 3 Κακή εκμετάλλευση τοπικότητας!
Εναλλαγή Βρόχων Αν ένας πίνακας Α αποθηκεύεται σε στήλες: A[1,1] A[2,1] A[1,2] A[2,2] A[1,3] for i = 1, 100 for j = 1, 200 A[i, j] = A[i, j] + 3 for j = 1, 200 for i = 1, 100 A[i, j] = A[i, j] + 3 Καλύτερη εκμετάλλευση τοπικότητας!
Εναλλαγή Βρόχων Κάποιες φορές η εναλλαγή δεν είναι επιτρεπτή for i = 2, 100 for j = 1, 200 A[i, j] = A[i-1, j+1] + 3 i πχ εξάρτηση από το σημείο (3,3) στο (4,2) j
Διανύσματα Εξάρτησης i j Διάνυσμα Εξάρτησης (1,-1) = (4,2)-(3,3) Διάνυσμα Κατεύθυνσης (+, -) από τα πρόσημα του προηγουμένου Εναλλαγή βρόχων δεν επιτρέπεται αν υπάρχει εξάρτηση με κατεύθυνση (+, -)
Συνένωση Βρόχων (Loop Fusion) for i = 1, 1000 A[i] = B[i] + 3 for j = 1, 1000 C[j] = A[j] + 5 for i = 1, 1000 A[i] = B[i] + 3 C[i] = A[i] + 5 Επαναχρησιμοποίηση του A[i]
Κατανομή Βρόχων (Loop Distribution) for i = 1, 1000 A[i] = A[i-1] + 3 C[i] = B[i] + 5 for i = 1, 1000 A[i] = A[i-1] + 3 for i = 1, 1000 C[i] = B[i] + 5 Ο δεύτερος βρόχος είναι παράλληλος
Δημιουργία Μπλοκ (Register Blocking) for j = 1, 2*m for i = 1, 2*n A[i, j] = A[i-1, j] + A[i-1, j-1] for j = 1, 2*m, 2 for i = 1, 2*n, 2 A[i, j] = A[i-1,j] + A[i-1,j-1] A[i, j+1] = A[i-1,j+1] + A[i-1,j] A[i+1, j] = A[i, j] + A[i, j-1] A[i+1, j+1] = A[i, j+1] + A[i, j] Επαναχρησιμοποίηση του A[i, j]
Συμβολικοί Καταχωρητές for j = 1, 2*M, 2 for i = 1, 2*N, 2 r1 = A[i-1,j] r2 = r1 + A[i-1,j-1] A[i, j] = r2 r3 = A[i-1,j+1] + r1 A[i, j+1] = r3 A[i+1, j] = r2 + A[i, j-1] A[i+1, j+1] = r3 + r2 Μείωση λειτουργιών μνήμης load/store 8MN loads 4MN loads
Εισαγωγή Βαθμωτών Μεταβλητών (Scalar Replacement) for i = 2, N+1 = A[i-1]+1 A[i] = t1 = A[1] for i = 2, N+1 = t1 + 1 t1 = A[i] = t1 Μείωση προσπελάσεων μνήμης για πίνακες
Τεχνική «Unroll-and-Jam» for j = 1, 2*M for i = 1, N A[i, j] = A[i-1, j] + A[i-1, j-1] for j = 1, 2*M, 2 for i = 1, N A[i, j]=a[i-1,j]+a[i-1,j-1] A[i, j+1]=a[i-1,j+1]+a[i-1,j] Περισσότερες ευκαιρίες εισαγωγής βαθμωτών μεταβλητών
Μεγάλοι Πίνακες Αποθήκευση ανά γραμμή for i = 1, 1000 for j = 1, 1000 A[i, j] = A[i, j] + B[j, i] Κακή εκμετάλλευση τοπικότητας στον Β Δε βοηθά η εναλλαγή
Δημιουργία Μπλοκ for v = 1, 1000, 20 for u = 1, 1000, 20 for j = v, v+19 for i = u, u+19 A[i, j] = A[i, j] + B[j, i] Καλύτερη εκμετάλλευση τοπικότητας
Ξεδίπλωμα για Εκμετάλλευση ILP for i = 1, 10 a[i] = b[i]; *p =... for i = 1, 10, 2 a[i] = b[i]; *p = a[i+1] = b[i+1]; *p = Περισσότερες εντολές για δρομολόγηση Λιγότερες δυναμικές διακλαδώσεις Μεγαλύτερος κώδικας