Navigation

News

Courses

Quick Links

Εισαγωγή

Τα simulation marks μας δίνουν τη δυνατότητα στον SESC να περιορίσουμε την αναλυτική, cycle-accurate, μικροαρχιτεκτονική προσομοίωση σε ένα συγκεκριμένο μέρος του προγράμματός μας όπου θέλουμε να επικεντρωθούμε. Tα υπόλοιπα τμήματα του προγράμματος εκτελούνται από τον προσομοιωτή σε functional mode (ή "rabbit mode" όπως λέγεται χαρακτηριστικά στον SESC), δηλαδή δεν μοντελοποιείται ο χρονισμός των εντολών, παρά μόνο η λειτουργικότητά τους, ώστε το αποτέλεσμα που παράγει μια εντολή στον προσομοιωτή να είναι το ίδιο με αυτό που θα είχαμε αν εκτελούταν στο πραγματικό σύστημα.

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

Χρήση simulation marks στον SESC

Χρησιμοποιώντας τη συνάρτηση sesc_simulation_mark(), ο προγραμματιστής μπορεί να ορίσει μέσα στο πρόγραμμα ένα simulation mark. Ένα παράδειγμα χρήσης simulation marks είναι αυτό που φαίνεται στη συνέχεια. Με κόκκινα φαίνονται οι απαραίτητες προσθήκες σε σχέση με το αρχικό πρόγραμμα.

#include <stdlib.h>
#include "sescapi.h"

int main(int argc, char **argv)
{
	...
   
	/* We don't want to include this part in accurate, 
	 * timing simulation. Just perform here the appropriate 
	 * initializations for the rest program to operate 
	 * correctly...
	 */
	initialize_structures();

	/* Here is where the parts of interest begin...*/

	/*simulation mark 0*/
	sesc_simulation_mark();
	
	part1();
	
	/*simulation mark 1*/
	sesc_simulation_mark();
	
	part2();
	
	/*simulation mark 2*/
	sesc_simulation_mark();
	
	part3();
	
	/*simulation mark 3*/
	sesc_simulation_mark();
	
	...
	
}

Στο παραπάνω πρόγραμμα έχουμε 3 περιοχές ενδιαφέροντος τις οποίες έχουμε περικλείσει με simulation marks. Τα simulation marks έχουν το καθένα το δικό τους id, αρχίζοντας από το 0. Στο command line του SESC μπορούμε να ορίσουμε δύο μόνο simulation marks μεταξύ των οποίων μπορούμε να πραγματοποιήσουμε αναλυτική προσομοίωση, χρησιμοποιώντας τα ορίσματα -1<ΙΝΤ> και -2<IΝΤ> (πρώτο και δεύτερο simulation mark, αντίστοιχα). Αυτό σημαίνει ότι μπορούμε να προσομοιώσουμε αναλυτικά συνεχόμενες περιοχές ενός προγράμματος (π.χ. τις περιοχές part1, part2+part3, part1+part2+part3, αλλά όχι part1+part3).

Για να προσομοιώσουμε π.χ. την περιοχή part2, τα ορίσματα που δίνουμε στον SESC είναι τα εξής:

$ sesc.mem -c ./sesc.conf -11 -22 ./hello
O προσομοιωτής θα εκτελέσει σε rabbit mode το πρόγραμμα μέχρι και το simulation mark 1, θα κάνει αναλυτική προσομοίωση για το part2, και έπειτα θα τερματίσει.

Μεταγλώττιση προγραμμάτων με simulation marks

Για την μεταγλώττιση ενός προγράμματος που χρησιμοποιεί τη συνάρτηση sesc_simulation_mark(), χρειάζεται να γίνει compile και αργότερα link το αρχείο sesc_events.c που υπάρχει στον κατάλογο libapp του πηγαίου κώδικα του SESC. Μπορείτε να αντιγράψετε το αρχείο αυτό στον κατάλογο του προγράμματός σας, ή απλά να προσδιορίσετε την τοποθεσία του μέσα από το Makefile (με κόκκινα φαίνονται οι προσθήκες στο πρότυπο του Makefile που είχε περιγραφεί εδώ):

OBJS = hello.o sesc_events.o

SESC_LIBAPP = /myhomepath/sesc-sim/sesc/src/libapp/

#το hello.c κάνει include το sescapi.h
hello.o: hello.c
	$(CC) $(CFLAGS) -I/$(INCLUDEDIR) -I/$(SESC_LIBAPP) -c -o hello.o hello.c

sesc_events.o: $(SESC_LIBAPP)/sesc_events.c
	$(CC) $(CFLAGS) -I/$(INCLUDEDIR) -I/$(SESC_LIBAPP) -c -o sesc_events.o $(SESC_LIBAPP)/sesc_events.c