4 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_bench, smpi,
5 "Logging specific to SMPI (benchmarking)");
7 void smpi_execute(double duration)
9 smx_host_t host = SIMIX_host_self();
10 smx_mutex_t mutex = smpi_process_mutex();
11 smx_cond_t cond = smpi_process_cond();
13 e_surf_action_state_t state;
15 SIMIX_mutex_lock(mutex);
18 SIMIX_action_execute(host, "execute",
19 duration * smpi_global->reference_speed);
21 SIMIX_register_action_to_condition(action, cond);
22 for (state = SIMIX_action_get_state(action);
23 state == SURF_ACTION_READY ||
24 state == SURF_ACTION_RUNNING; state = SIMIX_action_get_state(action)
26 SIMIX_cond_wait(cond, mutex);
28 SIMIX_unregister_action_to_condition(action, cond);
29 SIMIX_action_destroy(action);
31 SIMIX_mutex_unlock(mutex);
36 void smpi_start_timer()
38 SIMIX_mutex_lock(smpi_global->timer_mutex);
39 xbt_os_timer_start(smpi_global->timer);
42 double smpi_stop_timer()
45 xbt_os_timer_stop(smpi_global->timer);
46 duration = xbt_os_timer_elapsed(smpi_global->timer);
47 SIMIX_mutex_unlock(smpi_global->timer_mutex);
51 void smpi_bench_begin()
58 smpi_execute(smpi_stop_timer());
61 void smpi_do_once_1(const char *file, int line)
63 smpi_do_once_duration_node_t curr, prev;
65 SIMIX_mutex_lock(smpi_global->do_once_mutex);
67 for (curr = smpi_global->do_once_duration_nodes;
68 NULL != curr && (strcmp(curr->file, file) || curr->line != line);
73 curr = xbt_new(s_smpi_do_once_duration_node_t, 1);
74 curr->file = xbt_strdup(file);
79 smpi_global->do_once_duration_nodes = curr;
84 smpi_global->do_once_duration = &curr->duration;
89 double duration = *(smpi_global->do_once_duration);
94 SIMIX_mutex_unlock(smpi_global->do_once_mutex);
95 smpi_execute(duration);
100 void smpi_do_once_3()
102 *(smpi_global->do_once_duration) = smpi_stop_timer();