Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove benchmarking calls from cart_create
[simgrid.git] / src / smpi / smpi_pmpi.c
index 367176d..22858c3 100644 (file)
@@ -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 {
@@ -934,12 +942,13 @@ 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 {
+    retval = MPI_SUCCESS;
     for (i = 0 ;  i < count ; i++) {
       if(requests[i] == MPI_REQUEST_NULL) {
         retval = MPI_ERR_REQUEST;
@@ -947,7 +956,6 @@ int PMPI_Startall(int count, MPI_Request * requests)
     }
     if(retval != MPI_ERR_REQUEST) {
       smpi_mpi_startall(count, requests);
-      retval = MPI_SUCCESS;
     }
   }
   smpi_bench_begin();
@@ -989,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 {
@@ -1043,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 {
@@ -1097,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 {
@@ -1149,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 {
@@ -1200,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 {
@@ -1248,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;
@@ -1289,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);
@@ -1347,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;
@@ -2038,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
@@ -2069,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);
@@ -2088,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;
@@ -2133,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;
@@ -2166,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;
@@ -2199,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;
@@ -2246,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;
@@ -2396,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);
@@ -2579,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;
+      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;
   }
   retval = smpi_mpi_cart_create(comm_old, ndims, dims, periodic, reorder, comm_cart);
-
-  smpi_bench_begin();
-
   return retval;
 }
 
@@ -2673,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. */
@@ -2682,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
 }
@@ -2966,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
 }