文档介绍:计算流体力学讲义
第六讲 MPI并行程序设计(2)
李新亮
******@imech. ;力学所主楼219; 82543801
知识点:
阻塞通信与非阻塞通信
非连续数据的发送与接收
OpenMP并行程序设计初步
1
Copyright by Li Xinliang
讲义、课件上传至 (流体中文网) -> “流体论坛”->“ CFD基础理论”
也可到如下网址下载:http://cid-.//.Public
服务器/前端机
计算节点
MPI 程序的运行原理:
服务器(前端机)编译
可执行代码复制 N 份,每个节点运行一份
调用MPI库函数得到每个节点号 my_id
根据my_id 不同,程序执行情况不同
调用MPI 库函数进行通讯
MPI 编程的基本思想: 主从式,对等式
2
Copyright by Li Xinliang
重点:对等式程序设计
知识回顾
Copyright by Li Xinliang
3
计算节点
对等式
设计
“对等式”程序设计思想
如果我是其中一个进程;
我应当做……
完成我需要完成的任务
站在其中一个进程的角度思考
基本的MPI函数(6个)
MPI初始化 MPI_Init(ierr) ; MPI结束 MPI_Finalize(ierr)
得到当前进程标识
m_rank(M_WORLD,myid,ierr)
得到通信域包含的进程数
m_size(M_WORLD,numprocs,ierr)
消息发送
MPI_Send(buf,count,datatype,dest,m, ierr)
消息接收
MPI_Recv(buf,count,datatype,source,m,status,ierr)
4
Copyright by Li Xinliang
MPI的消息发送机制——两步进行
MPI_Send( A, …) 发送
MPI_Recv( B, …) 接收
发送变量A
接收到变量B
配合使用
5
Copyright by Li Xinliang
阻塞发送
开始
结束
消息成功发出
缓冲区可释放
阻塞接收
开始
结束
消息成功接收
缓冲区数据可使用
一、阻塞式通信与非阻塞式通信
阻塞式发送与接收
MPI_Send( A, …)
MPI_Recv( B , …)
6
Copyright by Li Xinliang
MPI_Send( ) 返回后缓冲区可释放
sum= ……
call MPI_Send(sum,……)
sum= ……变量可重复利用
MPI_Recv() 返回后缓冲区数据可使用
Call MPI_Recv(sum1,……)
Sum=sum0+sum1
……
7
Copyright by Li Xinliang
非阻塞发送
启动发送
立即返回
计
算
通信完成
释放发送缓冲区
发
送
消
息
非阻塞接收
启动接收
立即返回
计
算
通信完成
引用接收数据
接
收
消
息
计算
与
通信
重叠
非阻塞消息发送与接收
8
Copyright by Li Xinliang
非阻塞消息发送
MPI_ISend(buf,count,datatype,dest,m,request,ierr)
In buf,count,datatype,dest,m
Out request,ierr
Request (返回的非阻塞通信对象, 整数)
非阻塞消息接收
MPI_IRecv(buf,count,datatype,source,m,request,ierr)
In buf,count,datatype,source,m
Out request,ierr
非阻塞通信的完成
MPI_Wait(request,status,ierr) 等待消息收发完成
MPI_Test(request, flag,stutus,ierr)
MPI_Waitall(const,request_array,status,ierr) 等待多个消息完成
In request
Out status, flag (logical型)
9
Copyright by Li Xinliang
非阻塞通信调用后立即返回,缓冲区不能立即使用
Sum= ……计算某变量
MPI_Isend(sum ….) 发送该变量
sum=……不能给变量重新赋值(发送可能尚未完成)
MPI_Irec