Re: [MPIWG Fortran] Question about named constants
On Jun 18, 2015, at 11:05 AM, Junchao Zhang <[email protected]> wrote:
Hello, Fortran experts, I am a little puzzled by MPI-3.1 Chapter 2.5.4,
Not surprising. The (mis)use of terminology is confusing at best.
All named constants, with the exceptions noted below for Fortran, can be used in initialization expressions or assignments, but not necessarily in array declarations or as labels in C switch or Fortran select/case statements. This implies named constants to be link-time but not necessarily compile-time constants.
In Fortran “named constant” is a defined term. They are declared with the PARAMETER attribute. And can be used in most places where literal constants can be used, including array declarations. They cannot be used as statement labels, though I think the reference to “Fortran select/case statements” intends to talk about case-values, and not labels. Named constants can be used as case-values.
Then in F08, should MPI_INTEGER be declared as a parameter variable?
Yes. That’s what I did in my prototype mpi_f08 modules.
If no, then I get an error when compiling this initialization expression with gfortran type(MPI_Datatype) :: dtype = MPI_INTEGER
Error: Parameter 'mpi_integer' at (1) has not been declared or is a variable, which does not reduce to a constant expression
If yes, then of course I can use MPI_INTEGER in Fortran select/case.
Right.
Another question is what is the meaning of "link-time constants". I could not find in MPI. Does it mean I can use MPI_INTEGER after main before MPI_Init?
I suspect this is a historical artifact where some special head standing was needed to correctly define MPI_INTEGER based on whether the code was compiled with -i4 or -i8 (or equivalent, depending on the compiler). For the modern case of using the mpi_f08 module, you just compile the mpi_f08 module twice (once with -i4 and once with -i8) and then have the compile command select the right actual module to reference based on how the using program unit is compiled. Generally, values of objects are not set at link time; addresses of objects are set at link time. MPI objects that represent addresses (MPI_BOTTOM ??) are examples. If MPI_INTEGER is accessible, you can reference it. If should not have anything to do with whether MPI_Init has been called. Perhaps some of the MPI historians can shed more light on this terminology. I suspect it would be completely moot if we got rid of mpif.h. Cheers, Bill
Thank you!
--Junchao Zhang _______________________________________________ mpiwg-fortran mailing list [email protected] http://lists.mpi-forum.org/mailman/listinfo.cgi/mpiwg-fortran
Bill Long [email protected] Fortran Technical Support & voice: 651-605-9024 Bioinformatics Software Development fax: 651-605-9142 Cray Inc./ Cray Plaza, Suite 210/ 380 Jackson St./ St. Paul, MN 55101
participants (1)
-
Bill Long