Dries Kimpe wrote:
> 
> <quote>
> The problem is that the OpenMPI group takes ROMIO as-is from an older 
> release. Then they pass
> MPI_COMBINER_SUBARRAY as-is to ROMIO, which in that release it does not 
> understand. Then ROMIO blows up.
> </quote>
> 
> I'll try recompiling Open MPI with a newer version of ROMIO.
> 

Found the problem;
mca/io/romio/romio/adio/common/flatten.c  contains conditional code for
MPI implementations not supporting COMBINER_SUBARRAY, COMBINER_DARRAY
and COMBINER_DUP.

OpenMPI supports these, but fails to #define the necessary symbols:

MPIIMPL_HAVE_MPI_COMBINER_DARRAY
MPIIMPL_HAVE_MPI_COMBINER_SUBARRAY
MPIIMPL_HAVE_MPI_COMBINER_DUP

Because of this, ROMIO excludes support for these datatype constructors.

Solution:
remove the #ifdef/#endif in flatten.c or #define the correct symbols.

I verified that this solves the problem. (pnetcdf tests work now).

Atteched patch removes the conditional code.

  Greetings,
  Dries
Index: flatten.c
===================================================================
--- flatten.c   (revision 9836)
+++ flatten.c   (working copy)
@@ -116,7 +116,6 @@
     MPI_Type_get_contents(datatype, nints, nadds, ntypes, ints, adds, types);

     switch (combiner) {
-#ifdef MPIIMPL_HAVE_MPI_COMBINER_DUP
     case MPI_COMBINER_DUP:
         MPI_Type_get_envelope(types[0], &old_nints, &old_nadds,
                              &old_ntypes, &old_combiner); 
@@ -124,8 +123,6 @@
        if ((old_combiner != MPI_COMBINER_NAMED) && (!old_is_contig))
             ADIOI_Flatten(types[0], flat, st_offset, curr_index);
         break;
-#endif
-#ifdef MPIIMPL_HAVE_MPI_COMBINER_SUBARRAY
     case MPI_COMBINER_SUBARRAY:
         {
            int dims = ints[0];
@@ -142,8 +139,6 @@
            MPI_Type_free(&stype);
        }
        break;
-#endif
-#ifdef MPIIMPL_HAVE_MPI_COMBINER_DARRAY
     case MPI_COMBINER_DARRAY:
        {
            int dims = ints[2];
@@ -163,7 +158,6 @@
            MPI_Type_free(&dtype);
        }
        break;
-#endif
     case MPI_COMBINER_CONTIGUOUS:
        top_count = ints[0];
         MPI_Type_get_envelope(types[0], &old_nints, &old_nadds,
@@ -523,7 +517,6 @@
     MPI_Type_get_contents(datatype, nints, nadds, ntypes, ints, adds, types);

     switch (combiner) {
-#ifdef MPIIMPL_HAVE_MPI_COMBINER_DUP
     case MPI_COMBINER_DUP:
         MPI_Type_get_envelope(types[0], &old_nints, &old_nadds,
                               &old_ntypes, &old_combiner); 
@@ -535,8 +528,6 @@
                (*curr_index)++;
        }
         break;
-#endif
-#ifdef MPIIMPL_HAVE_MPI_COMBINER_SUBARRAY
     case MPI_COMBINER_SUBARRAY:
         {
            int dims = ints[0];
@@ -557,8 +548,6 @@

        }
        break;
-#endif
-#ifdef MPIIMPL_HAVE_MPI_COMBINER_DARRAY
     case MPI_COMBINER_DARRAY:
        {
            int dims = ints[2];
@@ -581,7 +570,6 @@
            MPI_Type_free(&dtype);
        }
        break;
-#endif
     case MPI_COMBINER_CONTIGUOUS:
         top_count = ints[0];
         MPI_Type_get_envelope(types[0], &old_nints, &old_nadds,

Reply via email to