X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5a37cda4c36f1fc25b8154daf308cbcc45a42b84..34a90997543e96d03c7a370fadabbd20abf0f37c:/src/simgrid/sg_config.c diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index f9617c1452..2a387677ad 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -20,7 +20,9 @@ #include "simgrid/sg_config.h" #include "smpi/smpi_interface.h" #include "mc/mc.h" -#include "instr/instr.h" +#include "mc/mc_record.h" +#include "simgrid/instr.h" +#include "mc/mc_replay.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_config, surf, "About the configuration of simgrid"); @@ -69,10 +71,8 @@ static void sg_config_cmd_line(int *argc, char **argv) "to the command line.\n" "\n" "You can also use --help-models to see the details of all models known by this simulator.\n" -#ifdef HAVE_TRACING "\n" "You can also use --help-tracing to see the details of all tracing options known by this simulator.\n" -#endif "\n" "You can also use --help-logs and --help-log-categories to see the details of logging output.\n" "\n" @@ -95,11 +95,9 @@ static void sg_config_cmd_line(int *argc, char **argv) surf_optimization_mode_description[k].description); printf("Both network and CPU models have 'Lazy' as default optimization level\n\n"); shall_exit = 1; -#ifdef HAVE_TRACING } else if (!strcmp(argv[i], "--help-tracing")) { TRACE_help (1); shall_exit = 1; -#endif } else { argv[j++] = argv[i]; } @@ -258,6 +256,11 @@ static void _sg_cfg_cb__maxmin_precision(const char* name, int pos) sg_maxmin_precision = xbt_cfg_get_double(_sg_cfg_set, name); } +static void _sg_cfg_cb__surf_precision(const char* name, int pos) +{ + sg_surf_precision = xbt_cfg_get_double(_sg_cfg_set, name); +} + static void _sg_cfg_cb__sender_gap(const char* name, int pos) { sg_sender_gap = xbt_cfg_get_double(_sg_cfg_set, name); @@ -297,7 +300,7 @@ static void _sg_cfg_cb__coll(const char *category, } /* New Module missing */ - find_coll_description(table, val); + find_coll_description(table, val, category); } static void _sg_cfg_cb__coll_gather(const char *name, int pos){ _sg_cfg_cb__coll("gather", mpi_coll_gather_description, name, pos); @@ -337,6 +340,21 @@ static void _sg_cfg_cb__coll_scatter(const char *name, int pos){ static void _sg_cfg_cb__coll_barrier(const char *name, int pos){ _sg_cfg_cb__coll("barrier", mpi_coll_barrier_description, name, pos); } + +static void _sg_cfg_cb__wtime_sleep(const char *name, int pos){ + smpi_wtime_sleep = xbt_cfg_get_double(_sg_cfg_set, name); +} + +static void _sg_cfg_cb__iprobe_sleep(const char *name, int pos){ + smpi_iprobe_sleep = xbt_cfg_get_double(_sg_cfg_set, name); +} + +static void _sg_cfg_cb__test_sleep(const char *name, int pos){ + smpi_test_sleep = xbt_cfg_get_double(_sg_cfg_set, name); +} + + + #endif /* callback of the inclusion path */ @@ -348,10 +366,17 @@ static void _sg_cfg_cb__surf_path(const char *name, int pos) /* callback to decide if we want to use the model-checking */ #include "xbt_modinter.h" + #ifdef HAVE_MC extern int _sg_do_model_check; /* this variable lives in xbt_main until I find a right location for it */ +extern int _sg_do_model_check_record; #endif +static void _sg_cfg_cb_model_check_replay(const char *name, int pos) +{ + MC_record_path = xbt_cfg_get_string(_sg_cfg_set, name); +} + static void _sg_cfg_cb_model_check(const char *name, int pos) { #ifdef HAVE_MC @@ -363,6 +388,17 @@ static void _sg_cfg_cb_model_check(const char *name, int pos) #endif } +static void _sg_cfg_cb_model_check_record(const char *name, int pos) +{ +#ifdef HAVE_MC + _sg_do_model_check_record = xbt_cfg_get_boolean(_sg_cfg_set, name); +#else + if (xbt_cfg_get_boolean(_sg_cfg_set, name)) { + xbt_die("You tried to activate the model-checking record from the command line, but it was not compiled in. Change your settings in cmake, recompile and try again"); + } +#endif +} + extern int _sg_do_verbose_exit; static void _sg_cfg_cb_verbose_exit(const char *name, int pos) @@ -388,6 +424,12 @@ static void _sg_cfg_cb_context_stack_size(const char *name, int pos) smx_context_stack_size = xbt_cfg_get_int(_sg_cfg_set, name) * 1024; } +static void _sg_cfg_cb_context_guard_size(const char *name, int pos) +{ + smx_context_guard_size_was_set = 1; + smx_context_guard_size = xbt_cfg_get_int(_sg_cfg_set, name) * xbt_pagesize; +} + static void _sg_cfg_cb_contexts_nthreads(const char *name, int pos) { SIMIX_context_set_nthreads(xbt_cfg_get_int(_sg_cfg_set, name)); @@ -528,8 +570,13 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_double, 1, 1, _sg_cfg_cb__tcp_gamma, NULL); xbt_cfg_setdefault_double(_sg_cfg_set, "network/TCP_gamma", 4194304.0); + xbt_cfg_register(&_sg_cfg_set, "surf/precision", + "Numerical precision used when updating simulation times (hence this value is expressed in seconds)", + xbt_cfgelm_double, 1, 1, _sg_cfg_cb__surf_precision, NULL); + xbt_cfg_setdefault_double(_sg_cfg_set, "surf/precision", 0.00001); + xbt_cfg_register(&_sg_cfg_set, "maxmin/precision", - "Numerical precision used when updating simulation models (epsilon in double comparisons)", + "Numerical precision used when computing resource sharing (hence this value is expressed in ops/sec or bytes/sec)", xbt_cfgelm_double, 1, 1, _sg_cfg_cb__maxmin_precision, NULL); xbt_cfg_setdefault_double(_sg_cfg_set, "maxmin/precision", 0.00001); @@ -572,6 +619,11 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/maxmin_selective_update", "no"); + /* Replay (this part is enabled event if MC it disabled) */ + xbt_cfg_register(&_sg_cfg_set, "model-check/replay", + "Uenable replay mode with the given path", + xbt_cfgelm_string, 0, 1, _sg_cfg_cb_model_check_replay, NULL); + #ifdef HAVE_MC /* do model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check", @@ -579,6 +631,12 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_model_check, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check", "no"); + /* do model-checking-record */ + xbt_cfg_register(&_sg_cfg_set, "model-check/record", + "Record the model-checking paths", + xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_model_check_record, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/record", "no"); + /* do stateful model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/checkpoint", "Specify the amount of steps between checkpoints during stateful model-checking (default: 0 => stateless verification). " @@ -586,12 +644,30 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_int, 1, 1, _mc_cfg_cb_checkpoint, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/checkpoint", 0); + /* do stateful model-checking */ + xbt_cfg_register(&_sg_cfg_set, "model-check/sparse-checkpoint", + "Use sparse per-page snapshots.", + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_sparse_checkpoint, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/sparse-checkpoint", "no"); + /* do liveness model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/property", "Specify the name of the file containing the property. It must be the result of the ltl2ba program.", xbt_cfgelm_string, 1, 1, _mc_cfg_cb_property, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/property", ""); + /* do communications determinism model-checking */ + xbt_cfg_register(&_sg_cfg_set, "model-check/communications_determinism", + "Enable/disable the detection of determinism in the communications schemes", + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_comms_determinism, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/communications_determinism", "no"); + + /* do send determinism model-checking */ + xbt_cfg_register(&_sg_cfg_set, "model-check/send_determinism", + "Enable/disable the detection of send-determinism in the communications schemes", + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_send_determinism, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/send_determinism", "no"); + /* Specify the kind of model-checking reduction */ xbt_cfg_register(&_sg_cfg_set, "model-check/reduction", "Specify the kind of exploration reduction (either none or DPOR)", @@ -604,6 +680,18 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_timeout, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/timeout", "no"); + /* Enable/disable global hash computation with model-checking */ + xbt_cfg_register(&_sg_cfg_set, "model-check/hash", + "Enable/Disable state hash for state comparison (exprimental)", + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_hash, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/hash", "no"); + + /* Set max depth exploration */ + xbt_cfg_register(&_sg_cfg_set, "model-check/snapshot_fds", + "Whether file descriptors must be snapshoted", + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_snapshot_fds, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/snapshot_fds", "no"); + /* Set max depth exploration */ xbt_cfg_register(&_sg_cfg_set, "model-check/max_depth", "Specify the max depth of exploration (default : 1000)", @@ -621,6 +709,12 @@ void sg_config_init(int *argc, char **argv) "Specify the name of dot file corresponding to graph state", xbt_cfgelm_string, 1, 1, _mc_cfg_cb_dot_output, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/dot_output", ""); + + /* Enable/disable non progressive cycles detection with model-checking */ + xbt_cfg_register(&_sg_cfg_set, "model-check/termination", + "Enable/Disable non progressive cycle detection", + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_termination, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/termination", "no"); #endif /* do verbose-exit */ @@ -650,14 +744,26 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", dflt_ctx_fact); - /* stack size of contexts in Ko */ + /* stack size of contexts in KiB */ xbt_cfg_register(&_sg_cfg_set, "contexts/stack_size", - "Stack size of contexts in Kib", + "Stack size of contexts in KiB", xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_stack_size, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/stack_size", 8*1024); /* No, it was not set yet (the above setdefault() changed this to 1). */ smx_context_stack_size_was_set = 0; + /* guard size for contexts stacks in memory pages */ + xbt_cfg_register(&_sg_cfg_set, "contexts/guard_size", + "Guard size for contexts stacks in memory pages", + xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_guard_size, NULL); +#if defined(_XBT_WIN32) || (PTH_STACKGROWTH != -1) + xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/guard_size", 0); +#else + xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/guard_size", 1); +#endif + /* No, it was not set yet (the above setdefault() changed this to 1). */ + smx_context_guard_size_was_set = 0; + /* number of parallel threads for user processes */ xbt_cfg_register(&_sg_cfg_set, "contexts/nthreads", "Number of parallel threads used to execute user contexts", @@ -708,6 +814,27 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_setdefault_string(_sg_cfg_set, "ns3/TcpModel", "default"); #endif + //For smpi/bw_factor and smpi/lat_factor + //Default value have to be "threshold0:value0;threshold1:value1;...;thresholdN:valueN" + //test is if( size >= thresholdN ) return valueN; + //Values can be modified with command line --cfg=smpi/bw_factor:"threshold0:value0;threshold1:value1;...;thresholdN:valueN" + // or with tag config put line + // SMPI model can be used without enable_smpi, so keep this the ifdef. + xbt_cfg_register(&_sg_cfg_set, "smpi/bw_factor", + "Bandwidth factors for smpi.", + xbt_cfgelm_string, 1, 1, NULL, NULL); + xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/bw_factor", "65472:0.940694;15424:0.697866;9376:0.58729;5776:1.08739;3484:0.77493;1426:0.608902;732:0.341987;257:0.338112;0:0.812084"); + + xbt_cfg_register(&_sg_cfg_set, "smpi/lat_factor", + "Latency factors for smpi.", + xbt_cfgelm_string, 1, 1, NULL, NULL); + xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/lat_factor", "65472:11.6436;15424:3.48845;9376:2.59299;5776:2.18796;3484:1.88101;1426:1.61075;732:1.9503;257:1.95341;0:2.01467"); + + xbt_cfg_register(&_sg_cfg_set, "smpi/IB_penalty_factors", + "Correction factor to communications using Infiniband model with contention (default value based on Stampede cluster profiling)", + xbt_cfgelm_string, 1, 1, NULL, NULL); + xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/IB_penalty_factors", "0.965;0.925;1.35"); + #ifdef HAVE_SMPI xbt_cfg_register(&_sg_cfg_set, "smpi/running_power", "Power of the host running the simulation (in flop/s). Used to bench the operations.", @@ -719,6 +846,11 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "smpi/display_timing", "no"); + xbt_cfg_register(&_sg_cfg_set, "smpi/simulate_computation", + "Boolean indicating whether the computational part of the simulated application should be simulated.", + xbt_cfgelm_boolean, 1, 1, NULL, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "smpi/simulate_computation", "yes"); + xbt_cfg_register(&_sg_cfg_set, "smpi/use_shared_malloc", "Boolean indicating whether we should use shared memory when using SMPI_SHARED_MALLOC. Allows user to disable it for debug purposes.", xbt_cfgelm_boolean, 1, 1, NULL, NULL); @@ -739,20 +871,10 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_int, 1, 1, NULL, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "smpi/send_is_detached_thres", 65536); - //For smpi/bw_factor and smpi/lat_factor - //Default value have to be "threshold0:value0;threshold1:value1;...;thresholdN:valueN" - //test is if( size >= thresholdN ) return valueN; - //Values can be modified with command line --cfg=smpi/bw_factor:"threshold0:value0;threshold1:value1;...;thresholdN:valueN" - // or with tag config put line - xbt_cfg_register(&_sg_cfg_set, "smpi/bw_factor", - "Bandwidth factors for smpi.", - xbt_cfgelm_string, 1, 1, NULL, NULL); - xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/bw_factor", "65472:0.940694;15424:0.697866;9376:0.58729;5776:1.08739;3484:0.77493;1426:0.608902;732:0.341987;257:0.338112;0:0.812084"); - - xbt_cfg_register(&_sg_cfg_set, "smpi/lat_factor", - "Latency factors for smpi.", - xbt_cfgelm_string, 1, 1, NULL, NULL); - xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/lat_factor", "65472:11.6436;15424:3.48845;9376:2.59299;5776:2.18796;3484:1.88101;1426:1.61075;732:1.9503;257:1.95341;0:2.01467"); + xbt_cfg_register(&_sg_cfg_set, "smpi/privatize_global_variables", + "Boolean indicating whether we should privatize global variable at runtime.", + xbt_cfgelm_boolean, 1, 1, NULL, NULL); + xbt_cfg_setdefault_boolean(_sg_cfg_set, "smpi/privatize_global_variables", "no"); xbt_cfg_register(&_sg_cfg_set, "smpi/os", "Small messages timings (MPI_Send minimum time for small messages)", @@ -768,10 +890,22 @@ void sg_config_init(int *argc, char **argv) "Small messages timings (MPI_Recv minimum time for small messages)", xbt_cfgelm_string, 1, 1, NULL, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/or", "1:0:0:0:0"); + xbt_cfg_register(&_sg_cfg_set, "smpi/iprobe", "Minimum time to inject inside a call to MPI_Iprobe", - xbt_cfgelm_double, 1, 1, NULL, NULL); + xbt_cfgelm_double, 1, 1, _sg_cfg_cb__iprobe_sleep, NULL); xbt_cfg_setdefault_double(_sg_cfg_set, "smpi/iprobe", 1e-4); + + xbt_cfg_register(&_sg_cfg_set, "smpi/test", + "Minimum time to inject inside a call to MPI_Test", + xbt_cfgelm_double, 1, 1, _sg_cfg_cb__test_sleep, NULL); + xbt_cfg_setdefault_double(_sg_cfg_set, "smpi/test", 1e-4); + + xbt_cfg_register(&_sg_cfg_set, "smpi/wtime", + "Minimum time to inject inside a call to MPI_Wtime", + xbt_cfgelm_double, 1, 1, _sg_cfg_cb__wtime_sleep, NULL); + xbt_cfg_setdefault_double(_sg_cfg_set, "smpi/wtime", 0.0); + xbt_cfg_register(&_sg_cfg_set, "smpi/coll_selector", "Which collective selector to use", xbt_cfgelm_string, 1, 1, NULL, NULL); @@ -831,7 +965,7 @@ void sg_config_init(int *argc, char **argv) /* retrieves the current directory of the current process */ const char *initial_path = __surf_get_initial_path(); xbt_assert((initial_path), - "__surf_get_initial_path() failed! Can't resolves current Windows directory"); + "__surf_get_initial_path() failed! Can't resolve current Windows directory"); surf_path = xbt_dynar_new(sizeof(char *), NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "path", initial_path); @@ -905,13 +1039,17 @@ void surf_config_models_setup() xbt_assert(network_model_name, "Set a network model to use with the 'compound' workstation model"); + if(surf_cpu_model_init_preparse){ + surf_cpu_model_init_preparse(); + } else { + cpu_id = + find_model_description(surf_cpu_model_description, cpu_model_name); + surf_cpu_model_description[cpu_id].model_init_preparse(); + } + network_id = find_model_description(surf_network_model_description, network_model_name); - cpu_id = - find_model_description(surf_cpu_model_description, cpu_model_name); - - surf_cpu_model_description[cpu_id].model_init_preparse(); surf_network_model_description[network_id].model_init_preparse(); }