Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Kill SMPE: use visualization instead.
[simgrid.git] / src / smpi / smpi_mpi.c
index 39b2926..674a1ed 100644 (file)
@@ -8,6 +8,10 @@
 #include "smpi_coll_private.h"
 #include "smpi_mpi_dt_private.h"
 
+#define MPI_CALL_IMPLEM(type,name,args) \
+   type name args __attribute__((weak,alias("P"#name))); \
+   type P##name args
+
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi,
                                 "Logging specific to SMPI (mpi)");
 
@@ -16,7 +20,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi,
 int TRACE_smpi_set_category(const char *category)
 {
   //need to end bench otherwise categories for execution tasks are wrong
-  smpi_bench_end (-1, NULL);
+  smpi_bench_end();
   int ret;
   if (!IS_TRACING){
     ret = 1;
@@ -31,26 +35,26 @@ int TRACE_smpi_set_category(const char *category)
     }
   }
   //begin bench after changing process's category
-  smpi_bench_begin (-1, NULL);
+  smpi_bench_begin();
   return ret;
 }
 #endif
 
 /* MPI User level calls */
 
-int MPI_Init(int *argc, char ***argv)
+MPI_CALL_IMPLEM(int, MPI_Init, (int *argc, char ***argv))
 {
   smpi_process_init(argc, argv);
 #ifdef HAVE_TRACING
   TRACE_smpi_init(smpi_process_index());
 #endif
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
-int MPI_Finalize(void)
+MPI_CALL_IMPLEM(int, MPI_Finalize, (void))
 {
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
 #ifdef HAVE_TRACING
   TRACE_smpi_finalize(smpi_process_index());
 #endif
@@ -58,7 +62,7 @@ int MPI_Finalize(void)
   return MPI_SUCCESS;
 }
 
-int MPI_Init_thread(int *argc, char ***argv, int required, int *provided)
+MPI_CALL_IMPLEM(int, MPI_Init_thread, (int *argc, char ***argv, int required, int *provided))
 {
   if (provided != NULL) {
     *provided = MPI_THREAD_MULTIPLE;
@@ -66,39 +70,39 @@ int MPI_Init_thread(int *argc, char ***argv, int required, int *provided)
   return MPI_Init(argc, argv);
 }
 
-int MPI_Query_thread(int *provided)
+MPI_CALL_IMPLEM(int, MPI_Query_thread, (int *provided))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (provided == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     *provided = MPI_THREAD_MULTIPLE;
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Is_thread_main(int *flag)
+MPI_CALL_IMPLEM(int, MPI_Is_thread_main, (int *flag))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (flag == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     *flag = smpi_process_index() == 0;
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Abort(MPI_Comm comm, int errorcode)
+MPI_CALL_IMPLEM(int, MPI_Abort, (MPI_Comm comm, int errorcode))
 {
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   smpi_process_destroy();
   // FIXME: should kill all processes in comm instead
   SIMIX_process_kill(SIMIX_process_self());
@@ -109,46 +113,46 @@ double MPI_Wtime(void)
 {
   double time;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   time = SIMIX_get_clock();
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return time;
 }
 
-int MPI_Address(void *location, MPI_Aint * address)
+MPI_CALL_IMPLEM(int, MPI_Address, (void *location, MPI_Aint * address))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (!address) {
     retval = MPI_ERR_ARG;
   } else {
     *address = (MPI_Aint) location;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Type_free(MPI_Datatype * datatype)
+MPI_CALL_IMPLEM(int, MPI_Type_free, (MPI_Datatype * datatype))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (!datatype) {
     retval = MPI_ERR_ARG;
   } else {
     // FIXME: always fail for now
     retval = MPI_ERR_TYPE;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Type_size(MPI_Datatype datatype, int *size)
+MPI_CALL_IMPLEM(int, MPI_Type_size, (MPI_Datatype datatype, int *size))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (datatype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else if (size == NULL) {
@@ -157,16 +161,17 @@ int MPI_Type_size(MPI_Datatype datatype, int *size)
     *size = (int) smpi_datatype_size(datatype);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb,
-                        MPI_Aint * extent)
+MPI_CALL_IMPLEM(int, MPI_Type_get_extent,
+                       (MPI_Datatype datatype, MPI_Aint * lb,
+                        MPI_Aint * extent))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (datatype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else if (lb == NULL || extent == NULL) {
@@ -174,16 +179,16 @@ int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb,
   } else {
     retval = smpi_datatype_extent(datatype, lb, extent);
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent)
+MPI_CALL_IMPLEM(int, MPI_Type_extent, (MPI_Datatype datatype, MPI_Aint * extent))
 {
   int retval;
   MPI_Aint dummy;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (datatype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else if (extent == NULL) {
@@ -191,15 +196,15 @@ int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent)
   } else {
     retval = smpi_datatype_extent(datatype, &dummy, extent);
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint * disp)
+MPI_CALL_IMPLEM(int, MPI_Type_lb, (MPI_Datatype datatype, MPI_Aint * disp))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (datatype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else if (disp == NULL) {
@@ -208,15 +213,15 @@ int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint * disp)
     *disp = smpi_datatype_lb(datatype);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint * disp)
+MPI_CALL_IMPLEM(int, MPI_Type_ub, (MPI_Datatype datatype, MPI_Aint * disp))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (datatype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else if (disp == NULL) {
@@ -225,30 +230,30 @@ int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint * disp)
     *disp = smpi_datatype_ub(datatype);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Op_create(MPI_User_function * function, int commute, MPI_Op * op)
+MPI_CALL_IMPLEM(int, MPI_Op_create, (MPI_User_function * function, int commute, MPI_Op * op))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (function == NULL || op == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     *op = smpi_op_new(function, commute);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Op_free(MPI_Op * op)
+MPI_CALL_IMPLEM(int, MPI_Op_free, (MPI_Op * op))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (op == NULL) {
     retval = MPI_ERR_ARG;
   } else if (*op == MPI_OP_NULL) {
@@ -258,15 +263,15 @@ int MPI_Op_free(MPI_Op * op)
     *op = MPI_OP_NULL;
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_free(MPI_Group * group)
+MPI_CALL_IMPLEM(int, MPI_Group_free, (MPI_Group * group))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group == NULL) {
     retval = MPI_ERR_ARG;
   } else {
@@ -274,15 +279,15 @@ int MPI_Group_free(MPI_Group * group)
     *group = MPI_GROUP_NULL;
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_size(MPI_Group group, int *size)
+MPI_CALL_IMPLEM(int, MPI_Group_size, (MPI_Group group, int *size))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (size == NULL) {
@@ -291,15 +296,15 @@ int MPI_Group_size(MPI_Group group, int *size)
     *size = smpi_group_size(group);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_rank(MPI_Group group, int *rank)
+MPI_CALL_IMPLEM(int, MPI_Group_rank, (MPI_Group group, int *rank))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (rank == NULL) {
@@ -308,16 +313,17 @@ int MPI_Group_rank(MPI_Group group, int *rank)
     *rank = smpi_group_rank(group, smpi_process_index());
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_translate_ranks(MPI_Group group1, int n, int *ranks1,
-                              MPI_Group group2, int *ranks2)
+MPI_CALL_IMPLEM(int, MPI_Group_translate_ranks,
+                       (MPI_Group group1, int n, int *ranks1,
+                        MPI_Group group2, int *ranks2))
 {
   int retval, i, index;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else {
@@ -327,15 +333,15 @@ int MPI_Group_translate_ranks(MPI_Group group1, int n, int *ranks1,
     }
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_compare(MPI_Group group1, MPI_Group group2, int *result)
+MPI_CALL_IMPLEM(int, MPI_Group_compare, (MPI_Group group1, MPI_Group group2, int *result))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (result == NULL) {
@@ -344,16 +350,17 @@ int MPI_Group_compare(MPI_Group group1, MPI_Group group2, int *result)
     *result = smpi_group_compare(group1, group2);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_union(MPI_Group group1, MPI_Group group2,
-                    MPI_Group * newgroup)
+MPI_CALL_IMPLEM(int, MPI_Group_union,
+                       (MPI_Group group1, MPI_Group group2,
+                        MPI_Group * newgroup))
 {
   int retval, i, proc1, proc2, size, size2;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
@@ -385,16 +392,17 @@ int MPI_Group_union(MPI_Group group1, MPI_Group group2,
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_intersection(MPI_Group group1, MPI_Group group2,
-                           MPI_Group * newgroup)
+MPI_CALL_IMPLEM(int, MPI_Group_intersection,
+                       (MPI_Group group1, MPI_Group group2,
+                        MPI_Group * newgroup))
 {
   int retval, i, proc1, proc2, size, size2;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
@@ -425,16 +433,17 @@ int MPI_Group_intersection(MPI_Group group1, MPI_Group group2,
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_difference(MPI_Group group1, MPI_Group group2,
-                         MPI_Group * newgroup)
+MPI_CALL_IMPLEM(int, MPI_Group_difference,
+                       (MPI_Group group1, MPI_Group group2,
+                        MPI_Group * newgroup))
 {
   int retval, i, proc1, proc2, size, size2;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
@@ -463,16 +472,17 @@ int MPI_Group_difference(MPI_Group group1, MPI_Group group2,
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_incl(MPI_Group group, int n, int *ranks,
-                   MPI_Group * newgroup)
+MPI_CALL_IMPLEM(int, MPI_Group_incl,
+                       (MPI_Group group, int n, int *ranks,
+                        MPI_Group * newgroup))
 {
   int retval, i, index;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
@@ -492,16 +502,17 @@ int MPI_Group_incl(MPI_Group group, int n, int *ranks,
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_excl(MPI_Group group, int n, int *ranks,
-                   MPI_Group * newgroup)
+MPI_CALL_IMPLEM(int, MPI_Group_excl,
+                       (MPI_Group group, int n, int *ranks,
+                        MPI_Group * newgroup))
 {
   int retval, i, size, rank, index;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
@@ -531,16 +542,17 @@ int MPI_Group_excl(MPI_Group group, int n, int *ranks,
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
-                         MPI_Group * newgroup)
+MPI_CALL_IMPLEM(int, MPI_Group_range_incl,
+                       (MPI_Group group, int n, int ranges[][3],
+                        MPI_Group * newgroup))
 {
   int retval, i, j, rank, size, index;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
@@ -576,16 +588,17 @@ int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
-                         MPI_Group * newgroup)
+MPI_CALL_IMPLEM(int, MPI_Group_range_excl,
+                       (MPI_Group group, int n, int ranges[][3],
+                        MPI_Group * newgroup))
 {
   int retval, i, newrank, rank, size, index, add;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (group == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
@@ -629,30 +642,30 @@ int MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Comm_rank(MPI_Comm comm, int *rank)
+MPI_CALL_IMPLEM(int, MPI_Comm_rank, (MPI_Comm comm, int *rank))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (comm == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else {
     *rank = smpi_comm_rank(comm);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Comm_size(MPI_Comm comm, int *size)
+MPI_CALL_IMPLEM(int, MPI_Comm_size, (MPI_Comm comm, int *size))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (comm == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else if (size == NULL) {
@@ -661,15 +674,15 @@ int MPI_Comm_size(MPI_Comm comm, int *size)
     *size = smpi_comm_size(comm);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Comm_group(MPI_Comm comm, MPI_Group * group)
+MPI_CALL_IMPLEM(int, MPI_Comm_group, (MPI_Comm comm, MPI_Group * group))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (comm == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else if (group == NULL) {
@@ -678,15 +691,15 @@ int MPI_Comm_group(MPI_Comm comm, MPI_Group * group)
     *group = smpi_comm_group(comm);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int *result)
+MPI_CALL_IMPLEM(int, MPI_Comm_compare, (MPI_Comm comm1, MPI_Comm comm2, int *result))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (comm1 == MPI_COMM_NULL || comm2 == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else if (result == NULL) {
@@ -704,15 +717,15 @@ int MPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int *result)
     }
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Comm_dup(MPI_Comm comm, MPI_Comm * newcomm)
+MPI_CALL_IMPLEM(int, MPI_Comm_dup, (MPI_Comm comm, MPI_Comm * newcomm))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (comm == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else if (newcomm == NULL) {
@@ -721,15 +734,15 @@ int MPI_Comm_dup(MPI_Comm comm, MPI_Comm * newcomm)
     *newcomm = smpi_comm_new(smpi_comm_group(comm));
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm)
+MPI_CALL_IMPLEM(int, MPI_Comm_create, (MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (comm == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else if (group == MPI_GROUP_NULL) {
@@ -740,15 +753,15 @@ int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm)
     *newcomm = smpi_comm_new(group);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Comm_free(MPI_Comm * comm)
+MPI_CALL_IMPLEM(int, MPI_Comm_free, (MPI_Comm * comm))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (comm == NULL) {
     retval = MPI_ERR_ARG;
   } else if (*comm == MPI_COMM_NULL) {
@@ -758,17 +771,34 @@ int MPI_Comm_free(MPI_Comm * comm)
     *comm = MPI_COMM_NULL;
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst,
-                  int tag, MPI_Comm comm, MPI_Request * request)
+MPI_CALL_IMPLEM(int, MPI_Comm_split, (MPI_Comm comm, int color, int key, MPI_Comm* comm_out))
+{
+  int retval;
+
+  smpi_bench_end();
+  if (comm_out == NULL) {
+    retval = MPI_ERR_ARG;
+  } else if (comm == MPI_COMM_NULL) {
+    retval = MPI_ERR_COMM;
+  } else {
+    *comm_out = smpi_comm_split(comm, color, key);
+    retval = MPI_SUCCESS;
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
+MPI_CALL_IMPLEM(int, MPI_Send_init,
+                       (void *buf, int count, MPI_Datatype datatype, int dst,
+                        int tag, MPI_Comm comm, MPI_Request * request))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Send_init");
+  smpi_bench_end();
   if (request == NULL) {
     retval = MPI_ERR_ARG;
   } else if (comm == MPI_COMM_NULL) {
@@ -777,17 +807,17 @@ int MPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst,
     *request = smpi_mpi_send_init(buf, count, datatype, dst, tag, comm);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(rank, "Send_init");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src,
-                  int tag, MPI_Comm comm, MPI_Request * request)
+MPI_CALL_IMPLEM(int, MPI_Recv_init,
+                       (void *buf, int count, MPI_Datatype datatype, int src,
+                        int tag, MPI_Comm comm, MPI_Request * request))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Recv_init");
+  smpi_bench_end();
   if (request == NULL) {
     retval = MPI_ERR_ARG;
   } else if (comm == MPI_COMM_NULL) {
@@ -796,70 +826,64 @@ int MPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src,
     *request = smpi_mpi_recv_init(buf, count, datatype, src, tag, comm);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(rank, "Recv_init");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Start(MPI_Request * request)
+MPI_CALL_IMPLEM(int, MPI_Start, (MPI_Request * request))
 {
   int retval;
-  MPI_Comm comm = (*request)->comm;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Start");
+  smpi_bench_end();
   if (request == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     smpi_mpi_start(*request);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(rank, "Start");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Startall(int count, MPI_Request * requests)
+MPI_CALL_IMPLEM(int, MPI_Startall, (int count, MPI_Request * requests))
 {
   int retval;
-  MPI_Comm comm = count > 0
-      && requests ? requests[0]->comm : MPI_COMM_NULL;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Startall");
+  smpi_bench_end();
   if (requests == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     smpi_mpi_startall(count, requests);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(rank, "Startall");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Request_free(MPI_Request * request)
+MPI_CALL_IMPLEM(int, MPI_Request_free, (MPI_Request * request))
 {
   int retval;
-  MPI_Comm comm = (*request)->comm;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Request_free");
+  smpi_bench_end();
   if (request == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     smpi_mpi_request_free(request);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(rank, "Request_free");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src,
-              int tag, MPI_Comm comm, MPI_Request * request)
+MPI_CALL_IMPLEM(int, MPI_Irecv,
+                       (void *buf, int count, MPI_Datatype datatype, int src,
+                        int tag, MPI_Comm comm, MPI_Request * request))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Irecv");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int src_traced = smpi_group_rank(smpi_comm_group(comm), src);
   TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__);
 #endif
@@ -875,18 +899,19 @@ int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src,
   TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__);
   (*request)->recv = 1;
 #endif
-  smpi_bench_begin(rank, "Irecv");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst,
-              int tag, MPI_Comm comm, MPI_Request * request)
+MPI_CALL_IMPLEM(int, MPI_Isend,
+                       (void *buf, int count, MPI_Datatype datatype, int dst,
+                        int tag, MPI_Comm comm, MPI_Request * request))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Isend");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int dst_traced = smpi_group_rank(smpi_comm_group(comm), dst);
   TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__);
   TRACE_smpi_send(rank, rank, dst_traced);
@@ -903,18 +928,19 @@ int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst,
   TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__);
   (*request)->send = 1;
 #endif
-  smpi_bench_begin(rank, "Isend");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag,
-             MPI_Comm comm, MPI_Status * status)
+MPI_CALL_IMPLEM(int, MPI_Recv,
+                       (void *buf, int count, MPI_Datatype datatype, int src, int tag,
+                        MPI_Comm comm, MPI_Status * status))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Recv");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int src_traced = smpi_group_rank(smpi_comm_group(comm), src);
   TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__);
 #endif
@@ -928,18 +954,19 @@ int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag,
   TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__);
   TRACE_smpi_recv(rank, src_traced, rank);
 #endif
-  smpi_bench_begin(rank, "Recv");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag,
-             MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Send,
+                       (void *buf, int count, MPI_Datatype datatype, int dst, int tag,
+                        MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Send");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int dst_traced = smpi_group_rank(smpi_comm_group(comm), dst);
   TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__);
   TRACE_smpi_send(rank, rank, dst_traced);
@@ -953,20 +980,21 @@ int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag,
 #ifdef HAVE_TRACING
   TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Send");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
-                 int dst, int sendtag, void *recvbuf, int recvcount,
-                 MPI_Datatype recvtype, int src, int recvtag,
-                 MPI_Comm comm, MPI_Status * status)
+MPI_CALL_IMPLEM(int, MPI_Sendrecv,
+                       (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                        int dst, int sendtag, void *recvbuf, int recvcount,
+                        MPI_Datatype recvtype, int src, int recvtag,
+                        MPI_Comm comm, MPI_Status * status))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Sendrecv");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int dst_traced = smpi_group_rank(smpi_comm_group(comm), dst);
   int src_traced = smpi_group_rank(smpi_comm_group(comm), src);
   TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__);
@@ -988,13 +1016,14 @@ int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
   TRACE_smpi_recv(rank, rank, dst_traced);
   TRACE_smpi_recv(rank, src_traced, rank);
 #endif
-  smpi_bench_begin(rank, "Sendrecv");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype,
-                         int dst, int sendtag, int src, int recvtag,
-                         MPI_Comm comm, MPI_Status * status)
+MPI_CALL_IMPLEM(int, MPI_Sendrecv_replace,
+                       (void *buf, int count, MPI_Datatype datatype,
+                        int dst, int sendtag, int src, int recvtag,
+                        MPI_Comm comm, MPI_Status * status))
 {
   //TODO: suboptimal implementation
   void *recvbuf;
@@ -1010,14 +1039,11 @@ int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype,
   return retval;
 }
 
-int MPI_Test(MPI_Request * request, int *flag, MPI_Status * status)
+MPI_CALL_IMPLEM(int, MPI_Test, (MPI_Request * request, int *flag, MPI_Status * status))
 {
   int retval;
-  int rank = request && (*request)->comm != MPI_COMM_NULL
-      ? smpi_comm_rank((*request)->comm)
-      : -1;
 
-  smpi_bench_end(rank, "Test");
+  smpi_bench_end();
   if (request == NULL || flag == NULL) {
     retval = MPI_ERR_ARG;
   } else if (*request == MPI_REQUEST_NULL) {
@@ -1026,35 +1052,36 @@ int MPI_Test(MPI_Request * request, int *flag, MPI_Status * status)
     *flag = smpi_mpi_test(request, status);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(rank, "Test");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Testany(int count, MPI_Request requests[], int *index, int *flag,
-                MPI_Status * status)
+MPI_CALL_IMPLEM(int, MPI_Testany,
+                       (int count, MPI_Request requests[], int *index, int *flag,
+                        MPI_Status * status))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);     //FIXME
+  smpi_bench_end();
   if (index == NULL || flag == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     *flag = smpi_mpi_testany(count, requests, index, status);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Wait(MPI_Request * request, MPI_Status * status)
+MPI_CALL_IMPLEM(int, MPI_Wait, (MPI_Request * request, MPI_Status * status))
 {
   int retval;
+
+  smpi_bench_end();
+#ifdef HAVE_TRACING
   int rank = request && (*request)->comm != MPI_COMM_NULL
       ? smpi_comm_rank((*request)->comm)
       : -1;
-
-  smpi_bench_end(rank, "Wait");
-#ifdef HAVE_TRACING
   MPI_Group group = smpi_comm_group((*request)->comm);
   int src_traced = smpi_group_rank(group, (*request)->src);
   int dst_traced = smpi_group_rank(group, (*request)->dst);
@@ -1075,16 +1102,17 @@ int MPI_Wait(MPI_Request * request, MPI_Status * status)
     TRACE_smpi_recv(rank, src_traced, dst_traced);
   }
 #endif
-  smpi_bench_begin(rank, "Wait");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Waitany(int count, MPI_Request requests[], int *index,
-                MPI_Status * status)
+MPI_CALL_IMPLEM(int, MPI_Waitany,
+                       (int count, MPI_Request requests[], int *index,
+                        MPI_Status * status))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);     //FIXME
+  smpi_bench_end();
 #ifdef HAVE_TRACING
   //save requests information for tracing
   int i;
@@ -1133,14 +1161,14 @@ int MPI_Waitany(int count, MPI_Request requests[], int *index,
   xbt_free(dsts);
   xbt_free(recvs);
 #endif
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
+MPI_CALL_IMPLEM(int, MPI_Waitall, (int count, MPI_Request requests[], MPI_Status status[]))
 {
 
-  smpi_bench_end(-1, NULL);     //FIXME
+  smpi_bench_end();
 #ifdef HAVE_TRACING
   //save information from requests
   int i;
@@ -1179,34 +1207,36 @@ int MPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
   xbt_free(dsts);
   xbt_free(recvs);
 #endif
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
-int MPI_Waitsome(int incount, MPI_Request requests[], int *outcount,
-                 int *indices, MPI_Status status[])
+MPI_CALL_IMPLEM(int, MPI_Waitsome,
+                       (int incount, MPI_Request requests[], int *outcount,
+                        int *indices, MPI_Status status[]))
 {
   int retval;
 
-  smpi_bench_end(-1, NULL);     //FIXME
+  smpi_bench_end();
   if (outcount == NULL || indices == NULL) {
     retval = MPI_ERR_ARG;
   } else {
     *outcount = smpi_mpi_waitsome(incount, requests, indices, status);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root,
-              MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Bcast,
+                       (void *buf, int count, MPI_Datatype datatype, int root,
+                        MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Bcast");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
 #endif
@@ -1219,17 +1249,17 @@ int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Bcast");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Barrier(MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Barrier, (MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Barrier");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   if (comm == MPI_COMM_NULL) {
@@ -1241,19 +1271,20 @@ int MPI_Barrier(MPI_Comm comm)
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Barrier");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
-               void *recvbuf, int recvcount, MPI_Datatype recvtype,
-               int root, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Gather,
+                       (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                        void *recvbuf, int recvcount, MPI_Datatype recvtype,
+                        int root, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Gather");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
 #endif
@@ -1270,19 +1301,20 @@ int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Gather");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
-                void *recvbuf, int *recvcounts, int *displs,
-                MPI_Datatype recvtype, int root, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Gatherv,
+                       (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                        void *recvbuf, int *recvcounts, int *displs,
+                        MPI_Datatype recvtype, int root, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Gatherv");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
 #endif
@@ -1301,19 +1333,20 @@ int MPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Gatherv");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
-                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
-                  MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Allgather,
+                       (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                        void *recvbuf, int recvcount, MPI_Datatype recvtype,
+                        MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Allgather");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   if (comm == MPI_COMM_NULL) {
@@ -1329,19 +1362,20 @@ int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Allgather");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
-                   void *recvbuf, int *recvcounts, int *displs,
-                   MPI_Datatype recvtype, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Allgatherv,
+                       (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                        void *recvbuf, int *recvcounts, int *displs,
+                        MPI_Datatype recvtype, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Allgatherv");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   if (comm == MPI_COMM_NULL) {
@@ -1359,19 +1393,20 @@ int MPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Allgatherv");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
-                void *recvbuf, int recvcount, MPI_Datatype recvtype,
-                int root, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Scatter,
+                       (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                        void *recvbuf, int recvcount, MPI_Datatype recvtype,
+                        int root, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Scatter");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
 #endif
@@ -1388,19 +1423,20 @@ int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Scatter");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Scatterv(void *sendbuf, int *sendcounts, int *displs,
-                 MPI_Datatype sendtype, void *recvbuf, int recvcount,
-                 MPI_Datatype recvtype, int root, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Scatterv,
+                       (void *sendbuf, int *sendcounts, int *displs,
+                        MPI_Datatype sendtype, void *recvbuf, int recvcount,
+                        MPI_Datatype recvtype, int root, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Scatterv");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
 #endif
@@ -1419,18 +1455,19 @@ int MPI_Scatterv(void *sendbuf, int *sendcounts, int *displs,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Scatterv");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Reduce(void *sendbuf, void *recvbuf, int count,
-               MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Reduce,
+                       (void *sendbuf, void *recvbuf, int count,
+                        MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Reduce");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
 #endif
@@ -1445,18 +1482,19 @@ int MPI_Reduce(void *sendbuf, void *recvbuf, int count,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Reduce");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Allreduce(void *sendbuf, void *recvbuf, int count,
-                  MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Allreduce,
+                       (void *sendbuf, void *recvbuf, int count,
+                        MPI_Datatype datatype, MPI_Op op, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Allreduce");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   if (comm == MPI_COMM_NULL) {
@@ -1472,18 +1510,19 @@ int MPI_Allreduce(void *sendbuf, void *recvbuf, int count,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Allreduce");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Scan(void *sendbuf, void *recvbuf, int count,
-             MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Scan,
+                       (void *sendbuf, void *recvbuf, int count,
+                        MPI_Datatype datatype, MPI_Op op, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Scan");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   if (comm == MPI_COMM_NULL) {
@@ -1499,18 +1538,19 @@ int MPI_Scan(void *sendbuf, void *recvbuf, int count,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Scan");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
-                       MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Reduce_scatter,
+                       (void *sendbuf, void *recvbuf, int *recvcounts,
+                        MPI_Datatype datatype, MPI_Op op, MPI_Comm comm))
 {
   int retval, i, size, count;
   int *displs;
   int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Reduce_scatter");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
@@ -1541,19 +1581,20 @@ int MPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Reduce_scatter");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
-                 void *recvbuf, int recvcount, MPI_Datatype recvtype,
-                 MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Alltoall,
+                       (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                        void *recvbuf, int recvcount, MPI_Datatype recvtype,
+                        MPI_Comm comm))
 {
   int retval, size, sendsize;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Alltoall");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   if (comm == MPI_COMM_NULL) {
@@ -1584,19 +1625,20 @@ int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Alltoall");
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps,
-                  MPI_Datatype sendtype, void *recvbuf, int *recvcounts,
-                  int *recvdisps, MPI_Datatype recvtype, MPI_Comm comm)
+MPI_CALL_IMPLEM(int, MPI_Alltoallv,
+                       (void *sendbuf, int *sendcounts, int *senddisps,
+                        MPI_Datatype sendtype, void *recvbuf, int *recvcounts,
+                        int *recvdisps, MPI_Datatype recvtype, MPI_Comm comm))
 {
   int retval;
-  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
 
-  smpi_bench_end(rank, "Alltoallv");
+  smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   if (comm == MPI_COMM_NULL) {
@@ -1616,32 +1658,32 @@ int MPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps,
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
 #endif
-  smpi_bench_begin(rank, "Alltoallv");
+  smpi_bench_begin();
   return retval;
 }
 
 
-int MPI_Get_processor_name(char *name, int *resultlen)
+MPI_CALL_IMPLEM(int, MPI_Get_processor_name, (char *name, int *resultlen))
 {
   int retval = MPI_SUCCESS;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   strncpy(name, SIMIX_host_get_name(SIMIX_host_self()),
           MPI_MAX_PROCESSOR_NAME - 1);
   *resultlen =
       strlen(name) >
       MPI_MAX_PROCESSOR_NAME ? MPI_MAX_PROCESSOR_NAME : strlen(name);
 
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
 
-int MPI_Get_count(MPI_Status * status, MPI_Datatype datatype, int *count)
+MPI_CALL_IMPLEM(int, MPI_Get_count, (MPI_Status * status, MPI_Datatype datatype, int *count))
 {
   int retval = MPI_SUCCESS;
   size_t size;
 
-  smpi_bench_end(-1, NULL);
+  smpi_bench_end();
   if (status == NULL || count == NULL) {
     retval = MPI_ERR_ARG;
   } else if (datatype == MPI_DATATYPE_NULL) {
@@ -1656,6 +1698,258 @@ int MPI_Get_count(MPI_Status * status, MPI_Datatype datatype, int *count)
       *count = smpi_mpi_get_count(status, datatype);
     }
   }
-  smpi_bench_begin(-1, NULL);
+  smpi_bench_begin();
   return retval;
 }
+
+/* The following calls are not yet implemented and will fail at runtime. */
+/* Once implemented, please move them above this notice. */
+
+static int not_yet_implemented(void) {
+   xbt_die("Not yet implemented");
+   return MPI_ERR_OTHER;
+}
+
+MPI_CALL_IMPLEM(int, MPI_Pack_size, (int incount, MPI_Datatype datatype, MPI_Comm comm, int* size)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cart_coords, (MPI_Comm comm, int rank, int maxdims, int* coords)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cart_create, (MPI_Comm comm_old, int ndims, int* dims, int* periods, int reorder, MPI_Comm* comm_cart)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cart_get, (MPI_Comm comm, int maxdims, int* dims, int* periods, int* coords)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cart_map, (MPI_Comm comm_old, int ndims, int* dims, int* periods, int* newrank)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cart_rank, (MPI_Comm comm, int* coords, int* rank)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cart_shift, (MPI_Comm comm, int direction, int displ, int* source, int* dest)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cart_sub, (MPI_Comm comm, int* remain_dims, MPI_Comm* comm_new)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cartdim_get, (MPI_Comm comm, int* ndims)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Graph_create, (MPI_Comm comm_old, int nnodes, int* index, int* edges, int reorder, MPI_Comm* comm_graph)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Graph_get, (MPI_Comm comm, int maxindex, int maxedges, int* index, int* edges)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Graph_map, (MPI_Comm comm_old, int nnodes, int* index, int* edges, int* newrank)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Graph_neighbors, (MPI_Comm comm, int rank, int maxneighbors, int* neighbors)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Graph_neighbors_count, (MPI_Comm comm, int rank, int* nneighbors)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Graphdims_get, (MPI_Comm comm, int* nnodes, int* nedges)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Topo_test, (MPI_Comm comm, int* top_type)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Error_class, (int errorcode, int* errorclass)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Errhandler_create, (MPI_Handler_function* function, MPI_Errhandler* errhandler)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Errhandler_free, (MPI_Errhandler* errhandler)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Errhandler_get, (MPI_Comm comm, MPI_Errhandler* errhandler)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Error_string, (int errorcode, char* string, int* resultlen)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Errhandler_set, (MPI_Comm comm, MPI_Errhandler errhandler)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Type_contiguous, (int count, MPI_Datatype old_type, MPI_Datatype* newtype)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Cancel, (MPI_Request* request)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Buffer_attach, (void* buffer, int size)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Buffer_detach, (void* buffer, int* size)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Testsome, (int incount, MPI_Request* requests, int* outcount, int* indices, MPI_Status* statuses)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Comm_test_inter, (MPI_Comm comm, int* flag)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Unpack, (void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Datatype type, MPI_Comm comm)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Type_commit, (MPI_Datatype* datatype)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Type_hindexed, (int count, int* blocklens, MPI_Aint* indices, MPI_Datatype old_type, MPI_Datatype* newtype)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Type_hvector, (int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* newtype)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Type_indexed, (int count, int* blocklens, int* indices, MPI_Datatype old_type, MPI_Datatype* newtype)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Type_struct, (int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* newtype)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Type_vector, (int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* newtype)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Ssend, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Ssend_init, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_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();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Intercomm_merge, (MPI_Comm comm, int high, MPI_Comm* comm_out)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Bsend, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Bsend_init, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Ibsend, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Comm_remote_group, (MPI_Comm comm, MPI_Group* group)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Comm_remote_size, (MPI_Comm comm, int* size)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Issend, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Probe, (int source, int tag, MPI_Comm comm, MPI_Status* status)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Attr_delete, (MPI_Comm comm, int keyval)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Attr_get, (MPI_Comm comm, int keyval, void* attr_value, int* flag)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Attr_put, (MPI_Comm comm, int keyval, void* attr_value)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Rsend, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Rsend_init, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Irsend, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Keyval_create, (MPI_Copy_function* copy_fn, MPI_Delete_function* delete_fn, int* keyval, void* extra_state)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Keyval_free, (int* keyval)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Test_cancelled, (MPI_Status* status, int* flag)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Pack, (void* inbuf, int incount, MPI_Datatype type, void* outbuf, int outcount, int* position, MPI_Comm comm)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Testall, (int count, MPI_Request* requests, int* flag, MPI_Status* statuses)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Get_elements, (MPI_Status* status, MPI_Datatype datatype, int* elements)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Dims_create, (int nnodes, int ndims, int* dims)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Iprobe, (int source, int tag, MPI_Comm comm, int* flag, MPI_Status* status)) {
+   return not_yet_implemented();
+}
+
+MPI_CALL_IMPLEM(int, MPI_Initialized, (int* flag)) {
+   return not_yet_implemented();
+}