[MPI3 Fortran] MPI Data types
Hubert Ritzdorf
ritzdorf at it.neclab.eu
Thu May 7 14:02:45 CDT 2009
The function CFI_is_contiguous() is what Jeff was referencing to the last
Chicago meeting. cdesc->elem_len doesn't help the MPI programmer
since there is a special constant (MPI_BOTTOM) and other
possibilities to construct the MPI datatype. I think, there are
4 possibilities in case of an MPI_Send/MPI_Isend:
(1) CFI_is_contiguous() returns isContiguous == true and
MPI datatype is contiguous:
MPI uses cdesc->base_add and sends count elements of
the MPI datatype.
(2) CFI_is_contiguous() returns isContiguous == true and
MPI datatype is NOT contiguous:
MPI uses address cdesc->base_add and sends count elements of
the MPI datatype.
(3) CFI_is_contiguous() returns isContiguous == false and
MPI datatype is contiguous:
MPI uses the the cdesc description ( including cdesc->base_add and
cdesc->elem_len) in order to pack count data elements of the
non-contiguous
Fortran array (similar to a Fortran copy-in; of course MPI can do
this packing on the fly).
This would be backward compatible to behaviour
of actual Fortran 90 compilers.
(4) CFI_is_contiguous() returns isContiguous == false and
MPI datatype is non-contiguous:
This is the tricky part:
(a) If MPI should be compatible to actual Fortran 90 compiler,
it must simulate the packing (copy in) and apply the
non-contiguous MPI datatype, to the packed buffer.
This corresponds to (3).
(b) Otherwise, handle the buffer and the MPI datatype
such as in (2).
Hubert
Craig Rasmussen wrote:
> I'll try to be gentle to you C folk (except for Jeff of course :-)
>
> The MPI implementation will get an array descriptor instead of _just_
> a pointer. Consider a simple MPI_send,
>
> void MPI_send(CFI_desc_t * cdesc, int count, int * error)
> {
> void * addr = cdesc->base_add; /* this is the normal address C
> expects (given some qualifications) */
>
> /* now for some example error checking code, not real code */
>
> assert(cdesc->type == the_right_MPI_type_given_by_the_user);
>
> CFI_is_contiguous(cdesc, &isContiguous); /* this function supplied
> by Fortran compiler */
> assert(isContiguous);
>
> assert(MPI_lib_actual_size(cdesc) >= count*cdesc->elem_len); /*
> this function supplied by MPI library */
>
> addr = MPI_lib_actual_addr_start(cdesc); /* this function supplied
> by MPI library */
>
> /* now can send data */
>
> *error = ...
> }
>
>
> On May 7, 2009, at 10:54 AM, N.M. Maclaren wrote:
>
>> On May 7 2009, Jeff Squyres wrote:
>>>
>>> I don't understand the implications of what you are saying. Be
>>> gentle with me; I'm *NOT* a Fortran expert (or anywhere close).
>>
>> Sorry.
>>
>> C's array model is confused, but the issue is its semantic aspect. A C
>> array is simply a pointer to the first element of a contiguous sequence
>> of an unspecified number of elements. Nothing more. A void * pointer
>> is the first byte of an unspecified length of storage of unspecified
>> type. It is assumed that it is of appropriate alignment and size for
>> how
>> it is used, but that information is not associated with an array
>> argument.
>>
>> A Fortran array is strongly typed (the first difference), and it
>> comes in
>> many forms. Most of them are contiguous, but the most important
>> Fortran 90
>> one (plain assumed size) is not. All but assumed shape (a Fortran 77
>> feature) have a strongly associated size. It is the user's
>> responsibility
>> to never pass a smaller array to a largerr argument.
>>
>> Pretty well all combinations are allowed in argument passing, and the
>> compiler is expected to use copy-in/copy-out when needed. In
>> particular,
>> it is needed (in general) when passing an assumed-shape array to an
>> assumed
>> size argument (which is the form that matches C's model). That can be
>> locked out, but that means that callers cannot use assumed shape arrays,
>> which (as I said) are the main Fortran 90 mechanism.
>>
>>>> I thought that we were discussing features to enable MPI-3 to
>>>> support things
>>>> like Fortran array arguments that have no equivalent in C (principally
>>>> assumed shape).
>>>
>>> I don't understand. What does it matter if there is no equivalent
>>> data type in C?
>>
>> Not data type - semantic model.
>>
>>> MPI is about message passing -- as long as we can get a memory
>>> layout description of the data to send / receive, then it doesn't
>>> matter what language the data will be accessed from.
>>
>> Yes, but ....
>>
>> The data layout is part of the MPI datatype, so there is a problem when
>> passing a Fortran 90 assumed shape REAL array (for example). If the MPI
>> datatype is REAL, the MPI send / receive needs to handle discontiguous
>> data (which it doesn't). If the MPI datatype is an MPI derived type,
>> there
>> is no direct equivalence between the Fortran and C interfaces.
>>
>>
>> Regards,
>> Nick Maclaren,
>> University of Cambridge Computing Service,
>> New Museums Site, Pembroke Street, Cambridge CB2 3QH, England.
>> Email: nmm1 at cam.ac.uk
>> Tel.: +44 1223 334761 Fax: +44 1223 334679
>>
>>
>>
>> _______________________________________________
>> mpi3-fortran mailing list
>> mpi3-fortran at lists.mpi-forum.org
>> http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-fortran
>
> _______________________________________________
> mpi3-fortran mailing list
> mpi3-fortran at lists.mpi-forum.org
> http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-fortran
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3245 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.mpi-forum.org/pipermail/mpiwg-fortran/attachments/20090507/4bf050f5/attachment-0001.bin>
More information about the mpiwg-fortran
mailing list