#define CHECK_ARGS(test, errcode, ...) \
if (test) { \
XBT_WARN(__VA_ARGS__); \
- return errcode; \
+ return (errcode); \
}
/* PMPI User level calls */
{
if (comm == MPI_COMM_NULL)
return MPI_ERR_COMM;
- if ((sendbuf == nullptr) || ((comm->rank() == root) && recvbuf == nullptr))
+ if ((sendbuf == nullptr && sendcount > 0) || ((comm->rank() == root) && recvbuf == nullptr && recvcount > 0))
return MPI_ERR_BUFFER;
if (((sendbuf != MPI_IN_PLACE && sendcount > 0) && (sendtype == MPI_DATATYPE_NULL)) ||
((comm->rank() == root) && (recvtype == MPI_DATATYPE_NULL)))
MPI_Datatype recvtype, MPI_Comm comm, MPI_Request* request)
{
CHECK_ARGS(comm == MPI_COMM_NULL, MPI_ERR_COMM, "Iallgather: the communicator cannot be MPI_COMM_NULL");
- CHECK_ARGS(recvbuf == nullptr, MPI_ERR_BUFFER, "Iallgather: param 4 recvbuf cannot be NULL");
+ CHECK_ARGS(recvbuf == nullptr && recvcount > 0, MPI_ERR_BUFFER, "Iallgather: param 4 recvbuf cannot be NULL");
CHECK_ARGS(sendbuf == nullptr && sendcount > 0, MPI_ERR_BUFFER,
"Iallgather: param 1 sendbuf cannot be NULL when sendcound > 0");
CHECK_ARGS((sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL), MPI_ERR_TYPE,
{
if (comm == MPI_COMM_NULL)
return MPI_ERR_COMM;
- if ((sendbuf == nullptr && sendcount > 0) || (recvbuf == nullptr))
+ if (sendbuf == nullptr && sendcount > 0)
return MPI_ERR_BUFFER;
if (((sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || (recvtype == MPI_DATATYPE_NULL))
return MPI_ERR_TYPE;
if (request == nullptr)
return MPI_ERR_ARG;
- for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free
+ for (int i = 0; i < comm->size(); i++) {
if (recvcounts[i] < 0)
return MPI_ERR_COUNT;
+ else if (recvcounts[i] > 0 && recvbuf == nullptr)
+ return MPI_ERR_BUFFER;
}
smpi_bench_end();
smpi_bench_end();
int rank = simgrid::s4u::this_actor::get_pid();
int size = comm->size();
- for (int i = 0; i < size; i++) { // copy data to avoid bad free
+ for (int i = 0; i < size; i++) {
if (recvcounts[i] < 0 || (sendbuf != MPI_IN_PLACE && sendcounts[i] < 0))
return MPI_ERR_COUNT;
}