[mpich2-dev] fandcattrf90 test on BGP
Rajeev Thakur
thakur at mcs.anl.gov
Wed Sep 30 09:11:24 CDT 2009
Bill's recent commits to the trunk have fixed both the attribute problem
when --with-aint-size=8 is set and errors in the use of the segment
routines in the ch3 code (which caused failures in the tests when
sizeof(MPI_Aint) was different from the sizeof(MPIDI_msg_sz_t)).
Rajeev
_____
From: mpich2-dev-bounces at mcs.anl.gov
[mailto:mpich2-dev-bounces at mcs.anl.gov] On Behalf Of Joe Ratterman
Sent: Thursday, July 16, 2009 4:56 PM
To: MPICH2 Dev
Subject: [mpich2-dev] fandcattrf90 test on BGP
(This is a re-send; I got a pile of python errors on the last try)
https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/test/mpi/f90/attr/fandcat
trf90.f90
https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/test/mpi/f90/attr/fandcat
trc.c
This test creates an attribute in F90, sets it in F90, and then reads it
back in C. It was getting the wrong answer:
Expected: 5555 (0x15b3)
Actual: 23858543329280 (0x15b300000000)
fandcattrf90.f90 excerpt
program main
use mpi
integer (kind=MPI_ADDRESS_KIND) val
errs = 0
call mpi_init(ierr)
commextra = 1001
call mpi_comm_create_keyval( mycopyfn, mydelfn,
&
& fcomm2_keyval, commextra, ierr )
val = 5555
call mpi_comm_set_attr( MPI_COMM_WORLD, fcomm2_keyval, val, ierr )
call chkcomm2inc( fcomm2_keyval, 5555, errs )
fandcattrc.c excerpt
int chkcomm2inc_ (int *keyval, const int *expected, int *ierr)
{
int flag;
MPI_Aint *val;
/* See Example 16.19 in MPI 2.2, part B. The use of MPI_Aint *val
and the address of val in the get_attr call is correct, as is
the use of *val to access the value. */
MPI_Comm_get_attr( MPI_COMM_WORLD, *keyval, &val, &flag );
if (!flag) {
*ierr = 1;
}
else {
if (*val != *expected) {
/* In some cases, using printf from a c routine linked
with a Fortran routine can cause linking difficulties.
To avoid problems in running the tests, this print
is commented out */
/* printf( "Val = %x, expected = %d\n", val, *expected ); */
*ierr = *ierr + 1;
}
}
}
BGP has an 8-byte MPI_Aint and a 4-byte void*, which seems to be the
root of the problem. MPI_Comm_get_attr() stores the integer data in a
void* internally. That means that there are only 4 bytes of actual
data, but *(MPI_Aint*)val tries to read 8 bytes. Effectively, that
means that MPI_Comm_get_attr() only returns an int*. This is a problem
caused by assuming that everything--specifically including MPI_Aint
values--will fit in the space used by a void*. The solution is to store
all attributes in an MPI_Aint. Since an MPI_Aint clearly cannot be
smaller than a void*, this will work fine. There is already special
code to handle the case of storing a 4-byte big-endian int in a 8-byte
void*, so a 4-byte void* in a 8-byte MPI_Aint would be very similar.
One idea that strikes me as really good is to change the "value" field
in the MPID_Attribute structure to be a union of int, void*, and
MPI_Aint types with three different names. That would get rid of the
interesting work that is required to handle 8-byte void* and 4-byte
ints. It would also make it easier to add MPI_Aint changes. You
wouldn't have to worry about the strangeness of storing an integer type
in a pointer type, and it would automatically handle any differences in
the sizes of the elements. You already track the data type, so you
would know into which element the attribute should be stored.
Comments or questions?
Joe Ratterman
jratt at us.ibm.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/mpich2-dev/attachments/20090930/513c5966/attachment.htm>
More information about the mpich2-dev
mailing list