On 8/8/12 11:28 PM, "Eugene Loh" <eugene....@oracle.com> wrote:

>On 8/7/2012 5:45 AM, Jeff Squyres wrote:
>> So the issue is when (for example) Fortran MPI_Recv says "hey, C ints
>>are the same as Fortran INEGERs, so I don't need a temporary MPI_Status
>>buffer; I'll just use the INTEGER array that I was given, and pass it to
>>the back-end C MPI_Recv() routine." Then C MPI_Recv() tries to write to
>>the size_t variable, and it might be poorly aligned.  Kaboom.
>Right.  Kind of.  Read on...
>>> So, specifically, what I propose is getting rid of the short-cuts that
>>>try to use Fortran statuses in-place if Fortran INTEGERs are as big as
>>>C ints.  I can make the changes.  Sanity checks on all that are welcome.
>> Hmm.  I'm not excited about this -- the whole point is that if we don't
>>need to do an extra copy, let's not do it.
>>
>> Is there a better way to fix this?
>>
>> Off the top of my head -- for example, could we change some of those
>>compile-time checks to run-time checks, and add in an alignment check?
>>E.g.:
>>
>> ----
>> #if OMPI_SIZEOF_FORTRAN_INTEGER == SIZEOF_INT
>>        c_status = (MPI_Status *) status;
>> #else
>>        c_status =&c_status2;
>> #endif
>> -----
>>
>> to
>>
>> ----
>>      /* The constant checks will be resolved at compile time; assume
>>         alignment_is_good() is an inline macro checking for "good"
>>alignment
>>         on platforms where alignment(int) != alignment(size_t) */
>>      if (OMPI_SIZEOF_FORTRAN_INTEGER == SIZEOF_INT&&
>>alignment_is_good(status)) {
>>        c_status = (MPI_Status *) status;
>>      } else {
>>        c_status =&c_status2;
>>      }
>> -----
>>
>> Would something like that work?
>>
>> I'm thinking that the benefit here is that we only penalize platforms
>>(with an extra "if" statement) where alignment(int) != alignment(size_t).
>I did quite a bit more poking around.  It appears this issue is already
>"well known."  That is, due to this issue, we're not allowed to assume
>that a status that the user passed to us (ompi/mpi/c layer) has proper
>alignment since it might have come from Fortran.  So, we should use
>OMPI_STATUS_SET and OMPI_STATUS_SET_COUNT instead of doing direct status
>assignments.  Not only does ompi/request/request.h define these macros,
>but it also gives a nice description of the issue and points us to trac
>2526.
>
>It seems to me there are a number of places where we do direct status
>assignments.  I found a couple of places in ompi/mca/pml/ob1/*.c and
>quite a few more in ompi/mpi/c/*.c.  If I'm sufficiently inspired
>tomorrow, I might look around to see if I can identify other places to
>look.  I can also confirm this leads to failures -- not only the mprobe
>stuff I reported but even vanilla MPI_Recv if you tweak the conditions
>just right.  I'll try to get to this stuff tomorrow.


That's incorrect.  Fortran statuses should never be passed to C
interfaces.  If you look at testany_f.c, for example, a temporary status
is created and then passed to the C binding (although, in this case, it
would probably be more efficient to pass it directly to
ompi_request_testany(), but that's not important here).  The part that is
important is that outside of the Fortran interfaces themselves, requests
are always C requests.


Brian

-- 
  Brian W. Barrett
  Dept. 1423: Scalable System Software
  Sandia National Laboratories






Reply via email to