nefelimet / comp-arch-lab-1

A repository containing code files and reports for the first lab of the Advanced Computer Architecture course.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

comp-arch-lab-1

Αναφορά και κώδικας για το πρώτο εργαστήριο του μαθήματος Αρχιτεκτονική Προηγμένων Υπολογιστών.

Authors: Δήμου Μαρία, Μεταλλίδου Νεφέλη

Ερώτημα 1

Για να έχουμε πρόσβαση στα αποτελέσματα των προσομοιώσεων, αρχικά δημιουργούμε τον φάκελο sim_results, στον οποίο θα αποθηκεύονται. Τρέχουμε την εντολή

./build/ARM/gem5.opt -d sim_results configs/example/arm/starter_se.py	--cpu="minor" "tests/test-progs/hello/bin/arm/linux/hello"

για να εκτελεστεί το hello και τα αποτελέσματά του να αποθηκευτούν στον sim_results. Η συχνότητα αλλάζει με το argument --cpu-freq=VALUE στην εντολή. Τρέχουμε π.χ. την εντολή

./build/ARM/gem5.opt -d sim_results configs/example/arm/starter_se.py	--cpu="minor" --cpu-freq="2GHz" "tests/test-progs/hello/bin/arm/linux/hello"

για να κάνουμε την συχνότητα 2 GHz (το default είναι 1GHz). Μέσα στο αρχείο starter_se.py εντοπίζουμε το tuple cpu_types, το οποίο περιέχει τους τύπους επεξεργαστή (atomic, minor, HPI), καθώς και τα χαρακτηριστικά του καθενός από αυτούς.

Επίσης η κλάση SimpleSeSystem έχει κάποιες μεταβλητές, όπως η clk_domain, η οποία για την αρχικοποίηση χρησιμοποιεί το clock="1GHz". Αυτό αφορά την συχνότητα του ρολογιού.

Στην συνάρτηση main βλέπουμε τα arguments που δίνουμε στην εντολή για να αλλάξουμε τις διάφορες παραμέτρους, π.χ. --cpu για να αλλάξουμε τον τύπο του επεξεργαστή, --mem-type για να αλλάξουμε τον τύπο της μνήμης, κτλ.

Ερώτημα 2

Το στοιχείο sim_seconds δείχνει τον αριθμό των δευτερολέπτων που έτρεξε η προσομοίωση, δηλαδή για πόσα δευτερόλεπτα τρέχει το προσομοιωμένο πρόγραμμα.

Το στοιχείο sim_insts δείχνει τον αριθμό των εντολών που έτρεξαν στο προσομοιωμένο πρόγραμμα. Παρατηρούμε ότι δεν αλλάζει με την αλλαγή της συχνότητας (αναμενόμενο, αφού τρέχουμε το ίδιο πρόγραμμα απλά με άλλη συχνότητα).

Το στοιχείο host_inst_rate δείχνει τον αριθμό των εντολών ανά δευτερόλεπτο προσομοίωσης.

Ερώτημα 3

Ανοίγοντας το αρχείο stats.txt βρίσκουμε τα εξής στοιχεία που μας ενδιαφέρουν:

  • system.cpu_cluster.l2.overall_misses::total = 474
  • system.cpu_cluster.cpus.icache.overall_misses::total = 327
  • system.cpu_cluster.cpus.dcache.overall_misses::total = 177 Το πρώτο στοιχείο δείχνει τον αριθμό αστοχιών στην L2 cache, ενώ τα άλλα δύο στην L1 I-cache και D-cache αντίστοιχα.

Από το ίδιο αρχείο βρίσκουμε το στοιχείο sim_insts, το οποίο δείχνει όπως είπαμε τον αριθμό των εντολών που εκτελέστηκαν. Εδώ ισούται με 5027.

Έχοντας όλα αυτά τα δεδομένα αντικαθιστούμε στον τύπο και βρίσκουμε CPI = 1 + ((327 + 177) * 6 + 474 * 5) / 5027 = 6.316.

Ερώτημα 4

Στο gem5.org πηγαίνουμε στο Documentation και στην συνέχεια στο CPU Models.

Απο εκεί αντλούμε τις εξής πληροφορίες για κάθε τύπο CPU.

Simple CPU

Η SimpleCPU είναι ένα λειτουργικό μοντέλο, κατάλληλο όταν δεν απαιτείται ένα λεπτομερές μοντέλο. Αυτό μπορεί να περιλαμβάνει περιόδους προθέρμανσης, συστήματα πελατών που οδηγούν έναν κεντρικό υπολογιστή ή απλώς δοκιμές για να βεβαιωθούμε ότι ένα πρόγραμμα λειτουργεί. Χωρίζεται σε τρεις κλάσεις:
BaseSimpleCPU, AtomicSimpleCPU, TimingSimpleCPU. Η BaseSimpleCPU διατηρεί την κατάσταση της αρχιτεκτονικής, καθορίζει λειτουργίες για τον έλεγχο διακοπών, υλοποιεί τη διεπαφή ExecContext, δεν μπορεί να εκτελεστεί μόνη της κτλ.
Η AtomicSimpleCPU χρησιμοποιεί ατομικές προσπελάσεις μνήμης και τις εκτιμήσεις λανθάνουσας κατάστασης από τις ατομικές προσπελάσεις για να εκτιμήσει τον συνολικό χρόνο πρόσβασης στη μνήμη cache, καθορίζει τη θύρα που χρησιμοποιείται για τη σύνδεση με τη μνήμη και συνδέει τη CPU με την κρυφή μνήμη κτλ. Τέλος, η TimingSimpleCPU χρησιμοποιεί προσπελάσεις μνήμης με χρονισμό, καθυστερεί στις προσπελάσεις στην κρυφή μνήμη και περιμένει να απαντήσει το σύστημα μνήμης πριν προχωρήσει κτλ. Όπως η AtomicSimpleCPU, έτσι και η TimingSimpleCPU προέρχεται από τη BaseSimpleCPU και υλοποιεί το ίδιο σύνολο λειτουργιών.

O3CPU

Η O3CPU είναι το νέο λεπτομερές μοντέλο για την έκδοση v2. 0. Πρόκειται για ένα μοντέλο CPU εκτός σειράς που βασίζεται στον Alpha 21264. Περιέχει τα εξής:
Pipeline stages, Execute-in-execute model, Template Policies, ISA independence, Interaction with ThreadContext. Τα στάδια του Pipeline είναι : Fetch, αποκωδικοποίηση, μετονομασία, έκδοση/εκτέλεση/επιστροφή, δέσμευση. Το μοντέλο Execute-in-execute εκτελεί πραγματικά εντολές σε στάδιο Pipeline. Η O3CPU χρησιμοποιεί σε μεγάλο βαθμό τις πολιτικές προτύπων για να επιτύχει ένα επίπεδο πολυμορφισμού χωρίς να χρειάζεται να χρησιμοποιεί εικονικές συναρτήσεις και έχει σχεδιαστεί έτσι ώστε να προσπαθεί να διαχωρίσει τον κώδικα που εξαρτάται από το ISA από τον κώδικα που είναι ανεξάρτητος από το ISA. Τέλος, το ThreadContext παρέχει διεπαφή για εξωτερικά αντικείμενα για πρόσβαση στην κατάσταση των νημάτων εντός της CPU .

TraceCPU

Το μοντέλο Trace CPU αναπαράγει ελαστικά ίχνη, τα οποία είναι ίχνη με σχόλια εξάρτησης και χρονισμού που παράγονται από τον ανιχνευτή Elastic Trace Probe που είναι προσαρτημένος στο μοντέλο CPU O3. Η εστίαση του μοντέλου Trace CPU είναι η διερεύνηση των επιδόσεων του συστήματος μνήμης (ιεραρχία κρυφής μνήμης, διασυνδέσεις και κύρια μνήμη) με γρήγορο και αρκετά ακριβή τρόπο, αντί της χρήσης του λεπτομερούς αλλά αργού μοντέλου CPU O3. Τα ίχνη αναπτύχθηκαν για single-threaded benchmarks που προσομοιώνονται τόσο σε λειτουργία SE όσο και σε FS. Γενικά, τα ελαστικά ίχνη μπορούν να μεταφερθούν σε άλλα περιβάλλοντα προσομοίωσης.

Minor CPU Model

Το Minor είναι ένα μοντέλο επεξεργαστή σε σειρά με σταθερό αγωγό αλλά με παραμετροποιήσιμες δομές δεδομένων και συμπεριφορά εκτέλεσης. Προορίζεται να χρησιμοποιηθεί για τη μοντελοποίηση επεξεργαστών με αυστηρή συμπεριφορά εκτέλεσης εντός σειράς και επιτρέπει την οπτικοποίηση της θέσης μιας εντολής στον αγωγό μέσω του εργαλείου MinorTrace/minorview. py. Η πρόθεση είναι να παρασχεθεί ένα πλαίσιο για τη μικρο-αρχιτεκτονική συσχέτιση του μοντέλου με έναν συγκεκριμένο, επιλεγμένο επεξεργαστή με παρόμοιες δυνατότητες. Στη φιλοσοφία του σχεδιασμού του Minor ανήκουν : η πολυνηματικότητα και οι δομές δεδομένων.

(a) Γράφουμε ένα πολύ απλό πρόγραμμα σε C, το οποίο απλά προσθέτει δύο αριθμούς. Το ονομάζουμε program.c και το μετακινούμε στον φάκελο /tests/test-progs/program. Χρησιμοποιούμε την εντολή

arm_linux_gnueabihf-gcc --static program.c -o program_arm

για να γίνει cross-compiled.

Για τον MinorCPU, τρέχουμε την εντολή

./build/ARM/gem5.opt configs/example/se.py --cpu-type="MinorCPU" --caches --cmd="tests/test-progs/program/program_arm"

ενώ για τον TimingSimpleCPU την εντολή

./build/ARM/gem5.opt configs/example/se.py --cpu-type="TimingSimpleCPU" --caches --cmd="tests/test-progs/program/program_arm"

Από το αρχείο stats.txt αντλούμε για κάθε περίπτωση τα παρακάτω στοιχεία:

παράμετρος MinorCPU TimingSimpleCPU
final_tick 34314000 38682000
sim_seconds 0.000034 0.000039
sim_ticks 34314000 38682000
host_tick_rate 631506173 2602421486
host_inst_rate 153724 561191
host_op_rate 176317 638260
host_seconds 0.05 0.01

Τα στοιχεία δίνουν μια συνολική εικόνα για την απόδοση. Ο χρόνος εκτέλεσης σε δευτερόλεπτα είναι το sim_seconds.

Για το MinorCPU μοντέλο, τα στοιχεία στο repo μας βρίσκονται στο αρχείο MinorCPU_stats.txt, ενώ για το TimingSimpleCPU στο TimingSimpleCPU_stats.txt.

(b) Η τεχνολογία μνήμης αλλάζει με το argument --mem-type=VALUE. Για το μοντέλο MinorCPU τρέχουμε την εντολή

./build/ARM/gem5.opt configs/example/se.py --cpu-type="MinorCPU" --caches --cmd="tests/test-progs/program/program_arm" --mem-type="SimpleMemory"

για να δοκιμάσουμε τον τύπο μνήμης SimpleMemory, και μετά τρέχουμε την

./build/ARM/gem5.opt configs/example/se.py --cpu-type="MinorCPU" --caches --cmd="tests/test-progs/program/program_arm" --mem-type="HBM_1000_4H_1x128"

για να δοκιμάσουμε τον τύπο HBM_1000_4H_1x128. Τα αποτελέσματα στο repo μας είναι στα αρχεία MinorCPU_SimpleMemory_stats.txt" και MinorCPU_HBM_stats.txt" αντίστοιχα.

Κάτι αντίστοιχο κάνουμε και για το TimingSimpleCPU.

Τα αποτελέσματα αυτών των δοκιμών φαίνονται στους παρακάτω πίνακες.

MinorCPU:

παράμετρος SimpleMemory HBM
final_tick 27141000 37163000
sim_seconds 0.000027 0.000037
sim_ticks 27141000 37163000
host_tick_rate 609993469 758866298
host_inst_rate 189585 172258
host_op_rate 217010 197525
host_seconds 0.04 0.05

TimingSimpleCPU:

παράμετρος SimpleMemory HBM
final_tick 31701000 41000000
sim_seconds 0.000032 0.000041
sim_ticks 31701000 41000000
host_tick_rate 765641407 800815519
host_inst_rate 200607 162499
host_op_rate 228951 185168
host_seconds 0.04 0.05

Παρατηρούμε ότι κοιτάζοντας διαφορετικά στοιχεία βλέπουμε διαφορετική ευαισθησία στο κάθε μοντέλο.

Κριτική

Όπως ζητήθηκε, αναφέρουμε και την κριτική μας για την εργασία. Το αντικείμενο είχε πολύ μεγάλο ενδιαφέρον, αλλά πιστεύουμε ότι αναλωθήκαμε παραπάνω από ότι χρειαζόταν στο να προσπαθούμε να κάνουμε build σε Linux με λανθασμένες οδηγίες, μέχρι να δοθεί το έτοιμο VM. Θα μπορούσε κάτι τέτοιο να είχε δοθεί εξ'αρχής, και όχι 4 μέρες πριν από το deadline. Ο παραπάνω χρόνος που θα είχαμε κερδίσει θα μπορούσε να είχε αφιερωθεί στο να καταλάβουμε καλύτερα τα ζητούμενα και να έχουμε μια πιο προσεγμένη αναφορά. Επίσης και κάποιες άλλες από τις οδηγίες στο pdf ήταν λάθος, όπως π.χ. το -caches αντί για --caches (διπλή παύλα). Βέβαια κάτι τέτοιο μπορούμε να βρούμε και μόνοι μας εύκολα με το argument --help, αλλά το να ήταν σωστές οι οδηγίες στο pdf θα έκανε την διαδικασία πιο εύκολη. Επίσης, καθώς για το τρέξιμο του gem5 απαιτείται και αρκετή μνήμη και γενικά γρήγορος υπολογιστής, κάτι το οποίο δεν διαθέτουν όλοι, θα ήταν πολύ χρήσιμο να μπορούμε να επισκεφτούμε υπολογιστές της σχολής, οι οποίοι έχουν τις απαραίτητες προδιαγραφές, για να κάνουμε εκεί την εργασία.

About

A repository containing code files and reports for the first lab of the Advanced Computer Architecture course.


Languages

Language:Python 99.4%Language:C 0.6%