Υ- 01 Αρχιτεκτονική Υπολογιστών Ιεραρχία μνήμης: προχωρημένα θέματα, μέρος 2 ο Αρης Ευθυμίου
Το σημερινό μάθημα Compiler op<misa<ons για κρυφές μνήμες Prefetching Mul<- level inclusion Κύρια μνήμη 2
Compiler op<miza<ons Η καλύτερη μέθοδος για το hardware: αφήνει το soyware να κάνει τη δουλειά! Τοποθέτηση δεδομένων και προγράμματος Παράδειγμα: branch staightening: Αν ο compiler γνωρίζει ότι η πιθανότητα να ακολουθηθεί μια διακλάδοση είναι μεγάλη, αντιστρέφει τη συνθήκη ώστε να εκτελείτε το σειριακό κομμάτι κώδικα συχνότερα εκμεταλεύεται χωρική τοπικότητα αναφορών 3
Πίνακες στη μνήμη Ο πίνακας είναι 2 διαστάσεων αλλά στη μνήμη υπάρχει μόνο 1 διάσταση column major A(i,j) at A + i + j*n rows row major A(i,j) at A + i*n cols + j Column major Row major 0 5 10 15 0 1 2 3 1 6 11 16 4 5 6 7 2 7 12 17 8 9 10 11 3 8 13 18 12 13 14 15 4 9 14 19 16 17 18 19 4
Loop interchange Αλλαγή σειράς σε επαναλλήψεις ώστε τα δεδομένα να προσπελαύνονται σειριακά 5
Blocking «σμίκρυνση» του προβλήματος ώστε να χωράει στη κρυφή μνήμη και εκτέλεση περισσότερων επαναλλήψεων Παράδειγμα: πολλαπλασιασμός πινάκων c ij * = a i* b *j 6
Απλή υλοποίηση for (i=0;i<n;i++) for (j=0;j<n;j++) for (k=0;k<n;k++) c[i][j] += a[i][k] * b[k][j]; 7
Γραμμική άλγεβρα Μπορούμε να σπάσουμε τον πίνακα σε μικρότερους κάθε πολλαπλασιασμός γίνεται σε μικρούς πίνακες με μέγεθος κατάλληλο ώστε να χωράνε στη κρυφή μνήμη 8
Υλοποίηση for(jj=0; jj < N; jj=jj+b) for(kk=0; kk < N; kk=kk+b) for(i=0; i < N; i++) for(j=jj; j < min(jj+b,n); j++) { r = 0; for(k=kk; k < min(kk+b,n); k++) r = r + y[i][k] * z[k][j]; x[i][j] = x[i][j] + r; } 9
Prefetching Προσκόμιση γραμμών στη κρυφή μνήμη, πρίν ζητηθούν από τον επεξεργαστή/πρόγραμμα χρειάζεται πρόβλεψη μπορεί να μειώσει τα compulsory misses Μπορεί να γίνει σε hardware ή soyware οι περισσότεροι επεξεργαστές έχουν σχετικές εντολές 10
Μέτρα αξιολόγησης prefetch accuracy ποσοστό χρήσιμων prefetch coverage αριθμός χρήσιμων prefetch / αριθμός misses χωρίς prefetch <meliness τα δεδομένα ήρθαν στην cache την κατάλληλη στιγμή Πρόωρο prefetching μπορεί να προκαλέσει cache pollu<on: αντικατάσταση χρήσιμων γραμμών 11
Προβλήματα prefetch Εκτός από cache pollu<on, υπάρχει και bandwidth pollu<on Ανταγωνισμός με προσπελάσεις στην υπόλοιπη ιεραρχία μνήμης (και τους διαύλους) από τον ίδιο ή άλλους επεξεργαστές ή από περιφερειακά Ανταγωνισμός με προσπελάσεις στην ίδια κρυφή μνήμη έλεγχος αν η γραμμή που σκοπεύει να γίνει prefetch υπάρχει ήδη 2 η θύρα για την μνήμη των tag 12
SoYware prefetching Ειδικές εντολές prefetch τοποθετημένες από τον compiler αρκετά πριν χρειαστούν τα δεδομένα συχνά σε συνδιασμό με loop- unrolling Register prefetch φορτώνουν τιμές σε καταχωρητή αλλά οι καταχωρητές είναι λίγοι... Cache prefetch φορτώνουν τιμές στη cache μόνο Τι συμβαίνει αν μια εντολη prefetch προκαλέσει page fault? Συνήθως είναι non- faul<ng, αν θα προκαλούσαν page fault μετατρέπονται σε no- ops 13
Δυσκολίες soyware prefetching Οι επιπλέον εντολές χρειάζονται: χώρο στη μνήμη, πιθ. προκαλούν επιπλέον I$ misses χρόνο εκτέλεσης πιθ. επιπλέον καταχωρητές για διευθύνσεις Η μεγάλη δυσκολία του soyware prefetching είναι το <meliness ακόμη περισσότερο σε OOO επεξεργαστές Πόσες επαναλλήψεις νωρίτερα πρέπει να αρχίσει το prefetch; 14
Sequen<al prefetching Γνωστό και ως next- line ή one- block look- ahead (OBL) Παρόμοιες επιδόσεις με μεγάλο μέγεθος γραμμής Συνήθως ενεργοποιείται σε miss prefetch on miss φέρνει την επόμενη γραμμή από αυτή που αστόχησε στη cache Χρήσιμη κυρίως σε κρυφές μνήμες εντολών Tagged prefetch 1 bit (tag) ανά γραμμή. Τιμή 1 αν προσκομίστηκε κατά παραγγελία (on demand) ή γίνει hit, 0 αν prefetch prefetch την επόμενη γραμμή αν το tag είναι 1 15
Stream buffer Ξεχωριστή αποθήκευση για prefetched γραμμές αποφεύγεται cache pollu<on Οργανωμένος σαν FIFO (κυκλική ουρά) Σε κάθε αναφορά μνήμης του επεξεργαστή ελέγχεται ταυτόχρονα με τη κρυφή μνήμη Αν ευστοχεί ο stream buffer, η γραμμή μεταφέρεται στη κρυφή μνήμη προσκομίζεται η επόμενη γραμμή από την ιεραρχία μνήμης Μπορεί να υπάρχουν πολλαπλοί stream buffers που παρακολουθούν διαφορετικά streams 16
Access strides Μια σειρά από διευθύνσεις μνήμης (a,b,c, ) ονομάζεται stream όταν οι διευθύνσεις διαφέρουν κατά ένα σταθερό αριθμό, που ονομάζεται stride (b- a == c- b, ) Εστω πρόγραμμα με nested loops με μεταβλητές/index i 1, i m Προσπελάσεις μνήμης κατηγοριοποιούνται: scalar ανεξάρτητες απο οποιοδήποτε index Zero stride π.χ. a[i 1,i 2 ] που βρίσκεται σε ένα loop με index i 3 Constant- stride π.χ. a[i 1,i 2 ] που βρίσκεται σε ένα loop με index i 2 Irregular π.χ. μέσω pointer ή a[i 1, b[i 1 ]] 17
Reference predic<on table Δύσκολη διάκριση stream μέσα από πολλαπλά memory references Γνωρίζοντας τη διεύθυνση της εντολής που προσπελαύνει μνήμη, μπορούμε να διακρίνουμε streams Το RPT είναι μια cache που ανιχνεύει και παρακολουθεί streams Κάθε καταχώρηση έχει: tag για ανίχνευση εντολής προσπέλασης (previous) operand address προηγούμενη διεύθυνση stride, state 18
Λειτουργία RPT PC effective address -! instruction tag previous address stride state +! prefetch address 19
Mul<- level inclusion Η κύρια μνήμη (ή άλλοι επεξεργαστές) ακυρώνουν γραμμές που βρίσκονται ήδη στη κρυφή μνήμη Οταν υπάρχει ιεραρχία από κρυφές μνήμες, οι ακυρώσεις πρέπει να διατρέχουν όλη την ιεραρχία από το τελευταίο επίπεδο (last level cache LLC) μέχρι το πρώτο χρειάζεται 2 θύρες προσπελάσεων, τουλάχιστον για tags Αν κάθε επίπεδο είναι υπερσύνολο του προηγούμενου, μόνο οι απαραίτητες ακυρώσεις χρειάζεται να «απασχολούν» τις κρυφές μνήμες Η ιδιότητα ονομάζεται mul<- level inclusion (MLI) Για write- back είναι space property: Αν η γραμμή είναι dirty στην L1, υπάρχει χώρος για τη γραμμή στη L2 20
MLI: λειτουργία Υποθέτουμε 2 επίπεδα κρυφής μνήμης με ίδιο μέγεθος γραμμής write- back (write- through ελαφρώς ευκολότερο) 2- way associa<ve a, a, b γραμμές στη L1 και A, A, B αντίστοιχες γραμμές στη L2 21
MLI προϋποθέσεις Υποθέτουμε ίδιο μέγεθος γραμμής Η L2 είναι μεγαλύτερη της L1 διαφορετικά δεν έχει λόγο ύπαρξης μια inclusive L2 Πρέπει διαφορετικές γραμμές της L1 να αντιστοιχούν σε διαφορετικές γραμμές στην L2 Αν index L2 >= index L1, πρέπει η associa<vity L2 >= assoc. L1 Αν index L2 < index L1, πρέπει η associa<vity L2 >= 2 a assoc. L1 22
MLI με διαφ. μέγεθος γραμμής Εστω B 1 το μέγεθος γραμμής της L1 και B 2 αυτό της L2 Β 2 >= Β 1 Β 2 πολλαπλάσιο του Β1 Σε κάθε γραμμή της L2 αντιστοιχούν B 2 /B 1 γραμμές της L1 Χρειάζεται 1 inclusion bit ανά γραμμή L1 πρέπει η associa<vity L2 >= B 2 /B 1 x assoc. L1 πρέπει η associa<vity L2 >= 2 γ x B 2 /B 1 x assoc. L1 23
Mul<- level exclusion Αν δεν υπάρχει χώρος για μεγάλη L2, ή απαιτείται μεγαλύτερη associa<vity από ότι είναι υλοποιήσιμο π.χ. η L2 μοιράζεται από χωριστές L1 I,D κάθε μια με μεγάλη associa<vity H L2 είναι μια τεράστια vic<m cache για την L1 Η πιο σωστά non- inclusion μπορεί η L2 να περιέχει κοινές γραμμές με τη L1 π.χ. μια evicted γραμμή, ξαναπροσπελαύνεται από τον πυρήνα 24
Κύρια μνήμη Βασίζεται σε τεχνολογία DRAM Θα βρίσκεται (πάντα;) εκτός ΟΚ επεξεργαστή τουλάχιστον για laptop, desktop, servers Η DRAM θεωρείται commodity product πολύ μικρή διαφορά κόστους παραγωγής, τιμής πώλησης Προτεραιότητες κατασκευαστών (φθίνουσα σειρά): χωρητικότητα ρυθμός μεταφοράς (bandwidth) καθυστέρηση (latency access <me)
DRAM array ddm
Γραμμές και στήλες Επειδή η αποθηκευμένη μνήμη σε ένα ΟΚ DRAM είναι μεγάλη, χρειάζεται πολλά bits για διεύθυνση απαιτούνται πολλά pins στο ΟΚ Για να μειωθεί ο αριθμός των pin, η διεύθυνση χωρίζεται σε 2 τμήματα: row address, column address η column χρειάζεται λίγο αργότερα Για να ξεχωρίζει το τμήμα της διεύθυνσης, δύο σήματα/ pins στο ΟΚ RAS (row- address strobe) CAS (column- address strobe)
Εσωτερική οργάνωση Υπάρχουν πολλαπλά arrays σε ένα OK DRAM 2 βασικοί τρόποι οργάνωσης: τα array δουλεύουν από κοινού και «δίνουν» 1 bit το καθένα π.χ. x4 DRAM 4 arrays δίνουν 4 bits από την ίδια διεύθυνση προσφέρει bandwidth «δίνοντας» πολλά bit παράλληλα ή δουλεύουν ως ανεξάρτητες banks δουλεύουν ανεξάρτητα μεταξύ τους: διαφορετικές διευθύνσεις,... προσφέρει bandwidth μέσω επικαλυπτόμενης προσπέλασης Γενικά σε ένα σύγχρονο DRAM ΟΚ: περιέχονται πολλά arrays και αρκετές banks κάθε bank αποτελείται από arrays που δουλεύουν παράλληλα
Memory modules Τα ΟΚ DRAM τοποθετούνται σε μικρές πλακέτες PCB, που ονομάζονται memory modules Τα πιο συνηθισμένα λέγονται DIMM (dual in- line memory module) Ενα σύστημα μπορεί να έχει πολλά ανεξάρτητα DIMM Ενα DIMM μπορεί να έχει 1 ή περισσότερες ανεξάρτητες ranks μια ομάδα από DRAM ΟΚ που λειτουργούν από κοινού, (αλλά τα DRAM τους, εσωτερικά, μπορεί να έχουν banks)
Κύρια μνήμη, οργάνωση
Memory bus Data bus (64bit), Address bus (~15bit), Control bus αγωγοί κοινοί για όλα τα DIMM Chip- Select busses για κάθε rank επιλέγει τα OK που αφορά η «εντολή»
Memory controller Mετατρέπει διευθύνσεις της CPU σε σειρές εντολών προς τα DIMMs Γνωρίζει την οργάνωση σε ranks, banks, Γνωρίζει τη κατάσταση κάθε (ομάδας) DRAM array: αν χρειάζεται precharge, μόνο CAS,
Fast page mode, EDO DRAM Πολλαπλές προσπελάσεις στην ίδια γραμμή γίνονται απευθείας από τους sense amplifiers Πρακτικά ο controller κρατά το RAS, και μεταβάλει πολλές φορές το σήμα CAS EDO (extended data out) προσθέτει ένα καταχωρητή μετά τον πολυπλέκτη στήλης μπορεί ο πολυπλέκτης στήλης να ξεκινήσει γρηγορότερα την επιλογή της επόμενης στήλης όσο στέλνεται η προηγούμενη
Synchronous DRAM Οι παλιότερες DRAM ήταν ασύγχρονες: οι μεταβολές των σημάτων RAS, CAS προκαλούσαν εσωτερικές μεταβάσεις στα ΟΚ DRAM Ο χρονισμός συμβάντων είναι ευκολότερος αν όλα τα σήματα είναι συγχρονισμένα με ένα σήμα αναφοράς (το ρολόι)
DDR SDRAM Aνταγωνισμος μεταξύ Rambus (RDRAM) και DDR, (τέλος 90, αρχές 2000) με πολλές μάχες στα δικαστήρια Πλέον το DDR έχει επικρατήσει Π.χ. η Intel σταμάτησε να παράγει chipsets συμβατά με Rambus το 2002