-
- print_buffer_int( sbuf, size*size, strdup("sbuf:"),rank);
- print_buffer_int( sendcounts, size, strdup("scount:"),rank);
- print_buffer_int( recvcounts, size, strdup("rcount:"),rank);
- print_buffer_int( sdispls, size, strdup("sdisp:"),rank);
- print_buffer_int( rdispls, size, strdup("rdisp:"),rank);
-
- MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, rbuf, recvcounts, rdispls, MPI_INT, comm);
-
- print_buffer_int( rbuf, size*size, strdup("rbuf:"),rank);
-
- MPI_Barrier(MPI_COMM_WORLD);
+ int status;
+
+ status = MPI_Alltoallv(NULL, sendcounts, sdispls, MPI_INT, rbuf, recvcounts, rdispls, MPI_INT, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_BUFFER)
+ printf("MPI_Alltoallv did not return MPI_ERR_BUFFER for empty sendbuf\n");
+ status = MPI_Alltoallv(sbuf, NULL, sdispls, MPI_INT, rbuf, recvcounts, rdispls, MPI_INT, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_COUNT)
+ printf("MPI_Alltoallv did not return MPI_ERR_COUNT for NULL sendcounts\n");
+ status = MPI_Alltoallv(sbuf, sendcounts, NULL, MPI_INT, rbuf, recvcounts, rdispls, MPI_INT, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_ARG)
+ printf("MPI_Alltoallv did not return MPI_ERR_ARG for NULL senddispl\n");
+ status = MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_DATATYPE_NULL, rbuf, recvcounts, rdispls, MPI_INT, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_TYPE)
+ printf("MPI_Alltoallv did not return MPI_ERR_TYPE for MPI_DATATYPE_NULL sendtype\n");
+ if (rank == 0)//if total recvcounts == 0 the call is not illegal, so be sure to fail for rank 0 to avoid deadlocks
+ status = MPI_Alltoallv(NULL, sendcounts, sdispls, MPI_INT, NULL, recvcounts, rdispls, MPI_INT, MPI_COMM_WORLD);
+ else
+ status = MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, NULL, recvcounts, rdispls, MPI_INT, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_BUFFER)
+ printf("MPI_Alltoallv did not return MPI_ERR_BUFFER for empty recvbuf\n");
+ status = MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, rbuf, NULL, rdispls, MPI_INT, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_COUNT)
+ printf("MPI_Alltoallv did not return MPI_ERR_COUNT for NULL recvcounts\n");
+ status = MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, rbuf, recvcounts, NULL, MPI_INT, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_ARG)
+ printf("MPI_Alltoallv did not return MPI_ERR_ARG for NULL recvdispl\n");
+ status = MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, rbuf, recvcounts, rdispls, MPI_DATATYPE_NULL, MPI_COMM_WORLD);
+ if(status!=MPI_ERR_TYPE)
+ printf("MPI_Alltoallv did not return MPI_ERR_TYPE for MPI_DATATYPE_NULL recvtype\n");
+ status = MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, rbuf, recvcounts, rdispls, MPI_INT, MPI_COMM_NULL);
+ if(status!=MPI_ERR_COMM)
+ printf("MPI_Alltoallv did not return MPI_ERR_COMM for MPI_COMM_NULL comm\n");
+
+ print_buffer_int(sbuf, size2, "sbuf:", rank);
+ print_buffer_int(sendcounts, size, "scount:", rank);
+ print_buffer_int(recvcounts, size, "rcount:", rank);
+ print_buffer_int(sdispls, size, "sdisp:", rank);
+ print_buffer_int(rdispls, size, "rdisp:", rank);
+
+ status = MPI_Alltoallv(sbuf, sendcounts, sdispls, MPI_INT, rbuf, recvcounts, rdispls, MPI_INT, comm);
+ if (status != MPI_SUCCESS)
+ printf("MPI_Alltoallv did not return MPI_SUCCESS\n");
+
+ print_buffer_int(rbuf, size2, "rbuf:", rank);
+
+ MPI_Barrier(MPI_COMM_WORLD);