X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f3ae712a1b95294052b6e8136d0f0f2d4b30e6eb..6235ffa5e7a5c3157228910d606b62971c57c1c5:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index b42f6a623f..4a9a8d22dd 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -1,3 +1,4 @@ + /* Copyright (c) 2007-2014. The SimGrid Team. * All rights reserved. */ @@ -164,8 +165,9 @@ int PMPI_Get_address(void *location, MPI_Aint * address) int PMPI_Type_free(MPI_Datatype * datatype) { int retval = 0; - - if (!datatype) { + /* Free a predefined datatype is an error according to the standard, and + should be checked for */ + if (*datatype == MPI_DATATYPE_NULL) { retval = MPI_ERR_ARG; } else { smpi_datatype_free(datatype); @@ -858,14 +860,16 @@ int PMPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst, smpi_bench_end(); if (request == NULL) { - retval = MPI_ERR_ARG; + retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { - retval = MPI_ERR_COMM; + retval = MPI_ERR_COMM; + } else if (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if (dst == MPI_PROC_NULL) { - retval = MPI_SUCCESS; + retval = MPI_SUCCESS; } else { - *request = smpi_mpi_send_init(buf, count, datatype, dst, tag, comm); - retval = MPI_SUCCESS; + *request = smpi_mpi_send_init(buf, count, datatype, dst, tag, comm); + retval = MPI_SUCCESS; } smpi_bench_begin(); if (retval != MPI_SUCCESS && request) @@ -883,6 +887,8 @@ int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src, retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; + } else if (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if (src == MPI_PROC_NULL) { retval = MPI_SUCCESS; } else { @@ -905,6 +911,8 @@ int PMPI_Ssend_init(void* buf, int count, MPI_Datatype datatype, retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; + } else if (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if (dst == MPI_PROC_NULL) { retval = MPI_SUCCESS; } else { @@ -923,7 +931,7 @@ int PMPI_Start(MPI_Request * request) smpi_bench_end(); if (request == NULL || *request == MPI_REQUEST_NULL) { - retval = MPI_ERR_ARG; + retval = MPI_ERR_REQUEST; } else { smpi_mpi_start(*request); retval = MPI_SUCCESS; @@ -934,14 +942,21 @@ int PMPI_Start(MPI_Request * request) int PMPI_Startall(int count, MPI_Request * requests) { - int retval = 0; - + int retval; + int i = 0; smpi_bench_end(); if (requests == NULL) { retval = MPI_ERR_ARG; } else { - smpi_mpi_startall(count, requests); retval = MPI_SUCCESS; + for (i = 0 ; i < count ; i++) { + if(requests[i] == MPI_REQUEST_NULL) { + retval = MPI_ERR_REQUEST; + } + } + if(retval != MPI_ERR_REQUEST) { + smpi_mpi_startall(count, requests); + } } smpi_bench_begin(); return retval; @@ -982,8 +997,8 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, 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 (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; } else { @@ -1036,8 +1051,8 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, 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 (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; } else { @@ -1090,8 +1105,8 @@ int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, 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 (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; } else { @@ -1142,8 +1157,8 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, 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 (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; } else { @@ -1193,8 +1208,8 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, 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 (!is_datatype_valid(datatype)) { + retval = MPI_ERR_TYPE; } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; } else { @@ -1241,7 +1256,7 @@ int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MP retval = MPI_ERR_COUNT; } else if (buf==NULL && count > 0) { retval = MPI_ERR_COUNT; - } else if (datatype == MPI_DATATYPE_NULL){ + } else if (!is_datatype_valid(datatype)){ retval = MPI_ERR_TYPE; } else if(tag<0 && tag != MPI_ANY_TAG){ retval = MPI_ERR_TAG; @@ -1282,8 +1297,8 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (sendtype == MPI_DATATYPE_NULL - || recvtype == MPI_DATATYPE_NULL) { + } else if (!is_datatype_valid(sendtype) + || !is_datatype_valid(recvtype)) { retval = MPI_ERR_TYPE; } else if (src == MPI_PROC_NULL || dst == MPI_PROC_NULL) { smpi_empty_status(status); @@ -1340,7 +1355,7 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, //TODO: suboptimal implementation void *recvbuf; int retval = 0; - if (datatype == MPI_DATATYPE_NULL) { + if (!is_datatype_valid(datatype)) { retval = MPI_ERR_TYPE; } else if (count < 0) { retval = MPI_ERR_COUNT; @@ -1362,7 +1377,6 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status) { int retval = 0; - smpi_bench_end(); if (request == NULL || flag == NULL) { retval = MPI_ERR_ARG; @@ -1371,7 +1385,19 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status) smpi_empty_status(status); retval = MPI_ERR_REQUEST; } else { +#ifdef HAVE_TRACING + int rank = request && (*request)->comm != MPI_COMM_NULL + ? smpi_process_index() + : -1; + + instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); + extra->type = TRACING_TEST; + TRACE_smpi_testing_in(rank, extra); +#endif *flag = smpi_mpi_test(request, status); +#ifdef HAVE_TRACING + TRACE_smpi_testing_out(rank); +#endif retval = MPI_SUCCESS; } smpi_bench_begin(); @@ -2020,7 +2046,7 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) { + } else if (!is_datatype_valid(datatype) || op == MPI_OP_NULL) { retval = MPI_ERR_ARG; } else { #ifdef HAVE_TRACING @@ -2051,7 +2077,7 @@ int PMPI_Reduce_local(void *inbuf, void *inoutbuf, int count, int retval = 0; smpi_bench_end(); - if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) { + if (!is_datatype_valid(datatype) || op == MPI_OP_NULL) { retval = MPI_ERR_ARG; } else { smpi_op_apply(op, inbuf, inoutbuf, &count, &datatype); @@ -2070,7 +2096,7 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (datatype == MPI_DATATYPE_NULL) { + } else if (!is_datatype_valid(datatype)) { retval = MPI_ERR_TYPE; } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; @@ -2115,7 +2141,7 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (datatype == MPI_DATATYPE_NULL) { + } else if (!is_datatype_valid(datatype)) { retval = MPI_ERR_TYPE; } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; @@ -2148,7 +2174,7 @@ int PMPI_Exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (datatype == MPI_DATATYPE_NULL) { + } else if (!is_datatype_valid(datatype)) { retval = MPI_ERR_TYPE; } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; @@ -2181,7 +2207,7 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (datatype == MPI_DATATYPE_NULL) { + } else if (!is_datatype_valid(datatype)) { retval = MPI_ERR_TYPE; } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; @@ -2228,7 +2254,7 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (datatype == MPI_DATATYPE_NULL) { + } else if (!is_datatype_valid(datatype)) { retval = MPI_ERR_TYPE; } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; @@ -2378,7 +2404,7 @@ int PMPI_Get_count(MPI_Status * status, MPI_Datatype datatype, int *count) if (status == NULL || count == NULL) { retval = MPI_ERR_ARG; - } else if (datatype == MPI_DATATYPE_NULL) { + } else if (!is_datatype_valid(datatype)) { retval = MPI_ERR_TYPE; } else { size = smpi_datatype_size(datatype); @@ -2561,20 +2587,16 @@ int PMPI_Initialized(int* flag) { int PMPI_Cart_create(MPI_Comm comm_old, int ndims, int* dims, int* periodic, int reorder, MPI_Comm* comm_cart) { int retval = 0; - smpi_bench_end(); if (comm_old == MPI_COMM_NULL){ - return MPI_ERR_COMM; - } - else if (ndims < 0 || + retval = MPI_ERR_COMM; + } else if (ndims < 0 || (ndims > 0 && (dims == NULL || periodic == NULL)) || comm_cart == NULL) { - return MPI_ERR_ARG; + retval = MPI_ERR_ARG; + } else{ + retval = smpi_mpi_cart_create(comm_old, ndims, dims, periodic, reorder, comm_cart); } - retval = smpi_mpi_cart_create(comm_old, ndims, dims, periodic, reorder, comm_cart); - - smpi_bench_begin(); - return retval; } @@ -2655,6 +2677,25 @@ int PMPI_Cart_sub(MPI_Comm comm, int* remain_dims, MPI_Comm* comm_new) { return smpi_mpi_cart_sub(comm, remain_dims, comm_new); } +int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){ + if(oldtype == MPI_DATATYPE_NULL) { + return MPI_ERR_TYPE; + } + int blocks[3] = { 1, 1, 1 }; + MPI_Aint disps[3] = { lb, 0, lb+extent }; + MPI_Datatype types[3] = { MPI_LB, oldtype, MPI_UB }; + + s_smpi_mpi_struct_t* subtype = smpi_datatype_struct_create( blocks, + disps, + 3, + types + ); + smpi_datatype_create(newtype,oldtype->size, lb, lb + extent, 1 , subtype, DT_FLAG_VECTOR); + + (*newtype)->flags &= ~DT_FLAG_COMMITED; + return MPI_SUCCESS; +} + /* The following calls are not yet implemented and will fail at runtime. */ /* Once implemented, please move them above this notice. */ @@ -2664,7 +2705,6 @@ int PMPI_Cart_sub(MPI_Comm comm, int* remain_dims, MPI_Comm* comm_new) { return MPI_SUCCESS; \ } - int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){ NOT_YET_IMPLEMENTED } @@ -2948,10 +2988,6 @@ int PMPI_Type_create_darray(int size, int rank, int ndims, int* array_of_gsizes, NOT_YET_IMPLEMENTED } -int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){ - NOT_YET_IMPLEMENTED -} - int PMPI_Type_create_subarray(int ndims,int *array_of_sizes, int *array_of_subsizes, int *array_of_starts, int order, MPI_Datatype oldtype, MPI_Datatype *newtype){ NOT_YET_IMPLEMENTED }