+ smpi_mpi_barrier(comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, -1, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Barrier");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
+ TRACE_smpi_collective_in (rank, root_traced, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else {
+ smpi_mpi_gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, root_traced, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Gather");
+ 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) {
+ int retval;
+ int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
+
+ smpi_bench_end(rank, "Gatherv");
+#ifdef HAVE_TRACING
+ int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
+ TRACE_smpi_collective_in (rank, root_traced, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(recvcounts == NULL || displs == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ smpi_mpi_gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, root_traced, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Gatherv");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_in (rank, -1, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else {
+ smpi_mpi_allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, -1, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Allgather");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_in (rank, -1, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(recvcounts == NULL || displs == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ smpi_mpi_allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, -1, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Allgatherv");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
+ TRACE_smpi_collective_in (rank, root_traced, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else {
+ smpi_mpi_scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, root_traced, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Scatter");
+ 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) {
+ int retval;
+ int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1;
+
+ smpi_bench_end(rank, "Scatterv");
+#ifdef HAVE_TRACING
+ int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
+ TRACE_smpi_collective_in (rank, root_traced, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(sendcounts == NULL || displs == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ smpi_mpi_scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, root_traced, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Scatterv");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ int root_traced = smpi_group_rank(smpi_comm_group(comm), root);
+ TRACE_smpi_collective_in (rank, root_traced, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ smpi_mpi_reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, root_traced, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Reduce");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_in (rank, -1, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(op == MPI_OP_NULL) {
+ retval = MPI_ERR_OP;
+ } else {
+ smpi_mpi_allreduce(sendbuf, recvbuf, count, datatype, op, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, -1, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Allreduce");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_in (rank, -1, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(op == MPI_OP_NULL) {
+ retval = MPI_ERR_OP;
+ } else {
+ smpi_mpi_scan(sendbuf, recvbuf, count, datatype, op, comm);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, -1, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Scan");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_in (rank, -1, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(op == MPI_OP_NULL) {
+ retval = MPI_ERR_OP;
+ } else if(recvcounts == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ /* arbitrarily choose root as rank 0 */
+ /* TODO: faster direct implementation ? */
+ size = smpi_comm_size(comm);
+ count = 0;
+ displs = xbt_new(int, size);
+ for(i = 0; i < size; i++) {
+ count += recvcounts[i];
+ displs[i] = 0;
+ }
+ smpi_mpi_reduce(sendbuf, recvbuf, count, datatype, op, 0, comm);
+ smpi_mpi_scatterv(recvbuf, recvcounts, displs, datatype, recvbuf, recvcounts[rank], datatype, 0, comm);
+ xbt_free(displs);
+ retval = MPI_SUCCESS;
+ }
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out (rank, -1, __FUNCTION__);
+#endif
+ smpi_bench_begin(rank, "Reduce_scatter");
+ return retval;
+}
+
+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");
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_in (rank, -1, __FUNCTION__);
+#endif
+ if(comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if(sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else {
+ size = smpi_comm_size(comm);
+ sendsize = smpi_datatype_size(sendtype) * sendcount;
+ if(sendsize < 200 && size > 12) {
+ retval = smpi_coll_tuned_alltoall_bruck(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);
+ } else if(sendsize < 3000) {
+ retval = smpi_coll_tuned_alltoall_basic_linear(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);
+ } else {
+ retval = smpi_coll_tuned_alltoall_pairwise(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);