X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a3d08dd00246eb26ced68c5b0e046096706bbe23..c76dff0228ca1145b553ffc73f0293ac8f8a75d1:/teshsuite/xbt/parmap_bench/parmap_bench.cpp diff --git a/teshsuite/xbt/parmap_bench/parmap_bench.cpp b/teshsuite/xbt/parmap_bench/parmap_bench.cpp index ce1262055c..ccab38bb79 100644 --- a/teshsuite/xbt/parmap_bench/parmap_bench.cpp +++ b/teshsuite/xbt/parmap_bench/parmap_bench.cpp @@ -1,12 +1,12 @@ -/* Copyright (c) 2012-2017. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2012-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ #include "src/internal_config.h" // HAVE_FUTEX_H -#include +#include "xbt/parmap.hpp" +#include #include -#include #include #include // std::iota @@ -15,12 +15,9 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(parmap_bench, "Bench for parmap"); -#define MODES_DEFAULT 0x7 -#define TIMEOUT 10.0 -#define ARRAY_SIZE 10007 -#define FIBO_MAX 25 - -void (*fun_to_apply)(unsigned*); +constexpr unsigned MODES_DEFAULT = 0x7; +constexpr unsigned ARRAY_SIZE = 10007; +constexpr unsigned FIBO_MAX = 25; static std::string parmap_mode_name(e_xbt_parmap_mode_t mode) { @@ -63,9 +60,11 @@ static void fun_big_comp(unsigned* arg) *arg = fibonacci(*arg % FIBO_MAX); } -static void bench_parmap(int nthreads, e_xbt_parmap_mode_t mode, bool full_bench) +template +void bench_parmap(int nthreads, double timeout, e_xbt_parmap_mode_t mode, bool full_bench, F func_to_apply) { - XBT_INFO("** mode = %s", parmap_mode_name(mode).c_str()); + std::string mode_name = parmap_mode_name(mode); + XBT_INFO("** mode = %s", mode_name.c_str()); if (mode == XBT_PARMAP_FUTEX && not HAVE_FUTEX_H) { XBT_INFO(" not available"); @@ -86,37 +85,39 @@ static void bench_parmap(int nthreads, e_xbt_parmap_mode_t mode, bool full_bench delete parmap; parmap = new simgrid::xbt::Parmap(nthreads, mode); } - parmap->apply(fun_to_apply, data); + parmap->apply(func_to_apply, data); elapsed_time = xbt_os_time() - start_time; i++; - } while (elapsed_time < TIMEOUT); + } while (elapsed_time < timeout); delete parmap; XBT_INFO(" ran %d times in %g seconds (%g/s)", i, elapsed_time, i / elapsed_time); } -static void bench_all_modes(int nthreads, unsigned modes, bool full_bench) +template void bench_all_modes(int nthreads, double timeout, unsigned modes, bool full_bench, F func_to_apply) { std::vector all_modes = {XBT_PARMAP_POSIX, XBT_PARMAP_FUTEX, XBT_PARMAP_BUSY_WAIT, XBT_PARMAP_DEFAULT}; for (unsigned i = 0; i < all_modes.size(); i++) { if (1U << i & modes) - bench_parmap(nthreads, all_modes[i], full_bench); + bench_parmap(nthreads, timeout, all_modes[i], full_bench, func_to_apply); } } int main(int argc, char* argv[]) { int nthreads; + double timeout; unsigned modes = MODES_DEFAULT; xbt_log_control_set("parmap_bench.fmt:[%c/%p]%e%m%n"); - MSG_init(&argc, argv); + simgrid::s4u::Engine e(&argc, argv); - if (argc != 2 && argc != 3) { - XBT_INFO("Usage: %s nthreads [modes]", argv[0]); + if (argc != 3 && argc != 4) { + XBT_INFO("Usage: %s nthreads timeout [modes]", argv[0]); XBT_INFO(" nthreads - number of working threads"); + XBT_INFO(" timeout - max duration for each test"); XBT_INFO(" modes - bitmask of modes to test"); return EXIT_FAILURE; } @@ -125,30 +126,29 @@ int main(int argc, char* argv[]) XBT_ERROR("Invalid thread count: %d", nthreads); return EXIT_FAILURE; } - if (argc == 3) - modes = strtol(argv[2], NULL, 0); + timeout = atof(argv[2]); + if (argc == 4) + modes = static_cast(strtoul(argv[2], nullptr, 0)); XBT_INFO("Parmap benchmark with %d workers (modes = %#x)...", nthreads, modes); XBT_INFO("%s", ""); - fun_to_apply = &fun_small_comp; + simgrid::kernel::context::Context::set_nthreads(nthreads); XBT_INFO("Benchmark for parmap create+apply+destroy (small comp):"); - bench_all_modes(nthreads, modes, true); + bench_all_modes(nthreads, timeout, modes, true, &fun_small_comp); XBT_INFO("%s", ""); XBT_INFO("Benchmark for parmap apply only (small comp):"); - bench_all_modes(nthreads, modes, false); + bench_all_modes(nthreads, timeout, modes, false, &fun_small_comp); XBT_INFO("%s", ""); - fun_to_apply = &fun_big_comp; - XBT_INFO("Benchmark for parmap create+apply+destroy (big comp):"); - bench_all_modes(nthreads, modes, true); + bench_all_modes(nthreads, timeout, modes, true, &fun_big_comp); XBT_INFO("%s", ""); XBT_INFO("Benchmark for parmap apply only (big comp):"); - bench_all_modes(nthreads, modes, false); + bench_all_modes(nthreads, timeout, modes, false, &fun_big_comp); XBT_INFO("%s", ""); return EXIT_SUCCESS;