From: Augustin Degomme Date: Tue, 5 Nov 2013 18:04:19 +0000 (+0100) Subject: Make time independent tracing output by default in one file per process X-Git-Tag: v3_11_beta~387 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/dc0e44715d73224df3cff50a9a0f42e73b1afc8c Make time independent tracing output by default in one file per process Structure is filename.txt : list of all the files to open folder filename.txt_files : all files, with unique names (so that they won't be erased by a new run, only the main one will) Adds an option tracing/smpi/format/ti_one_file to only use one subfile and put every event in it For larger runs this will avoid opening too many handles. --- diff --git a/src/instr/instr_TI_trace.c b/src/instr/instr_TI_trace.c index 7b67d984d1..6fd798f25e 100644 --- a/src/instr/instr_TI_trace.c +++ b/src/instr/instr_TI_trace.c @@ -5,16 +5,27 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "instr/instr_private.h" #include "xbt/virtu.h" /* sg_cmdline */ -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_TI_trace, instr_trace, "tracing event system"); +#include "xbt/xbt_os_time.h" +#include "simgrid/sg_config.h" + +#include + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_TI_trace, instr_trace, "tracing event system"); extern FILE *tracing_file; +double prefix=0.0; + +xbt_dict_t tracing_files = NULL; + extern s_instr_trace_writer_t active_writer; extern xbt_dynar_t buffer; void TRACE_TI_init(void) { active_writer.print_PushState = print_TIPushState; + active_writer.print_CreateContainer=print_TICreateContainer; + active_writer.print_DestroyContainer=print_TIDestroyContainer; } void TRACE_TI_start(void) @@ -39,12 +50,59 @@ void TRACE_TI_start(void) void TRACE_TI_end(void) { + if(tracing_files)xbt_dict_free(&tracing_files); fclose(tracing_file); char *filename = TRACE_get_filename(); xbt_dynar_free(&buffer); XBT_DEBUG("Filename %s is closed", filename); } +void print_TICreateContainer(paje_event_t event){ + + char* folder_name = bprintf("%s_files",TRACE_get_filename()); + if(tracing_files==NULL){ + tracing_files = xbt_dict_new_homogeneous(NULL); + struct stat st; + if (stat(folder_name, &st) == -1) { + mkdir(folder_name, 0700); + } + //generate unique run id with time + prefix=xbt_os_time(); + } + + //Open a file for each new container + char *filename = NULL; + + + //if we are in the mode with only one file + static FILE* temp = NULL; + + if (!xbt_cfg_get_boolean(_sg_cfg_set, "tracing/smpi/format/ti_one_file") || temp ==NULL){ + filename = bprintf("%s/%f_%s.txt", folder_name, prefix, ((createContainer_t) event->data)->container->name); + temp=fopen(filename, "w"); + if(temp==NULL){ + xbt_die("Tracefile %s could not be opened for writing.", + filename); + } + fprintf(tracing_file, "%s\n", filename); + + } + + + + xbt_dict_set(tracing_files, ((createContainer_t) event->data)->container->name, (void*)temp, NULL); + + //Append its path to the main file + free(folder_name); + free(filename); +} + + +void print_TIDestroyContainer(paje_event_t event){ + xbt_dict_remove(tracing_files, ((destroyContainer_t) event->data)->container->name); +} + + void print_TIPushState(paje_event_t event) { @@ -64,95 +122,97 @@ void print_TIPushState(paje_event_t event) else process_id = xbt_strdup(((pushState_t) event->data)->container->name + 5); + FILE* trace_file = (FILE* )xbt_dict_get(tracing_files, ((pushState_t) event->data)->container->name); + switch (extra->type) { case TRACING_INIT: - fprintf(tracing_file, "%s init\n", process_id); + fprintf(trace_file, "%s init\n", process_id); break; case TRACING_FINALIZE: - fprintf(tracing_file, "%s finalize\n", process_id); + fprintf(trace_file, "%s finalize\n", process_id); break; case TRACING_SEND: - fprintf(tracing_file, "%s send %d %d %s\n", process_id, extra->dst, + fprintf(trace_file, "%s send %d %d %s\n", process_id, extra->dst, extra->send_size, extra->datatype1); break; case TRACING_ISEND: - fprintf(tracing_file, "%s isend %d %d %s\n", process_id, extra->dst, + fprintf(trace_file, "%s isend %d %d %s\n", process_id, extra->dst, extra->send_size, extra->datatype1); break; case TRACING_RECV: - fprintf(tracing_file, "%s recv %d %d %s\n", process_id, extra->src, + fprintf(trace_file, "%s recv %d %d %s\n", process_id, extra->src, extra->send_size, extra->datatype1); break; case TRACING_IRECV: - fprintf(tracing_file, "%s irecv %d %d %s\n", process_id, extra->src, + fprintf(trace_file, "%s irecv %d %d %s\n", process_id, extra->src, extra->send_size, extra->datatype1); break; case TRACING_WAIT: - fprintf(tracing_file, "%s wait\n", process_id); + fprintf(trace_file, "%s wait\n", process_id); break; case TRACING_WAITALL: - fprintf(tracing_file, "%s waitall\n", process_id); + fprintf(trace_file, "%s waitall\n", process_id); break; case TRACING_BARRIER: - fprintf(tracing_file, "%s barrier\n", process_id); + fprintf(trace_file, "%s barrier\n", process_id); break; case TRACING_BCAST: // rank bcast size (root) (datatype) - fprintf(tracing_file, "%s bcast %d ", process_id, extra->send_size); + fprintf(trace_file, "%s bcast %d ", process_id, extra->send_size); if (extra->root != 0 || (extra->datatype1 && strcmp(extra->datatype1, ""))) - fprintf(tracing_file, "%d %s", extra->root, extra->datatype1); - fprintf(tracing_file, "\n"); + fprintf(trace_file, "%d %s", extra->root, extra->datatype1); + fprintf(trace_file, "\n"); break; case TRACING_REDUCE: // rank reduce comm_size comp_size (root) (datatype) - fprintf(tracing_file, "%s reduce %d %f ", process_id, extra->send_size, + fprintf(trace_file, "%s reduce %d %f ", process_id, extra->send_size, extra->comp_size); if (extra->root != 0 || (extra->datatype1 && strcmp(extra->datatype1, ""))) - fprintf(tracing_file, "%d %s", extra->root, extra->datatype1); - fprintf(tracing_file, "\n"); + fprintf(trace_file, "%d %s", extra->root, extra->datatype1); + fprintf(trace_file, "\n"); break; case TRACING_ALLREDUCE: // rank allreduce comm_size comp_size (datatype) - fprintf(tracing_file, "%s allreduce %d %f %s\n", process_id, + fprintf(trace_file, "%s allreduce %d %f %s\n", process_id, extra->send_size, extra->comp_size, extra->datatype1); break; case TRACING_ALLTOALL: // rank alltoall send_size recv_size (sendtype) (recvtype) - fprintf(tracing_file, "%s alltoall %d %d %s %s\n", process_id, + fprintf(trace_file, "%s alltoall %d %d %s %s\n", process_id, extra->send_size, extra->recv_size, extra->datatype1, extra->datatype2); break; case TRACING_ALLTOALLV: // rank alltoallv send_size [sendcounts] recv_size [recvcounts] (sendtype) (recvtype) - fprintf(tracing_file, "%s alltoallv %d ", process_id, extra->send_size); + fprintf(trace_file, "%s alltoallv %d ", process_id, extra->send_size); for (i = 0; i < extra->num_processes; i++) - fprintf(tracing_file, "%d ", extra->sendcounts[i]); - fprintf(tracing_file, "%d ", extra->recv_size); + fprintf(trace_file, "%d ", extra->sendcounts[i]); + fprintf(trace_file, "%d ", extra->recv_size); for (i = 0; i < extra->num_processes; i++) - fprintf(tracing_file, "%d ", extra->recvcounts[i]); - fprintf(tracing_file, "%s %s \n", extra->datatype1, extra->datatype2); + fprintf(trace_file, "%d ", extra->recvcounts[i]); + fprintf(trace_file, "%s %s \n", extra->datatype1, extra->datatype2); break; case TRACING_GATHER: // rank gather send_size recv_size root (sendtype) (recvtype) - fprintf(tracing_file, "%s gather %d %d %d %s %s\n", process_id, + fprintf(trace_file, "%s gather %d %d %d %s %s\n", process_id, extra->send_size, extra->recv_size, extra->root, extra->datatype1, extra->datatype2); break; case TRACING_ALLGATHERV: // rank allgatherv send_size [recvcounts] (sendtype) (recvtype) - fprintf(tracing_file, "%s allgatherv %d ", process_id, extra->send_size); + fprintf(trace_file, "%s allgatherv %d ", process_id, extra->send_size); for (i = 0; i < extra->num_processes; i++) - fprintf(tracing_file, "%d ", extra->recvcounts[i]); - fprintf(tracing_file, "%s %s \n", extra->datatype1, extra->datatype2); + fprintf(trace_file, "%d ", extra->recvcounts[i]); + fprintf(trace_file, "%s %s \n", extra->datatype1, extra->datatype2); break; case TRACING_REDUCE_SCATTER: // rank reducescatter [recvcounts] comp_size (sendtype) - fprintf(tracing_file, "%s reducescatter ", process_id); + fprintf(trace_file, "%s reducescatter ", process_id); for (i = 0; i < extra->num_processes; i++) - fprintf(tracing_file, "%d ", extra->recvcounts[i]); - fprintf(tracing_file, "%f %s\n", extra->comp_size, extra->datatype1); + fprintf(trace_file, "%d ", extra->recvcounts[i]); + fprintf(trace_file, "%f %s\n", extra->comp_size, extra->datatype1); break; case TRACING_COMPUTING: - fprintf(tracing_file, "%s compute %f\n", process_id, extra->comp_size); + fprintf(trace_file, "%s compute %f\n", process_id, extra->comp_size); break; case TRACING_GATHERV: // rank gatherv send_size [recvcounts] root (sendtype) (recvtype) - fprintf(tracing_file, "%s gatherv %d ", process_id, extra->send_size); + fprintf(trace_file, "%s gatherv %d ", process_id, extra->send_size); for (i = 0; i < extra->num_processes; i++) - fprintf(tracing_file, "%d ", extra->recvcounts[i]); - fprintf(tracing_file, "%d %s %s\n", extra->root, extra->datatype1, extra->datatype2); + fprintf(trace_file, "%d ", extra->recvcounts[i]); + fprintf(trace_file, "%d %s %s\n", extra->root, extra->datatype1, extra->datatype2); break; case TRACING_WAITANY: case TRACING_SENDRECV: diff --git a/src/instr/instr_config.c b/src/instr/instr_config.c index d6993321ca..50886f987c 100644 --- a/src/instr/instr_config.c +++ b/src/instr/instr_config.c @@ -22,6 +22,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration"); #define OPT_TRACING_SMPI_INTERNALS "tracing/smpi/internals" #define OPT_TRACING_DISPLAY_SIZES "tracing/smpi/display_sizes" #define OPT_TRACING_FORMAT "tracing/smpi/format" +#define OPT_TRACING_FORMAT_TI_ONEFILE "tracing/smpi/format/ti_one_file" #define OPT_TRACING_CATEGORIZED "tracing/categorized" #define OPT_TRACING_UNCATEGORIZED "tracing/uncategorized" #define OPT_TRACING_MSG_PROCESS "tracing/msg/process" @@ -105,7 +106,8 @@ int TRACE_start() /* init the tracing module to generate the right output */ /* open the trace file */ - const char* format = sg_cfg_get_string("tracing/smpi/format"); + /* open the trace file(s) */ + const char* format = sg_cfg_get_string(OPT_TRACING_FORMAT); XBT_DEBUG("Tracing format %s\n", format); if(!strcmp(format, "Paje")){ TRACE_paje_init(); @@ -114,11 +116,9 @@ int TRACE_start() TRACE_TI_init(); TRACE_TI_start(); }else{ - xbt_die("Unknown trace format :%s ", format); + xbt_die("Unknown trace format :%s ", format); } - - /* activate trace */ if (trace_active == 1) { THROWF(tracing_error, 0, "Tracing is already active"); @@ -188,9 +188,16 @@ int TRACE_end() xbt_dict_free(&declared_marks); xbt_dict_free(&created_categories); - /* close the trace file */ - TRACE_paje_end(); - + /* close the trace files */ + const char* format = sg_cfg_get_string(OPT_TRACING_FORMAT); + XBT_DEBUG("Tracing format %s\n", format); + if(!strcmp(format, "Paje")){ + TRACE_paje_end(); + }else if (!strcmp(format, "TI")){ + TRACE_TI_end(); + }else{ + xbt_die("Unknown trace format :%s ", format); + } /* de-activate trace */ trace_active = 0; XBT_DEBUG("Tracing is off"); @@ -455,6 +462,13 @@ void TRACE_global_init(int *argc, char **argv) xbt_cfgelm_string, 1, 1, NULL, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, OPT_TRACING_FORMAT, "Paje"); + + /* format -- Switch the ouput format of Tracing */ + xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_FORMAT_TI_ONEFILE, + "(smpi only for now) For replay format only : output to one file only", + xbt_cfgelm_boolean, 1, 1, NULL, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_FORMAT_TI_ONEFILE, "no"); + /* comment */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_COMMENT, "Comment to be added on the top of the trace file.", @@ -575,6 +589,11 @@ void TRACE_help (int detailed) "Default format is Paje. Time independent traces are also supported, \n" "to output traces that can later be used by the trace replay tool", detailed); + print_line (OPT_TRACING_FORMAT_TI_ONEFILE, "Only works for SMPI now, and TI output format", + "By default, each process outputs to a separate file, inside a filename_files folder \n" + "By setting this option to yes, all processes will output to only one file \n" + "This is meant to avoid opening thousands of files with large simulations", + detailed); print_line (OPT_TRACING_COMMENT, "Comment to be added on the top of the trace file.", " Use this to add a comment line to the top of the trace file.", detailed); diff --git a/src/instr/instr_private.h b/src/instr/instr_private.h index 8bafe0078a..cfa16136e9 100644 --- a/src/instr/instr_private.h +++ b/src/instr/instr_private.h @@ -364,6 +364,8 @@ void print_pajeEndLink(paje_event_t event); void print_pajeNewEvent (paje_event_t event); void print_TIPushState(paje_event_t event); +void print_TICreateContainer(paje_event_t event); +void print_TIDestroyContainer(paje_event_t event); void TRACE_TI_start(void); void TRACE_TI_end(void); void TRACE_TI_init(void);