From: markls Date: Fri, 24 Aug 2007 00:00:25 +0000 (+0000) Subject: encapsulated simdata in private data structures so that smpi.h does not need to X-Git-Tag: v3.3~1252 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/3b2a4637c63acb5ffa7e48bc17cf0ec92ad5d539 encapsulated simdata in private data structures so that smpi.h does not need to include simix.h git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@4108 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/smpi/private.h b/src/smpi/private.h index fa42b5c5cf..770c63c29f 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -1,11 +1,27 @@ -#include "smpi.h" +#ifndef SMPI_PRIVATE_H +#define SMPI_PRIVATE_H + #include "xbt/mallocator.h" #include "xbt/xbt_os_time.h" +#include "smpi.h" #define SMPI_DEFAULT_SPEED 100 #define SMPI_REQUEST_MALLOCATOR_SIZE 100 #define SMPI_MESSAGE_MALLOCATOR_SIZE 100 +typedef struct smpi_mpi_communicator_simdata { + smx_host_t *hosts; + smx_process_t *processes; + int barrier_count; + smx_mutex_t barrier_mutex; + smx_cond_t barrier_cond; +} s_smpi_mpi_communicator_simdata_t; + +typedef struct smpi_mpi_request_simdata { + smx_mutex_t mutex; + smx_cond_t cond; +} s_smpi_mpi_request_simdata_t; + typedef struct SMPI_Global { // config vars @@ -38,9 +54,7 @@ typedef struct SMPI_Global { xbt_os_timer_t *timers; smx_mutex_t *timers_mutexes; - } s_SMPI_Global_t, *SMPI_Global_t; - extern SMPI_Global_t smpi_global; struct smpi_received_message_t { @@ -50,7 +64,6 @@ struct smpi_received_message_t { int tag; void *buf; }; - typedef struct smpi_received_message_t smpi_received_message_t; // function prototypes @@ -82,3 +95,5 @@ int smpi_create_request(void *buf, int count, smpi_mpi_datatype_t *datatype, int smpi_isend(smpi_mpi_request_t *request); int smpi_irecv(smpi_mpi_request_t *request); void smpi_wait(smpi_mpi_request_t *request, smpi_mpi_status_t *status); + +#endif diff --git a/src/smpi/smpi.h b/src/smpi/smpi.h index f19628cf97..967fb64a8c 100644 --- a/src/smpi/smpi.h +++ b/src/smpi/smpi.h @@ -1,7 +1,8 @@ -#include +#ifndef SMPI_H +#define SMPI_H +#include #include -#include #define SMPI_RAND_SEED 5 @@ -19,14 +20,10 @@ #define MPI_ERR_TAG 8 // MPI_Comm +typedef struct smpi_mpi_communicator_simdata *smpi_mpi_communicator_simdata_t; struct smpi_mpi_communicator_t { int size; - smx_host_t *hosts; - - smx_process_t *processes; - int barrier_count; - smx_mutex_t barrier_mutex; - smx_cond_t barrier_cond; + smpi_mpi_communicator_simdata_t simdata; }; typedef struct smpi_mpi_communicator_t smpi_mpi_communicator_t; typedef smpi_mpi_communicator_t *MPI_Comm; @@ -46,6 +43,7 @@ typedef struct smpi_mpi_datatype_t smpi_mpi_datatype_t; typedef smpi_mpi_datatype_t *MPI_Datatype; // MPI_Request +typedef struct smpi_mpi_request_simdata *smpi_mpi_request_simdata_t; struct smpi_mpi_request_t { smpi_mpi_communicator_t *comm; int src; @@ -57,8 +55,8 @@ struct smpi_mpi_request_t { int count; short int completed :1; - smx_mutex_t mutex; - smx_cond_t cond; + + smpi_mpi_request_simdata_t simdata; }; typedef struct smpi_mpi_request_t smpi_mpi_request_t; typedef smpi_mpi_request_t *MPI_Request; @@ -114,3 +112,5 @@ XBT_IMPORT_NO_EXPORT(int) smpi_simulated_main(int argc, char **argv); unsigned int smpi_sleep(unsigned int); void smpi_exit(int); int smpi_gettimeofday(struct timeval *tv, struct timezone *tz); + +#endif diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index ad53360abb..84d9ff2dd9 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -30,11 +30,6 @@ int inline smpi_mpi_comm_rank_self(smpi_mpi_communicator_t *comm) return smpi_mpi_comm_rank(comm, SIMIX_host_self()); } -//int smpi_mpi_comm_world_rank_self() -//{ -// return smpi_mpi_comm_rank(smpi_mpi_global->mpi_comm_world, SIMIX_host_self()); -//} - int smpi_sender(int argc, char **argv) { smx_process_t self; @@ -51,7 +46,7 @@ int smpi_sender(int argc, char **argv) smx_host_t dhost; - smx_action_t communicate_action; + smx_action_t action; smpi_received_message_t *message; @@ -96,10 +91,10 @@ int smpi_sender(int argc, char **argv) SIMIX_process_suspend(self); } else { - SIMIX_mutex_lock(request->mutex); - - // copy request to appropriate received queue message = xbt_mallocator_get(smpi_global->message_mallocator); + + SIMIX_mutex_lock(request->simdata->mutex); + message->comm = request->comm; message->src = request->src; message->dst = request->dst; @@ -116,18 +111,16 @@ int smpi_sender(int argc, char **argv) request->completed = 1; - communicate_action = SIMIX_action_communicate(shost, dhost, - NULL, request->datatype->size * request->count * 1.0, -1.0); + action = SIMIX_action_communicate(shost, dhost, NULL, request->datatype->size * request->count * 1.0, -1.0); + + SIMIX_register_action_to_condition(action, request->simdata->cond); - SIMIX_register_action_to_condition(communicate_action, request->cond); - SIMIX_cond_wait(request->cond, request->mutex); - //SIMIX_unregister_action_to_condition(communicate_action, request->cond); + SIMIX_cond_wait(request->simdata->cond, request->simdata->mutex); - SIMIX_mutex_unlock(request->mutex); + SIMIX_mutex_unlock(request->simdata->mutex); // wake up receiver if necessary receiver_process = smpi_global->receiver_processes[drank]; - if (SIMIX_process_is_suspended(receiver_process)) { SIMIX_process_resume(receiver_process); } @@ -232,14 +225,14 @@ stopsearch: if (NULL == request || NULL == message) { SIMIX_process_suspend(self); } else { - SIMIX_mutex_lock(request->mutex); + SIMIX_mutex_lock(request->simdata->mutex); memcpy(request->buf, message->buf, request->datatype->size * request->count); request->src = message->src; request->completed = 1; - SIMIX_cond_broadcast(request->cond); + SIMIX_cond_broadcast(request->simdata->cond); - SIMIX_mutex_unlock(request->mutex); + SIMIX_mutex_unlock(request->simdata->mutex); xbt_free(message->buf); xbt_mallocator_release(smpi_global->message_mallocator, message); @@ -268,8 +261,9 @@ void *smpi_request_new() smpi_mpi_request_t *request = xbt_new(smpi_mpi_request_t, 1); request->completed = 0; - request->mutex = SIMIX_mutex_init(); - request->cond = SIMIX_cond_init(); + request->simdata = xbt_new(s_smpi_mpi_request_simdata_t, 1); + request->simdata->mutex = SIMIX_mutex_init(); + request->simdata->cond = SIMIX_cond_init(); return request; } @@ -280,8 +274,9 @@ void smpi_request_free(void *pointer) smpi_mpi_request_t *request = pointer; if (NULL != request) { - SIMIX_cond_destroy(request->cond); - SIMIX_mutex_destroy(request->mutex); + SIMIX_cond_destroy(request->simdata->cond); + SIMIX_mutex_destroy(request->simdata->mutex); + xbt_free(request->simdata); xbt_free(request); } @@ -510,14 +505,15 @@ void smpi_mpi_init() smpi_mpi_global = xbt_new(s_SMPI_MPI_Global_t, 1); // global communicator - smpi_mpi_global->mpi_comm_world = xbt_new(smpi_mpi_communicator_t, 1); - smpi_mpi_global->mpi_comm_world->size = size; - smpi_mpi_global->mpi_comm_world->barrier_count = 0; - smpi_mpi_global->mpi_comm_world->barrier_mutex = SIMIX_mutex_init(); - smpi_mpi_global->mpi_comm_world->barrier_cond = SIMIX_cond_init(); - smpi_mpi_global->mpi_comm_world->hosts = hosts; - smpi_mpi_global->mpi_comm_world->processes = xbt_new(smx_process_t, size); - smpi_mpi_global->mpi_comm_world->processes[0] = process; + smpi_mpi_global->mpi_comm_world = xbt_new(smpi_mpi_communicator_t, 1); + smpi_mpi_global->mpi_comm_world->size = size; + smpi_mpi_global->mpi_comm_world->simdata = xbt_new(s_smpi_mpi_communicator_simdata_t, 1); + smpi_mpi_global->mpi_comm_world->simdata->barrier_count = 0; + smpi_mpi_global->mpi_comm_world->simdata->barrier_mutex = SIMIX_mutex_init(); + smpi_mpi_global->mpi_comm_world->simdata->barrier_cond = SIMIX_cond_init(); + smpi_mpi_global->mpi_comm_world->simdata->hosts = hosts; + smpi_mpi_global->mpi_comm_world->simdata->processes = xbt_new(smx_process_t, size); + smpi_mpi_global->mpi_comm_world->simdata->processes[0] = process; // mpi datatypes smpi_mpi_global->mpi_byte = xbt_new(smpi_mpi_datatype_t, 1); @@ -657,14 +653,14 @@ void smpi_bench_end() void smpi_barrier(smpi_mpi_communicator_t *comm) { - SIMIX_mutex_lock(comm->barrier_mutex); - if(++comm->barrier_count < comm->size) { - SIMIX_cond_wait(comm->barrier_cond, comm->barrier_mutex); + SIMIX_mutex_lock(comm->simdata->barrier_mutex); + if(++comm->simdata->barrier_count < comm->size) { + SIMIX_cond_wait(comm->simdata->barrier_cond, comm->simdata->barrier_mutex); } else { - comm->barrier_count = 0; - SIMIX_cond_broadcast(comm->barrier_cond); + comm->simdata->barrier_count = 0; + SIMIX_cond_broadcast(comm->simdata->barrier_cond); } - SIMIX_mutex_unlock(comm->barrier_mutex); + SIMIX_mutex_unlock(comm->simdata->barrier_mutex); return; } @@ -751,14 +747,14 @@ int smpi_irecv(smpi_mpi_request_t *request) void smpi_wait(smpi_mpi_request_t *request, smpi_mpi_status_t *status) { if (NULL != request) { - SIMIX_mutex_lock(request->mutex); + SIMIX_mutex_lock(request->simdata->mutex); if (!request->completed) { - SIMIX_cond_wait(request->cond, request->mutex); + SIMIX_cond_wait(request->simdata->cond, request->simdata->mutex); } if (NULL != status) { status->MPI_SOURCE = request->src; } - SIMIX_mutex_unlock(request->mutex); + SIMIX_mutex_unlock(request->simdata->mutex); } }