Allow choice to output to tracefile to be set at runtime

This commit is contained in:
Howard Mao 2018-09-28 01:26:47 +00:00
parent b28259fbda
commit c54e05a6db
6 changed files with 50 additions and 28 deletions

View File

@ -75,10 +75,11 @@ class FireSimServerNode(FireSimNode):
SERVERS_CREATED = 0
def __init__(self, server_hardware_config=None, server_link_latency=None,
server_bw_max=None):
server_bw_max=None, server_tracing=None):
super(FireSimServerNode, self).__init__()
self.server_hardware_config = server_hardware_config
self.server_link_latency = server_link_latency
self.server_tracing = server_tracing
self.server_bw_max = server_bw_max
self.job = None
self.server_id_internal = FireSimServerNode.SERVERS_CREATED
@ -110,7 +111,7 @@ class FireSimServerNode(FireSimNode):
"""
return self.server_hardware_config.get_boot_simulation_command(
self.get_mac_address(), self.get_rootfs_name(), slotno, self.server_link_latency,
self.server_bw_max, self.get_bootbin_name())
self.server_bw_max, self.get_bootbin_name(), self.server_tracing)
def copy_back_job_results_from_run(self, slotno):
"""

View File

@ -34,7 +34,7 @@ class FireSimTopologyWithPasses:
def __init__(self, user_topology_name, no_net_num_nodes, run_farm, hwdb,
defaulthwconfig, workload, defaultlinklatency, defaultswitchinglatency,
defaultnetbandwidth, terminateoncompletion):
defaultnetbandwidth, defaulttracing, terminateoncompletion):
self.passes_used = []
self.user_topology_name = user_topology_name
self.no_net_num_nodes = no_net_num_nodes
@ -46,6 +46,7 @@ class FireSimTopologyWithPasses:
self.defaultlinklatency = defaultlinklatency
self.defaultswitchinglatency = defaultswitchinglatency
self.defaultnetbandwidth = defaultnetbandwidth
self.defaulttracing = defaulttracing
self.terminateoncompletion = terminateoncompletion
self.phase_one_passes()
@ -247,6 +248,8 @@ class FireSimTopologyWithPasses:
node.server_link_latency = self.defaultlinklatency
if node.server_bw_max is None:
node.server_bw_max = self.defaultnetbandwidth
if node.server_tracing is None:
node.server_tracing = self.defaulttracing
def pass_assign_jobs(self):
""" assign jobs to simulations. """

View File

@ -75,18 +75,23 @@ class RuntimeHWConfig:
def get_boot_simulation_command(self, macaddr, blkdev, slotid, linklatency,
netbw, bootbin):
netbw, bootbin, tracing):
""" return the command used to boot the simulation. this has to have
some external params passed to it, because not everything is contained
in a runtimehwconfig. TODO: maybe runtimehwconfig should be renamed to
pre-built runtime config? It kinda contains a mix of pre-built and
runtime parameters currently. """
tracefile = "+tracefile=TRACEFILE" if tracing else ""
# this monstrosity boots the simulator, inside screen, inside script
# the sed is in there to get rid of newlines in runtime confs
driver = self.get_local_driver_binaryname()
runtimeconf = self.get_local_runtimeconf_binaryname()
basecommand = """screen -S fsim{slotid} -d -m bash -c "script -f -c 'stty intr ^] && sudo ./{driver} +permissive $(sed \':a;N;$!ba;s/\\n/ /g\' {runtimeconf}) +macaddr={macaddr} +blkdev={blkdev} +slotid={slotid} +niclog=niclog +linklatency={linklatency} +netbw={netbw} +profile-interval=-1 +zero-out-dram +permissive-off {bootbin} && stty intr ^c' uartlog"; sleep 1""".format(slotid=slotid, driver=driver, runtimeconf=runtimeconf, macaddr=macaddr, blkdev=blkdev, linklatency=linklatency, netbw=netbw, bootbin=bootbin)
basecommand = """screen -S fsim{slotid} -d -m bash -c "script -f -c 'stty intr ^] && sudo ./{driver} +permissive $(sed \':a;N;$!ba;s/\\n/ /g\' {runtimeconf}) +macaddr={macaddr} +blkdev={blkdev} +slotid={slotid} +niclog=niclog {tracefile} +linklatency={linklatency} +netbw={netbw} +profile-interval=-1 +zero-out-dram +permissive-off {bootbin} && stty intr ^c' uartlog"; sleep 1""".format(
slotid=slotid, driver=driver, runtimeconf=runtimeconf,
macaddr=macaddr, blkdev=blkdev, linklatency=linklatency,
netbw=netbw, bootbin=bootbin, tracefile=tracefile)
return basecommand
@ -171,6 +176,7 @@ class InnerRuntimeConfiguration:
self.linklatency = int(runtime_dict['targetconfig']['linklatency'])
self.switchinglatency = int(runtime_dict['targetconfig']['switchinglatency'])
self.netbandwidth = int(runtime_dict['targetconfig']['netbandwidth'])
self.tracing = runtime_dict['targetconfig']['tracing'] == "yes"
self.defaulthwconfig = runtime_dict['targetconfig']['defaulthwconfig']
@ -220,7 +226,7 @@ class RuntimeConfig:
self.runfarm, self.runtimehwdb, self.innerconf.defaulthwconfig,
self.workload, self.innerconf.linklatency,
self.innerconf.switchinglatency, self.innerconf.netbandwidth,
self.innerconf.terminateoncompletion)
self.innerconf.tracing, self.innerconf.terminateoncompletion)
def launch_run_farm(self):
""" directly called by top-level launchrunfarm command. """

View File

@ -18,6 +18,7 @@ no_net_num_nodes=2
linklatency=6405
switchinglatency=10
netbandwidth=200
tracing=yes
# This references a section from config_hwconfigs.ini
# In homogeneous configurations, use this to set the hardware config deployed

View File

@ -26,13 +26,16 @@
tracerv_t::tracerv_t(simif_t *sim, char *tracefile): endpoint_t(sim)
tracerv_t::tracerv_t(simif_t *sim, char *tracefilename): endpoint_t(sim)
{
#ifdef TRACERVWIDGET_0
this->tracefile = fopen(tracefile, "w");
if (!this->tracefile) {
fprintf(stderr, "Could not open Trace log file: %s\n", this->tracefile);
abort();
this->tracefile = NULL;
if (tracefilename) {
this->tracefile = fopen(tracefilename, "w");
if (!this->tracefile) {
fprintf(stderr, "Could not open Trace log file: %s\n", this->tracefile);
abort();
}
}
#endif // #ifdef TRACERVWIDGET_0
}
@ -72,25 +75,29 @@ void tracerv_t::tick() {
if (outfull) {
// TODO. as opt can mmap file and just load directly into it.
pull(TRACERV_ADDR, (char*)OUTBUF, QUEUE_DEPTH * 64);
if (this->tracefile) {
#ifdef HUMAN_READABLE
for (int i = 0; i < QUEUE_DEPTH * 8; i+=8) {
fprintf(this->tracefile, "%016llx", OUTBUF[i+7]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+6]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+5]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+4]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+3]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+2]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+1]);
fprintf(this->tracefile, "%016llx\n", OUTBUF[i+0]);
}
#else
for (int i = 0; i < QUEUE_DEPTH * 8; i+=8) {
// this stores as raw binary. stored as little endian. e.g. to get the same thing as the human readable above, flip all the bytes in each 512-bit line.
for (int q = 0; q < 8; q++) {
fwrite(OUTBUF + (i+q), sizeof(uint64_t), 1, this->tracefile);
for (int i = 0; i < QUEUE_DEPTH * 8; i+=8) {
fprintf(this->tracefile, "%016llx", OUTBUF[i+7]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+6]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+5]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+4]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+3]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+2]);
fprintf(this->tracefile, "%016llx", OUTBUF[i+1]);
fprintf(this->tracefile, "%016llx\n", OUTBUF[i+0]);
}
#else
for (int i = 0; i < QUEUE_DEPTH * 8; i+=8) {
// this stores as raw binary. stored as little endian.
// e.g. to get the same thing as the human readable above,
// flip all the bytes in each 512-bit line.
for (int q = 0; q < 8; q++) {
fwrite(OUTBUF + (i+q), sizeof(uint64_t), 1, this->tracefile);
}
}
}
#endif
}
}
#endif // ifdef TRACERVWIDGET_0

View File

@ -18,6 +18,7 @@ firesim_top_t::firesim_top_t(int argc, char** argv, firesim_fesvr_t* fesvr, uint
char * blkfile = NULL;
char * niclogfile = NULL;
char * slotid = NULL;
char * tracefile = NULL;
uint64_t mac_little_end = 0; // default to invalid mac addr, force user to specify one
int netbw = MAX_BANDWIDTH, netburst = 8;
int linklatency = 0;
@ -82,6 +83,9 @@ firesim_top_t::firesim_top_t(int argc, char** argv, firesim_fesvr_t* fesvr, uint
char *str = const_cast<char*>(arg.c_str()) + 13;
linklatency = atoi(str);
}
if (arg.find("+tracefile=") == 0) {
tracefile = const_cast<char*>(arg.c_str()) + 11;
}
}
add_endpoint(new uart_t(this));
@ -106,7 +110,7 @@ firesim_top_t::firesim_top_t(int argc, char** argv, firesim_fesvr_t* fesvr, uint
add_endpoint(new blockdev_t(this, blkfile));
add_endpoint(new simplenic_t(this, slotid, mac_little_end, netbw, netburst, linklatency, niclogfile));
add_endpoint(new tracerv_t(this, "TRACEFILE"));
add_endpoint(new tracerv_t(this, tracefile));
// add more endpoints here
}