Υ- 01 Αρχιτεκτονική Υπολογιστών Προσομοιωτής SimpleScalar Αρης Ευθυμίου
Το σημερινό μάθημα Ο προσομοιωτής simplescalar 2
Simplescalar Σύνολο προσομοιωτών διάφορα επίπεδα αφαίρεσης/λεπτομέρειας θα χρησιμοποιήσουμε μόνο τον sim- outorder Αναπτύχθηκε από τον Todd AusUn SimpleScalar LLC hzp://www.simplescalar.com/ δωρεάν για ακαδημαϊκή χρήση Κάπως παρωχημένος πλέον για έρευνα, αλλά σχετικά μικρός χρόνος εκμάθησης αρκεί για τους σκοπούς του μαθήματος 3
Εγκατάσταση Download από το simplescalar.com (έκδοση 3.0e) Χρειάστηκε μικροαλλαγές, οπότε χρησιμοποιείστε το τοπικό αντίγραφο στον κατάλογο: ~eihym/simplescalar/ Δεν θα χρειαστούμε simpleuuls, simpletools, δεν θα μεταγλωτίσουμε προγράμματα, υπάρχουν έτοιμα Κρατήστε δικό σας αντίγραφο του πηγαίου κώδικα θα κάνετε αλλαγές στο κώδικα αποσυμπιέστε το αρχείο, δημιουργεί κατάλογο simplesim- 3.0 Στο κατάλογο του αντιγράφου σας: make clean make config-alpha make 4
Μετροπρογράμματα Από το SPEC Integer bzip, gcc, gobmk, mcf, hmmer, sjeng, FloaUng point bwaves, gromacs, lbm, milc, zeusmp Σε μορφή συμπιεσμένου eio (eio.gz) ένα αρχείο ανά μετροπρόγραμμα περιλαμβάνει την είσοδο το μεγαλύτερο είναι 1.7Μ Θα τα βρείτε: ~eihym/simplescalar 5
Οδηγίες χρήσης Σκεφτείτε πως θα οργανώσετε καταλόγους κώδικα, μετροπρογραμμάτων, αποτελεσμάτων,... Δημιουργία αρχείου ρυθμίσεων (configurauon): path_to/sim-outorder -dumpconfig config_file Διαβάστε το αρχείο και τα σχόλια Λεπτομέρειες στο documentauon (επόμενη διαφάνεια) Εκτέλεση ενός προγράμματος: sim-outorder -config config_file benchname.eio.gz 6
DocumentaUon users guide, hackers guide download from website Διαφάνειες, Ανδρέα Μόσχοβου (U. of Toronto) www.eecg.toronto.edu/~moshovos/aca06/lecturenotes/ simplescalar.ppt θα δούμε μια σύνοψη αυτών στη συνέχεια 7
Αποτελέσματα Η έξοδος εμφανίζεται στο τερματικό (stdout) Η εντολή με την οποία εκτελέστηκε Οι ρυθμίσεις Τα αποτελέσματα προσομοίωσης ( simulauon stausucs ) Αν χρειάζεστε τα αποτελέσματα ανακατεύθυνση εξόδου στο Unix: command > file ή για να κρατάτε και τα μηνύματα λάθους: command >& file ή, καλύτερα, δείτε τις επιλογές redir::sim, redir::prog 8
Συμβουλές Οταν προσθέτετε κάποιο δικό σας στοιχείο, προσθέστε μια επιλογή ρύθμισης ώστε να μπορεί να γίνει προσομοίωση και με την αλλαγή σας απενεργοποιημένη (με τον ίδιο κώδικα) για να μπορείτε να κάνετε σύγκριση εύκολα Οργανώστε το κώδικα με ένα revision control system, π.χ. git μπορείτε να δοκιμάσετε παραλλαγές και να επιστρέψετε σε παλιότερη έκδοση, αν δεν δουλέψουν καλά. Σκεφτείτε αυτοματοποίηση προσομοιώσεων και δημιουργία γραφημάτων με scripts παίρνουν πολύ ώρα 9
10
Simplescalar architecture
Ο Simplescalar είναι προσομοιωτής Δεν είναι ακριβές μοντέλο του υλικού κάνει απλοποιήσεις για να τρέχει γρήγορα Στη πραγματικότητα οι εντολές εκτελούνται νωρίς με τη σειρά προγράμματος και στο στάδιο dispatch (decode) Λανθασμένα εικαζόμενες (misspeculated) εντολές χρησιμοποιούν ένα ψεύτικο αρχείο καταχωρητών (και μνήμη) Οι κρυφές μνήμες κρατούν μόνο τα tags και πληροφορίες κατάστασης τα δεδομένα είναι στη μνήμη
Mapping into Simplescalar Reorder buffer (incl. physical registers), reservauon stauons έχουν συγχωνευτεί σε Register Update Unit (RUU) Οι Load/store δημιουργούν 2 micro- ops υπολογισμός διεύθυνσης (effecuve address calculauon) στο RUU πραγματικό load/store στο Load- Store Queue (LSQ)
RUU Circular buffer, each entry contains The instrucuon opcode, PC Ready bits for source registers A linked list of consumers per desunauon register Info for recovering from branch mispredicuon Status flags, e.g., what state is this in, is it an address op An instrucuon can execute when all source registers are available: readyq in ruu_issue() On write- back: walk target list, set ready bits of consumers
Understanding simplescalar Start with sim_main() at end of sim- outorder.c Don t get bogged down to minor details. Grasp the basics Then read the main funcuons: ruu_fetch(), ruu_dispatch(), ruu_issue(), lsq_refresh(), ruu_writeback (), ruu_commit() Could take a full day s work, prob. more Do this; it will save muluple debugging Ume later
sim_main() perform the fast- forward phase forever do ruu_commit () ruu_release_fu() ruu_writeback() lsq_refresh() ruu_issue() ruu_dispatch() ruu_fetch() Every iterauon is a single cycle MulUple instrucuons are handled inside most funcuons in a loop superscalar machine: many instrucuons per cycle
ruu_fetch() Fetch and predict a number of instrucuons It stalls on I$ misses, branch mispredicuon Using variable ruu_fetch_issue_delay in sim_main()! InstrucUons placed in fetch_data[] circular buffer I$, itlb accesses for updaung their status and provide latency determines hit/miss InstrucUon actually fetched from memory Branch predictor can cheat instrucuon opcode is passed to it
ruu_dispatch() Pick from fetchq and decode instrucuon (in order) in reality it also executes them uses a C switch statement and lots of macros Breaks loads/stores into effecuve address calculauon (into RUU) and load/store (into LSQ) Register renaming and dependency checking Using ruu_link_idep, ruu_install_odep! Checks if operands ready and places into readyq Checks for mispredicuon, sets spec_mode keeps recovery info.
ruu_issue() Get next ready instrucuon from readyq Stores complete immediately Loads check LSQ, access D$, dtlb All instrucuons (exc stores) try to get appropriate funcuonal unit fu = res_get (fu_pool, MD_OP_class (rs op) Schedule future event for compleuon eventq_queue_event(rs, sim_cycle + latency)
lsq_refresh() Scheduling for loads/stores Scan LSQ in order Store with unknown address, stop scanning Store with unknown data, remember address in std_unknowns! Ready load matching std_unknowns, don t issue Other ready loads move to readyq
ruu_writeback() Gets events from eventq, if Ume is right If recover instrucuon, squash pipe, correct PC, set ruu_fetch_issue_delay Update rename table Broadcast result to consuming instrucuons They may become ready; place in readyq
ruu_commit() Scan RUU in order If instrucuon not complete (writeback), finish If store, get mem- port, access D$, dtlb Release LSQ entry for loads/stores Release RUU entry
Εργασία 0: Δοκιμάστε το Τρέξτε τα μετροπρογράμματα με fast- forward 20 εκατομύρια εντολές και εκτέλεση 50 εκατομύρια - max:inst 50000000 - fasœwd 20000000 Αρχικό μηχάνημα (Baseline): Bimodal predictor αλλά με διαφορετικές τιμές από το default configurauon - bpred bimod - bpred:bimod 256 - bpred:ras 8 - bpred:btb 64 2 2- level predictor: - bpred 2lev - bpred:2lev 1 256 4 0 - bpred:ras 8 - bpred:btb 64 2 combining predictor (hybrid) - bpred comb - bpred:comb 256 - bpred:bimod 256 - bpred:2lev 1 256 4 0 - bpred:ras 8 - bpred:btb 64 2 23
Εργασία 0 Μετρήστε: branch predicuon rate IPC ή CPI Αναπαραστήστε τα αποτελέσματα σε γραφήματα χωριστές μπάρες για κάθε config για να έχετε μια μπάρα λιγότερη, κανονικοποιείστε τα αποτελέσματα ως προς το baseline (Res_conf1/Res_conf2) το baseline θα είναι το «1» Κάθε μετροπρόγραμμα θα έχει 2 μπάρες δίπλα- δίπλα με διαφορετικό χρώμα Για να χωρέσουν, βάλτε ξεχωριστά τα integer, και τα fp Υπολογίστε και έναν μεσο όρο ανά κατηγορία 24