On Nov 13, 2013, at 22:41 , George Bosilca <bosi...@icl.utk.edu> wrote:
> > On Nov 13, 2013, at 21:05 , Jeff Squyres (jsquyres) <jsquy...@cisco.com> > wrote: > >> On Nov 12, 2013, at 4:25 PM, George Bosilca <bosi...@icl.utk.edu> wrote: >> >>>> However, the key here is that MPI_STATUS_SIZE is set to be the size of a >>>> ***C*** MPI_Status (but expressed in units of Fortran INTEGER size -- so >>>> in the sizeof(int)==sizeof(INTEGER)==4 case, MPI_STATUS_SIZE is 6. But in >>>> the sizeof(int)==4, sizeof(INTEGER)==8 case, MPI_STATUS_SIZE is 3. >>>> >>>> That being said, we *could* change this so that MPI_STATUS_SIZE is always >>>> 6, and have the C<—>Fortran status routines just do the Right Thing >>>> depending on the size/type of ompi_fortran_integer_t. >>> >>> Indeed. We can have an Fortran MPI_Status (only in the Fortran interface) >>> that will be 3 ompi_fortran_integer_t, and alter the translation macros to >>> do the right thing (translate from C int to the chosen Fortran int). >> >> >> I'm not sure I understand what you're proposing: what you say sounds like >> what we do today: >> >> - in the sizeof(int)==sizeof(INTEGER)==4 case, everything is the same size, >> and nothing special needs to be done > > Yes for this part. > >> - in the sizeof(int)==4, sizeof(INTEGER)==8 case, the Fortran status size is >> 3, but the C<->Fortran stuff still basically does a memcpy from the C >> MPI_Status to the Fortran array (meaning: the C int’s are not upsized to be >> fortran INTEGERs). > > No. The Fortran status must __always__ be 6, because we need enough room to > correctly convert the 3 useful variables to Fortran, plus copy the rest of > the hidden things.These 6 type will be INTEGER (which will then be different > than the C int). The C<->F stuff will do not a memcpy but copy all elements > while casting to the correct Fortran type (ompi_fortran_integer_t). > > The fact that we are talking about 3 integers in the Fortran status might > explain the segfault. This number should never be 3 it should be ALWAYS 6 or > the function MPI_Status_c2f will clearly overwrite the memory. I did manage to try this idea on an -i8 enabled Open MPI version. The test application provided on one of the early email successfully complete without the segfault and with a correct output. node= 0 and size= 2 : Hello node= 1 and size= 2 : Hello Iam = 1 and my temp value is = 1 Iam = 0 and my temp value is = 1 So the fix is trivial, make MPI_STATUS_SIZE always equal to sizeof(MPI_Status)/sizeof(int). Everything else is already taken care of by the current Fortran <-> C infrastructure. George. > > George. > > >> >> -- >> Jeff Squyres >> jsquy...@cisco.com >> For corporate legal information go to: >> http://www.cisco.com/web/about/doing_business/legal/cri/ >> >> _______________________________________________ >> users mailing list >> us...@open-mpi.org >> http://www.open-mpi.org/mailman/listinfo.cgi/users >