Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
trace MPI_Init and MPI_Finalize as well
[simgrid.git] / src / smpi / smpi_pmpi.c
index bcbe9b9..7f06648 100644 (file)
@@ -31,8 +31,9 @@ int PMPI_Init(int *argc, char ***argv)
 #ifdef HAVE_TRACING
   int rank = smpi_process_index();
   TRACE_smpi_init(rank);
-
   TRACE_smpi_computing_init(rank);
+  TRACE_smpi_collective_in(rank, -1, __FUNCTION__,0);
+  TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
   smpi_bench_begin();
   return MPI_SUCCESS;
@@ -40,11 +41,14 @@ int PMPI_Init(int *argc, char ***argv)
 
 int PMPI_Finalize(void)
 {
-  smpi_process_finalize();
   smpi_bench_end();
 #ifdef HAVE_TRACING
   int rank = smpi_process_index();
-  TRACE_smpi_computing_out(rank);
+  TRACE_smpi_collective_in(rank, -1, __FUNCTION__,0);
+#endif
+  smpi_process_finalize();
+#ifdef HAVE_TRACING
+  TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
   TRACE_smpi_finalize(smpi_process_index());
 #endif
   smpi_process_destroy();
@@ -115,10 +119,6 @@ int PMPI_Abort(MPI_Comm comm, int errorcode)
 {
   smpi_bench_end();
   smpi_process_destroy();
-#ifdef HAVE_TRACING
-  int rank = smpi_process_index();
-  TRACE_smpi_computing_out(rank);
-#endif
   // FIXME: should kill all processes in comm instead
   simcall_process_kill(SIMIX_process_self());
   return MPI_SUCCESS;
@@ -127,7 +127,13 @@ int PMPI_Abort(MPI_Comm comm, int errorcode)
 double PMPI_Wtime(void)
 {
   double time;
-  time = SIMIX_get_clock();
+  if (smpi_process_initialized() && !smpi_process_finalized() && !smpi_sample_is_running) {
+    smpi_bench_end();
+    time = SIMIX_get_clock();
+    smpi_bench_begin();
+  } else {
+    time = SIMIX_get_clock();
+  }
   return time;
 }
 
@@ -907,7 +913,7 @@ int PMPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm* comm_out)
 }
 
 int PMPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst,
-                  int tag, MPI_Comm comm, MPI_Request * request)
+                   int tag, MPI_Comm comm, MPI_Request * request)
 {
   int retval = 0;
 
@@ -923,12 +929,13 @@ int PMPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst,
     retval = MPI_SUCCESS;
   }
   smpi_bench_begin();
-  if(retval!=MPI_SUCCESS)*request=MPI_REQUEST_NULL;
+  if (retval != MPI_SUCCESS && request)
+    *request = MPI_REQUEST_NULL;
   return retval;
 }
 
 int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src,
-                  int tag, MPI_Comm comm, MPI_Request * request)
+                   int tag, MPI_Comm comm, MPI_Request * request)
 {
   int retval = 0;
 
@@ -938,33 +945,37 @@ int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src,
   } else if (comm == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else if (src == MPI_PROC_NULL) {
-      retval = MPI_SUCCESS;
+    retval = MPI_SUCCESS;
   } else {
     *request = smpi_mpi_recv_init(buf, count, datatype, src, tag, comm);
     retval = MPI_SUCCESS;
   }
   smpi_bench_begin();
-  if(retval!=MPI_SUCCESS)*request=MPI_REQUEST_NULL;
+  if (retval != MPI_SUCCESS && request)
+    *request = MPI_REQUEST_NULL;
   return retval;
 }
 
-int PMPI_Ssend_init(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request) {
+int PMPI_Ssend_init(void* buf, int count, MPI_Datatype datatype,
+                    int dst, int tag, MPI_Comm comm, MPI_Request* request)
+{
   int retval = 0;
 
-    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();
-    if(retval!=MPI_SUCCESS)*request=MPI_REQUEST_NULL;
-    return 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();
+  if (retval != MPI_SUCCESS && request)
+    *request = MPI_REQUEST_NULL;
+  return retval;
 }
 
 int PMPI_Start(MPI_Request * request)
@@ -1014,7 +1025,7 @@ int PMPI_Request_free(MPI_Request * request)
 }
 
 int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src,
-              int tag, MPI_Comm comm, MPI_Request * request)
+               int tag, MPI_Comm comm, MPI_Request * request)
 {
   int retval = 0;
 
@@ -1040,28 +1051,29 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src,
   } else {
 
 #ifdef HAVE_TRACING
-  int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  int src_traced = smpi_group_index(smpi_comm_group(comm), src);
-  TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, count*smpi_datatype_size(datatype));
+    int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
+    int src_traced = smpi_group_index(smpi_comm_group(comm), src);
+    TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, count*smpi_datatype_size(datatype));
 #endif
 
     *request = smpi_mpi_irecv(buf, count, datatype, src, tag, comm);
     retval = MPI_SUCCESS;
 
 #ifdef HAVE_TRACING
-  TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__);
-  (*request)->recv = 1;
+    TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__);
+    (*request)->recv = 1;
 #endif
   }
 
   smpi_bench_begin();
-  if(retval!=MPI_SUCCESS)*request=MPI_REQUEST_NULL;
+  if (retval != MPI_SUCCESS && request)
+    *request = MPI_REQUEST_NULL;
   return retval;
 }
 
 
 int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst,
-              int tag, MPI_Comm comm, MPI_Request * request)
+               int tag, MPI_Comm comm, MPI_Request * request)
 {
   int retval = 0;
 
@@ -1086,29 +1098,30 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst,
   } 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__, count*smpi_datatype_size(datatype));
-  TRACE_smpi_send(rank, rank, dst_traced, count*smpi_datatype_size(datatype));
+    int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
+    int dst_traced = smpi_group_index(smpi_comm_group(comm), dst);
+    TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__, count*smpi_datatype_size(datatype));
+    TRACE_smpi_send(rank, rank, dst_traced, count*smpi_datatype_size(datatype));
 #endif
 
     *request = smpi_mpi_isend(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);
+    TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__);
+    (*request)->send = 1;
 #endif
   }
 
   smpi_bench_begin();
-  if(retval!=MPI_SUCCESS)*request=MPI_REQUEST_NULL;
+  if (retval != MPI_SUCCESS && request)
+    *request = MPI_REQUEST_NULL;
   return retval;
 }
 
-int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request) {
+int PMPI_Issend(void* buf, int count, MPI_Datatype datatype,
+                int dst, int tag, MPI_Comm comm, MPI_Request* request)
+{
   int retval = 0;
 
   smpi_bench_end();
@@ -1132,25 +1145,24 @@ int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, M
   } 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__, count*smpi_datatype_size(datatype));
-  TRACE_smpi_send(rank, rank, dst_traced, count*smpi_datatype_size(datatype));
+    int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
+    int dst_traced = smpi_group_index(smpi_comm_group(comm), dst);
+    TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__, count*smpi_datatype_size(datatype));
+    TRACE_smpi_send(rank, rank, dst_traced, count*smpi_datatype_size(datatype));
 #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);
+    TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__);
+    (*request)->send = 1;
 #endif
   }
 
   smpi_bench_begin();
-  if(retval!=MPI_SUCCESS)*request=MPI_REQUEST_NULL;
+  if (retval != MPI_SUCCESS && request)
+    *request = MPI_REQUEST_NULL;
   return retval;
 }
 
@@ -1180,7 +1192,6 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag,
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
   int src_traced = smpi_group_index(smpi_comm_group(comm), src);
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, count*smpi_datatype_size(datatype));
 #endif
 
@@ -1192,7 +1203,6 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag,
   if(status!=MPI_STATUS_IGNORE)src_traced = smpi_group_index(smpi_comm_group(comm), status->MPI_SOURCE);
   TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__);
   TRACE_smpi_recv(rank, src_traced, rank);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1225,7 +1235,6 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag,
 
 #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__, count*smpi_datatype_size(datatype));
   TRACE_smpi_send(rank, rank, dst_traced,count*smpi_datatype_size(datatype));
@@ -1236,7 +1245,6 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag,
 
 #ifdef HAVE_TRACING
   TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1269,7 +1277,6 @@ int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MP
 
  #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__, count*smpi_datatype_size(datatype));
    TRACE_smpi_send(rank, rank, dst_traced,count*smpi_datatype_size(datatype));
@@ -1280,7 +1287,6 @@ int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MP
 
  #ifdef HAVE_TRACING
    TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__);
-   TRACE_smpi_computing_in(rank);
  #endif
    }
 
@@ -1319,7 +1325,6 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 
 #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);
   int src_traced = smpi_group_index(smpi_comm_group(comm), src);
   TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__, sendcount*smpi_datatype_size(sendtype));
@@ -1334,7 +1339,6 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 #ifdef HAVE_TRACING
   TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__);
   TRACE_smpi_recv(rank, src_traced, rank);
-  TRACE_smpi_computing_in(rank);
 #endif
 
   }
@@ -1374,10 +1378,11 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status)
   int retval = 0;
 
   smpi_bench_end();
-  if (request == MPI_REQUEST_NULL || flag == NULL) {
+  if (request == NULL || flag == NULL) {
     retval = MPI_ERR_ARG;
   } else if (*request == MPI_REQUEST_NULL) {
     *flag= TRUE;
+    smpi_empty_status(status);
     retval = MPI_ERR_REQUEST;
   } else {
     *flag = smpi_mpi_test(request, status);
@@ -1468,6 +1473,8 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status)
 
   smpi_bench_end();
 
+  smpi_empty_status(status);
+
   if (request == NULL) {
     retval = MPI_ERR_ARG;
   } else if (*request == MPI_REQUEST_NULL) {
@@ -1475,32 +1482,30 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status)
   } else {
 
 #ifdef HAVE_TRACING
-  int rank = request && (*request)->comm != MPI_COMM_NULL
+    int rank = request && (*request)->comm != MPI_COMM_NULL
       ? smpi_process_index()
       : -1;
-  TRACE_smpi_computing_out(rank);
 
-  int src_traced = (*request)->src;
-  int dst_traced = (*request)->dst;
-  MPI_Comm comm = (*request)->comm;
-  int is_wait_for_receive = (*request)->recv;
-  TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__,-1);
+    int src_traced = (*request)->src;
+    int dst_traced = (*request)->dst;
+    MPI_Comm comm = (*request)->comm;
+    int is_wait_for_receive = (*request)->recv;
+    TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__,-1);
 #endif
 
     smpi_mpi_wait(request, status);
     retval = MPI_SUCCESS;
 
 #ifdef HAVE_TRACING
-  //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE)
-  TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__);
-  if (is_wait_for_receive) {
-    if(src_traced==MPI_ANY_SOURCE)
-    src_traced = (status!=MPI_STATUS_IGNORE) ?
-                                smpi_group_rank(smpi_comm_group(comm), status->MPI_SOURCE) :
-                                src_traced;
-    TRACE_smpi_recv(rank, src_traced, dst_traced);
-  }
-  TRACE_smpi_computing_in(rank);
+    //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE)
+    TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__);
+    if (is_wait_for_receive) {
+      if(src_traced==MPI_ANY_SOURCE)
+        src_traced = (status!=MPI_STATUS_IGNORE) ?
+          smpi_group_rank(smpi_comm_group(comm), status->MPI_SOURCE) :
+          src_traced;
+      TRACE_smpi_recv(rank, src_traced, dst_traced);
+    }
 #endif
 
   }
@@ -1532,7 +1537,6 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta
     }
   }
   int rank_traced = smpi_process_index();
-  TRACE_smpi_computing_out(rank_traced);
 
   TRACE_smpi_ptp_in(rank_traced, -1, -1, __FUNCTION__,count);
 
@@ -1563,7 +1567,6 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta
     xbt_free(comms);
 
   }
-  TRACE_smpi_computing_in(rank_traced);
 #endif
   smpi_bench_begin();
   return retval;
@@ -1596,7 +1599,6 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
     }
   }
   int rank_traced = smpi_process_index();
-  TRACE_smpi_computing_out(rank_traced);
 
   TRACE_smpi_ptp_in(rank_traced, -1, -1, __FUNCTION__,count);
 #endif
@@ -1625,7 +1627,6 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
   xbt_free(valid);
   xbt_free(comms);
 
-  TRACE_smpi_computing_in(rank_traced);
 #endif
   smpi_bench_begin();
   return retval;
@@ -1675,7 +1676,6 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int root_traced = smpi_group_index(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__, count*smpi_datatype_size(datatype));
 #endif
@@ -1683,7 +1683,6 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1702,14 +1701,12 @@ int PMPI_Barrier(MPI_Comm comm)
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, smpi_comm_size(comm));
 #endif
     mpi_coll_barrier_fun(comm);
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1744,7 +1741,6 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     }
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int root_traced = smpi_group_index(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(sendtmptype));
 #endif
@@ -1755,7 +1751,6 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1791,7 +1786,6 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int root_traced = smpi_group_index(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(sendtmptype));
 #endif
@@ -1800,7 +1794,6 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1832,7 +1825,6 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     }
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__,sendcount*smpi_datatype_size(sendtype));
 #endif
     mpi_coll_allgather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount,
@@ -1873,7 +1865,6 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     }
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__,sendcount*smpi_datatype_size(sendtype));
 #endif
     mpi_coll_allgatherv_fun(sendbuf, sendcount, sendtype, recvbuf, recvcounts,
@@ -1881,7 +1872,6 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1910,7 +1900,6 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     }
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int root_traced = smpi_group_index(smpi_comm_group(comm), root);
 
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(recvtype));
@@ -1920,7 +1909,6 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1950,7 +1938,6 @@ int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs,
     }
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int root_traced = smpi_group_index(smpi_comm_group(comm), root);
   int count=0, i;
   for(i=0; i<smpi_comm_size(comm);i++)count+=sendcounts[i];
@@ -1961,7 +1948,6 @@ int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -1983,7 +1969,6 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count,
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int root_traced = smpi_group_index(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__, count*smpi_datatype_size(datatype));
 #endif
@@ -1992,7 +1977,6 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2037,7 +2021,6 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count,
     }
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, count*smpi_datatype_size(datatype));
 #endif
     mpi_coll_allreduce_fun(sendtmpbuf, recvbuf, count, datatype, op, comm);
@@ -2049,7 +2032,6 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2073,14 +2055,12 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count,
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, count*smpi_datatype_size(datatype));
 #endif
     smpi_mpi_scan(sendbuf, recvbuf, count, datatype, op, comm);
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2103,14 +2083,12 @@ int PMPI_Exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, count*smpi_datatype_size(datatype));
 #endif
     smpi_mpi_exscan(sendbuf, recvbuf, count, datatype, op, comm);
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2135,7 +2113,6 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int count=0, i;
   for(i=0; i<smpi_comm_size(comm);i++)count+=recvcounts[i];
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, count*smpi_datatype_size(datatype));
@@ -2150,7 +2127,6 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2175,7 +2151,6 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount,
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, recvcount*smpi_comm_size(comm)*smpi_datatype_size(datatype));
 #endif
     int count=smpi_comm_size(comm);
@@ -2187,7 +2162,6 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount,
     retval = MPI_SUCCESS;
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2211,13 +2185,11 @@ int PMPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, sendcount*smpi_datatype_size(sendtype));
 #endif
     retval = mpi_coll_alltoall_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2244,7 +2216,6 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps,
   } else {
 #ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
-  TRACE_smpi_computing_out(rank);
   int i, size=0;
   for(i=0; i< smpi_comm_size(comm);i++)size+=sendcounts[i];
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__, size*smpi_datatype_size(sendtype));
@@ -2255,7 +2226,6 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps,
                                   comm);
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  TRACE_smpi_computing_in(rank);
 #endif
   }
 
@@ -2324,7 +2294,7 @@ int PMPI_Type_commit(MPI_Datatype* datatype) {
   int retval = 0;
 
   smpi_bench_end();
-  if (datatype == MPI_DATATYPE_NULL) {
+  if (datatype == NULL || *datatype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else {
     smpi_datatype_commit(datatype);