初步的 MPI消息传递函数

1.点对点通信(point-to-point) 
定义:给定属于同一通信器内的两个进程,其中一个发送消息,一个接收消息; 
MPI 系统定义的所有通信方式均建立在点对点通信之上; 
四种模式:标准模式、缓存区模式、同步模式、就绪模式;

2.标准模式点对点通信 
进程可以随意地发送(接收)消息,与是否存在匹配的消息接收(发送)进程无关;

两类:

阻塞式:消息发送函数返回,用户可以对消息缓存区进行处理,不会影响已发送的消息数据;接受函数返回,用户可以使用接受到的消息数据; 

非阻塞式:发送和接受函数返回后,必须调用另一类函数来确保它们的正确完成;

            阻塞式                非阻塞式    
          INTEGER   A             INTEGER   A
          A=100                   A=100
          MPI_Send(A,1,… .)      MPI_Isend(A,1,… )
          A=200                   A=200
消息数据: A=100                   A=100 或 A=200
                                  MPI_Isend(A,1,… flag,… )
                                  MPI_Wait(flag,… )
                                  A=200
消息数据: A=100                   A=100  

 

3.点对点通信函数举例 
阻塞式标准消息发送函数
MPI_Send(buf,count,datatype,dest,tag,comm,ierr)  
  Real*8(integer,…)buf  : 消息发送缓存区起始地址(Fortran,  用户的待发送的第一个数据)
  integer  count            :buf 起始的数据单元个数
  integer  datatype         :数据类型(基本或用户定义的) 
  integer  dest             : 接收进程序号
  integer  tag              : 消息的标号
  integer  comm             : 通信器
  integer  ierr             函数调用返回错误码

 

real *8  a(100,100)
integer  b(60,60)
c-----发送50 个双精度数“a(5,20) : a(54,20)” 到2 号进程
call MPI_Send( a (5,20),50,MPI_DOUBLE_PRECISION,299999,MPI_COMM_WORLD,ierr )
c-----发送20 个整型数“b(20,40) : b(39,40)” 到5 号进程
call MPI_Send( b (20,40),20,MPI_DOUBLE_PRECISION,5, 99999,MPI_COMM_WORLD,ierr )

 

阻塞式标准消息接收函数
MPI_Recv(buf,count,datatype,dest,tag,comm,status, ierr) 
  Real*8(integer,…)buf          : 消息接收缓存区起始地址(Fortran,  用户用于接受的第一个数据)
  integer  count                    :buf 起始的数据单元个数
  integer  datatype                 :数据类型(基本或用户定义的) 
  integer  dest                     : 发送进程序号
  integer  tag                      : 消息的标号
  integer  comm                     通信器
  integer   status(MPI_STATUS_SIZE) : 接收状态数组;
  integer  ierr                     : 函数调用返回错误码

 

real *8  a(100,100)
integer  b(60,60)
c-----从2 号进程接收50 个双精度数到“a(5,20) : a(54,20)” 
call MPI_Recv( a (5,20),50,MPI_DOUBLE_PRECISION,2, 99999,MPI_COMM_WORLD,status,ierr )
c-----从5 号进程接收20 个整型数到“b(20,40) : b(39,40)” 
call MPI_Recv( b (20,40),20,MPI_DOUBLE_PRECISION,5, 99999,MPI_COMM_WORLD,status,ierr )

 

4.聚合通信(Collective Communication)
定义:属于同一通信器的所有 MPI 进程均必须参与的通信操作;
参与方式:调用同一聚合通信函数; 

函数类型:
同步通信函数:所有进程在某个程序点上同步;  
               MPI_Barrier ( comm , ierr )

全局通信函数:  
广播: MPI_Bcast(buf,count,dtype,root,comm,ierr)
root   发送 
other  接受

收集:MPI_Gather(bufs,bufr,count,dtype,root,comm,ierr)
all 发送大小一致的数据块   
root 接受并按序号连续存放
全收集:MPI_Allgather()
all 发送   
all接受   
索引收集:MPI_Gatherv()  
all 发送大小不等的数据块   
root 接受并按索引间断存放

索引全收集:MPI_Allgatherv()
all 发送大小不等的数据块   
All接受并按索引间断存放  
分散:MPI_Scatter(bufs,bufr,count,dtype,root,comm,ierr)
root 发送连续的大小一致数据块
All  接受 
索引分散: MPI_Scatterv()
root 发送间断的大小不一致数据块
All  接受

全交换:  MPI_Alltoall()  
All 发送大小一致数据块到各进程
All接受大小一致数据块并按序号连续存放 
索引全交换: MPI_Alltoallv()
全局规约(global reduction)函数:
规约:   MPI_Reduce(sbuf,rbuf,count,dtype,op,root, comm,ierr);
规约操作类型 op :   MPI_SUM, MPI_MIN, MPI_MAX,  MPI_PROD等12种;   
全规约: MPI_Allreduce(),  除要求将结果返回到所有进程外,与 MPI_Reduce()一致;
规约分散: MPI_Reduce_scatter(),将规约结果分散到各进程;
并行前缀计算:MPI_Scan()  

 

          例子:   求两个向量的内积,并将结果返回进程0 
           subroutine par_blas1(m,a,b,c,comm) 
           real  a(m),b(m)       ! local slice of array
           real  c              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值