void smpi_exit(int);
int smpi_gettimeofday(struct timeval *tv, struct timezone *tz);
+void smpi_do_once_1(void);
+int smpi_do_once_2(void);
+void smpi_do_once_3(void);
+#define DO_ONCE for (smpi_do_once_1(); smpi_do_once_2(); smpi_do_once_3())
+
#endif
#define SMPI_DEFAULT_SPEED 100
#define SMPI_REQUEST_MALLOCATOR_SIZE 100
#define SMPI_MESSAGE_MALLOCATOR_SIZE 100
+// FIXME: should probably be dynamic datatype...
+// or could include code to dynamically expand when full
+#define SMPI_MAX_TIMES 10
// smpi mpi communicator
typedef struct smpi_mpi_communicator_t {
xbt_os_timer_t timer;
smx_mutex_t timer_mutex;
smx_cond_t timer_cond;
+ double times[SMPI_MAX_TIMES];
+ int times_max;
+ smx_mutex_t times_mutex;
} s_smpi_global_t;
typedef struct smpi_global_t *smpi_global_t;
int smpi_mpi_wait(smpi_mpi_request_t request, smpi_mpi_status_t *status);
void smpi_bench_begin(void);
-void smpi_bench_end(void);
+double smpi_bench_end(void);
+void smpi_bench_skip(void);
void smpi_global_init(void);
void smpi_global_destroy(void);
+#include <stdio.h>
#include "private.h"
// FIXME: could cause trouble with multithreaded procs on same host...
void smpi_bench_begin()
{
SIMIX_mutex_lock(smpi_global->timer_mutex);
+
xbt_os_timer_start(smpi_global->timer);
+
return;
}
-void smpi_bench_end()
+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_mutex_unlock(smpi_global->timer_mutex);
+ 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_mutex_unlock(smpi_global->timer_mutex);
+
+ return;
+}
+
+void smpi_do_once_1() {
+ smpi_bench_end();
+ SIMIX_mutex_lock(smpi_global->times_mutex);
+ if (0 < smpi_global->times[0]) {
+ smpi_bench_skip();
+ }
+ return;
+}
+
+int smpi_do_once_2() {
+ int retval = 1;
+ if (0 < smpi_global->times[0]) {
+ SIMIX_mutex_unlock(smpi_global->times_mutex);
+ retval = 0;
+ }
+ smpi_bench_begin();
+ return retval;
+}
+
+void smpi_do_once_3() {
+ smpi_global->times[0] = smpi_bench_end();
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();
- for(i = 0; i < size; i++) {
+ 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();
smpi_global->pending_recv_request_queues[i] = xbt_fifo_new();
smpi_global->received_message_queues_mutexes[i] = SIMIX_mutex_init();
}
+ for (i = 0; i < SMPI_MAX_TIMES; i++) {
+ smpi_global->times[i] = -1.0;
+ }
+
}
void smpi_global_destroy()
xbt_os_timer_free(smpi_global->timer);
SIMIX_mutex_destroy(smpi_global->timer_mutex);
SIMIX_cond_destroy(smpi_global->timer_cond);
+ SIMIX_mutex_destroy(smpi_global->times_mutex);
for(i = 0; i < size; i++) {
xbt_fifo_free(smpi_global->pending_send_request_queues[i]);
-// FIXME: remove
-#include <stdio.h>
#include "private.h"
int MPI_Init(int *argc, char ***argv)