Allow choice to output to tracefile to be set at runtime
This commit is contained in:
parent
b28259fbda
commit
c54e05a6db
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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. """
|
||||
|
|
|
@ -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. """
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue