Example #1
0
/* create the config set, register what should be and parse the command line*/
void surf_config_init(int *argc, char **argv)
{
  char *description = xbt_malloc(1024), *p = description;
  char *default_value;
  double double_default_value;
  int default_value_int;
  int i;

  /* Create the configuration support */
  if (_surf_init_status == 0) { /* Only create stuff if not already inited */
    _surf_init_status = 1;

    sprintf(description,
            "The model to use for the CPU. Possible values: ");
    p = description;
    while (*(++p) != '\0');
    for (i = 0; surf_cpu_model_description[i].name; i++)
      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                   surf_cpu_model_description[i].name);
    sprintf(p,
            ".\n       (use 'help' as a value to see the long description of each model)");
    default_value = xbt_strdup("Cas01");
    xbt_cfg_register(&_surf_cfg_set,
                     "cpu/model", description, xbt_cfgelm_string,
                     &default_value, 1, 1, &_surf_cfg_cb__cpu_model, NULL);

    sprintf(description,
            "The model to use for the network. Possible values: ");
    p = description;
    while (*(++p) != '\0');
    for (i = 0; surf_network_model_description[i].name; i++)
      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                   surf_network_model_description[i].name);
    sprintf(p,
            ".\n       (use 'help' as a value to see the long description of each model)");
    default_value = xbt_strdup("LV08");
    xbt_cfg_register(&_surf_cfg_set,
                     "network/model", description, xbt_cfgelm_string,
                     &default_value, 1, 1, &_surf_cfg_cb__network_model,
                     NULL);

    sprintf(description,
            "The model to use for the workstation. Possible values: ");
    p = description;
    while (*(++p) != '\0');
    for (i = 0; surf_workstation_model_description[i].name; i++)
      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                   surf_workstation_model_description[i].name);
    sprintf(p,
            ".\n       (use 'help' as a value to see the long description of each model)");
    default_value = xbt_strdup("CLM03");
    xbt_cfg_register(&_surf_cfg_set,
                     "workstation/model", description, xbt_cfgelm_string,
                     &default_value, 1, 1,
                     &_surf_cfg_cb__workstation_model, NULL);

    xbt_free(description);

    default_value = xbt_strdup("Full");
    xbt_cfg_register(&_surf_cfg_set, "routing",
                     "Model to use to store the routing information",
                     xbt_cfgelm_string, &default_value, 1, 1, NULL, NULL);

    xbt_cfg_register(&_surf_cfg_set, "TCP_gamma",
                     "Size of the biggest TCP window (cat /proc/sys/net/ipv4/tcp_[rw]mem for recv/send window; Use the last given value, which is the max window size)",
                     xbt_cfgelm_double, NULL, 1, 1,
                     _surf_cfg_cb__tcp_gamma, NULL);
    xbt_cfg_setdefault_double(_surf_cfg_set, "TCP_gamma", 20000.0);

    xbt_cfg_register(&_surf_cfg_set, "maxmin/precision",
                     "Minimum retained action value when updating simulation",
                     xbt_cfgelm_double, NULL, 1, 1, _surf_cfg_cb__maxmin_precision, NULL);
    xbt_cfg_setdefault_double(_surf_cfg_set, "maxmin/precision", 0.00001); // FIXME use setdefault everywhere here!

    /* The parameters of network models */

    double_default_value = 0.0;
    xbt_cfg_register(&_surf_cfg_set, "network/sender_gap",
                     "Minimum gap between two overlapping sends",
                     xbt_cfgelm_double, &double_default_value, 1, 1,
                     _surf_cfg_cb__sender_gap, NULL);

    double_default_value = 1.0;
    xbt_cfg_register(&_surf_cfg_set, "network/latency_factor",
                     "Correction factor to apply to the provided latency (default value set by network model)",
                     xbt_cfgelm_double, &double_default_value, 1, 1,
                     _surf_cfg_cb__latency_factor, NULL);
    double_default_value = 1.0;
    xbt_cfg_register(&_surf_cfg_set, "network/bandwidth_factor",
                     "Correction factor to apply to the provided bandwidth (default value set by network model)",
                     xbt_cfgelm_double, &double_default_value, 1, 1,
                     _surf_cfg_cb__bandwidth_factor, NULL);
    double_default_value = 0.0;
    xbt_cfg_register(&_surf_cfg_set, "network/weight_S",
                     "Correction factor to apply to the weight of competing streams(default value set by network model)",
                     xbt_cfgelm_double, &double_default_value, 1, 1,
                     _surf_cfg_cb__weight_S, NULL);

    /* Inclusion path */
    xbt_cfg_register(&_surf_cfg_set, "path",
                     "Lookup path for inclusions in platform and deployment XML files",
                     xbt_cfgelm_string, NULL, 0, 0,
                     _surf_cfg_cb__surf_path, NULL);

    default_value_int = 0;
    xbt_cfg_register(&_surf_cfg_set, "maxmin_selective_update",
                     "Update the constraint set propagating recursively to others constraints",
                     xbt_cfgelm_int, &default_value_int, 0, 1,
                     _surf_cfg_cb__surf_maxmin_selective_update, NULL);

    /* do model-check */
    default_value_int = 0;
    xbt_cfg_register(&_surf_cfg_set, "model-check",
                     "Activate the model-checking of the \"simulated\" system (EXPERIMENTAL -- msg only for now)",
                     xbt_cfgelm_int, &default_value_int, 0, 1,
                     _surf_cfg_cb_model_check, NULL);
    /*
       FIXME: this function is not setting model-check to it's default value because
       internally it calls to variable->cb_set that in this case is the function 
       _surf_cfg_cb_model_check which sets it's value to 1 (instead of the defalut value 0)
       xbt_cfg_set_int(_surf_cfg_set, "model-check", default_value_int); */

    /* context factory */
    default_value = xbt_strdup("ucontext");
    xbt_cfg_register(&_surf_cfg_set, "contexts/factory",
                     "Context factory to use in SIMIX (ucontext, thread or raw)",
                     xbt_cfgelm_string, &default_value, 1, 1, _surf_cfg_cb_context_factory, NULL);

    /* stack size of contexts in Ko */
    default_value_int = 128;
    xbt_cfg_register(&_surf_cfg_set, "contexts/stack_size",
                     "Stack size of contexts in Ko (ucontext or raw only)",
                     xbt_cfgelm_int, &default_value_int, 1, 1,
                     _surf_cfg_cb_context_stack_size, NULL);

    /* number of parallel threads for user processes */
    default_value_int = 1;
    xbt_cfg_register(&_surf_cfg_set, "contexts/nthreads",
                     "Number of parallel threads for user contexts (EXPERIMENTAL)",
                     xbt_cfgelm_int, &default_value_int, 1, 1,
                     _surf_cfg_cb_contexts_nthreads, NULL);

    /* minimal number of user contexts to be run in parallel */
    default_value_int = 1;
    xbt_cfg_register(&_surf_cfg_set, "contexts/parallel_threshold",
        "Minimal number of user contexts to be run in parallel",
        xbt_cfgelm_int, &default_value_int, 1, 1,
        _surf_cfg_cb_contexts_parallel_threshold, NULL);

    default_value_int = 0;
    xbt_cfg_register(&_surf_cfg_set, "fullduplex",
                     "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM03)",
                     xbt_cfgelm_int, &default_value_int, 0, 1,
                     _surf_cfg_cb__surf_network_fullduplex, NULL);
    xbt_cfg_setdefault_int(_surf_cfg_set, "fullduplex", default_value_int);

#ifdef HAVE_GTNETS
    xbt_cfg_register(&_surf_cfg_set, "gtnets_jitter",
                     "Double value to oscillate the link latency, uniformly in random interval [-latency*gtnets_jitter,latency*gtnets_jitter)",
                     xbt_cfgelm_double, NULL, 1, 1,
                     _surf_cfg_cb__gtnets_jitter, NULL);
    xbt_cfg_setdefault_double(_surf_cfg_set, "gtnets_jitter", 0.0);

    default_value_int = 10;
    xbt_cfg_register(&_surf_cfg_set, "gtnets_jitter_seed",
                     "Use a positive seed to reproduce jitted results, value must be in [1,1e8], default is 10",
                     xbt_cfgelm_int, &default_value_int, 0, 1,
                     _surf_cfg_cb__gtnets_jitter_seed, NULL);
#endif

    if (!surf_path) {
      /* 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_path = xbt_dynar_new(sizeof(char *), NULL);
      xbt_cfg_setdefault_string(_surf_cfg_set, "path", initial_path);
    }


    surf_config_cmd_line(argc, argv);
  } else {
    XBT_WARN("Call to surf_config_init() after initialization ignored");
  }
}
Example #2
0
/* create the config set, register what should be and parse the command line*/
void surf_config_init(int *argc, char **argv)
{
    char *description = xbt_malloc(1024), *p = description;
    char *default_value;
    double double_default_value;
    int default_value_int;
    int i;

    /* Create the configuration support */
    if (_surf_init_status == 0) { /* Only create stuff if not already inited */
        sprintf(description,
                "The model to use for the CPU. Possible values: ");
        p = description;
        while (*(++p) != '\0');
        for (i = 0; surf_cpu_model_description[i].name; i++)
            p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                         surf_cpu_model_description[i].name);
        sprintf(p,
                ".\n       (use 'help' as a value to see the long description of each model)");
        default_value = xbt_strdup("Cas01");
        xbt_cfg_register(&_surf_cfg_set, "cpu/model", description, xbt_cfgelm_string,
                         &default_value, 1, 1, &_surf_cfg_cb__cpu_model, NULL);

        sprintf(description,
                "The optimization modes to use for the CPU. Possible values: ");
        p = description;
        while (*(++p) != '\0');
        for (i = 0; surf_optimization_mode_description[i].name; i++)
            p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                         surf_optimization_mode_description[i].name);
        sprintf(p,
                ".\n       (use 'help' as a value to see the long description of each optimization mode)");
        default_value = xbt_strdup("Lazy");
        xbt_cfg_register(&_surf_cfg_set, "cpu/optim", description, xbt_cfgelm_string,
                         &default_value, 1, 1, &_surf_cfg_cb__optimization_mode, NULL);

        sprintf(description,
                "The model to use for the storage. Possible values: ");
        p = description;
        while (*(++p) != '\0');
        for (i = 0; surf_storage_model_description[i].name; i++)
            p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                         surf_storage_model_description[i].name);
        sprintf(p,
                ".\n       (use 'help' as a value to see the long description of each model)");
        default_value = xbt_strdup("default");
        xbt_cfg_register(&_surf_cfg_set, "storage/model", description, xbt_cfgelm_string,
                         &default_value, 1, 1, &_surf_cfg_cb__storage_mode,
                         NULL);

        /* ********************************************************************* */
        /* TUTORIAL: New model                                                   */
        sprintf(description,
                "The model to use for the New model. Possible values: ");
        p = description;
        while (*(++p) != '\0');
        for (i = 0; surf_new_model_description[i].name; i++)
            p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                         surf_new_model_description[i].name);
        sprintf(p,
                ".\n       (use 'help' as a value to see the long description of each model)");
        default_value = xbt_strdup("default");
        xbt_cfg_register(&_surf_cfg_set, "new_model/model", description, xbt_cfgelm_string,
                         &default_value, 1, 1, &_surf_cfg_cb__storage_mode,
                         NULL);
        /* ********************************************************************* */

        sprintf(description,
                "The model to use for the network. Possible values: ");
        p = description;
        while (*(++p) != '\0');
        for (i = 0; surf_network_model_description[i].name; i++)
            p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                         surf_network_model_description[i].name);
        sprintf(p,
                ".\n       (use 'help' as a value to see the long description of each model)");
        default_value = xbt_strdup("LV08");
        xbt_cfg_register(&_surf_cfg_set, "network/model", description, xbt_cfgelm_string,
                         &default_value, 1, 1, &_surf_cfg_cb__network_model,
                         NULL);

        sprintf(description,
                "The optimization modes to use for the network. Possible values: ");
        p = description;
        while (*(++p) != '\0');
        for (i = 0; surf_optimization_mode_description[i].name; i++)
            p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                         surf_optimization_mode_description[i].name);
        sprintf(p,
                ".\n       (use 'help' as a value to see the long description of each optimization mode)");
        default_value = xbt_strdup("Lazy");
        xbt_cfg_register(&_surf_cfg_set, "network/optim", description, xbt_cfgelm_string,
                         &default_value, 1, 1, &_surf_cfg_cb__optimization_mode, NULL);

        sprintf(description,
                "The model to use for the workstation. Possible values: ");
        p = description;
        while (*(++p) != '\0');
        for (i = 0; surf_workstation_model_description[i].name; i++)
            p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
                         surf_workstation_model_description[i].name);
        sprintf(p,
                ".\n       (use 'help' as a value to see the long description of each model)");
        default_value = xbt_strdup("default");
        xbt_cfg_register(&_surf_cfg_set, "workstation/model", description, xbt_cfgelm_string,
                         &default_value, 1, 1,
                         &_surf_cfg_cb__workstation_model, NULL);

        xbt_free(description);

        xbt_cfg_register(&_surf_cfg_set, "network/TCP_gamma",
                         "Size of the biggest TCP window (cat /proc/sys/net/ipv4/tcp_[rw]mem for recv/send window; Use the last given value, which is the max window size)",
                         xbt_cfgelm_double, NULL, 1, 1,
                         _surf_cfg_cb__tcp_gamma, NULL);
        xbt_cfg_setdefault_double(_surf_cfg_set, "network/TCP_gamma", 4194304.0);

        xbt_cfg_register(&_surf_cfg_set, "maxmin/precision",
                         "Numerical precision used when updating simulation models (epsilon in double comparisons)",
                         xbt_cfgelm_double, NULL, 1, 1, _surf_cfg_cb__maxmin_precision, NULL);
        xbt_cfg_setdefault_double(_surf_cfg_set, "maxmin/precision", 0.00001); // FIXME use setdefault everywhere here!

        /* The parameters of network models */

        double_default_value = 0.0;
        xbt_cfg_register(&_surf_cfg_set, "network/sender_gap",
                         "Minimum gap between two overlapping sends",
                         xbt_cfgelm_double, &double_default_value, 1, 1,
                         _surf_cfg_cb__sender_gap, NULL);

        double_default_value = 1.0;
        xbt_cfg_register(&_surf_cfg_set, "network/latency_factor",
                         "Correction factor to apply to the provided latency (default value set by network model)",
                         xbt_cfgelm_double, &double_default_value, 1, 1,
                         _surf_cfg_cb__latency_factor, NULL);
        double_default_value = 1.0;
        xbt_cfg_register(&_surf_cfg_set, "network/bandwidth_factor",
                         "Correction factor to apply to the provided bandwidth (default value set by network model)",
                         xbt_cfgelm_double, &double_default_value, 1, 1,
                         _surf_cfg_cb__bandwidth_factor, NULL);
        double_default_value = 0.0;
        xbt_cfg_register(&_surf_cfg_set, "network/weight_S",
                         "Correction factor to apply to the weight of competing streams(default value set by network model)",
                         xbt_cfgelm_double, &double_default_value, 1, 1,
                         _surf_cfg_cb__weight_S, NULL);

        /* Inclusion path */
        xbt_cfg_register(&_surf_cfg_set, "path",
                         "Lookup path for inclusions in platform and deployment XML files",
                         xbt_cfgelm_string, NULL, 0, 0,
                         _surf_cfg_cb__surf_path, NULL);

        default_value_int = 0;
        xbt_cfg_register(&_surf_cfg_set, "cpu/maxmin_selective_update",
                         "Update the constraint set propagating recursively to others constraints (1 by default when optim is set to lazy)",
                         xbt_cfgelm_int, &default_value_int, 0, 1,
                         NULL, NULL);
        default_value_int = 0;
        xbt_cfg_register(&_surf_cfg_set, "network/maxmin_selective_update",
                         "Update the constraint set propagating recursively to others constraints (1 by default when optim is set to lazy)",
                         xbt_cfgelm_int, &default_value_int, 0, 1,
                         NULL, NULL);

#ifdef HAVE_MC
        /* do model-checking */
        xbt_cfg_register(&_surf_cfg_set, "model-check",
                         "Verify the system through model-checking instead of simulating it (EXPERIMENTAL)",
                         xbt_cfgelm_int, NULL, 0, 1,
                         _surf_cfg_cb_model_check, NULL);
        xbt_cfg_setdefault_int(_surf_cfg_set, "model-check", 0);

        /* do stateful model-checking */
        xbt_cfg_register(&_surf_cfg_set, "model-check/checkpoint",
                         "Specify the amount of steps between checkpoints during stateful model-checking (default: 0 => stateless verification). "
                         "If value=1, one checkpoint is saved for each step => faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption.",
                         xbt_cfgelm_int, NULL, 0, 1,
                         _mc_cfg_cb_checkpoint, NULL);
        xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/checkpoint", 0);

        /* do liveness model-checking */
        xbt_cfg_register(&_surf_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, NULL, 0, 1,
                         _mc_cfg_cb_property, NULL);
        xbt_cfg_setdefault_string(_surf_cfg_set, "model-check/property", "");

        /* Specify the kind of model-checking reduction */
        xbt_cfg_register(&_surf_cfg_set, "model-check/reduction",
                         "Specify the kind of exploration reduction (either none or DPOR)",
                         xbt_cfgelm_string, NULL, 0, 1,
                         _mc_cfg_cb_reduce, NULL);
        xbt_cfg_setdefault_string(_surf_cfg_set, "model-check/reduction", "dpor");

        /* Enable/disable timeout for wait requests with model-checking */
        xbt_cfg_register(&_surf_cfg_set, "model-check/timeout",
                         "Enable/Disable timeout for wait requests",
                         xbt_cfgelm_int, NULL, 0, 1,
                         _mc_cfg_cb_timeout, NULL);
        xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/timeout", 0);

        /* Set max depth exploration */
        xbt_cfg_register(&_surf_cfg_set, "model-check/max_depth",
                         "Specify the max depth of exploration (default : 1000)",
                         xbt_cfgelm_int, NULL, 0, 1,
                         _mc_cfg_cb_max_depth, NULL);
        xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/max_depth", 1000);

        /* Set number of visited state stored for state comparison reduction*/
        xbt_cfg_register(&_surf_cfg_set, "model-check/visited",
                         "Specify the number of visited state stored for state comparison reduction. If value=5, the last 5 visited states are stored",
                         xbt_cfgelm_int, NULL, 0, 1,
                         _mc_cfg_cb_visited, NULL);
        xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/visited", 0);
#endif

        /* do verbose-exit */
        default_value_int = 1;
        xbt_cfg_register(&_surf_cfg_set, "verbose-exit",
                         "Activate the \"do nothing\" mode in Ctrl-C",
                         xbt_cfgelm_int, &default_value_int, 0, 1,
                         _surf_cfg_cb_verbose_exit, NULL);


        /* context factory */
        default_value = xbt_strdup("ucontext");
        xbt_cfg_register(&_surf_cfg_set, "contexts/factory",
                         "Context factory to use in SIMIX (ucontext, thread or raw)",
                         xbt_cfgelm_string, &default_value, 1, 1, _surf_cfg_cb_context_factory, NULL);

        /* stack size of contexts in Ko */
        default_value_int = 128;
        xbt_cfg_register(&_surf_cfg_set, "contexts/stack_size",
                         "Stack size of contexts in Kib (ucontext or raw only)",
                         xbt_cfgelm_int, &default_value_int, 1, 1,
                         _surf_cfg_cb_context_stack_size, NULL);

        /* number of parallel threads for user processes */
        default_value_int = 1;
        xbt_cfg_register(&_surf_cfg_set, "contexts/nthreads",
                         "Number of parallel threads used to execute user contexts",
                         xbt_cfgelm_int, &default_value_int, 1, 1,
                         _surf_cfg_cb_contexts_nthreads, NULL);

        /* minimal number of user contexts to be run in parallel */
        default_value_int = 2;
        xbt_cfg_register(&_surf_cfg_set, "contexts/parallel_threshold",
                         "Minimal number of user contexts to be run in parallel (raw contexts only)",
                         xbt_cfgelm_int, &default_value_int, 1, 1,
                         _surf_cfg_cb_contexts_parallel_threshold, NULL);

        /* synchronization mode for parallel user contexts */
#ifdef HAVE_FUTEX_H
        default_value = xbt_strdup("futex");
#else //No futex on mac and posix is unimplememted yet
        default_value = xbt_strdup("busy_wait");
#endif
        xbt_cfg_register(&_surf_cfg_set, "contexts/synchro",
                         "Synchronization mode to use when running contexts in parallel (either futex, posix or busy_wait)",
                         xbt_cfgelm_string, &default_value, 1, 1,
                         _surf_cfg_cb_contexts_parallel_mode, NULL);

        /* number of parallel threads for Surf */
        default_value_int = surf_get_nthreads();
        xbt_cfg_register(&_surf_cfg_set, "surf/nthreads",
                         "Number of parallel threads used to update Surf models",
                         xbt_cfgelm_int, &default_value_int, 1, 1,
                         _surf_cfg_cb_surf_nthreads, NULL);

        default_value = xbt_strdup("no");
        xbt_cfg_register(&_surf_cfg_set, "network/coordinates",
                         "\"yes\" or \"no\", specifying whether we use a coordinate-based routing (as Vivaldi)",
                         xbt_cfgelm_string, &default_value, 1, 1,
                         _surf_cfg_cb__surf_network_coordinates, NULL);
        xbt_cfg_setdefault_string(_surf_cfg_set, "network/coordinates", default_value);

        default_value_int = 0;
        xbt_cfg_register(&_surf_cfg_set, "network/crosstraffic",
                         "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM02)",
                         xbt_cfgelm_int, &default_value_int, 0, 1,
                         _surf_cfg_cb__surf_network_crosstraffic, NULL);
        xbt_cfg_setdefault_int(_surf_cfg_set, "network/crosstraffic", default_value_int);

#ifdef HAVE_GTNETS
        xbt_cfg_register(&_surf_cfg_set, "gtnets/jitter",
                         "Double value to oscillate the link latency, uniformly in random interval [-latency*gtnets_jitter,latency*gtnets_jitter)",
                         xbt_cfgelm_double, NULL, 1, 1,
                         _surf_cfg_cb__gtnets_jitter, NULL);
        xbt_cfg_setdefault_double(_surf_cfg_set, "gtnets/jitter", 0.0);

        default_value_int = 10;
        xbt_cfg_register(&_surf_cfg_set, "gtnets/jitter_seed",
                         "Use a positive seed to reproduce jitted results, value must be in [1,1e8], default is 10",
                         xbt_cfgelm_int, &default_value_int, 0, 1,
                         _surf_cfg_cb__gtnets_jitter_seed, NULL);
#endif
#ifdef HAVE_NS3
        xbt_cfg_register(&_surf_cfg_set, "ns3/TcpModel",
                         "The ns3 tcp model can be : NewReno or Reno or Tahoe",
                         xbt_cfgelm_string, NULL, 1, 1,
                         NULL, NULL);
        xbt_cfg_setdefault_string(_surf_cfg_set, "ns3/TcpModel", "default");
#endif

//SMPI
        double default_reference_speed = 20000.0;
        xbt_cfg_register(&_surf_cfg_set, "smpi/running_power",
                         "Power of the host running the simulation (in flop/s). Used to bench the operations.",
                         xbt_cfgelm_double, &default_reference_speed, 1, 1, NULL,
                         NULL);

        int default_display_timing = 0;
        xbt_cfg_register(&_surf_cfg_set, "smpi/display_timing",
                         "Boolean indicating whether we should display the timing after simulation.",
                         xbt_cfgelm_int, &default_display_timing, 1, 1, NULL,
                         NULL);

        double default_threshold = 1e-6;
        xbt_cfg_register(&_surf_cfg_set, "smpi/cpu_threshold",
                         "Minimal computation time (in seconds) not discarded.",
                         xbt_cfgelm_double, &default_threshold, 1, 1, NULL,
                         NULL);

        int default_small_messages_threshold = 0;
        xbt_cfg_register(&_surf_cfg_set, "smpi/async_small_thres",
                         "Maximal size of messages that are to be sent asynchronously, without waiting for the receiver",
                         xbt_cfgelm_int, &default_small_messages_threshold, 1, 1, NULL,
                         NULL);

        //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 <prop id="smpi/bw_factor" value="threshold0:value0;threshold1:value1;...;thresholdN:valueN"></prop>
        xbt_cfg_register(&_surf_cfg_set, "smpi/bw_factor",
                         "Bandwidth factors for smpi.",
                         xbt_cfgelm_string, NULL, 1, 1, NULL,
                         NULL);
        xbt_cfg_setdefault_string(_surf_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(&_surf_cfg_set, "smpi/lat_factor",
                         "Latency factors for smpi.",
                         xbt_cfgelm_string, NULL, 1, 1, NULL,
                         NULL);
        xbt_cfg_setdefault_string(_surf_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");
//END SMPI


        if (!surf_path) {
            /* 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_path = xbt_dynar_new(sizeof(char *), NULL);
            xbt_cfg_setdefault_string(_surf_cfg_set, "path", initial_path);
        }

        _surf_init_status = 1;

        surf_config_cmd_line(argc, argv);

        xbt_mallocator_initialization_is_done(SIMIX_context_is_parallel());

    } else {
        XBT_WARN("Call to surf_config_init() after initialization ignored");
    }
}