Καλησπέρα, Έχω πολλές απορίες σχετικά με το hardware prefetching που εμφανίζεται στο ιουλιος 2010 4βiii συνεπώς ήλπιζα να εξηγήσετε λίγο καλύτερα την άσκηση.Στα loops όπου η στήλη είναι πολ\σιο του 8 και δεν εχουμε αλλάξει γραμμή, τελικά η σωστή απάντηση είναι mmh ή mmm? Διότι δε βλέπω πως έχουμε το block με το δεδομένο Α[1][8] εφόσον αυτό έχει γίνει prefetched πολλές επαναλήψεις πίσω. Αν έχουμε μόνο μία θέση για blocks στον prefetching buffer τότε δε θα πρεπε να μπορούμε να το βρούμε εκεί.Όταν αλλάζει η γραμμή, γιατί έχουμε mhh? Ολη η γραμμή Α[1] βρίσκεται στην cache συνεπώς θα έπρεπε να έχουμε hit στο πρώτο. Το δεύτερο το έχουμε λόγω prefetching και το δεύτερο βρίσκεται στην cache, άρα hhh.Στην επόμενο loop γιατί έχουμε mmh? Αν το Α[30] το διαβάσαμε από το prefetching buffer τότε το Α[10]-Α[11] θα έπρεπε να είναι ακόμα στην cache - εκτός κι αν σε hit από τον prefetching buffer φέρνουμε το block στην cache. Ευχαριστώ εκ των προτέρων!
Σόρρυ για το προηγούμενο mail σε λάθος διεύθυνση.
Καλησπέρα,
On 06/28/2011 09:01 PM, George Chatzikonstantis wrote:
Καλησπέρα,
Έχω πολλές απορίες σχετικά με το hardware prefetching που εμφανίζεται στο ιουλιος 2010 4βiii συνεπώς ήλπιζα να εξηγήσετε λίγο καλύτερα την άσκηση. Στα loops όπου η στήλη είναι πολ\σιο του 8 και δεν εχουμε αλλάξει γραμμή, τελικά η σωστή απάντηση είναι mmh ή mmm? Διότι δε βλέπω πως έχουμε το block με το δεδομένο Α[1][8] εφόσον αυτό έχει γίνει prefetched πολλές επαναλήψεις πίσω. Αν έχουμε μόνο μία θέση για blocks στον prefetching buffer τότε δε θα πρεπε να μπορούμε να το βρούμε εκεί.
Με την υπόθεση ότι το hw prefetching δε λειτουργεί με χρήση buffer αλλά τα φέρνει κατευθείαν στην cache, και με την υπόθεση ότι ο χρονισμός του prefetcher είναι κοινός για όλες τις αναφορές και τηρεί τη σειρά με την οποία αυτές έγιναν, θα έχεις κέρδος από τον prefetcher στην περίπτωση των compulsory misses της A[i][j]. Στις αναφορές των A[i-1][j], A[i+1][j] θα έχεις conflicts ακόμα και με τη λειτουργία του prefetcher, όπως αναφέρθηκε από συνάδελφο σε χθεσινό mail.
Στην περίπτωση που γίνει η παραδοχή ότι υπάρχει κάποιος buffer, τότε το αποτέλεσμα προφανώς θα διαφέρει ανάλογα με τα πόσα entries θα έχει ο buffer αυτός.
Όταν αλλάζει η γραμμή, γιατί έχουμε mhh? Ολη η γραμμή Α[1] βρίσκεται στην cache συνεπώς θα έπρεπε να έχουμε hit στο πρώτο. Το δεύτερο το έχουμε λόγω prefetching και το δεύτερο βρίσκεται στην cache, άρα hhh.
Ουσιαστικά το μπλοκ στο οποίο ανήκει το Α[1][0], εκτοπίστηκε λόγω της λειτουργίας του prefetching στις τελευταίες προηγούμενες επαναλήψεις του εσωτερικού loop. Π.χ. όταν γίνονταν οι αναφορές στα Α[0][248],Α[2][248], μπορούμε να υποθέσουμε ότι άρχισε η προφόρτωση για τα επόμενα blocks, δηλ. αυτά που περιέχουν τα Α[1][0], Α[3][0]. Αυτά όμως, όπως είπαμε, θα καταλήξουν τελικά σε conflict misses.
Ν.
advcomparch@lists.cslab.ece.ntua.gr