[mpi-21] Ballot 4 proposal: fix attribute example 4.13
Jeff Squyres
jsquyres at [hidden]
Thu Feb 7 12:23:53 CST 2008
On Feb 7, 2008, at 12:51 PM, Rolf Rabenseifner wrote:
>>> Additional proposal (B): Add at the end of the previous text:
>>> The application must not change this integer valued attribute
>>> at the returned address.
>>
>> I had to think about this quite a bit before I "got it" -- you're
>> saying that when an integer-valued attribute is set (from fortran),
>> the MPI implementation must be caching the value internally and then
>> returning a pointer to that internally cached value. Hence, the
>> address is only valid as long as the MPI object is valid.
>>
>> However, I'm not sure about the requirement of not changing the value
>> (for integer-valued attributes). If you MPI_xxx_get_attr from C and
>> change the value, it'll be changed for any subsequent
>> MPI_xxx_get_attr
>> calls from C or Fortran. However, if you MPI_xxx_get_attr from
>> Fortran and change the value, the next call to MPI_xxx_get_attr will
>> have the original value.
>>
>> Are you just trying to avoid this disparity?
>
> Normally, MPI never gives the application the right to change
> anything in a opaque object without calling an MPI routine.
>
> C-routine MPI_xxx_get_attr is called with a handle to a opaque object
> that has stored a Fortran integer-valued attribute.
> IF we allow, that MPI_xxx_get_attr returns a pointer to foo
> and foo contains the value of such fortran-integer-attribute,
> AND IF we allow that a subsequent same call to MPI_xxx_get_attr
> returns
> the same pointer to same foo,
> AND IF we allow that the application may change the value of foo,
> THEN I would report:
> foo is part of the opaque object
> and we allowed that the application has changed the value without
> calling MPI_xxx_set_attr.
Ah, I can see this rationale. Good point. It might be helpful to
have some synopsis of your above text should be part of a "Rationale"
block in the official text, because that's not immediately obvious.
What I have difficulty resolving, though, is that this would be an
asymmetrical exception:
1. set attribute in fortran, get attribute in fortran: allowed to change
2. set attribute in fortran, get attribute in C: *NOT* allowed to change
3. set attribute in C, get attribute in C: allowed to change
4. set attribute in C, get attribute in fortran: allowed to change
I can see your rationale; it's just that this asymmetry makes me...
uncomfortable. Indeed, case 2 is the only case where the life of the
MPI object is related to the life of the attribute. That's just weird
to me.
But I could probably be convinced that this is ok -- after all, who
really cares about attributes! ;-) (e.g., the set-in-C-get-in-
fortran case is almost useless...)
> If we do not want this, then there are two solutions:
> - restrictive: to forbid changing the value from C directly;
> - memory wasting: producing always a new foo in each call to
> MPI_xxx_get_attr.
The memory wasting solution is no good -- we'd either have to say that
the caller is reponsible for free()'ing the returned pointer or accept
a memory leak, because there's no way for the caller to give the
pointer back to MPI and say "I'm done with this".
--
Jeff Squyres
Cisco Systems
More information about the Mpi-21
mailing list