最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

MPI库并行Fortran程序:进程通讯

来源:博客园


(相关资料图)

用MPI库并行Fortran程序时,常常需要进程通讯以实现数组同步。这里的一个简单的例子可以说明MPI_SEND命令和MPI_RECV命令的用法,以实现点到点的通讯。

需求描述

用三个进程,输出数列1,2,3,...10.其中进程0用于输出3,6,9。进程1用于输出1,4,7,10。进程2用于输出2,5,8。最后三个进程相互通讯,把数列均匀的输出。

MPI_SEND命令

CALL MPI_SEND(buffer,count,datatype,destination,tag,common,ierror)buffer数组或整形,实数都可。为待发送的数组或者变量名。count整形。为待发送数据的长度,单个变量的长度为1。datatype为以下选择中的1个:

MPI DATATYPEFortran DATATYPE
MPI_CHARACTERcharacter(1)
MPI_INTEGERinteger
MPI_REALreal
MPI_DOUBLE_PRECISIONdouble precision,适合REAL(kind=8)
MPI_COMPLEXcomplex
MPI_LOGICALlogical
MPI_BYTE8 binary digits

destination整形。为发送目的地的进程编号。tag整形。为通讯标识,当接收和发送的通讯标识一致时才会进行收发,否则会等待下去。commom通信器,一般使用系统预先定义的全局通信因子“MPI_COMM_WORLD”。ierror输出。如果执行成功则会返回0。

MPI_RECV命令

CALL MPI_RECV(buffer,count,datatype,source,tag,common,status,ierror)buffer数组或整形,实数都可。为接收的数组或者变量名。count整形。为接收数据的长度,单个变量的长度为1。datatype同MPI_SEND命令。source整形。为发送来源地的进程编号。tag整形。为通讯标识,要与MPI_SEND命令中的通讯标识一致。commom通信器,一般使用系统预先定义的全局通信因子“MPI_COMM_WORLD”。status输出。0表示还未收到。ierror输出。如果执行成功则会返回0。

示例程序

文件test_mpi.f程序如下

cloc       program test_mpi       USE MPI       INTEGER::  ICORE,NCORE,IERR,MASTER      DIMENSION::A(10)      DATA A/0,0,0,0,0,0,0,0,0,0/C INITIALIZATION      CALL MPI_INIT(IERR)      CALL MPI_COMM_RANK(MPI_COMM_WORLD,ICORE,IERR)      CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NCORE,IERR)      MASTER  = 0      IF(ICORE.EQ.MASTER) WRITE(6,"(I3,"-CORES ASSIGNED")") NCORE      CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)C INPUT DATA 单个进程为各自的部分赋值      DO I    = 1,10      ICE     = MOD(I,NCORE)      IF(ICE.EQ.ICORE)  A(I)=1.0*I      ENDDOC COMMUNICATION 进程通讯,以同步变量      DO 1  J = 1,10      ICE     = MOD(J,NCORE)      IF(ICE.EQ.ICORE)  THEN         TMP   = A(J)        !在NCORE个进程中,只有第ICE个进程被赋值,它要将该值发送给剩下的NCORE-1个进程        DO  I = 0,NCORE-1        IF (I.NE.ICE) CALL MPI_SEND(TMP,1,MPI_REAL,I,     &                I,MPI_COMM_WORLD,IERR)        ENDDO      ELSE         !每个进程分别接收来自ICE个进程发送来的数据,通讯标识号为自己的进程号        CALL MPI_RECV(TMP,1,MPI_REAL,     &       ICE,ICORE,MPI_COMM_WORLD,ISTATUS,IERR)        A(J)  = TMP       ENDIF1     CONTINUEC OUTPUT DATA 输出进程0同步后的变量      IF(ICORE.EQ.MASTER) WRITE(6,"(10F5.1)") (A(I),I=1,10)      CALL MPI_FINALIZE(IERR)      end program

运行test_mpi.f程序

mpiifort -g test_mpi.f -o z #编译mpirun -np 3 ./z #运行mpirun -np 3 xterm -e gdb ./z #用GDB调试程序

运行结果,输出为:

3-CORES ASSIGNED  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0 10.0

关键词: 一般使用 调试程序 发送数据