Author: goodell Date: 2012-12-20 20:18:52 -0600 (Thu, 20 Dec 2012) New Revision: 10800 Modified: mpich2/trunk/src/mpi/romio/mpi-io/prealloc.c mpich2/trunk/src/mpi/romio/mpi-io/set_size.c Log: ROMIO: check for consistent prealloc sizes By using MPI_Allreduce to get the maximum value and minimum value of all sizes, when the two values are identical, all processes have same values of size. The problem of checking the sizes with MPI_Bcast is that the root will pass the check while the others not. Based on patch 0004 from the second round of IBM's error checking patches. Modified: mpich2/trunk/src/mpi/romio/mpi-io/prealloc.c =================================================================== --- mpich2/trunk/src/mpi/romio/mpi-io/prealloc.c 2012-12-21 02:18:49 UTC (rev 10799) +++ mpich2/trunk/src/mpi/romio/mpi-io/prealloc.c 2012-12-21 02:18:52 UTC (rev 10800) @@ -38,7 +38,7 @@ int error_code=0, mynod=0; ADIO_File adio_fh; static char myname[] = "MPI_FILE_PREALLOCATE"; - MPI_Offset tmp_sz; + MPI_Offset tmp_sz, max_sz, min_sz; #ifdef MPI_hpux int fl_xmpi; @@ -62,9 +62,10 @@ } tmp_sz = size; - MPI_Bcast(&tmp_sz, 1, ADIO_OFFSET, 0, adio_fh->comm); + MPI_Allreduce(&tmp_sz, &max_sz, 1, ADIO_OFFSET, MPI_MAX, adio_fh->comm); + MPI_Allreduce(&tmp_sz, &min_sz, 1, ADIO_OFFSET, MPI_MIN, adio_fh->comm); - if (tmp_sz != size) { + if (max_sz != min_sz) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**notsame", 0); Modified: mpich2/trunk/src/mpi/romio/mpi-io/set_size.c =================================================================== --- mpich2/trunk/src/mpi/romio/mpi-io/set_size.c 2012-12-21 02:18:49 UTC (rev 10799) +++ mpich2/trunk/src/mpi/romio/mpi-io/set_size.c 2012-12-21 02:18:52 UTC (rev 10800) @@ -37,7 +37,7 @@ int error_code; ADIO_File adio_fh; static char myname[] = "MPI_FILE_SET_SIZE"; - MPI_Offset tmp_sz; + MPI_Offset tmp_sz, max_sz, min_sz; #ifdef MPI_hpux int fl_xmpi; @@ -65,10 +65,11 @@ /* --END ERROR HANDLING-- */ tmp_sz = size; - MPI_Bcast(&tmp_sz, 1, ADIO_OFFSET, 0, adio_fh->comm); + MPI_Allreduce(&tmp_sz, &max_sz, 1, ADIO_OFFSET, MPI_MAX, adio_fh->comm); + MPI_Allreduce(&tmp_sz, &min_sz, 1, ADIO_OFFSET, MPI_MIN, adio_fh->comm); /* --BEGIN ERROR HANDLING-- */ - if (tmp_sz != size) { + if (max_sz != min_sz) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**notsame", 0);