How do I retain precision for a Fortran MPI program in a portable way?

前端 未结 3 1986
独厮守ぢ
独厮守ぢ 2020-12-11 01:36

I have a Fortran program where I specify the kind of the numeric data types in an attempt to retain a minimum level of precision, regardless of what compiler is

3条回答
  •  借酒劲吻你
    2020-12-11 01:54

    Not really an answer, but we have the same problem and use something like this:

    !> Number of digits for single precision numbers
    integer, parameter, public :: single_prec = 6
    !> Number of digits for double precision numbers
    integer, parameter, public :: double_prec = 15
    !> Number of digits for extended double precision numbers
    integer, parameter, public :: xdble_prec = 18
    !> Number of digits for quadruple precision numbers
    integer, parameter, public :: quad_prec = 33
    
    integer, parameter, public :: rk_prec = double_prec
    
    !> The kind to select for default reals
    integer, parameter, public :: rk = selected_real_kind(rk_prec)
    

    And then have an initialization routine where we do:

    !call mpi_type_create_f90_real(rk_prec, MPI_UNDEFINED, rk_mpi, iError)
    !call mpi_type_create_f90_integer(long_prec, long_k_mpi, iError)
    ! Workaround shitty MPI-Implementations.
    select case(rk_prec)
    case(single_prec)
      rk_mpi = MPI_REAL
    case(double_prec)
      rk_mpi = MPI_DOUBLE_PRECISION
    case(quad_prec)
      rk_mpi = MPI_REAL16
    case default
      write(*,*) 'unknown real type specified for mpi_type creation'
    end select
    long_k_mpi = MPI_INTEGER8
    

    While this is not nice, it works reasonably well, and seems to be usable on Cray, IBM BlueGene and conventional Linux Clusters. Best thing to do is push sites and vendors to properly support this in MPI. As far as I know it has been fixed in OpenMPI and planned to be fixed in MPICH by 3.1.1. See OpenMPI Tickets 3432 and 3435 as well as MPICH Tickets 1769 and 1770.

提交回复
热议问题