X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7b5d97a0198ce4ecbe5654a7cfe978bd1880f936..cbc3117c526501483677c834f121499c5c67b753:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index 1e4dc070af..3707670bed 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -862,6 +862,24 @@ int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src, return retval; } +int PMPI_Ssend_init(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request) { + int retval; + + smpi_bench_end(); + if (request == NULL) { + retval = MPI_ERR_ARG; + } else if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else { + *request = smpi_mpi_ssend_init(buf, count, datatype, dst, tag, comm); + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + int PMPI_Start(MPI_Request * request) { int retval; @@ -1001,7 +1019,50 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, return retval; } +int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request) { + int retval; + + smpi_bench_end(); + if (request == NULL) { + retval = MPI_ERR_ARG; + } else if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ + retval = MPI_ERR_COMM; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; + } else { + +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int dst_traced = smpi_group_index(smpi_comm_group(comm), dst); + TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__); + TRACE_smpi_send(rank, rank, dst_traced); +#endif + + *request = smpi_mpi_issend(buf, count, datatype, dst, tag, comm); + retval = MPI_SUCCESS; +#ifdef HAVE_TRACING + TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__); + (*request)->send = 1; + TRACE_smpi_computing_in(rank); +#endif + } + + smpi_bench_begin(); + return retval; +} int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status * status) @@ -1094,6 +1155,50 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, return retval; } + + +int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { + int retval; + + smpi_bench_end(); + + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ + retval = MPI_ERR_COMM; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; + } else { + + #ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int dst_traced = smpi_group_index(smpi_comm_group(comm), dst); + TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__); + TRACE_smpi_send(rank, rank, dst_traced); + #endif + + smpi_mpi_ssend(buf, count, datatype, dst, tag, comm); + retval = MPI_SUCCESS; + + #ifdef HAVE_TRACING + TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__); + TRACE_smpi_computing_in(rank); + #endif + } + + smpi_bench_begin(); + return retval;} + + int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dst, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int src, int recvtag, @@ -1319,30 +1424,15 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta #ifdef HAVE_TRACING //save requests information for tracing int i; - xbt_dynar_t srcs = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t dsts = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t recvs = xbt_dynar_new(sizeof(int), NULL); + int *srcs = xbt_new(int, count); + int *dsts = xbt_new(int, count); + int *recvs = xbt_new(int, count); for (i = 0; i < count; i++) { MPI_Request req = requests[i]; //already received requests are no longer valid if (req) { - int *asrc = xbt_new(int, 1); - int *adst = xbt_new(int, 1); - int *arecv = xbt_new(int, 1); - *asrc = req->src; - *adst = req->dst; - *arecv = req->recv; - xbt_dynar_insert_at(srcs, i, asrc); - xbt_dynar_insert_at(dsts, i, adst); - xbt_dynar_insert_at(recvs, i, arecv); - xbt_free(asrc); - xbt_free(adst); - xbt_free(arecv); - } else { - int *t = xbt_new(int, 1); - xbt_dynar_insert_at(srcs, i, t); - xbt_dynar_insert_at(dsts, i, t); - xbt_dynar_insert_at(recvs, i, t); - xbt_free(t); + srcs[i] = req->src; + dsts[i] = req->dst; + recvs[i] = req->recv; } } int rank_traced = smpi_process_index(); @@ -1359,18 +1449,16 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta } #ifdef HAVE_TRACING if(*index!=MPI_UNDEFINED){ - int src_traced, dst_traced, is_wait_for_receive; - xbt_dynar_get_cpy(srcs, *index, &src_traced); - xbt_dynar_get_cpy(dsts, *index, &dst_traced); - xbt_dynar_get_cpy(recvs, *index, &is_wait_for_receive); + int src_traced = srcs[*index]; + int dst_traced = dsts[*index]; + int is_wait_for_receive = recvs[*index]; if (is_wait_for_receive) { TRACE_smpi_recv(rank_traced, src_traced, dst_traced); } TRACE_smpi_ptp_out(rank_traced, src_traced, dst_traced, __FUNCTION__); - //clean-up of dynars - xbt_dynar_free(&srcs); - xbt_dynar_free(&dsts); - xbt_dynar_free(&recvs); + xbt_free(srcs); + xbt_free(dsts); + xbt_free(recvs); } TRACE_smpi_computing_in(rank_traced); #endif @@ -1385,30 +1473,17 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) #ifdef HAVE_TRACING //save information from requests int i; - xbt_dynar_t srcs = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t dsts = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t recvs = xbt_dynar_new(sizeof(int), NULL); + int *srcs = xbt_new(int, count); + int *dsts = xbt_new(int, count); + int *recvs = xbt_new(int, count); + int valid_count = 0; for (i = 0; i < count; i++) { MPI_Request req = requests[i]; if(req){ - int *asrc = xbt_new(int, 1); - int *adst = xbt_new(int, 1); - int *arecv = xbt_new(int, 1); - *asrc = req->src; - *adst = req->dst; - *arecv = req->recv; - xbt_dynar_insert_at(srcs, i, asrc); - xbt_dynar_insert_at(dsts, i, adst); - xbt_dynar_insert_at(recvs, i, arecv); - xbt_free(asrc); - xbt_free(adst); - xbt_free(arecv); - }else { - int *t = xbt_new(int, 1); - xbt_dynar_insert_at(srcs, i, t); - xbt_dynar_insert_at(dsts, i, t); - xbt_dynar_insert_at(recvs, i, t); - xbt_free(t); + srcs[valid_count] = req->src; + dsts[valid_count] = req->dst; + recvs[valid_count] = req->recv; + valid_count++; } } int rank_traced = smpi_process_index(); @@ -1418,20 +1493,18 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) #endif int retval = smpi_mpi_waitall(count, requests, status); #ifdef HAVE_TRACING - for (i = 0; i < count; i++) { - int src_traced, dst_traced, is_wait_for_receive; - xbt_dynar_get_cpy(srcs, i, &src_traced); - xbt_dynar_get_cpy(dsts, i, &dst_traced); - xbt_dynar_get_cpy(recvs, i, &is_wait_for_receive); + for (i = 0; i < valid_count; i++) { + int src_traced = srcs[i]; + int dst_traced = dsts[i]; + int is_wait_for_receive = recvs[i]; if (is_wait_for_receive) { TRACE_smpi_recv(rank_traced, src_traced, dst_traced); } } TRACE_smpi_ptp_out(rank_traced, -1, -1, __FUNCTION__); - //clean-up of dynars - xbt_dynar_free(&srcs); - xbt_dynar_free(&dsts); - xbt_dynar_free(&recvs); + xbt_free(srcs); + xbt_free(dsts); + xbt_free(recvs); TRACE_smpi_computing_in(rank_traced); #endif smpi_bench_begin(); @@ -2200,13 +2273,7 @@ int PMPI_Unpack(void* inbuf, int insize, int* position, void* outbuf, int outcou return not_yet_implemented(); } -int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) { - return not_yet_implemented(); -} -int PMPI_Ssend_init(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request) { - return not_yet_implemented(); -} int PMPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm, int remote_leader, int tag, MPI_Comm* comm_out) { return not_yet_implemented(); @@ -2236,11 +2303,6 @@ int PMPI_Comm_remote_size(MPI_Comm comm, int* size) { return not_yet_implemented(); } -int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request) { - return not_yet_implemented(); -} - - int PMPI_Attr_delete(MPI_Comm comm, int keyval) { return not_yet_implemented(); }