Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] Prototypes for Fortran MPI_ commands using 64-bit indexing
From: Dave Love (d.love_at_[hidden])
Date: 2013-12-10 11:42:27

George Bosilca <bosilca_at_[hidden]> writes:

>> 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.

This doesn't seem to have been fixed, and I think it's going to bite
here. Is this the right change?

--- openmpi-1.6.5/ompi/config/ompi_setup_mpi_fortran.m4~ 2012-04-03 15:30:24.000000000 +0100
+++ openmpi-1.6.5/ompi/config/ompi_setup_mpi_fortran.m4 2013-12-10 12:23:54.232854527 +0000
@@ -127,8 +127,8 @@
         AC_MSG_RESULT([skipped (no Fortran bindings)])
         bytes=`expr 4 \* $ac_cv_sizeof_int + $ac_cv_sizeof_size_t`
- num_integers=`expr $bytes / $OMPI_SIZEOF_FORTRAN_INTEGER`
- sanity=`expr $num_integers \* $OMPI_SIZEOF_FORTRAN_INTEGER`
+ num_integers=`expr $bytes / $ac_cv_sizeof_int`
+ sanity=`expr $num_integers \* $ac_cv_sizeof_int`
         AS_IF([test "$sanity" != "$bytes"],
                AC_MSG_WARN([WARNING: Size of C int: $ac_cv_sizeof_int])