Compiler: gfortran-4.8.5
MPI library: OpenMPI-1.7.2 (preinstalled OpenSuSE 13.2)
This program:
use mpi
implicit none
real*16 :: x
integer :: ierr, irank, type16
call MPI_Init(ierr)
call MPI_Comm_Rank(MPI_Comm_World, irank, ierr)
if (irank+1==1) x = 2.1
if (irank+1==8) x = 2.8
if (irank+1==7) x = 5.2
if (irank+1==4) x = 6.7
if (irank+1==6) x = 6.5
if (irank+1==3) x = 5.7
if (irank+1==2) x = 4.0
if (irank+1==5) x = 6.8
print '(a,i0,a,f3.1)', "rank+1: ",irank+1," x: ",x
call MPI_AllReduce(MPI_IN_PLACE, x, 1, MPI_REAL16, MPI_MAX, MPI_Comm_World, ierr)
if (irank==0) print '(i0,a,f3.1)', irank+1," max x: ", x
call MPI_Finalize(ierr)
end
I also tried real(16)
, real(kind(1.q0))
. real(real128)
is actually equivalent with real*10
for this compiler.
The result is:
> mpif90 reduce16.f90
> mpirun -n 8 ./a.out
rank+1: 1 x: 2.1
rank+1: 2 x: 4.0
rank+1: 3 x: 5.7
rank+1: 4 x: 6.7
rank+1: 5 x: 6.8
rank+1: 6 x: 6.5
rank+1: 7 x: 5.2
rank+1: 8 x: 2.8
1 max x: 2.8
The program finds the true maximum for real*10
keeping MPI_REAL16
. The MPI specification (3.1, pages 628 and 674) is not very clear if MPI_REAL16
corresponds to real*16
or real(real128)
if these differ.
Also, assuming MPI_REAL16
is actually real(real128)
and trying to use that in a program leads to a different problem:
Error: There is no specific subroutine for the generic 'mpi_recv' at (1)
Error: There is no specific subroutine for the generic 'mpi_send' at (1)
which does not happen for real*16
.
(disregarding that one should be able to pass any bit pattern, so this check is superfluous)
What is the right way to use 16 byte reals? Is the OpenMPI library in error?
MPI_ERR_ARG: invalid argument of some other kind
fromcall MPI_TYPE_CREATE_F90_REAL(25, MPI_UNDEFINED, type16, ierr)
wheretype16
andierr
are integers. – Rauchinclude 'mpif.h'
before every subroutine call when MPI-3 already broughtuse mpi_f08
. – Rauchuse mpi_f08
interface in the release version and theuse mpi
anduse mpi_f08
syntaxes are already part of the man pages in the GitHub master. (Truth be told, the commit is from 2 days ago, but better late than never) – Armingtonq
rather thane
? Otherwise they will be truncated to single precision. I can also reproduce your problem on openmpi 1.10.0, with and without theq
. – Constellationq
is completely non-standard. The kind notation could be used, if I cared about those numbers. – Rauch