Εισαγωγή
Ο SESC είναι ένας cycle-accurate προσομοιωτής μικροαρχιτεκτονικής επεξεργαστών που αναπτύχθηκε στο πανεπιστήμιο Urbana-Champaign του Illinois. Έχει τη δυνατότητα να προσομοιώσει από απλούς μικροεπεξεργαστές, μέχρι πολυ-επεξεργαστές ή επεξεργαστές πολλαπλών νημάτων. Το pipeline που μοντελοποιεί είναι αυτό ενός out-of-order, superscalar επεξεργαστή, με πρόβλεψη διακλάδωσης, caches, διαύλους διασύνδεσης στο υποσύστημα μνήμης, και γενικά όλα τα δομικά στοιχεία ενός μοντέρνου μικροεπεξεργαστή που είναι απαραίτητα για σωστή και ακριβή προσομοίωση.
Το σύνολο εντολών (ISA) που αναγνωρίζει ο SESC είναι αυτό του MIPS, επομένως για να προσομοιώσουμε μια εφαρμογή στον SESC πρέπει να την μεταγλωττίσουμε σε κάποιο MIPS-based Linux σύστημα (είτε native είτε χρησιμοποιώντας cross-development εργαλεία).
Εγκατάσταση του SESC
Για την εγκατάσταση του SESC προϋποτίθεται ότι έχετε κάποια πρόσφατη διανομή GNU/Linux, με τα συνήθη GNU εργαλεία ανάπτυξης λογισμικού (gcc, g++, make, κ.λπ.). Επιπλέον, συνίσταται να έχετε γύρω στα 100MB ελεύθερο χώρο στον σκληρό σας δίσκο.
-
Αρχικά, δημιουργήστε κάπου μέσα στο home folder σας έναν
κατάλογο όπου θα αποθηκεύσετε και θα εγκαταστήσετε τον SESC.
Στον ίδιο κατάλογο επιπλέον προτείνεται να αποθηκεύετε τις
διάφορες εφαρμογές που θα χρησιμοποιείτε σαν benchmarks στην
προσομοίωση μαζί με τα αποτελέσματα της προσομοίωσης.
Στο εξής, θα θεωρήσουμε ότι ο κατάλογος αυτός θα λέγεται
"sesc-sim".
[~]$ mkdir ~/sesc-sim
-
Κατεβάστε το tarball με τα sources του sesc από τη σελίδα
του μαθήματος,
και κάντε το extract στον κατάλογο sesc-sim.
[~]$ cd ~/sesc-sim [sesc-sim]$ tar zxvf ../sesc.tgz #Έστω ότι το sesc.tgz βρίσκεται στο home folder [sesc-sim]$ ls sesc
Δημιουργήθηκε o κατάλογος "sesc" ο οποίος περιέχει τα sources του simulator. -
Για να κάνετε build τον simulator, αρχικά δημιουργήστε μέσα στο sesc-sim έναν ξεχωριστό κατάλογο, π.χ. "build", ο οποίος θα περιέχει τελικά το εκτελέσιμο του SESC μαζί με όποια απαραίτητα configuration files, και ο οποίος θα είναι πλήρως ανεξαρτητοποιημένος από τον κατάλογο με τα sources.
[sesc-sim]$ mkdir build [sesc-sim]$ ls build sesc
Στη συνέχεια κάνουμε configure και build τον simulator. Γενικά υπάρχουν διάφορα πρόσθετα χαρακτηριστικά του προσομοιωτή που μπορούν να ενεργοποιηθούν κατά το configuration, όπως π.χ. μοντελοποίηση πολυ-επεξεργαστικών αρχιτεκτονικών, μοντελοποίηση κατανάλωσης ισχύος, μοντέλα θερμοκρασίας, κ.λπ. Μπορείτε να δείτε την πλήρη λίστα με τις πρόσθετες επιλογές, δίνοντας μέσα από τον κατάλογο "build" την εξής εντολή:[sesc-sim]$ cd build [build]$ ../sesc/configure --help
Στην προκειμένη περίπτωση, εμείς θα χρησιμοποιήσουμε το όρισμα --enable-smp για να υποστηρίξουμε προσομοίωση πολυ-επεξεργαστικών συστημάτων. Κάνουμε λοιπόν configure ως εξής:[build]$ ../sesc/configure --enable-smp
Αφού κάνουμε configure τον simulator, είμαστε έτοιμοι να τον κάνουμε build δίνοντας την εξής εντολή:
[build]$ make
H διαδικασία μεταγλώττισης μπορεί να πάρει αρκετό χρόνο, ανάλογα με το σύστημά σας. Μετά το πέρας της διαδικασίας, θα πρέπει να έχει παραχθεί στον κατάλογο build το εκτελέσιμο του simulator, δηλαδή το "sesc.smp".[build]$ ls config.h config.log config.status Make.defs Makefile obj sesc.smp
-
Τα χαρακτηριστικά του συστήματος που προσομοιώνεται κάθε φορά προδιαγράφονται σε κάποιο configuration αρχείο. Ο SESC έχει ήδη έτοιμα κάποια ενδεικτικά configuration αρχεία, τα οποία μπορούν να αλλαχθούν από τον χρήστη κατά το δοκούν. Για αρχή, θα χρησιμοποιήσουμε το default configuration αρχείο για τον προσομοιωτή που προέκυψε από την μεταγλώττιση. Για να δημιουργηθεί το αρχείο αυτό στον κατάλογο build, δίνουμε από τον κατάλογο αυτό την εντολή:
[build]$ make sesc.conf [build]$ ls config.h config.log config.status Make.defs Makefile obj sesc.conf sesc.smp shared.conf
Το configuration αρχείο που δημιουργείται είναι το "sesc.conf". Στη γενική περίπτωση, αυτό προδιαγράφει τα διάφορα μικροαρχιτεκτονικά χαρακτηριστικά του επεξεργαστή, και αυτό το αρχείο θα αλλάζουμε κάθε φορά που θέλουμε να μελετήσουμε την απόδοση του επεξεργαστή με διαφορετικές μικροαρχιτεκτονικές παραμέτρους στις δομικές του μονάδες.
Παράδειγμα προσομοίωσης εφαρμογής
Στην ενότητα αυτή θα δώσουμε ένα παράδειγμα για το πώς μπορούμε να προσομοιώσουμε την εκτέλεση μιας εφαρμογής στον SESC. Συγκεκριμένα, θα προσομοιώσουμε την εφαρμογή crafty από την σουίτα μετροπρογραμμάτων SPEC CPU2000 (http://www.spec.org/cpu/CINT2000/186.crafty/docs/186.crafty.html).
Η πρακτική που προτείνεται να ακολουθήσετε για την προσομοίωση τω εφαρμογών, είναι η δημιουργία ξεχωριστού καταλόγου για κάθε εφαρμογή όπου θα αποθηκεύεται το εκτελέσιμο της εφαρμογής, τα πιθανά αρχεία εισόδου/εξόδου της, και τα αρχεία εξόδου και των διαφόρων στατιστικών από την προσομοίωση.
Συνεπώς, στον αρχικό κατάλογο, δημιουργούμε τον κατάλογο "crafty",
[sesc-sim]$ mkdir crafty [sesc-sim]$ ls build crafty sescκαι εκεί τοποθετούμε το εκτελέσιμο "crafty" καθώς και το αρχείο εισόδου "crafty.in".
[sesc-sim]$ ls crafty crafty crafty.in
Για να εκτελέσουμε την προσομοίωση, καλούμε τον προσομοιωτή από τον κατάλογο crafty με τα εξής ορίσματα:
[sesc-sim]$ cd crafty [crafty]$ ../build/sesc.smp -c../build/sesc.conf ./crafty < ./crafty.inΜε το πρώτο όρισμα (-cCONF_FILE_NAME ) ορίζουμε το πλήρες path του configuration αρχείου που προδιαγράφει τα χαρακτηριστικά του επεξεργαστή που θέλουμε να προσομοιώσουμε. Σε αυτή την περίπτωση χρησιμοποιούμε το default configuration αρχείο (sesc.conf) που δημιουργήθηκε κατά την εγκατάσταση του προσομοιωτή στον κατάλογο build.
Τα ορίσματα που ακολουθούν είναι το εκτελέσιμο της εφαρμογής, μαζί με όποιες παραμέτρους αυτή χρειάζεται. Στο παραπάνω παράδειγμα, δίνουμε απλώς στην εφαρμογή crafty τα περιεχόμενα του αρχείου crafty.in σαν standard είσοδο.
Όταν ολοκληρωθεί η προσομοίωση, όλα τα αποτελέσματά της αποθηκεύονται σε ένα αρχείο εξόδου του οποίου το όνομα έχει τη μορφή "sesc_executable.sim_id", όπου "sim_id" είναι μια κατάληξη "μοναδική" για κάθε προσομοίωση. Π.χ. στην παραπάνω εκτέλεση, δημιουργείται το αρχείο "sesc_crafty.OmSeMJ".
[crafty]$ ls crafty crafty.in game.001 sesc_crafty.OmSeMJ
Στη γενική περίπτωση, για κάθε προσομοίωση θα χρειαστείτε να αλλάζετε μία ή περισσότερες παραμέτρους στο configuration αρχείο προκειμένου να μοντελοποιήσετε τη συμπεριφορά του επεξεργαστή με διαφορετικά χαρακτηριστικά λειτουργίας. Προκειμένου τα αρχεία εξόδου που θα προκύψουν από κάθε προσομοίωση να είναι "αναγνωρίσιμα" και ενδεικτικά των αλλαγών που κάνετε κάθε φορά (και να μην έχουν όλα τη μορφή π.χ. sesc_crafty.*), προτείνεται να χρησιμοποιήσετε επιπλέον το όρισμα -xΚΕΥ στη γραμμή εντολών, όπου KEY είναι μια "λέξη-κλειδί" ενδεικτική της αλλαγής που έχετε κάνει στις παραμέτρους. Αυτό έχει σαν αποτέλεσμα το όνομα του αρχείου εξόδου της προσομοίωσης να έχει τελικά τη μορφή "sesc_KEY_executable.sim_id".
π.χ. έχοντας αλλάξει τον default branch predictor στο default configuration αρχείο σε έναν "Not-taken" predictor, εκτελούμε την προσομοίωση με τα εξής ορίσματα:
[crafty]$ ../build/sesc.smp -c../build/sesc.conf -xnottaken ./crafty < ./crafty.in
και τελικά παράγεται το αρχείο εξόδου προσομοίοωσης sesc_nottaken_crafty.5tBMmv
[crafty]$ ls crafty crafty.in game.001 sesc_crafty.OmSeMJ sesc_nottaken_crafty.5tBMmv
Αποτελέσματα προσομοίωσης
Ένα αρχείο εξόδου προσομοίωσης περιλαμβάνει στην αρχή του ένα αντίγραφο του configuration αρχείου που χρησιμοποιήθηκε στην προσομοίωση, την πλήρη εντολή μαζί με όλα τα ορίσματα που δόθηκαν στη γραμμή εντολών για να εκτελεστεί η προσομοίωση, και ένα μεγάλο σύνολο από αποτελέσματα προσομοίωσης. Ο όγκος των πληροφοριών αυτών είναι αρκετά μεγάλος, εξαιτίας του ότι προσομοιώνεται η λειτουργία πολλών κομματιών του επεξεργαστή για τα οποία καταμετρώνται διάφορα γεγονότα. Ως εκ τούτου, οι πληροφορίες αυτές δεν είναι εύκολα αναγνώσιμες, και για τον σκοπό αυτό προτείνεται η χρήση του script "report.pl" μέσα από τον κατάλογο sesc/scripts/, το οποίο δέχεται σαν είσοδο το αρχικό αρχείο εξόδου και επεξεργάζεται τα περιεχόμενά του παράγοντας κάπως πιο συγκεντρωτικά και ευανάγνωστα αποτελέσματα.
Σε συνέχεια του παραδείγματος της προηγούμενης ενότητας, μέσα από τον κατάλογο crafty καλούμε το script ως εξής:
[crafty]$ ../sesc/scripts/report.pl ./sesc_nottaken_crafty.5tBMmv # Bench : ../build/sesc.smp -c../build/sesc.conf -xnottaken ./crafty # File : ./sesc_nottaken_crafty.5tBMmv : Sat Mar 22 23:51:38 2008 Exe Speed Exe MHz Exe Time Sim Time (5000MHz) 329.630 KIPS 1.2847 MHz 62.670 secs 16.103 msec Proc Avg.Time BPType Total RAS BPred BTB BTAC 0 33.730 nottaken 29.60% ( 99.85% of 5.89%) 25.21% ( 0.00% of 0.00%) 0.00% nInst BJ Load Store INT FP : LD Forward , Replay: Worst Unit (clk) 0 20657909 15.06% 12.38% 7.62% 64.95% 0.00% : 10.49% 335 inst/repl : LDSTIssueX 0.16 Proc IPC Cycles Busy LDQ STQ IWin ROB Regs Ports TLB maxBr MisBr Br4Clk Other 0 0.26 80514219 6.4 0.0 8.2 2.0 0.0 12.7 0.0 0.0 0.0 70.6 0.0 0.0 ################################################################################ Proc Cache Occ MissRate (RD, WR) %DMemAcc MB/s : ... 0 DL1 0.0 2.69% ( 1.1%, 1.6%) 93.50% 0.21GB/s : L1L2 2837.54 MB/s : SysBus 0 MB/s : MemoryBus 0 MB/s : ################################################################################ Proc Cache Occ MissRate (RD, WR) %DMemAcc MB/s : ... 0 IL1 0.0 1.06% ( 1.1%, 0.0%) 145.26% 0.13GB/s : L1L2 2837.54 MB/s : SysBus 0 MB/s : MemoryBus 0 MB/s :Τα αποτελέσματα που επιστρέφει το report.pl μας πληροφορούν μεταξύ άλλων για τα εξής:
- η προσομοίωση διήρκησε 62.670 δευτερόλεπτα πραγματικού χρόνου ("Exe Time")
- η εκτέλεση της εφαρμογής στο προσομοιούμενο σύστημα διήρκησε 16.103 msec ("Sim Time")
- σε κάθε δευτερόλεπτο πραγματικού χρόνου ο προσομοιωτής εκτελούσε κατά μέσο όρο 329.630 * 10^6 εντολές της εφαρμογής ("Exe Speed")
- προσομοιώθηκε η εκτέλεση 20657909 συνολικά εντολών της εφαρμογής ("nInst")
- χρειάστηκαν 80514219 κύκλοι του προσομοιούμενου επεξεργαστή για την εκτέλεση της εφαρμογής ("Cycles")
- ο μέσος αριθμός εντολών ανά κύκλο ήταν 0.26 ("IPC" == "nInst"/"Cycles" )