Attribute keys can be allocated in one language and freed in another. Similarly, attribute values can be set in one language and accessed in another. To achieve this, attribute keys will be allocated in an integer range that is valid all languages. The same holds true for system-defined attribute values (such as MPI_TAG_UB, MPI_WTIME_IS_GLOBAL, etc.)
Attribute keys declared in one language are associated with copy and delete functions in that language (the functions provided by the MPI_{TYPE,COMM,WIN}_CREATE_KEYVAL call). When a communicator is duplicated, for each attribute, the corresponding copy function is called, using the right calling convention for the language of that function; and similarly, for the delete callback function.
Advice
to implementors.
This requires that attributes be tagged either as ``C,'' ``C++'' or
``Fortran,'' and that the language tag be checked in order to use
the right calling convention for the callback function.
( End of advice to implementors.)
MPI will store, internally, address sized attributes. If Fortran
INTEGERs are smaller, then the Fortran
function MPI_ATTR_GET will return the least significant
part of the attribute word; the Fortran function
MPI_ATTR_PUT
will
set the least significant part of the attribute word, which will be
sign extended to the entire word.
(These two functions may be invoked explicitly by user code, or
implicitly, by attribute copying callback functions.)
As for addresses, new functions are provided that manipulate
Fortran address sized attributes, and have the same functionality as the
old
functions in C/C++. These functions are described in
Section Caching
, page Caching
.
Users are encouraged to use these new functions.
MPI supports two types of attributes: address-valued (pointer) attributes,
and integer valued attributes. C and C++
attribute functions put and get address
valued attributes. Fortran attribute functions put and get integer valued
attributes. When an integer valued attribute is accessed from C or C++,
then
MPI_xxx_get_attr
will return the address of (a pointer to) the integer
valued attribute. When an address valued attribute is accessed from
Fortran, then MPI_xxx_GET_ATTR
will convert the address into an integer and
return the result of this conversion. This conversion is lossless if new
style
attribute functions are used, and an integer of kind
MPI_ADDRESS_KIND
is returned. The conversion may cause truncation if
deprecated
attribute functions are used.
A. C to Fortran
The predefined MPI attributes can be integer valued or address valued.
Predefined integer valued attributes, such as MPI_TAG_UB,
behave as if they
were put by a Fortran call,
i.e.,
in Fortran,
MPI_COMM_GET_ATTR(MPI_COMM_WORLD, MPI_TAG_UB, val, flag, ierr)
will return in val
the upper bound for tag value; in C,
MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &p, &flag)
will return in p
a pointer to an int containing the upper bound for tag value.
Address valued predefined attributes, such as MPI_WIN_BASE
behave as if
they were put by a C call,
i.e.,
in Fortran,
MPI_WIN_GET_ATTR(win, MPI_WIN_BASE, val, flag, ierror)
will return in val the base address of the window,
converted to an integer. In C,
MPI_Win_get_attr(win, MPI_WIN_BASE, &p, &flag)
will return in p
a pointer to the window base, cast to (void *).
The design is consistent with the behavior
specified
for predefined
attributes, and ensures that no information is lost when attributes are
passed from language to language.
( End of rationale.)
Implementations should tag attributes either as address attributes or as
integer attributes, according to whether they were set in C or in Fortran. Thus,
the right choice can be made when the attribute is retrieved.
( End of advice to implementors.)
The attribute manipulation functions described in
Section Caching
on page Caching
define
attributes arguments to be of type void* in C, and of type
INTEGER, in Fortran. On some systems,
INTEGERs will have 32 bits, while C/C++ pointers will have
64 bits. This is a problem if communicator attributes are used to
move information from a Fortran caller to a C/C++ callee, or
vice-versa.
Example
C code
static int i = 5;
void *p;
p = &i;
MPI_Comm_put_attr(..., p);
....
Fortran code
INTEGER(kind = MPI_ADDRESS_KIND) val
CALL MPI_COMM_GET_ATTR(...,val,...)
IF(val.NE.address_of_i) THEN CALL ERROR
B. Fortran to C
Fortran code
INTEGER(kind=MPI_ADDRESS_KIND) val
val = 55555
CALL MPI_COMM_PUT_ATTR(...,val,ierr)
C code
int *p;
MPI_Comm_get_attr(...,&p, ...);
if (*p != 55555) error();
Rationale.
Advice
to implementors.
![]()
![]()
![]()
Up: Language Interoperability
Next: Extra State
Previous: Addresses
Return to MPI-2.1 Standard Index
Return to MPI Forum Home Page
MPI-2.0 of July 1, 2008
HTML Generated on July 6, 2008