MPI_REDUCE
该操作对通信域内所有进程的数据进行给定操作的运算后,将结果保存到根进程中。
1. Fortran调用格式
CALL MPI_REDUCE(sendbuf,recvbuf,count,datatype,op,root,comm,ierr)
! sendbuf 发送消息缓冲区的起始地址
! recvbuf 接收消息缓冲区的地址
! count 发送消息缓冲区的数据个数
! datatype 发送消息缓冲区的元素类型
! op 归约操作符
! root 根进程序列号
! comm 通信域
2. 归约操作符
归约操作 | 含义 |
---|---|
MPI_MAX | 最大值 |
MPI_MIN | 最小值 |
MPI_SUM | 求和 |
MPI_PROD | 求积 |
MPI_LAND | 逻辑与 |
MPI_BAND | 按位与 |
MPI_LOR | 逻辑或 |
MPI_BOR | 按位或 |
MPI_LXOR | 逻辑异或 |
MPI_BXOR | 按位异或 |
MPI_MAXLOC | 最大值且相应位置 |
MPI_MINLOC | 最小值且相应位置 |
3. Fortran求解pi
!pi_reduce.f90
PROGRAM Main
use mpi
IMPLICIT NONE
INTEGER :: np,myid
INTEGER :: N=1000000
INTEGER :: i,j,ierr
REAL*8 :: pi=0.0,pi_local=0.0
REAL*8 :: h,xi,fval
h = 1.0/N
CALL MPI_INIT(ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,np,ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
i = myid
DO WHILE(i<N)
xi = (i+0.5)*h
fval = 4/(1.0+xi**2)
pi_local = pi_local+h*fval
i = i+np
ENDDO
CALL MPI_REDUCE(pi_local,pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD,ierr)
IF (myid .eq. 0) THEN
WRITE(0,*) 'pi = ',pi
ENDIF
最终结果:
$ mpifort -o pi_reduce pi_reduce.f90
$ mpirun -n 4 pi_reduce
pi = 3.14159264854036