- if (comm == MPI_COMM_NULL)
- return MPI_ERR_COMM;
- if ((sendbuf == nullptr) || ((comm->rank() == root) && recvbuf == nullptr))
- return MPI_ERR_BUFFER;
- if (((sendbuf != MPI_IN_PLACE && sendcount > 0) && (sendtype == MPI_DATATYPE_NULL)) ||
- ((comm->rank() == root) && (recvtype == MPI_DATATYPE_NULL)))
- return MPI_ERR_TYPE;
- if (((sendbuf != MPI_IN_PLACE) && (sendcount < 0)) || ((comm->rank() == root) && (recvcount < 0)))
- return MPI_ERR_COUNT;
- if (root < 0 || root >= comm->size())
- return MPI_ERR_ROOT;
- if (request == nullptr)
- return MPI_ERR_ARG;
-
- smpi_bench_end();
- const char* sendtmpbuf = static_cast<const char*>(sendbuf);
- int sendtmpcount = sendcount;
- MPI_Datatype sendtmptype = sendtype;
- if ((comm->rank() == root) && (sendbuf == MPI_IN_PLACE)) {
- sendtmpcount = 0;
- sendtmptype = recvtype;
- }
- int rank = simgrid::s4u::this_actor::get_pid();
-
- TRACE_smpi_comm_in(rank, request == MPI_REQUEST_IGNORED ? "PMPI_Gather" : "PMPI_Igather",
+ CHECK_COMM(8)
+ SET_BUF1(sendbuf)
+ SET_BUF2(recvbuf)
+ int rank = comm->rank();
+ if(sendbuf != MPI_IN_PLACE){
+ CHECK_COUNT(2, sendcount)
+ CHECK_TYPE(3, sendtype)
+ CHECK_BUFFER(1,sendbuf, sendcount, sendtype)
+ }
+ if(rank == root){
+ CHECK_NOT_IN_PLACE_ROOT(4, recvbuf)
+ CHECK_TYPE(6, recvtype)
+ CHECK_COUNT(5, recvcount)
+ CHECK_BUFFER(4, recvbuf, recvcount, recvtype)
+ } else {
+ CHECK_NOT_IN_PLACE_ROOT(1, sendbuf)
+ }
+ CHECK_ROOT(7)
+ CHECK_REQUEST(9)
+
+ const void* real_sendbuf = sendbuf;
+ int real_sendcount = sendcount;
+ MPI_Datatype real_sendtype = sendtype;
+ if (rank == root){
+ if (sendbuf == MPI_IN_PLACE) {
+ real_sendcount = 0;
+ real_sendtype = recvtype;
+ } else if(recvtype->size() * recvcount != sendtype->size() * sendcount){
+ XBT_WARN("MPI_(I)Gather : received size at root differs from sent size : %zu vs %zu", recvtype->size() * recvcount , sendtype->size() * sendcount);
+ return MPI_ERR_TRUNCATE;
+ }
+ }
+
+ const SmpiBenchGuard suspend_bench;
+
+ aid_t pid = simgrid::s4u::this_actor::get_pid();
+
+ TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Gather" : "PMPI_Igather",