编译器:gfortran-4.8.5
MPI 库:OpenMPI-1.7.2(预装 OpenSuSE 13.2)
这个程序:
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
我也试过real(16)
,real(kind(1.q0))
。对于这个编译器,real(real128)
实际上是等价的。real*10
结果是:
> 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
程序找到真正的最大值以real*10
保持MPI_REAL16
。MPI 规范(3.1,第 628 和 674 页)不是很清楚是否MPI_REAL16
对应real*16
或real(real128)
不同。
此外,假设MPI_REAL16
实际上real(real128)
并尝试在程序中使用它会导致不同的问题:
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)
这不会发生real*16
。(忽略一个应该能够通过任何位模式,所以这个检查是多余的)
使用 16 字节实数的正确方法是什么?OpenMPI 库是否出错?