int running_hosts_count;
smx_mutex_t running_hosts_count_mutex;
+ // FIXME: maybe all code needs to lock timer?
xbt_os_timer_t timer;
smx_mutex_t timer_mutex;
smx_cond_t timer_cond;
+
+ // keeps track of previous times
double times[SMPI_MAX_TIMES];
int times_max;
smx_mutex_t times_mutex;
+ smx_mutex_t execute_mutex;
+ smx_cond_t execute_cond;
+
} s_smpi_global_t;
typedef struct smpi_global_t *smpi_global_t;
extern smpi_global_t smpi_global;
int smpi_mpi_irecv(smpi_mpi_request_t request);
int smpi_mpi_wait(smpi_mpi_request_t request, smpi_mpi_status_t *status);
+void smpi_execute(double duration);
void smpi_bench_begin(void);
double smpi_bench_end(void);
void smpi_bench_skip(void);
-#include <stdio.h>
#include "private.h"
-// FIXME: could cause trouble with multithreaded procs on same host...
-// FIXME: add benchmarking flag?
+void smpi_execute(double duration) {
+ smx_host_t host = SIMIX_host_self();
+ smx_action_t action;
+
+ SIMIX_mutex_lock(smpi_global->execute_mutex);
+
+ action = SIMIX_action_execute(host, "computation", duration * SMPI_DEFAULT_SPEED);
+
+ SIMIX_register_action_to_condition(action, smpi_global->execute_cond);
+ SIMIX_cond_wait(smpi_global->execute_cond, smpi_global->execute_mutex);
+ SIMIX_unregister_action_to_condition(action, smpi_global->execute_cond);
+ SIMIX_action_destroy(action);
+
+ SIMIX_mutex_unlock(smpi_global->execute_mutex);
+
+ return;
+}
void smpi_bench_begin()
{
SIMIX_mutex_lock(smpi_global->timer_mutex);
-
xbt_os_timer_start(smpi_global->timer);
-
return;
}
double smpi_bench_end()
{
double duration;
- smx_host_t host;
- smx_action_t action;
xbt_os_timer_stop(smpi_global->timer);
duration = xbt_os_timer_elapsed(smpi_global->timer);
- host = SIMIX_host_self();
- action = SIMIX_action_execute(host, "computation", duration * SMPI_DEFAULT_SPEED);
-
- SIMIX_register_action_to_condition(action, smpi_global->timer_cond);
- SIMIX_cond_wait(smpi_global->timer_cond, smpi_global->timer_mutex);
- SIMIX_unregister_action_to_condition(action, smpi_global->timer_cond);
- SIMIX_action_destroy(action);
-
SIMIX_mutex_unlock(smpi_global->timer_mutex);
+ smpi_execute(duration);
+
return duration;
}
+
void smpi_bench_skip() {
- smx_host_t host;
- smx_action_t action;
double duration = smpi_global->times[0];
-
- SIMIX_mutex_lock(smpi_global->timer_mutex);
-
- host = SIMIX_host_self();
- action = SIMIX_action_execute(host, "computation", duration * SMPI_DEFAULT_SPEED);
-
- SIMIX_register_action_to_condition(action, smpi_global->timer_cond);
- SIMIX_cond_wait(smpi_global->timer_cond, smpi_global->timer_mutex);
- SIMIX_unregister_action_to_condition(action, smpi_global->timer_cond);
- SIMIX_action_destroy(action);
-
- SIMIX_mutex_unlock(smpi_global->timer_mutex);
-
+ smpi_execute(duration);
return;
}
smpi_global->timer = xbt_os_timer_new();
smpi_global->timer_mutex = SIMIX_mutex_init();
smpi_global->timer_cond = SIMIX_cond_init();
+
smpi_global->times_max = 0;
smpi_global->times_mutex = SIMIX_mutex_init();
+ smpi_global->execute_mutex = SIMIX_mutex_init();
+ smpi_global->execute_cond = SIMIX_cond_init();
+
for (i = 0; i < size; i++) {
smpi_global->pending_send_request_queues[i] = xbt_fifo_new();
smpi_global->pending_send_request_queues_mutexes[i] = SIMIX_mutex_init();
SIMIX_mutex_destroy(smpi_global->timer_mutex);
SIMIX_cond_destroy(smpi_global->timer_cond);
SIMIX_mutex_destroy(smpi_global->times_mutex);
+ SIMIX_mutex_destroy(smpi_global->execute_mutex);
+ SIMIX_cond_destroy(smpi_global->execute_cond);
for(i = 0; i < size; i++) {
xbt_fifo_free(smpi_global->pending_send_request_queues[i]);
smpi_bench_end();
- host = SIMIX_host_self();
+ host = SIMIX_host_self();
- SIMIX_mutex_lock(smpi_global->timer_mutex);
+ SIMIX_mutex_lock(smpi_global->execute_mutex);
action = SIMIX_action_sleep(host, seconds);
- SIMIX_register_action_to_condition(action, smpi_global->timer_cond);
- SIMIX_cond_wait(smpi_global->timer_cond, smpi_global->timer_mutex);
- SIMIX_unregister_action_to_condition(action, smpi_global->timer_cond);
+ SIMIX_register_action_to_condition(action, smpi_global->execute_cond);
+ SIMIX_cond_wait(smpi_global->execute_cond, smpi_global->execute_mutex);
+ SIMIX_unregister_action_to_condition(action, smpi_global->execute_cond);
SIMIX_action_destroy(action);
- SIMIX_mutex_unlock(smpi_global->timer_mutex);
+ SIMIX_mutex_unlock(smpi_global->execute_mutex);
smpi_bench_begin();
return 0;