X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/673a25c682fbdedbdefbc513160b2710a5b545fb..016cd0085fff6c062767f0f1f03b98e3202a14f7:/src/instr/instr_config.c diff --git a/src/instr/instr_config.c b/src/instr/instr_config.c index e83bf2d1cb..851ca3d7eb 100644 --- a/src/instr/instr_config.c +++ b/src/instr/instr_config.c @@ -9,32 +9,157 @@ #ifdef HAVE_TRACING +XBT_LOG_NEW_CATEGORY(instr, "Logging the behavior of the tracing system (used for Visualization/Analysis of simulations)"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration"); + #define OPT_TRACING "tracing" #define OPT_TRACING_SMPI "tracing/smpi" #define OPT_TRACING_SMPI_GROUP "tracing/smpi/group" -#define OPT_TRACING_PLATFORM "tracing/platform" +#define OPT_TRACING_CATEGORIZED "tracing/categorized" #define OPT_TRACING_UNCATEGORIZED "tracing/uncategorized" #define OPT_TRACING_MSG_TASK "tracing/msg/task" #define OPT_TRACING_MSG_PROCESS "tracing/msg/process" #define OPT_TRACING_MSG_VOLUME "tracing/msg/volume" #define OPT_TRACING_FILENAME "tracing/filename" #define OPT_TRACING_PLATFORM_METHOD "tracing/platform/method" +#define OPT_TRIVA_UNCAT_CONF "triva/uncategorized" +#define OPT_TRIVA_CAT_CONF "triva/categorized" static int trace_configured = 0; static int trace_active = 0; -void TRACE_activate (void) +extern xbt_dict_t created_categories; //declared in instr_interface.c +extern xbt_dict_t defined_types; //declared in instr_interface.c + +int TRACE_start() { - if (trace_active){ - THROW0(tracing_error, TRACE_ERROR_ALREADY_ACTIVE, - "Tracing is already active."); + // tracing system must be: + // - enabled (with --cfg=tracing:1) + // - already configured (TRACE_global_init already called) + if (!(TRACE_is_enabled() && TRACE_is_configured())){ + return 0; + } + + DEBUG0("Tracing starts"); + + /* open the trace file */ + TRACE_paje_start(); + + /* activate trace */ + TRACE_activate (); + + /* base type hierarchy: + * --cfg=tracing + */ + pajeDefineContainerType("PLATFORM", "0", "platform"); + pajeDefineContainerType("HOST", "PLATFORM", "HOST"); + pajeDefineContainerType("LINK", "PLATFORM", "LINK"); + pajeDefineVariableType("power", "HOST", "power"); + pajeDefineVariableType("bandwidth", "LINK", "bandwidth"); + pajeDefineVariableType("latency", "LINK", "latency"); + pajeDefineEventType("source", "LINK", "source"); + pajeDefineEventType("destination", "LINK", "destination"); + + /* type hierarchy for: + * --cfg=tracing/uncategorized + */ + if (TRACE_uncategorized()){ + pajeDefineVariableTypeWithColor("power_used", "HOST", "power_used", "0.5 0.5 0.5"); + pajeDefineVariableTypeWithColor("bandwidth_used", "LINK", "bandwidth_used", "0.5 0.5 0.5"); + } + + /* type hierarchy for: + * --cfg=tracing/msg/process + * --cfg=tracing/msg/volume + */ + if (TRACE_msg_process_is_enabled() || TRACE_msg_volume_is_enabled()) { + //processes grouped by host + pajeDefineContainerType("PROCESS", "HOST", "PROCESS"); + } + + if (TRACE_msg_process_is_enabled()) { + pajeDefineStateType("category", "PROCESS", "category"); + pajeDefineStateType("presence", "PROCESS", "presence"); + } + + if (TRACE_msg_volume_is_enabled()) { + pajeDefineLinkType("volume", "0", "PROCESS", "PROCESS", "volume"); + } + + /* type hierarchy for: + * --cfg=tracing/msg/task + */ + if (TRACE_msg_task_is_enabled()) { + //tasks grouped by host + pajeDefineContainerType("TASK", "HOST", "TASK"); + pajeDefineStateType("category", "TASK", "category"); + pajeDefineStateType("presence", "TASK", "presence"); } + + /* type hierarchy for + * --cfg=tracing/smpi + * --cfg=tracing/smpi/group + */ + if (TRACE_smpi_is_enabled()) { + if (TRACE_smpi_is_grouped()){ + pajeDefineContainerType("MPI_PROCESS", "HOST", "MPI_PROCESS"); + }else{ + pajeDefineContainerType("MPI_PROCESS", "PLATFORM", "MPI_PROCESS"); + } + pajeDefineStateType("MPI_STATE", "MPI_PROCESS", "MPI_STATE"); + pajeDefineLinkType("MPI_LINK", "0", "MPI_PROCESS", "MPI_PROCESS", + "MPI_LINK"); + } + + /* creating the platform */ + pajeCreateContainer(MSG_get_clock(), "platform", "PLATFORM", "0", + "simgrid-platform"); + + /* other trace initialization */ + defined_types = xbt_dict_new(); + created_categories = xbt_dict_new(); + TRACE_msg_task_alloc(); + TRACE_surf_alloc(); + TRACE_msg_process_alloc(); + TRACE_smpi_alloc(); + return 0; +} + +int TRACE_end() +{ + if (!TRACE_is_active()) + return 1; + + /* close the trace file */ + TRACE_paje_end(); + + /* generate uncategorized graph configuration for triva */ + if (TRACE_get_triva_uncat_conf()){ + TRACE_generate_triva_uncat_conf(); + } + + /* generate categorized graph configuration for triva */ + if (TRACE_get_triva_cat_conf()){ + TRACE_generate_triva_cat_conf(); + } + + /* activate trace */ + TRACE_desactivate (); + DEBUG0("Tracing system is shutdown"); + return 0; +} + +void TRACE_activate (void) +{ + xbt_assert0 (trace_active==0, "Tracing is already active."); trace_active = 1; + DEBUG0 ("Tracing is on"); } void TRACE_desactivate (void) { trace_active = 0; + DEBUG0 ("Tracing is off"); } int TRACE_is_active (void) @@ -62,9 +187,9 @@ int TRACE_smpi_is_grouped(void) return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI_GROUP); } -int TRACE_platform_is_enabled(void) +int TRACE_categorized (void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_PLATFORM); + return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_CATEGORIZED); } int TRACE_uncategorized (void) @@ -97,6 +222,16 @@ char *TRACE_get_platform_method(void) return xbt_cfg_get_string(_surf_cfg_set, OPT_TRACING_PLATFORM_METHOD); } +char *TRACE_get_triva_uncat_conf (void) +{ + return xbt_cfg_get_string(_surf_cfg_set, OPT_TRIVA_UNCAT_CONF); +} + +char *TRACE_get_triva_cat_conf (void) +{ + return xbt_cfg_get_string(_surf_cfg_set, OPT_TRIVA_CAT_CONF); +} + void TRACE_global_init(int *argc, char **argv) { /* name of the tracefile */ @@ -130,7 +265,7 @@ void TRACE_global_init(int *argc, char **argv) /* platform */ int default_tracing_platform = 0; - xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_PLATFORM, + xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_CATEGORIZED, "Tracing of categorized platform (host and link) utilization.", xbt_cfgelm_int, &default_tracing_platform, 0, 1, NULL, NULL); @@ -170,6 +305,20 @@ void TRACE_global_init(int *argc, char **argv) xbt_cfgelm_int, &default_tracing_msg_volume, 0, 1, NULL, NULL); + /* Triva graph configuration for uncategorized tracing */ + char *default_triva_uncat_conf_file = xbt_strdup (""); + xbt_cfg_register(&_surf_cfg_set, OPT_TRIVA_UNCAT_CONF, + "Triva Graph configuration file for uncategorized resource utilization traces.", + xbt_cfgelm_string, &default_triva_uncat_conf_file, 1, 1, + NULL, NULL); + + /* Triva graph configuration for uncategorized tracing */ + char *default_triva_cat_conf_file = xbt_strdup (""); + xbt_cfg_register(&_surf_cfg_set, OPT_TRIVA_CAT_CONF, + "Triva Graph configuration file for categorized resource utilization traces.", + xbt_cfgelm_string, &default_triva_cat_conf_file, 1, 1, + NULL, NULL); + /* instrumentation can be considered configured now */ trace_configured = 1; } @@ -194,7 +343,7 @@ void TRACE_help (int detailed) " It activates the tracing system and register the simulation platform\n" " in the trace file. You have to enable this option to others take effect.", detailed); - print_line (OPT_TRACING_PLATFORM, "Trace categorized resource utilization", + print_line (OPT_TRACING_CATEGORIZED, "Trace categorized resource utilization", " It activates the categorized resource utilization tracing. It should\n" " be enabled if tracing categories are used by this simulator.", detailed); @@ -245,17 +394,130 @@ void TRACE_help (int detailed) " This experimental option only has effect if this simulator is MSG-based.\n" " It traces the communication volume of MSG send/receive.", detailed); + print_line (OPT_TRIVA_UNCAT_CONF, "Generate graph configuration for Triva", + " This option can be used in all types of simulators build with SimGrid\n" + " to generate a uncategorized resource utilization graph to be used as\n" + " configuration for the Triva visualization analysis. This option\n" + " can be used with tracing/categorized:1 and tracing:1 options to\n" + " analyze an unmodified simulator before changing it to contain\n" + " categories.", + detailed); + print_line (OPT_TRIVA_CAT_CONF, "generate uncategorized graph configuration for Triva", + " This option can be used if this simulator uses tracing categories\n" + " in its code. The file specified by this option holds a graph configuration\n" + " file for the Triva visualization tool that can be used to analyze a categorized\n" + " resource utilization.", + detailed); +} + +void TRACE_generate_triva_uncat_conf (void) +{ + char *output = TRACE_get_triva_uncat_conf (); + if (output && strlen(output) > 0){ + FILE *file = fopen (output, "w"); + xbt_assert1 (file != NULL, + "Unable to open file (%s) for writing triva graph " + "configuration (uncategorized).", output); + fprintf (file, + "{\n" + " node = (HOST);\n" + " edge = (LINK);\n" + "\n" + " HOST = {\n" + " size = power;\n" + " scale = global;\n" + " host_sep = {\n" + " type = separation;\n" + " size = power;\n" + " values = (power_used);\n" + " };\n" + " };\n" + " LINK = {\n" + " src = source;\n" + " dst = destination;\n" + " size = bandwidth;\n" + " scale = global;\n" + " link_sep = {\n" + " type = separation;\n" + " size = bandwidth;\n" + " values = (bandwidth_used);\n" + " };\n" + " };\n" + " graphviz-algorithm = neato;\n" + "}\n" + ); + fclose (file); + } +} + +void TRACE_generate_triva_cat_conf (void) +{ + char *output = TRACE_get_triva_cat_conf(); + if (output && strlen(output) > 0){ + //check if we do have categories declared + if (xbt_dict_length(created_categories) == 0){ + INFO0("No categories declared, ignoring generation of triva graph configuration"); + return; + } + xbt_dict_cursor_t cursor=NULL; + char *key, *data; + FILE *file = fopen (output, "w"); + xbt_assert1 (file != NULL, + "Unable to open file (%s) for writing triva graph " + "configuration (categorized).", output); + fprintf (file, + "{\n" + " node = (HOST);\n" + " edge = (LINK);\n" + "\n" + " HOST = {\n" + " size = power;\n" + " scale = global;\n" + " host_sep = {\n" + " type = separation;\n" + " size = power;\n" + " values = ("); + xbt_dict_foreach(created_categories,cursor,key,data) { + fprintf(file, "%s, ",key); + } + fprintf (file, + ");\n" + " };\n" + " };\n" + " LINK = {\n" + " src = source;\n" + " dst = destination;\n" + " size = bandwidth;\n" + " scale = global;\n" + " link_sep = {\n" + " type = separation;\n" + " size = bandwidth;\n" + " values = ("); + xbt_dict_foreach(created_categories,cursor,key,data) { + fprintf(file, "%s, ",key); + } + fprintf (file, + ");\n" + " };\n" + " };\n" + " graphviz-algorithm = neato;\n" + "}\n" + ); + fclose(file); + } } #undef OPT_TRACING #undef OPT_TRACING_SMPI #undef OPT_TRACING_SMPI_GROUP -#undef OPT_TRACING_PLATFORM +#undef OPT_TRACING_CATEGORIZED #undef OPT_TRACING_UNCATEGORIZED #undef OPT_TRACING_MSG_TASK #undef OPT_TRACING_MSG_PROCESS #undef OPT_TRACING_MSG_VOLUME #undef OPT_TRACING_FILENAME #undef OPT_TRACING_PLATFORM_METHOD +#undef OPT_TRIVA_UNCAT_CONF +#undef OPT_TRIVA_CAT_CONF #endif /* HAVE_TRACING */