From 7593cbfc4657e206415167818fe2110b2f125302 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 16 May 2013 16:32:03 +0200 Subject: [PATCH] Revert "Remove parmap from surf." This reverts commit 61a993d9efe970edcbb1cb3d947553b2f188b327. --- src/simgrid/sg_config.c | 12 ++++++++ src/surf/surf.c | 68 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index b812c87d55..4203815fc1 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -389,6 +389,11 @@ static void _sg_cfg_cb__surf_network_coordinates(const char *name, xbt_die("Setting of whether to use coordinate cannot be disabled once set."); } +static void _sg_cfg_cb_surf_nthreads(const char *name, int pos) +{ + surf_set_nthreads(xbt_cfg_get_int(_sg_cfg_set, name)); +} + static void _sg_cfg_cb__surf_network_crosstraffic(const char *name, int pos) { @@ -658,6 +663,13 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/synchro", "busy_wait"); #endif + /* number of parallel threads for Surf */ + xbt_cfg_register(&_sg_cfg_set, "surf/nthreads", + "Number of parallel threads used to update Surf models", + xbt_cfgelm_int, NULL, 1, 1, + _sg_cfg_cb_surf_nthreads, NULL); + xbt_cfg_setdefault_int(_sg_cfg_set, "surf/nthreads", surf_get_nthreads()); + xbt_cfg_register(&_sg_cfg_set, "network/coordinates", "\"yes\" or \"no\", specifying whether we use a coordinate-based routing (as Vivaldi)", xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb__surf_network_coordinates, NULL); diff --git a/src/surf/surf.c b/src/surf/surf.c index 807bfaf8d5..c3c1d93c03 100644 --- a/src/surf/surf.c +++ b/src/surf/surf.c @@ -567,9 +567,20 @@ double surf_solve(double max_date) } surf_min_index = 0; - /* sequential version */ - xbt_dynar_foreach(model_list, iter, model) { - surf_share_resources(model); + + if (surf_get_nthreads() > 1) { + /* parallel version */ +#ifdef CONTEXT_THREADS + xbt_parmap_apply(surf_parmap, (void_f_pvoid_t) surf_share_resources, model_list); +#else + xbt_die("Asked to run in parallel, but no thread at hand..."); +#endif + } + else { + /* sequential version */ + xbt_dynar_foreach(model_list, iter, model) { + surf_share_resources(model); + } } unsigned i; @@ -648,9 +659,17 @@ double surf_solve(double max_date) NOW = NOW + min; - /* sequential version */ - xbt_dynar_foreach(model_list, iter, model) { - surf_update_actions_state(model); + if (surf_get_nthreads() > 1) { + /* parallel version */ +#ifdef CONTEXT_THREADS + xbt_parmap_apply(surf_parmap, (void_f_pvoid_t) surf_update_actions_state, model_list); +#endif + } + else { + /* sequential version */ + xbt_dynar_foreach(model_list, iter, model) { + surf_update_actions_state(model); + } } #ifdef HAVE_TRACING @@ -683,3 +702,40 @@ static void surf_update_actions_state(surf_model_t model) model->model_private->update_actions_state(NOW, min); } +/** + * \brief Returns the number of parallel threads used to update the models. + * \return the number of threads (1 means no parallelism) + */ +int surf_get_nthreads(void) { + return surf_nthreads; +} + +/** + * \brief Sets the number of parallel threads used to update the models. + * + * A value of 1 means no parallelism. + * + * \param nb_threads the number of threads to use + */ +void surf_set_nthreads(int nthreads) { + + if (nthreads<=0) { + nthreads = xbt_os_get_numcores(); + XBT_INFO("Auto-setting surf/nthreads to %d",nthreads); + } + +#ifdef CONTEXT_THREADS + xbt_parmap_destroy(surf_parmap); + surf_parmap = NULL; +#endif + + if (nthreads > 1) { +#ifdef CONTEXT_THREADS + surf_parmap = xbt_parmap_new(nthreads, XBT_PARMAP_DEFAULT); +#else + THROWF(arg_error, 0, "Cannot activate parallel threads in Surf: your architecture does not support threads"); +#endif + } + + surf_nthreads = nthreads; +} -- 2.20.1