Ασκήσεις στα Προηγμένα Θέματα Αρχιτεκτονικής Υπολογιστών

Σχετικά έγγραφα
ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Ασκήσεις Αρχιτεκτονικής Υπολογιστών

Ασκήσεις Caches

Άσκηση 1η. Θεωρήστε ένα σύστημα μνήμης με μία cache: 4 way set associative μεγέθους 256ΚΒ,

Ασκήσεις Caches

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Ασκήσεις Caches. Αρχιτεκτονική Υπολογιστών. 5ο εξάμηνο ΣΗΜΜΥ ακ. έτος: Νεκ. Κοζύρης

AΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ (5 ο εξάμηνο) ΕΠΑΝΑΛΗΠΤΙΚΗ ΕΞΕΤΑΣΗ (ΦΘΙΝΟΠΩΡΟ 2007) ΔΙΑΡΚΕΙΑ ΕΞΕΤΑΣΗΣ: 2 ΩΡΕΣ 30 ΛΕΠΤΑ

ΕΘΝΙKΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Ονοματεπώνυμο: ΑΜ:

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

add $t0,$zero, $zero I_LOOP: beq $t0,$s3, END add $t1, $zero,$zero J_LOOP: sub $t2, $s3, $t0 add $t2, $t2, $s1 int i, j, tmp; int *arr, n;

3 η ΑΣΚΗΣΗ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

2η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Ακ. έτος , 5ο Εξάμηνο Σχολή ΗΜ&ΜΥ

Α. Δίνονται οι. (i) στη. πρέπει να. πιο. (ii) $a0. $s0 θα πρέπει να. αποθήκευση. αυξάνει τον. f: sub sll add sub jr. h: addi sw sw.

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Θέµατα Φεβρουαρίου

ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών H/Y Department of Electrical and Computer Engineering. Εργαστήριο 8. Χειμερινό Εξάμηνο

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Pipeline: Ένα παράδειγμα από.τη καθημερινή ζωή. 30 min κάθε «φάση»

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Αρχιτεκτονική Υπολογιστών Κρυφές Μνήμες. (οργάνωση, λειτουργία και απόδοση)

ΠΛΕ- 074 Αρχιτεκτονική Υπολογιστών 2

Ιεραρχία Μνήμης. Ιεραρχία μνήμης και τοπικότητα. Σκοπός της Ιεραρχίας Μνήμης. Κρυφές Μνήμες

Διάλεξη 12 Καθυστερήσεις (Stalls) Εκκενώσεις Εντολών (Flushing)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΔΕΥΤΕΡΗ ΠΡΟΟΔΟΣ ΣΤΗΝ ΟΡΓΑΝΩΣΗ ΣΤΟΥΣ Η/Y (ΗΥ232)

Οργάνωση Υπολογιστών

Αρχιτεκτονική Υπολογιστών II Ενδεικτικές απαντήσεις στα θέματα των εξετάσεων

ΠΛΕ- 027 Μικροεπεξεργαστές 6ο μάθημα: Αρχιτεκτονική πυρήνα: υλοποίηση με διοχέτευση

Προγραμματισμός συστημάτων UNIX/POSIX. Θέμα επιλεγμένο από τους φοιτητές: Προγραμματιστικές τεχνικές που στοχεύουν σε επιδόσεις

Διάλεξη 12 Καθυστερήσεις (Stalls)

Διάλεξη 15 Απόδοση της Ιεραρχίας Μνήμης Βελτιστοποίηση της απόδοσης

ΠΛΕ- 027 Μικροεπεξεργαστές

Παραδείγματα Assembly (Μέρος

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΔΕΥΤΕΡΗ ΠΡΟΟΔΟΣ ΣΤΗΝ ΟΡΓΑΝΩΣΗ ΣΤΟΥΣ Η/Y (ΗΥ232)

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής

Ενότητα 2: Η κρυφή µνήµη και η λειτουργία της

Τελική Εξέταση, Απαντήσεις/Λύσεις

Chapter 6 Αύξηση της απόδοσης με διοχέτευση (pipeline)

Αρχιτεκτονική υπολογιστών

(advanced_ca, ακ. έτος Cache Optimisations

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

ΠΛΕ- 027 Μικροεπεξεργαστές 9ο μάθημα: Αρχιτεκτονική συστήματος μνήμης: Κρυφές μνήμες εισαγωγή

Διάλεξη 14 Εισαγωγή στην Ιεραρχία Μνήμης

ΤΕΧΝΙΚΕΣ ΑΥΞΗΣΗΣ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ I

SMPcache. Ένα εργαλείο για προσομοίωση-οπτικοποίηση κρυφής μνήμης (Cache)

Κεφάλαιο 5. ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ -. Σερπάνος 2. Σημείωση

Είδη των Cache Misses: 3C s

Διάλεξη 11 Προώθηση (Forwarding)

(Branch Prediction Mechanisms)

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Cach O p i timisati tions

Συστήματα σε Ολοκληρωμένα Κυκλώματα

Ιεραρχία Μνήμης. Εικονική μνήμη (virtual memory) Επεκτείνοντας την Ιεραρχία Μνήμης. Εικονική Μνήμη. Μ.Στεφανιδάκης

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

Ζητήµατα Απόδοσης. Ιεραρχία Μνήµης. Αναγκαιότητα για Ιεραρχία Μνήµης. Processor-DRAM Gap (latency) Ε-85: Ειδικά Θέµατα Λογισµικού

Επιπλέον διδακτικό υλικό κρυφών μνημών: set-associative caches, πολιτικές αντικατάστασης, χειρισμός εγγραφών

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών - Μηχανικών Υπολογιστών. Αρχιτεκτονική Υπολογιστών Νεκτάριος Κοζύρης. Cache Optimizations

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Διάλεξη 13. Διακλαδώσεις. Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

1.1 ΑΣΚΗΣΗ ΛΥΣΗ 2.1 ΑΣΚΗΣΗ ΛΥΣΗ 3.1 ΑΣΚΗΣΗ

Υ- 01 Αρχιτεκτονική Υπολογιστών Υπόβαθρο: Κρυφές μνήμες

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y»

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών

Θέματα Μεταγλωττιστών

Η ιεραρχία της μνήμης

Pipelined Datapath, Hazards and Forwarding

Κεντρική Μονάδα Επεξεργασίας. Επανάληψη: Απόδοση ΚΜΕ. ΚΜΕ ενός κύκλου (single-cycle) Παραλληλισμός σε επίπεδο εντολών. Υπολογιστικό σύστημα

Θέματα Μεταγλωττιστών

Άσκηση IF ID EX MEM WB α. 300ps 400ps 350ps 500ps 100ps β. 200ps 150ps 120ps 190ps 140ps

Οργάνωση και Σχεδίαση Υπολογιστών Η ιασύνδεση Υλικού και Λογισµικού, 4 η έκδοση. Κεφάλαιο 5. Μεγάλη και γρήγορη: Αξιοποίηση της ιεραρχίας της µνήµης

i Στα σύγχρονα συστήματα η κύρια μνήμη δεν συνδέεται απευθείας με τον επεξεργαστή

30 min κάθε «φάση» Pipeline: Ένα παράδειγµα από.τη καθηµερινή ζωή. 1. Πλυντήριο. 2. Στεγνωτήριο. 3. ίπλωµα. 4. αποθήκευση. προσέγγιση για 4.

Παραλληλισμός σε επίπεδο εντολών

Αρχιτεκτονική Υπολογιστών

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Τμήμα Πληροφορικής

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Υ- 07 Παράλληλα Συστήματα Αρχιτεκτονική σύγχρονων πυρήνων επεξεργαστών

Εικονική Μνήμη (Virtual Μemory)

ΘΕΜΑ 2. (2,5 µονάδες) Θεωρήστε τρεις κρυφές µνήµες των 512 πλαισίων µε 8 λέξεις ανά πλαίσιο και οργανώσεις αντίστοιχα:

Δομές Επανάληψης. Εισαγωγή στη C++

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διαχείριση μνήμης Εργαστηριακές Ασκήσεις

Τεχνολογίες Κύριας Μνήμης

MIPS functions and procedures

Διαδικασίες ΙI. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 5

2 η Ενδιάμεση Εξέταση Λύσεις/Απαντήσεις

Παραλληλισµός Εντολών (Pipelining)

Εντολές Διακλάδωσης. #bubbles ~= pipeline depth X loop length. Next fetch started. Fetch. I-cache. Fetch Buffer. Decode. Issue Buffer.

Αρχιτεκτονική Υπολογιστών

Εντολές του MIPS (2)

Transcript:

Ασκήσεις στα Προηγμένα Θέματα Αρχιτεκτονικής Υπολογιστών ακ. έτος 2006-2007 Νεκτάριος Κοζύρης Νίκος Αναστόπουλος {nkoziris,anastop}@cslab.ece.ntua.gr

Άσκηση 1: pipelining

Εξετάζουμε την εκτέλεση του παρακάτω κώδικα ο οποίος αντιγράφει ένα «null-terminated» string. Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit addi r1,r1,1 addi r2,r2,1 j Repeat Exit: ;load char (1byte) ;store char ;was char NULL? ;update r1 to point at next char of source string ;update r2 to point at next char of target string Υποθέσεις αρχιτεκτονική σωλήνωσης 5 σταδίων (IF ID EX MEM WB) εγγραφή σε έναν καταχωρητή στο 1 ο μισό ενός κύκλου, ανάγνωση στο 2 ο εντολή διακλάδωσης χωρίς συνθήκη: η διεύθυνση-στόχος γίνεται γνωστή στο στάδιο IF εντολή διακλάδωσης με συνθήκη: πρόβλεψη διακλάδωσης (NOT TAKEN), η προβλεπόμενη διεύθυνση-στόχος γίνεται γνωστή στο στάδιο IF, ο έλεγχος για την ορθότητα της πρόβλεψης στο ΜΕΜ

Αρχικά, υποθέτουμε ότι δεν υπάρχει σχήμα προώθησης. Για τις 2 πρώτες επαναλήψεις, δείξτε τα διάφορα στάδια του pipeline από τα οποία διέρχονται οι εντολές σε αυτό το διάστημα εκτέλεσης. Υποδείξτε και εξηγείστε τους πιθανούς κινδύνους (hazards) που μπορούν να προκύψουν κατά την εκτέλεση, καθώς και τον τρόπο με τονοποίοναυτοίαντιμετωπίζονται. Πόσοι κύκλοι απαιτούνται κατά μέσο όρο για την αντιγραφή ενός χαρακτήρα;

Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit addi r1,r1,1 addi r2,r2,1 j Repeat Exit: πραγματική εξάρτηση δεδομένων RAW κίνδυνος δεδομένων ο κίνδυνος επιλύεται με stalls 2 κύκλων

Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit addi r1,r1,1 addi r2,r2,1 j Repeat Exit: πραγματική εξάρτηση δεδομένων δεν εγείρει όμως RAW κίνδυνο δεδομένων, αφού με τα stalls της προηγούμενης περίπτωσης ο κίνδυνος εξαλείφεται

Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit addi r1,r1,1 addi r2,r2,1 j Repeat Exit: πραγματικές εξαρτήσεις δεδομένων δεν εγείρουν όμως κίνδυνο δεδομένων, αφού στο pipeline εγγραφή σε κάποιον καταχωρητή γίνεται στο 1o μισό ενός κύκλου, ενώ η ανάγνωση από τον ίδιον καταχωρητή στο 2o μισό του ίδιου κύκλου.

Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit addi r1,r1,1 addi r2,r2,1 j Repeat Exit: η beqz δεν προκαλεί κίνδυνο ελέγχου, διότι υπάρχει πρόβλεψη διακλάδωσης η οποία γίνεται σωστά για την ακολουθία εντολών της άσκησης η j δεν προκαλεί κίνδυνο ελέγχου, διότι η διεύθυνσηστόχος της διακλάδωσης υπολογίζεται στο στάδιο IF, και η εκτέλεση μπορεί να συνεχίσει από τον επόμενο κύκλο χωρίς stalls

8 κύκλοι για την αντιγραφή ενός χαρακτήρα (γενική περίπτωση)

Για την ίδια ακολουθία εντολών, δείξτε όπως και πριν τον χρονισμό του pipeline, θεωρώντας όμως τώρα ότι υπάρχουν όλαταδυνατά σχήματα προώθησης. Πόσοι κύκλοι απαιτούνται κατά μέσο όρο για την αντιγραφή ενός χαρακτήρα;

εξαλείφονται τα stalls της προηγούμενης περίπτωσης 6κύκλοι για την αντιγραφή ενός χαρακτήρα

Επεκτείνουμε την παραπάνω αρχιτεκτονική σωλήνωσης διπλασιάζοντας το εύρος της σωλήνωσης. Αναδιατάξτε την ακολουθία των εντολών των προηγούμενων ερωτημάτων ώστε να είναι δυνατόν να εκτελεστεί αποδοτικά σύμφωνα με τα νέα δεδομένα. Δείξτε τον χρονισμό του pipeline, θεωρώντας όλα τα δυνατά σχήματα προώθησης, και υποδείξτε τα σημεία όπου γίνεται προώθηση. Πόσοι κύκλοι απαιτούνται κατά μέσο όρο για την αντιγραφή ενός χαρακτήρα;

Αναδιάταξη εντολών για αποδοτική εκτέλεση στη διπλή σωλήνωση: οι εντολές να είναι κατά το δυνατόν ανά 2 ανεξάρτητες ώστε να μπορούν να εκτελεστούν παράλληλα δεν πρέπει να επηρεάζεται η σημασιολογία του προγράμματος Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit addi r1,r1,1 addi r2,r2,1 j Repeat Exit: Repeat: lb r3,0(r1) addi r1,r1,1 sb r3,0(r2) addi r2,r2,1 beqz r3,exit j Repeat Exit:

3 κύκλοι για την αντιγραφή ενός χαρακτήρα

Για να βελτιώσουμε κι άλλο την απόδοση, εφαρμόζουμε την τεχνική του ξεδιπλώματος βρόχων (loop unrolling). Για την ακολουθία εντολών των προηγούμενων ερωτημάτων εφαρμόστε unrolling 2 φορές. Θεωρείστε ότι έχετε πάλι διπλή σωλήνωση όπως και πριν, οπότε φροντίστε να αναδιατάξετε όπου είναι δυνατόν την ακολουθία, επιτυγχάνοντας το μέγιστο δυνατό παραλληλισμό. Δείξτε τον χρονισμό του pipeline, θεωρώντας όλα τα δυνατά σχήματα προώθησης, και υποδείξτε τα σημεία όπου γίνεται προώθηση. Πόσοι κύκλοι απαιτούνται κατά μέσο όρο για την αντιγραφή ενός χαρακτήρα;

Loop unrolling k φορές: επαναλαμβάνουμε το «σώμα» του loop k φορές, ώστε να αντιγράφονται k διαδοχικοί χαρακτήρες σε μια επανάληψη του loop αυξάνουμε τις μεταβλητές δεικτοδότησης ώστε να δείχνουν στον χαρακτήρα που βρίσκεται k θέσεις μπροστά από τον τρέχοντα Αρχικός κώδικας (k=1) Unrolled (k=2) Unrolled και αναδιατεταγμένος Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit addi r1,r1,1 addi r2,r2,1 j Repeat Exit: Repeat: lb r3,0(r1) sb r3,0(r2) beqz r3,exit lb r3,1(r1) sb r3,1(r2) beqz r3,exit addi r1,r1,2 addi r2,r2,2 j Repeat Exit: Repeat: lb r3,0(r1) addi r1,r1,2 sb r3,0(r2) addi r2,r2,2 beqz r3,exit lb r3,-1(r1) sb r3,-1(r2) beqz r3,exit j Repeat Exit:

η επόμενη εντολή της «j Repeat» μπορεί να αρχίσει να εκτελείται στον 6 ο κύκλο, και στην 1 η σωλήνωση (διότι αυτή δεν έχει stalls) απαιτούνται κατά μέσο όρο 5/2 = 2.5 κύκλοι για την αντιγραφή ενός χαρακτήρα

Άσκηση 2: caches

Θεωρούμε το ακόλουθο κομμάτι κώδικα int i,j; double result, a[110][4]; for(i=0; i<4; i++) for(j=0; j<100; j++) result += a[j][i]*a[j+1][i] + 0.5; Υποθέσεις κάθε στοιχείο του πίνακα έχει μέγεθος 8 bytes υπάρχει 1 επίπεδο κρυφής μνήμης, πλήρως συσχετιστικής, με LRU πολιτική αντικατάστασης, αποτελούμενη από 100 blocks δεδομένων το μέγεθος του block είναι 32 bytes ο πίνακας είναι αποθηκευμένος στην κύρια μνήμη κατά γραμμές, και είναι «ευθυγραμμισμένος» ώστε το 1 ο στοιχείο του να απεικονίζεται στην αρχή μιας γραμμής της cache αρχικά η cache είναι άδεια

Βρείτε ποιες από τις αναφορές στα στοιχεία του πίνακα a για όλη την εκτέλεση του παραπάνω κώδικα καταλήγουν σε misses στην cache. Υποδείξτε ποια είναι compulsory, ποια είναι capacity, και ποια conflict. Δώστε τον συνολικό αριθμό των misses.

1 block = 32 bytes 1 στοιχείο = 8 bytes πίνακας αποθηκευμένος κατά γραμμές σε 1 block της cache θα απεικονίζονται 4 διαδοχικά στοιχεία του πίνακα, π.χ. a[i][j], a[i][j+1], a[i][j+2], a[i][j+3] επιπλέον πίνακας ευθυγραμμισμένος σε 1 block της cache θα απεικονίζεται 1 ολόκληρη γραμμή του πίνακα, δηλαδή a[i][j], a[i][j+1], a[i][j+2], a[i][j+3] όπου j%4=0

αναφορά στη μνήμη περιεχόμενα cache i=0,j=0 a[0][0] compulsory miss a[0][0] a[0][1] a[0][2] a[0][3] δηλαδή, αναφερόμαστε για 1 η φορά στα αντίστοιχα blocks

αναφορά στη μνήμη περιεχόμενα cache i=0,j=0 a[0][0] a[1][0] compulsory miss compulsory miss a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3]

αναφορά στη μνήμη περιεχόμενα cache i=0,j=0 a[0][0] a[1][0] i=0,j=1 a[1][0] compulsory miss compulsory miss hit a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3]

αναφορά στη μνήμη περιεχόμενα cache i=0,j=0 a[0][0] a[1][0] i=0,j=1 a[1][0] a[2][0] compulsory miss compulsory miss hit compulsory miss a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]

αναφορά στη μνήμη περιεχόμενα cache i=0,j=0 a[0][0] a[1][0] i=0,j=1 a[1][0] a[2][0] compulsory miss compulsory miss hit compulsory miss a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] Έτσι για i=0, j=2 99 θα έχουμε 1 hit + 1 comp. miss για κάθε επανάληψη του j

αναφορά στη μνήμη περιεχόμενα cache i=0,j=0 a[0][0] a[1][0] i=0,j=1 a[1][0] a[2][0] compulsory miss compulsory miss hit compulsory miss a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] Έτσι για i=0, j=2 99 θα έχουμε 1 hit + 1 comp. miss για κάθε επανάληψη του j για i=0 θα έχουμε 2+99=101 misses, όλα compulsory

αναφορά στη μνήμη περιεχόμενα cache i=0,j=99 a[99][0] compulsory miss a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3]

αναφορά στη μνήμη περιεχόμενα cache i=0,j=99 a[99][0] a[100][0] compulsory miss compulsory miss αντικατέστησε το LRU block που υπήρχε στην cache a[100][0] a[100][1] a[100][2] a[100][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3]

αναφορά στη μνήμη περιεχόμενα cache i=1,j=0 a[0][1] capacity miss διότι αντικαταστάθηκε λόγω έλλειψης χώρου το block που είχε έρθει στην cache κατά το παρελθόν και το περιείχε a[100][0] a[100][1] a[100][2] a[100][3] a[0][0] a[0][1] a[0][2] a[0][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3]

αναφορά στη μνήμη περιεχόμενα cache i=1,j=0 a[0][1] a[1][1] capacity miss capacity miss a[100][0] a[100][1] a[100][2] a[100][3] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[3][0] a[3][1] a[3][2] a[3][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3]

αναφορά στη μνήμη περιεχόμενα cache i=1,j=0 a[0][1] a[1][1] i=1,j=1 a[1][1] capacity miss capacity miss hit a[100][0] a[100][1] a[100][2] a[100][3] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[3][0] a[3][1] a[3][2] a[3][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3]

αναφορά στη μνήμη περιεχόμενα cache i=1,j=0 a[0][1] a[1][1] i=1,j=1 a[1][1] a[2][1] capacity miss capacity miss hit capacity miss a[100][0] a[100][1] a[100][2] a[100][3] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3]

αναφορά στη μνήμη περιεχόμενα cache i=1,j=0 a[0][1] a[1][1] i=1,j=1 a[1][1] a[2][1] capacity miss capacity miss hit capacity miss a[100][0] a[100][1] a[100][2] a[100][3] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3] Στις επόμενες επαναλήψεις θα έχουμε κυκλικές αντικαταστάσεις blocks, οπότε τα misses και τα hits θα ακολουθούν το ίδιο μοτίβο όπως και για i=0.

αναφορά στη μνήμη περιεχόμενα cache i=1,j=0 a[0][1] a[1][1] i=1,j=1 a[1][1] a[2][1] capacity miss capacity miss hit capacity miss a[100][0] a[100][1] a[100][2] a[100][3] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3] Στις επόμενες επαναλήψεις θα έχουμε κυκλικές αντικαταστάσεις blocks, οπότε τα misses και τα hits θα ακολουθούν το ίδιο μοτίβο όπως και για i=0. συνολικά θα έχουμε 4*101=404 misses

αναφορά στη μνήμη περιεχόμενα cache i=1,j=0 a[0][1] a[1][1] i=1,j=1 a[1][1] a[2][1] capacity miss capacity miss hit capacity miss a[100][0] a[100][1] a[100][2] a[100][3] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[4][0] a[4][1] a[4][2] a[4][3] a[98][0] a[98][1] a[98][2] a[98][3] a[99][0] a[99][1] a[99][2] a[99][3] Conflict misses δεν έχουμε διότι η cache είναι fully associative τα blocks δεδομένων μπορούν να απεικονιστούν οπουδήποτε στην cache

To σύνολο εντολών της αρχιτεκτονικής του επεξεργαστή διαθέτει μία ειδική εντολή prf(*addr). H εντολή αυτή προ-φορτώνει στην κρυφή μνήμη ολόκληρο το μπλοκ που περιέχει τη λέξη που βρίσκεται στη διεύθυνση μνήμης addr. Χωρίς να αλλάξετε τη σειρά των loads για τις αναφορές στα στοιχεία του πίνακα, εισάγετε κλήσεις στην prf (1 ή περισσότερες) στον παραπάνω κώδικα ώστε να μειωθούν τα misses. Δώστε τον συνολικό αριθμό των misses. Υποθέστε ότι 7 επαναλήψεις του εσωτερικού loop είναι αρκετές ώστε να καλυφθεί ο χρόνος που απαιτείται για να έρθουν τα δεδομένα που ζητά η prf στην cache. Mη λάβετε ειδική μέριμνα για την προφόρτωση δεδομένων στις αρχικές επαναλήψεις του loop, ούτε για τις έξτρα προφορτώσεις στις τελευταίες επαναλήψεις.

Ας δούμε τις αναφορές σε στοιχεία του πίνακα για τις πρώτες επαναλήψεις του loop: (i,j)= (0,0): a[0][0] miss, a[1][0] miss (0,1): a[1][0] hit, a[2][0] miss (0,2): a[2][0] hit, a[3][0] miss (0,3): a[3][0] hit, a[4][0] miss (0,4): a[4][0] hit, a[5][0] miss (0,5): a[5][0] hit, a[6][0] miss (0,6): a[6][0] hit, a[7][0] miss (0,7): a[7][0] hit, a[8][0] miss (0,8): a[8][0] hit, a[9][0] miss οι πρώτες επαναλήψεις που χρειάζονται για να καλύψουν χρονικά τη μεταφορά δεδομένων που ζητά η prf δηλαδή, αν η prf κληθεί στην (0,0), τότε τα δεδομένα που ζήτησε θα έρθουν στην (0,7) για ποιες αναφορές θα εφαρμόσουμε προφόρτωση; για εκείνες που καταλήγουν σε misses (a[j+1][i]) έτσι, στην επανάληψη (0,0) πρέπει να ζητήσουμε το a[8][0], στην (0,1) το a[9][0], κ.ο.κ.

for(i=0; i<4; i++) for(j=0; j<100; j++) { prf(&a[j+8][i]); result += a[j][i]*a[j+1][i] + 0.5; } Έτσι, τα μόνα misses που συμβαίνουν σε κάθε επανάληψη είναι τα εξής: (i,j)= (0,0): a[0][0] miss, a[1][0] miss (0,1): a[1][0] hit, a[2][0] miss (0,2): a[2][0] hit, a[3][0] miss (0,3): a[3][0] hit, a[4][0] miss (0,4): a[4][0] hit, a[5][0] miss συνολικά, θα έχουμε 4*8=32 misses (0,5): a[5][0] hit, a[6][0] miss (0,6): a[6][0] hit, a[7][0] miss (0,7): a[7][0] hit, a[8][0] hit (0,8): a[8][0] hit, a[9][0] hit

Υποθέστε τώρα ότι έχετε μια cache ίδιας οργάνωσης, αλλά απείρου μεγέθους. Πώς θα ξαναγράφατε τον κώδικα του ερωτήματος 2, μειώνοντας περαιτέρω τον αριθμό των κλήσεων στην prf; για να ελαχιστοποιήσουμε τα prefetches, εκτελούμε την 1 η μόνο επανάληψη του εξωτερικού βρόχου με prefetches και τις υπόλοιπες ως έχουν ξέρουμε ότι η cache είναι απείρου μεγέθους, οπότε οι επόμενες επαναλήψεις δεν οδηγούν σε capacity misses for(j=0; j<100; j++){ prf(&a[j+8][0]); result += a[j][0]*a[j+1][0] + 0.5; } for(i=1; i<4; i++) for(j=0; j<100; j++) result += a[j][i]*a[j+1][i] + 0.5; συνολικά, θα έχουμε 8 misses

Θεωρείστε πάλι τον αρχικό κώδικα (χωρίς τις προφορτώσεις). Εκτός από την προφόρτωση δεδομένων, ποια άλλη γνωστή τεχνική βελτιστοποίησης θα εφαρμόζατε στον κώδικα ώστε να μειωθούν τα misses; for(i=0; i<4; i++) for(j=0; j<100; j++) result += a[j][i]*a[j+1][i] + 0.5; στο σώμα του loop δεν υπάρχουν εξαρτήσεις, επομένως μπορούμε να εφαρμόσουμε αναδιάταξη βρόχων (loop interchange) for(j=0; j<100; j++) for(i=0; i<4; i++) result += a[j][i]*a[j+1][i] + 0.5; τώρα ο πίνακας προσπελαύνεται όπως είναι αποθηκευμένος καλύτερη τοπικότητα αναφορών, αφού γειτονικά στοιχεία προσπελαύνονται σε διαδοχικές επαναλήψεις του εσωτερικού loop misses συμβαίνουν όταν αναφερόμαστε στο πρώτο στοιχείο κάθε γραμμής (i=0) συνολικά έχουμε 100 misses