On 08/27/2014 08:32 AM, Jeff Squyres (jsquyres) wrote:
On Aug 27, 2014, at 10:05 AM, Orion Poplawski <or...@cora.nwra.com> wrote:

Can someone give me a quick overview of the tkr/ignore-tkr split in the fortran 
bindings?

Heh.  How much do you want to know?  How far down the Fortran rabbit hole do 
you want to go?  :-)

In the process of updating the Fedora openmpi packages from 1.8.1 in Fedora 
21/22 to 1.8.2 we seem to have gone from libmpi_usempi.so to 
libmpi_usempi_ignore_tkr.so and I'm not sure why.

Did you upgrade gcc/gfortran to 4.9[.x]?  If so, that's likely why.


That's the trick. Thanks very much for the description. I'm glad we got this change in now then, and it looks like we can safely update older releases if needed.

In short:

- pre gcc/gfortran-4.9: uses the TKR interface
- gcc/gfortran >= 4.9: uses the ignore-TKR interface

TKR = Fortran-eese for "type, kind, rank".  "Type" is what you would expect: INTEGER, DOUBLE PRECISION, 
...etc.  "Kind", as I understand it, is a variant of the type: e.g., there are different kinds of INTEGERs.  I'm sure 
that a Fortran expert will disagree with me here, but for a software engineer, it comes down to INTEGERs of different sizes: 2 
byte integer values, 4 byte integer values, etc.  "Rank" is the array dimension of the variable (which is a little 
confusing in an MPI context, where "rank" has an entirely different meaning).

Before Fortran 08, there was no Fortran equivalent of C's (void*).  Hence, it 
was actually impossible -- using pure Fortran -- to have Fortran prototypes for 
MPI subroutines that take a choice buffer (e.g., MPI_Send, which takes a 
(void*) buffer argument in C).

Most Fortran compilers have long-since had various pragmas that tell the 
compiler to ignore the TKR of a given subroutine parameter -- effectively 
making it like a C (void*).

Gfortran tends to be quite pure in its Fortran implementation and did not 
support this kind of ignore-TKR pragma until the 4.9 series.

Hence, gfortran <v4.9 uses the old OMPI "TKR"-based implementation (which is old, crotchety, 
and has various shortcomings).  Gfortran >=4.9 uses the shiny new "ignore TKR"-based 
implementation, which is significantly simpler, has more features, and is OMPI's defined path fortran for 
Fortran support.

Keep in mind that all of this is based one *one* of the 3 defined Fortran 
interfaces in MPI:

1. mpif.h
2. "mpi" module
3. "mpi_f08" module

Specificially, this conversation is about #2.  Many of the aspects also apply 
to #3, but the issues are (related but) a little different there.



--
Orion Poplawski
Technical Manager                     303-415-9701 x222
NWRA/CoRA Division                    FAX: 303-415-9702
3380 Mitchell Lane                  or...@cora.nwra.com
Boulder, CO 80301              http://www.cora.nwra.com

Reply via email to