X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9189fe94c14ef9e31142d1603a1979ea7e731a0a..c5ad8ca1a68bbaa9152471c8d0eeb99d762f0d86:/src/gras/Virtu/sg_emul.c diff --git a/src/gras/Virtu/sg_emul.c b/src/gras/Virtu/sg_emul.c index 127cfbe064..1fce177fe0 100644 --- a/src/gras/Virtu/sg_emul.c +++ b/src/gras/Virtu/sg_emul.c @@ -1,42 +1,54 @@ -/* $Id$ */ - /* sg_emul - Emulation support (simulation) */ -/* Copyright (c) 2003-5 Arnaud Legrand, Martin Quinson. All rights reserved.*/ +/* Copyright (c) 2005, 2006, 2007, 2009, 2010. 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 /* sprintf */ #include "gras/emul.h" #include "gras/Virtu/virtu_sg.h" #include "gras_modinter.h" -#include "xbt/xbt_portability.h" /* timers */ +#include "xbt/xbt_os_time.h" /* timers */ #include "xbt/dict.h" #include "xbt/ex.h" -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(emul,gras,"Emulation support"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_virtu_emul, gras_virtu, + "Emulation support"); +/*** CPU burning */ +void gras_cpu_burn(double flops) +{ + smx_action_t execution; + + if (flops > 0){ + execution = simcall_host_execute("task", SIMIX_host_self(), flops, 1); + simcall_host_execution_wait(execution); + } +} /*** Timing macros ***/ static xbt_os_timer_t timer; static int benchmarking = 0; static xbt_dict_t benchmark_set = NULL; -static double reference = .00523066250047108838; /* FIXME: we should benchmark host machine to set this */ +static double reference = .00000000523066250047108838; /* FIXME: we should benchmark host machine to set this; unit=s/flop */ static double duration = 0.0; -static char* locbuf = NULL; -static int locbufsize; +static char *locbuf = NULL; +static unsigned int locbufsize; void gras_emul_init(void) { - if(!benchmark_set) { - benchmark_set = xbt_dict_new(); + if (!benchmark_set) { + benchmark_set = xbt_dict_new_homogeneous(xbt_free_f); timer = xbt_os_timer_new(); } } -void gras_emul_exit(void) { - if (locbuf) free(locbuf); +void gras_emul_exit(void) +{ + free(locbuf); xbt_dict_free(&benchmark_set); xbt_os_timer_free(timer); } @@ -45,79 +57,59 @@ void gras_emul_exit(void) { static void store_in_dict(xbt_dict_t dict, const char *key, double value) { double *ir; - xbt_ex_t e; - - TRY { - ir = xbt_dict_get(dict, key); - } CATCH(e) { - if (e.category == mismatch_error) { - ir = NULL; - xbt_ex_free(e); - } else { - RETHROW; - } - } + + ir = xbt_dict_get_or_null(dict, key); if (!ir) { - ir = xbt_new0(double,1); - xbt_dict_set(dict, key, ir, free); + ir = xbt_new0(double, 1); + xbt_dict_set(dict, key, ir, NULL); } *ir = value; } -static double get_from_dict(xbt_dict_t dict, const char *key) { +static double get_from_dict(xbt_dict_t dict, const char *key) +{ double *ir = xbt_dict_get(dict, key); return *ir; } -int gras_bench_always_begin(const char *location,int line) +int gras_bench_always_begin(const char *location, int line) { - xbt_assert0(!benchmarking,"Already benchmarking"); + xbt_assert(!benchmarking, "Already benchmarking"); benchmarking = 1; if (!timer) - xbt_os_timer_start(timer); + xbt_os_timer_start(timer); return 0; } int gras_bench_always_end(void) { - m_task_t task = NULL; - - xbt_assert0(benchmarking,"Not benchmarking yet"); + xbt_assert(benchmarking, "Not benchmarking yet"); benchmarking = 0; xbt_os_timer_stop(timer); duration = xbt_os_timer_elapsed(timer); - task = MSG_task_create("task", (duration)/reference, 0 , NULL); - MSG_task_execute(task); - MSG_task_destroy(task); + + gras_cpu_burn(duration / reference); + return 0; } -int gras_bench_once_begin(const char *location,int line) { +int gras_bench_once_begin(const char *location, int line) +{ double *ir = NULL; - xbt_ex_t e; - xbt_assert0(!benchmarking,"Already benchmarking"); + xbt_assert(!benchmarking, "Already benchmarking"); benchmarking = 1; if (!locbuf || locbufsize < strlen(location) + 64) { - locbufsize = strlen(location) + 64; - locbuf = xbt_realloc(locbuf,locbufsize); - } - sprintf(locbuf,"%s:%d",location, line); - - TRY { - ir = xbt_dict_get(benchmark_set, locbuf); - } CATCH(e) { - if (e.category == mismatch_error) { - xbt_ex_free(e); - ir = NULL; - } else { - RETHROW; - } + locbufsize = strlen(location) + 64; + locbuf = xbt_realloc(locbuf, locbufsize); } - if(!ir) { - DEBUG1("%s",locbuf); + sprintf(locbuf, "%s:%d", location, line); + + ir = xbt_dict_get_or_null(benchmark_set, locbuf); + if (!ir) { + XBT_DEBUG("%s", locbuf); duration = 1; xbt_os_timer_start(timer); return 1; @@ -129,33 +121,29 @@ int gras_bench_once_begin(const char *location,int line) { int gras_bench_once_end(void) { - m_task_t task = NULL; - - xbt_assert0(benchmarking,"Not benchmarking yet"); + xbt_assert(benchmarking, "Not benchmarking yet"); benchmarking = 0; - if(duration>0) { + if (duration > 0) { xbt_os_timer_stop(timer); duration = xbt_os_timer_elapsed(timer); store_in_dict(benchmark_set, locbuf, duration); } else { - duration = get_from_dict(benchmark_set,locbuf); + duration = get_from_dict(benchmark_set, locbuf); } - DEBUG2("Simulate the run of a task of %f sec for %s",duration,locbuf); - task = MSG_task_create("task", (duration)/reference, 0 , NULL); - MSG_task_execute(task); - MSG_task_destroy(task); + XBT_DEBUG("Simulate the run of a task of %f sec for %s", duration, locbuf); + gras_cpu_burn(duration / reference); return 0; } /*** Conditional execution support ***/ -int gras_if_RL(void) { - return 0; +int gras_if_RL(void) +{ + return 0; } -int gras_if_SG(void) { - return 1; +int gras_if_SG(void) +{ + return 1; } - -