X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/90fed84c000f36c96f8bc38befc3a3b1e8cfc6ab..22597ce66d246bfecc64c1885ca6ebcf3e0cb7f6:/src/smpi/smpi_base.c diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 614067d45c..b545e49192 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -68,7 +68,7 @@ typedef struct s_smpi_factor { } s_smpi_factor_t; xbt_dynar_t smpi_os_values = NULL; xbt_dynar_t smpi_or_values = NULL; - +xbt_dynar_t smpi_ois_values = NULL; // Methods used to parse and store the values for timing injections in smpi // These are taken from surf/network.c and generalized to have more factors @@ -139,6 +139,28 @@ static double smpi_os(double size) return current; } +static double smpi_ois(double size) +{ + if (!smpi_ois_values) + smpi_ois_values = + parse_factor(sg_cfg_get_string("smpi/ois")); + + unsigned int iter = 0; + s_smpi_factor_t fact; + double current=0.0; + xbt_dynar_foreach(smpi_ois_values, iter, fact) { + if (size <= fact.factor) { + XBT_DEBUG("ois : %lf <= %ld return %f", size, fact.factor, current); + return current; + }else{ + current=fact.values[0]+fact.values[1]*size; + } + } + XBT_DEBUG("ois : %lf > %ld return %f", size, fact.factor, current); + + return current; +} + static double smpi_or(double size) { if (!smpi_or_values) @@ -266,6 +288,16 @@ MPI_Request smpi_mpi_send_init(void *buf, int count, MPI_Datatype datatype, return request; } +MPI_Request smpi_mpi_ssend_init(void *buf, int count, MPI_Datatype datatype, + int dst, int tag, MPI_Comm comm) +{ + MPI_Request request = + build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + comm, PERSISTENT | SSEND | SEND); + request->refcount++; + return request; +} + MPI_Request smpi_mpi_recv_init(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm) { @@ -293,10 +325,11 @@ void smpi_mpi_start(MPI_Request request) smpi_datatype_use(request->old_type); request->action = simcall_comm_irecv(mailbox, request->buf, &request->real_size, &match_recv, request); - double sleeptime = smpi_or(request->size); + //integrate pseudo-timing for buffering of small messages, do not bother to execute the simcall if 0 + double sleeptime = request->detached ? smpi_or(request->size) : 0.0; if(sleeptime!=0.0){ simcall_process_sleep(sleeptime); - XBT_DEBUG("receiving size of %ld : sleep %lf ", request->size, smpi_or(request->size)); + XBT_DEBUG("receiving size of %zu : sleep %lf ", request->size, smpi_or(request->size)); } } else { @@ -313,7 +346,7 @@ void smpi_mpi_start(MPI_Request request) XBT_DEBUG("Send request %p is not in the permanent receive mailbox (buf: %p)",request,request->buf); mailbox = smpi_process_remote_mailbox(receiver); } - if (request->size < 64*1024 ) { //(FIXME: this limit should be configurable) + if ( (! (request->flags & SSEND)) && (request->size < sg_cfg_get_int("smpi/send_is_detached_thres"))) { void *oldbuf = NULL; request->detached = 1; request->refcount++; @@ -329,11 +362,19 @@ void smpi_mpi_start(MPI_Request request) // we make a copy here, as the size is modified by simix, and we may reuse the request in another receive later request->real_size=request->size; smpi_datatype_use(request->old_type); - double sleeptime = smpi_os(request->size); + + //if we are giving back the control to the user without waiting for completion, we have to inject timings + double sleeptime =0.0; + if(request->detached || (request->flags & (ISEND|SSEND))){// issend should be treated as isend + //isend and send timings may be different + sleeptime = (request->flags & ISEND)? smpi_ois(request->size) : smpi_os(request->size); + } + if(sleeptime!=0.0){ simcall_process_sleep(sleeptime); - XBT_DEBUG("sending size of %ld : sleep %lf ", request->size, smpi_os(request->size)); + XBT_DEBUG("sending size of %zu : sleep %lf ", request->size, smpi_os(request->size)); } + request->action = simcall_comm_isend(mailbox, request->size, -1.0, request->buf, request->real_size, @@ -393,12 +434,24 @@ MPI_Request smpi_mpi_isend(void *buf, int count, MPI_Datatype datatype, { MPI_Request request = build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, - comm, NON_PERSISTENT | SEND); + comm, NON_PERSISTENT | ISEND | SEND); smpi_mpi_start(request); return request; } +MPI_Request smpi_mpi_issend(void *buf, int count, MPI_Datatype datatype, + int dst, int tag, MPI_Comm comm) +{ + MPI_Request request = + build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + comm, NON_PERSISTENT | ISEND | SSEND | SEND); + smpi_mpi_start(request); + return request; +} + + + MPI_Request smpi_irecv_init(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm) { @@ -432,12 +485,22 @@ void smpi_mpi_recv(void *buf, int count, MPI_Datatype datatype, int src, void smpi_mpi_send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request; - request = smpi_mpi_isend(buf, count, datatype, dst, tag, comm); + MPI_Request request = + build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag, + comm, NON_PERSISTENT | SEND); + + smpi_mpi_start(request); smpi_mpi_wait(&request, MPI_STATUS_IGNORE); } +void smpi_mpi_ssend(void *buf, int count, MPI_Datatype datatype, + int dst, int tag, MPI_Comm comm) +{ + MPI_Request request = smpi_mpi_issend(buf, count, datatype, dst, tag, comm); + smpi_mpi_wait(&request, MPI_STATUS_IGNORE); +} + void smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dst, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int src, int recvtag, @@ -454,7 +517,7 @@ void smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, smpi_mpi_waitall(2, requests, stats); if(status != MPI_STATUS_IGNORE) { // Copy receive status - memcpy(status, &stats[1], sizeof(MPI_Status)); + *status = stats[1]; } } @@ -579,7 +642,7 @@ int smpi_mpi_testall(int count, MPI_Request requests[], smpi_empty_status(pstat); } if(status != MPI_STATUSES_IGNORE) { - memcpy(&status[i], pstat, sizeof(*pstat)); + status[i] = *pstat; } } return flag; @@ -723,10 +786,10 @@ int smpi_mpi_waitall(int count, MPI_Request requests[], if(index == MPI_UNDEFINED) { break; } - if(status != MPI_STATUSES_IGNORE) { - memcpy(&status[index], pstat, sizeof(*pstat)); - if(status[index].MPI_ERROR==MPI_ERR_TRUNCATE)retvalue=MPI_ERR_IN_STATUS; - + if (status != MPI_STATUSES_IGNORE) { + status[index] = *pstat; + if (status[index].MPI_ERROR == MPI_ERR_TRUNCATE) + retvalue = MPI_ERR_IN_STATUS; } } } @@ -749,7 +812,7 @@ int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, indices[count] = index; count++; if(status != MPI_STATUSES_IGNORE) { - memcpy(&status[index], pstat, sizeof(*pstat)); + status[index] = *pstat; } }else{ return MPI_UNDEFINED; @@ -773,7 +836,7 @@ int smpi_mpi_testsome(int incount, MPI_Request requests[], int *indices, indices[count] = i; count++; if(status != MPI_STATUSES_IGNORE) { - memcpy(&status[i], pstat, sizeof(*pstat)); + status[i] = *pstat; } } }else{