X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/71e92a54731567b2ae3decbd612e60e253098e3c..54cb3695a30bf100bec2710d11af87d3b6ba1a44:/src/smpi/internals/smpi_bench.cpp diff --git a/src/smpi/internals/smpi_bench.cpp b/src/smpi/internals/smpi_bench.cpp index 302050337c..9793546b0f 100644 --- a/src/smpi/internals/smpi_bench.cpp +++ b/src/smpi/internals/smpi_bench.cpp @@ -28,8 +28,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_bench, smpi, "Logging specific to SMPI (benchmarking)"); -static simgrid::config::Flag smpi_wtime_sleep("smpi/wtime", "Minimum time to inject inside a call to MPI_Wtime", - 0.0); +static simgrid::config::Flag + smpi_wtime_sleep("smpi/wtime", + "Minimum time to inject inside a call to MPI_Wtime(), gettimeofday() and clock_gettime()", + 1e-8 /* Documented to be 10 ns */); double smpi_cpu_threshold = -1; double smpi_host_speed; @@ -38,6 +40,7 @@ SharedMallocType smpi_cfg_shared_malloc = SharedMallocType::GLOBAL; double smpi_total_benched_time = 0; extern "C" XBT_PUBLIC void smpi_execute_flops_(double* flops); + void smpi_execute_flops_(double *flops) { smpi_execute_flops(*flops); @@ -235,6 +238,8 @@ int smpi_gettimeofday(struct timeval* tv, struct timezone* tz) tv->tv_usec = static_cast((now - tv->tv_sec) * 1e6); #endif } + if (smpi_wtime_sleep > 0) + simcall_process_sleep(smpi_wtime_sleep); smpi_bench_begin(); return 0; } @@ -251,11 +256,28 @@ int smpi_clock_gettime(clockid_t clk_id, struct timespec* tp) tp->tv_sec = static_cast(now); tp->tv_nsec = static_cast((now - tp->tv_sec) * 1e9); } + if (smpi_wtime_sleep > 0) + simcall_process_sleep(smpi_wtime_sleep); smpi_bench_begin(); return 0; } #endif +double smpi_mpi_wtime() +{ + double time; + if (smpi_process()->initialized() && not smpi_process()->finalized() && not smpi_process()->sampling()) { + smpi_bench_end(); + time = SIMIX_get_clock(); + if (smpi_wtime_sleep > 0) + simcall_process_sleep(smpi_wtime_sleep); + smpi_bench_begin(); + } else { + time = SIMIX_get_clock(); + } + return time; +} + extern double sg_surf_precision; unsigned long long smpi_rastro_resolution () { @@ -276,27 +298,6 @@ unsigned long long smpi_rastro_timestamp () return static_cast(sec) * smpi_rastro_resolution() + pre; } -double smpi_mpi_wtime() -{ - double time; - if (smpi_process()->initialized() && not smpi_process()->finalized() && not smpi_process()->sampling()) { - smpi_bench_end(); - time = SIMIX_get_clock(); - // to avoid deadlocks if used as a break condition, such as - // while (MPI_Wtime(...) < time_limit) { - // .... - // } - // because the time will not normally advance when only calls to MPI_Wtime - // are made -> deadlock (MPI_Wtime never reaches the time limit) - if (smpi_wtime_sleep > 0) - simcall_process_sleep(smpi_wtime_sleep); - smpi_bench_begin(); - } else { - time = SIMIX_get_clock(); - } - return time; -} - /* ****************************** Functions related to the SMPI_SAMPLE_ macros ************************************/ namespace { class SampleLocation : public std::string {