[MPIWG Fortran] F08 and pair types?

Jeff Squyres (jsquyres) jsquyres at cisco.com
Wed Dec 9 07:45:35 CST 2015


On Dec 8, 2015, at 6:31 PM, Bill Long <longb at cray.com> wrote:
> 
> As I understand the high-level situation, this is all for MPI_REDUCE and friends, and MPI_2INTEGER and MPI_MINLOC or MPI_MAXLOC are all just magic constants that the MPI_REDUCE routine internally decodes to determine what to do.  The actual data, the in and out arguments of MPI_REDUCE, are choice arguments (void *). 

> Current codes have the actual argument IN declared as INTEGER :: IN (2, K) where K is the number of things in the list to be reduced. IN(1,*) is the “VAL" value, and IN(2,*) is the “LOC” value.  Since the corresponding dummy argument is (void *) you can pass any actual type, since only the memory layout matters. 

Correct.

> If the above is correct, then the following declarations would have the same memory layouts for the actual arguments:
> 
> INTEGER :: IN(2, K)
> 
> and
> 
> TYPE MPI_2INTEGER_TYPE
>    SEQUENCE
>    INTEGER :: VAL
>    INTEGER :: LOC
> END TYPE
> 
> TYPE(MPI_2INTEGER_TYPE) :: IN(K)
> 
> This seems like sugar coating for the 2INTEGER case. 

Yes, exactly.

Is there a way to do it without SEQUENCE (since that is frowned upon)?

> But, the following would likely not be equivalent:
> 
> DOUBLE PRECISION :: IN(2, K)
> 
> and
> 
> TYPE MPI_DOUBLE_INT_TYPE
>   SEQUENCE
>   DOUBLE PRECISION :: VAL
>   INTEGER :: LOC
> END TYPE
> 
> TYPE(MPI_DOUBLE_INT_TYPE) :: IN(K)

Right -- I'm not trying to make those equivalent.

To be clear:

- the only one where we need this equivalence MPI_2INTEGER.
- the intent is to deprecate MPI_2DOUBLE_PRECISION and MPI_2REAL
  --> I assume that these are historical artifacts that were created before derived types existed
- and then create 2 new types: MPI_DOUBLE_PRECISION_INTEGER and MPI_REAL_INTEGER
  --> these will be analogous to their C counterparts (but using Fortran types, not C types)

>> 2. I wasn't looking to emulate the C types in Fortran -- I think we've had this discussion before.  The intent is to have Fortran-native types (that would be natural for Fortran programmers).
> 
> I think BIND(C) is “natural” for Fortran programmers these days.  This stuff has been around for over a decade.  The use of “DOUBLE PRECISION” is far less natural these days.  Essentially everyone has switched to REAL(KIND= ) instead.  That stuff is 25 years old. 

Hmm.  Ok, that's the opposite advice we got for MPI-3.0 (which was now admittedly several years ago).

Soo... which way should it go these days?

- use native Fortran datatypes
- use C datatypes (via BIND(C))

I.e., when users want to use MINLOC / MAXLOC in fortran, will they be using this across DOUBLE PRECISION values, or Type(C_DOUBLE)?

-- 
Jeff Squyres
jsquyres at cisco.com
For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/




More information about the mpiwg-fortran mailing list