Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
It's ok to pass NULL to xbt_free.
[simgrid.git] / src / smpi / smpi_bench.c
index 6feda0f..480c391 100644 (file)
@@ -127,7 +127,6 @@ void smpi_execute_flops(double flops) {
   smx_action_t action;
   smx_host_t host;
   host = SIMIX_host_self();
-
   XBT_DEBUG("Handle real computation time: %f flops", flops);
   action = simcall_host_execute("computation", host, flops, 1);
 #ifdef HAVE_TRACING
@@ -141,8 +140,21 @@ static void smpi_execute(double duration)
   /* FIXME: a global variable would be less expensive to consult than a call to xbt_cfg_get_double() right on the critical path */
   if (duration >= sg_cfg_get_double("smpi/cpu_threshold")) {
     XBT_DEBUG("Sleep for %f to handle real computation time", duration);
-    smpi_execute_flops(duration *
-               sg_cfg_get_double("smpi/running_power"));
+    double flops = duration *
+        sg_cfg_get_double("smpi/running_power");
+#ifdef HAVE_TRACING
+    int rank = smpi_process_index();
+    instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
+    extra->type=TRACING_COMPUTING;
+    extra->comp_size=flops;
+    TRACE_smpi_computing_in(rank, extra);
+#endif
+    smpi_execute_flops(flops);
+
+#ifdef HAVE_TRACING
+  TRACE_smpi_computing_out(rank);
+#endif
+
   } else {
     XBT_DEBUG("Real computation took %f while option smpi/cpu_threshold is set to %f => ignore it",
         duration, sg_cfg_get_double("smpi/cpu_threshold"));
@@ -165,8 +177,18 @@ void smpi_bench_end(void)
 
 unsigned int smpi_sleep(unsigned int secs)
 {
+  smx_action_t action;
+
   smpi_bench_end();
-  smpi_execute_flops((double) secs*simcall_host_get_speed(SIMIX_host_self()));
+
+  double flops = (double) secs*simcall_host_get_speed(SIMIX_host_self());
+  XBT_DEBUG("Sleep for: %f flops", flops);
+  action = simcall_host_execute("computation", SIMIX_host_self(), flops, 1);
+  #ifdef HAVE_TRACING
+    simcall_set_category (action, TRACE_internal_smpi_get_category());
+  #endif
+  simcall_host_execution_wait(action);
+
   smpi_bench_begin();
   return secs;
 }
@@ -220,6 +242,8 @@ typedef struct {
   int benching;     /* 1: we are benchmarking; 0: we have enough data, no bench anymore */
 } local_data_t;
 
+int smpi_sample_is_running = 0;
+
 static char *sample_location(int global, const char *file, int line) {
   if (global) {
     return bprintf("%s:%d", file, line);
@@ -247,6 +271,8 @@ void smpi_sample_1(int global, const char *file, int line, int iters, double thr
   local_data_t *data;
 
   smpi_bench_end();     /* Take time from previous, unrelated computation into account */
+  smpi_sample_is_running++;
+
   if (!samples)
     samples = xbt_dict_new_homogeneous(free);
 
@@ -301,6 +327,7 @@ int smpi_sample_2(int global, const char *file, int line)
         data->count, data->iters, data->relstderr, data->threshold, data->mean);
     smpi_execute(data->mean);
 
+    smpi_sample_is_running--;
     smpi_bench_begin(); // prepare to capture future, unrelated computations
     return 0;
   }
@@ -397,7 +424,7 @@ void *smpi_shared_malloc(size_t size, const char *file, int line)
           case EEXIST:
             xbt_die("Please cleanup /dev/shm/%s", loc);
           default:
-            xbt_die("An unhandled error occured while opening %s: %s", loc, strerror(errno));
+            xbt_die("An unhandled error occured while opening %s. shm_open: %s", loc, strerror(errno));
         }
       }
       data = xbt_new(shared_data_t, 1);
@@ -406,7 +433,7 @@ void *smpi_shared_malloc(size_t size, const char *file, int line)
       data->loc = loc;
       mem = shm_map(fd, size, data);
       if (shm_unlink(loc) < 0) {
-        XBT_WARN("Could not early unlink %s: %s", loc, strerror(errno));
+        XBT_WARN("Could not early unlink %s. shm_unlink: %s", loc, strerror(errno));
       }
       xbt_dict_set(allocs, loc, data, NULL);
       XBT_DEBUG("Mapping %s at %p through %d", loc, mem, fd);