Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] detailed description of new configuration options
[simgrid.git] / src / instr / instr_config.c
1 /* Copyright (c) 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5   * under the terms of the license (GNU LGPL) which comes with this package. */
6
7
8 #include "instr/instr_private.h"
9
10 #ifdef HAVE_TRACING
11
12 #define OPT_TRACING               "tracing"
13 #define OPT_TRACING_SMPI          "tracing/smpi"
14 #define OPT_TRACING_SMPI_GROUP    "tracing/smpi/group"
15 #define OPT_TRACING_PLATFORM      "tracing/platform"
16 #define OPT_TRACING_UNCATEGORIZED "tracing/uncategorized"
17 #define OPT_TRACING_MSG_TASK      "tracing/msg/task"
18 #define OPT_TRACING_MSG_PROCESS   "tracing/msg/process"
19 #define OPT_TRACING_MSG_VOLUME    "tracing/msg/volume"
20 #define OPT_TRACING_FILENAME      "tracing/filename"
21 #define OPT_TRACING_PLATFORM_METHOD "tracing/platform/method"
22 #define OPT_TRIVA_UNCAT_CONF      "triva/uncategorized"
23 #define OPT_TRIVA_CAT_CONF        "triva/categorized"
24
25 static int trace_configured = 0;
26 static int trace_active = 0;
27
28 extern xbt_dict_t created_categories; //declared in instr_interface.c
29
30 void TRACE_activate (void)
31 {
32   if (trace_active){
33     THROW0(tracing_error, TRACE_ERROR_ALREADY_ACTIVE,
34            "Tracing is already active.");
35   }
36   trace_active = 1;
37 }
38
39 void TRACE_desactivate (void)
40 {
41   trace_active = 0;
42 }
43
44 int TRACE_is_active (void)
45 {
46   return trace_active;
47 }
48
49 int TRACE_is_enabled(void)
50 {
51   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING);
52 }
53
54 int TRACE_is_configured(void)
55 {
56   return trace_configured;
57 }
58
59 int TRACE_smpi_is_enabled(void)
60 {
61   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI);
62 }
63
64 int TRACE_smpi_is_grouped(void)
65 {
66   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI_GROUP);
67 }
68
69 int TRACE_platform_is_enabled(void)
70 {
71   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_PLATFORM);
72 }
73
74 int TRACE_uncategorized (void)
75 {
76   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_UNCATEGORIZED);
77 }
78
79 int TRACE_msg_task_is_enabled(void)
80 {
81   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_TASK);
82 }
83
84 int TRACE_msg_process_is_enabled(void)
85 {
86   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_PROCESS);
87 }
88
89 int TRACE_msg_volume_is_enabled(void)
90 {
91   return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_VOLUME);
92 }
93
94 char *TRACE_get_filename(void)
95 {
96   return xbt_cfg_get_string(_surf_cfg_set, OPT_TRACING_FILENAME);
97 }
98
99 char *TRACE_get_platform_method(void)
100 {
101   return xbt_cfg_get_string(_surf_cfg_set, OPT_TRACING_PLATFORM_METHOD);
102 }
103
104 char *TRACE_get_triva_uncat_conf (void)
105 {
106   return xbt_cfg_get_string(_surf_cfg_set, OPT_TRIVA_UNCAT_CONF);
107 }
108
109 char *TRACE_get_triva_cat_conf (void)
110 {
111   return xbt_cfg_get_string(_surf_cfg_set, OPT_TRIVA_CAT_CONF);
112 }
113
114 void TRACE_global_init(int *argc, char **argv)
115 {
116   /* name of the tracefile */
117   char *default_tracing_filename = xbt_strdup("simgrid.trace");
118   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_FILENAME,
119                    "Trace file created by the instrumented SimGrid.",
120                    xbt_cfgelm_string, &default_tracing_filename, 1, 1,
121                    NULL, NULL);
122
123   /* tracing */
124   int default_tracing = 0;
125   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING,
126                    "Enable Tracing.",
127                    xbt_cfgelm_int, &default_tracing, 0, 1,
128                    NULL, NULL);
129
130   /* smpi */
131   int default_tracing_smpi = 0;
132   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_SMPI,
133                    "Tracing of the SMPI interface.",
134                    xbt_cfgelm_int, &default_tracing_smpi, 0, 1,
135                    NULL, NULL);
136
137   /* smpi grouped */
138   int default_tracing_smpi_grouped = 0;
139   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_SMPI_GROUP,
140                    "Group MPI processes by host.",
141                    xbt_cfgelm_int, &default_tracing_smpi_grouped, 0, 1,
142                    NULL, NULL);
143
144
145   /* platform */
146   int default_tracing_platform = 0;
147   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_PLATFORM,
148                    "Tracing of categorized platform (host and link) utilization.",
149                    xbt_cfgelm_int, &default_tracing_platform, 0, 1,
150                    NULL, NULL);
151
152   /* tracing uncategorized resource utilization */
153   int default_tracing_uncategorized = 0;
154   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_UNCATEGORIZED,
155                    "Tracing of uncategorized resource (host and link) utilization.",
156                    xbt_cfgelm_int, &default_tracing_uncategorized, 0, 1,
157                    NULL, NULL);
158
159   /* platform method */
160   char *default_tracing_platform_method = xbt_strdup("a");
161   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_PLATFORM_METHOD,
162                    "Tracing method used to register categorized resource behavior.",
163                    xbt_cfgelm_string, &default_tracing_platform_method, 1,
164                    1, NULL, NULL);
165
166   /* msg task */
167   int default_tracing_msg_task = 0;
168   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_MSG_TASK,
169                    "Tracing of MSG task behavior.",
170                    xbt_cfgelm_int, &default_tracing_msg_task, 0, 1,
171                    NULL, NULL);
172
173   /* msg process */
174   int default_tracing_msg_process = 0;
175   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_MSG_PROCESS,
176                    "Tracing of MSG process behavior.",
177                    xbt_cfgelm_int, &default_tracing_msg_process, 0, 1,
178                    NULL, NULL);
179
180   /* msg volume (experimental) */
181   int default_tracing_msg_volume = 0;
182   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_MSG_VOLUME,
183                    "Tracing of MSG communication volume (experimental).",
184                    xbt_cfgelm_int, &default_tracing_msg_volume, 0, 1,
185                    NULL, NULL);
186
187   /* Triva graph configuration for uncategorized tracing */
188   char *default_triva_uncat_conf_file = xbt_strdup ("");
189   xbt_cfg_register(&_surf_cfg_set, OPT_TRIVA_UNCAT_CONF,
190                    "Triva Graph configuration file for uncategorized resource utilization traces.",
191                    xbt_cfgelm_string, &default_triva_uncat_conf_file, 1, 1,
192                    NULL, NULL);
193
194   /* Triva graph configuration for uncategorized tracing */
195   char *default_triva_cat_conf_file = xbt_strdup ("");
196   xbt_cfg_register(&_surf_cfg_set, OPT_TRIVA_CAT_CONF,
197                    "Triva Graph configuration file for categorized resource utilization traces.",
198                    xbt_cfgelm_string, &default_triva_cat_conf_file, 1, 1,
199                    NULL, NULL);
200
201   /* instrumentation can be considered configured now */
202   trace_configured = 1;
203 }
204
205 static void print_line (const char *option, const char *desc, const char *longdesc, int detailed)
206 {
207   char str[INSTR_DEFAULT_STR_SIZE];
208   snprintf (str, INSTR_DEFAULT_STR_SIZE, "--cfg=%s ", option);
209
210   int len = strlen (str);
211   printf ("%s%*.*s %s\n", str, 30-len, 30-len, "", desc);
212   if (!!longdesc && detailed){
213     printf ("%s\n\n", longdesc);
214   }
215 }
216
217 void TRACE_help (int detailed)
218 {
219   printf(
220       "Description of the tracing options accepted by this simulator:\n\n");
221   print_line (OPT_TRACING, "Enable the tracing system",
222       "  It activates the tracing system and register the simulation platform\n"
223       "  in the trace file. You have to enable this option to others take effect.",
224       detailed);
225   print_line (OPT_TRACING_PLATFORM, "Trace categorized resource utilization",
226       "  It activates the categorized resource utilization tracing. It should\n"
227       "  be enabled if tracing categories are used by this simulator.",
228       detailed);
229   print_line (OPT_TRACING_UNCATEGORIZED, "Trace uncategorized resource utilization",
230       "  It activates the uncategorized resource utilization tracing. Use it if\n"
231       "  this simulator do not use tracing categories and resource use have to be\n"
232       "  traced.",
233       detailed);
234   print_line (OPT_TRACING_PLATFORM_METHOD, "Change the resource utilization tracing method",
235       "  It changes the way resource utilization (categorized or not) is traced\n"
236       "  inside the simulation core. Method 'a' (default) traces all updates defined\n"
237       "  by the CPU/network model of a given resource. Depending on the interface used\n"
238       "  by this simulator (MSG, SMPI, SimDAG), the default method can generate large\n"
239       "  trace files. Method 'b' tries to make smaller tracefiles using clever updates,\n"
240       "  without losing details of resource utilization. Method 'c' generates even\n"
241       "  smaller files by doing time integration during the simulation, but it loses\n"
242       "  precision. If this last method is used, the smallest timeslice used in the\n"
243       "  tracefile analysis must be bigger than the smaller resource utilization. If\n"
244       "  unsure, do not change this option.",
245       detailed);
246   print_line (OPT_TRACING_FILENAME, "Filename to register traces",
247       "  A file with this name will be created to register the simulation. The file\n"
248       "  is in the Paje format and can be analyzed using Triva or Paje visualization\n"
249       "  tools. More information can be found in these webpages:\n"
250       "     http://triva.gforge.inria.fr/\n"
251       "     http://paje.sourceforge.net/",
252       detailed);
253   print_line (OPT_TRACING_SMPI, "Trace the MPI Interface (SMPI)",
254       "  This option only has effect if this simulator is SMPI-based. Traces the MPI\n"
255       "  interface and generates a trace that can be analyzed using Gantt-like\n"
256       "  visualizations. Every MPI function (implemented by SMPI) is transformed in a\n"
257       "  state, and point-to-point communications can be analyzed with arrows.",
258       detailed);
259   print_line (OPT_TRACING_SMPI_GROUP, "Group MPI processes by host (SMPI)",
260       "  This option only has effect if this simulator is SMPI-based. The processes\n"
261       "  are grouped by the hosts where they were executed.",
262       detailed);
263   print_line (OPT_TRACING_MSG_TASK, "Trace task behavior (MSG)",
264       "  This option only has effect if this simulator is MSG-based. It traces the\n"
265       "  behavior of all categorized MSG tasks, grouping them by hosts.",
266       detailed);
267   print_line (OPT_TRACING_MSG_PROCESS, "Trace processes behavior (MSG)",
268       "  This option only has effect if this simulator is MSG-based. It traces the\n"
269       "  behavior of all categorized MSG processes, grouping them by hosts. This option\n"
270       "  can be used to track process location if this simulator has process migration.",
271       detailed);
272   print_line (OPT_TRACING_MSG_VOLUME, "Tracing of communication volume (MSG)",
273       "  This experimental option only has effect if this simulator is MSG-based.\n"
274       "  It traces the communication volume of MSG send/receive.",
275       detailed);
276   print_line (OPT_TRIVA_UNCAT_CONF, "Generate graph configuration for Triva",
277       "  This option can be used in all types of simulators build with SimGrid\n"
278       "  to generate a uncategorized resource utilization graph to be used as\n"
279       "  configuration for the Triva visualization analysis. This option\n"
280       "  can be used with tracing/categorized:1 and tracing:1 options to\n"
281       "  analyze an unmodified simulator before changing it to contain\n"
282       "  categories.",
283       detailed);
284   print_line (OPT_TRIVA_CAT_CONF, "generate uncategorized graph configuration for Triva",
285       "  This option can be used if this simulator uses tracing categories\n"
286       "  in its code. The file specified by this option holds a graph configuration\n"
287       "  file for the Triva visualization tool that can be used to analyze a categorized\n"
288       "  resource utilization.",
289       detailed);
290 }
291
292 void TRACE_generate_triva_uncat_conf (void)
293 {
294   char *output = TRACE_get_triva_uncat_conf ();
295   if (output && strlen(output) > 0){
296     FILE *file = fopen (output, "w");
297     if (!file){
298       THROW1(tracing_error, TRACE_ERROR_FILE_OPEN,
299              "Unable to open file (%s) for writing triva graph configuration (uncategorized).", output);
300     }
301     fprintf (file,
302         "{\n"
303         "  node = (HOST);\n"
304         "  edge = (LINK);\n"
305         "\n"
306         "  HOST = {\n"
307         "    size = power;\n"
308         "    scale = global;\n"
309         "    host_sep = {\n"
310         "      type = separation;\n"
311         "      size = power;\n"
312         "      values = (power_used);\n"
313         "    };\n"
314         "  };\n"
315         "  LINK = {\n"
316         "    src = source;\n"
317         "    dst = destination;\n"
318         "    size = bandwidth;\n"
319         "    scale = global;\n"
320         "    link_sep = {\n"
321         "      type = separation;\n"
322         "      size = bandwidth;\n"
323         "      values = (bandwidth_used);\n"
324         "    };\n"
325         "  };\n"
326         "  graphviz-algorithm = neato;\n"
327         "}\n"
328         );
329     fclose (file);
330   }
331 }
332
333 void TRACE_generate_triva_cat_conf (void)
334 {
335   char *output = TRACE_get_triva_cat_conf();
336   if (output && strlen(output) > 0){
337     //check if we do have categories declared
338     if (xbt_dict_length(created_categories) == 0){
339 //      INFO0("No categories declared, ignoring generation of triva graph configuration");
340       return;
341     }
342     xbt_dict_cursor_t cursor=NULL;
343     char *key, *data;
344     FILE *file = fopen (output, "w");
345     if (!file){
346       THROW1(tracing_error, TRACE_ERROR_FILE_OPEN,
347              "Unable to open file (%s) for writing triva graph configuration (categorized).", output);
348     }
349     fprintf (file,
350         "{\n"
351         "  node = (HOST);\n"
352         "  edge = (LINK);\n"
353         "\n"
354         "  HOST = {\n"
355         "    size = power;\n"
356         "    scale = global;\n"
357         "    host_sep = {\n"
358         "      type = separation;\n"
359         "      size = power;\n"
360         "      values = (");
361     xbt_dict_foreach(created_categories,cursor,key,data) {
362       fprintf(file, "p%s, ",key);
363     }
364     fprintf (file,
365         ");\n"
366         "    };\n"
367         "  };\n"
368         "  LINK = {\n"
369         "    src = source;\n"
370         "    dst = destination;\n"
371         "    size = bandwidth;\n"
372         "    scale = global;\n"
373         "    link_sep = {\n"
374         "      type = separation;\n"
375         "      size = bandwidth;\n"
376         "      values = (");
377     xbt_dict_foreach(created_categories,cursor,key,data) {
378       fprintf(file, "b%s, ",key);
379     }
380     fprintf (file,
381         ");\n"
382         "    };\n"
383         "  };\n"
384         "  graphviz-algorithm = neato;\n"
385         "}\n"
386         );
387     fclose(file);
388   }
389 }
390
391 #undef OPT_TRACING
392 #undef OPT_TRACING_SMPI
393 #undef OPT_TRACING_SMPI_GROUP
394 #undef OPT_TRACING_PLATFORM
395 #undef OPT_TRACING_UNCATEGORIZED
396 #undef OPT_TRACING_MSG_TASK
397 #undef OPT_TRACING_MSG_PROCESS
398 #undef OPT_TRACING_MSG_VOLUME
399 #undef OPT_TRACING_FILENAME
400 #undef OPT_TRACING_PLATFORM_METHOD
401 #undef OPT_TRIVA_UNCAT_CONF
402 #undef OPT_TRIVA_CAT_CONF
403
404 #endif /* HAVE_TRACING */