Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
merge conflicts
[simgrid.git] / src / gras / Virtu / sg_emul.c
1 /* sg_emul - Emulation support (simulation)                                 */
2
3 /* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9 #include <stdio.h>              /* sprintf */
10 #include "gras/emul.h"
11 #include "gras/Virtu/virtu_sg.h"
12 #include "gras_modinter.h"
13
14 #include "xbt/xbt_os_time.h"    /* timers */
15 #include "xbt/dict.h"
16 #include "xbt/ex.h"
17
18 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_virtu_emul, gras_virtu,
19                                 "Emulation support");
20 /*** CPU burning */
21 void gras_cpu_burn(double flops)
22 {
23   smx_action_t execution;
24
25   if (flops > 0){
26     execution = SIMIX_req_host_execute("task", SIMIX_host_self(), flops, 1);
27     SIMIX_req_host_execution_wait(execution);
28   }
29 }
30
31 /*** Timing macros ***/
32 static xbt_os_timer_t timer;
33 static int benchmarking = 0;
34 static xbt_dict_t benchmark_set = NULL;
35 static double reference = .00000000523066250047108838;  /* FIXME: we should benchmark host machine to set this; unit=s/flop */
36 static double duration = 0.0;
37
38 static char *locbuf = NULL;
39 static unsigned int locbufsize;
40
41 void gras_emul_init(void)
42 {
43   if (!benchmark_set) {
44     benchmark_set = xbt_dict_new();
45     timer = xbt_os_timer_new();
46   }
47 }
48
49 void gras_emul_exit(void)
50 {
51   free(locbuf);
52   xbt_dict_free(&benchmark_set);
53   xbt_os_timer_free(timer);
54 }
55
56
57 static void store_in_dict(xbt_dict_t dict, const char *key, double value)
58 {
59   double *ir;
60
61   ir = xbt_dict_get_or_null(dict, key);
62   if (!ir) {
63     ir = xbt_new0(double, 1);
64     xbt_dict_set(dict, key, ir, xbt_free_f);
65   }
66   *ir = value;
67 }
68
69 static double get_from_dict(xbt_dict_t dict, const char *key)
70 {
71   double *ir = xbt_dict_get(dict, key);
72
73   return *ir;
74 }
75
76 int gras_bench_always_begin(const char *location, int line)
77 {
78   xbt_assert(!benchmarking, "Already benchmarking");
79   benchmarking = 1;
80
81   if (!timer)
82     xbt_os_timer_start(timer);
83   return 0;
84 }
85
86 int gras_bench_always_end(void)
87 {
88   xbt_assert(benchmarking, "Not benchmarking yet");
89   benchmarking = 0;
90   xbt_os_timer_stop(timer);
91   duration = xbt_os_timer_elapsed(timer);
92
93   gras_cpu_burn(duration / reference);
94
95   return 0;
96 }
97
98 int gras_bench_once_begin(const char *location, int line)
99 {
100   double *ir = NULL;
101   xbt_assert(!benchmarking, "Already benchmarking");
102   benchmarking = 1;
103
104   if (!locbuf || locbufsize < strlen(location) + 64) {
105     locbufsize = strlen(location) + 64;
106     locbuf = xbt_realloc(locbuf, locbufsize);
107   }
108   sprintf(locbuf, "%s:%d", location, line);
109
110   ir = xbt_dict_get_or_null(benchmark_set, locbuf);
111   if (!ir) {
112     XBT_DEBUG("%s", locbuf);
113     duration = 1;
114     xbt_os_timer_start(timer);
115     return 1;
116   } else {
117     duration = -1.0;
118     return 0;
119   }
120 }
121
122 int gras_bench_once_end(void)
123 {
124   xbt_assert(benchmarking, "Not benchmarking yet");
125   benchmarking = 0;
126   if (duration > 0) {
127     xbt_os_timer_stop(timer);
128     duration = xbt_os_timer_elapsed(timer);
129     store_in_dict(benchmark_set, locbuf, duration);
130   } else {
131     duration = get_from_dict(benchmark_set, locbuf);
132   }
133   XBT_DEBUG("Simulate the run of a task of %f sec for %s", duration, locbuf);
134   gras_cpu_burn(duration / reference);
135   return 0;
136 }
137
138
139 /*** Conditional execution support ***/
140
141 int gras_if_RL(void)
142 {
143   return 0;
144 }
145
146 int gras_if_SG(void)
147 {
148   return 1;
149 }