当前位置:文档之家› 最新2019-MPI并行程序的设计-PPT课件

最新2019-MPI并行程序的设计-PPT课件



cout<<"process"<<myid<<"recvived"<<message<<"from "<<"process 0"<<endl;

}

MPI_Finalize();
}
2019/5/31
18
开启4个进程运行结果:
2019/5/31
19
开启6个进程运行结果:
2019/5/31
20
MPI并行程序的两种基本模式
2019/5/31
10
1、MPI初始化:MPI_Init函数
用法:MPI_Init(&argc , &argv)
每一个MPI进程调用的第一个MPI函数都是 MPI_Init。该函数指示系统完成所有的初始化工 作,以备对后续MPI库的调用进行处理。
2、 MPI结束:MPI_Finalize函数
两种最基本的并行程序设计模式:
对等模式:各个部分地位相同,功能和代 码基本一致,只不过是处理的数据或对象
不同,也容易用同样的程序来实现。(典 型应用如Jacobi迭代)
主从模式:具有主进程和从进程,主进程 接收从进程的处理结果,并进行汇总处理
(典型应用如矩阵向量乘法)
2019/5/31
21
16
一个简单的发送和接收的例子
首先输出几个进程分别运行在哪一台机子.这里调 用一个MPI_Get_processor_name获得本机的 名字.
接着进程0向其他进程发送问候信息,其他进程接收 进程0的消息.并输出这一过程.
2019/5/31
17
#include"mpi.h"
#include< iostream.h>
对等模式—并行jacobi程序
这里的 jacobi迭代是计算一个矩阵的数据二维数组 A(M,M)。其边界值边界赋为8,内部初值为0,通过 迭代求矩阵各点的值.
假设需要迭代的数据是M*M的二维数组A(M,M),令M=4*N,按 上图进行数据划分,则分布在4个不同进程上的数据分别是: 进程0:A(M,1:N); 进程1:A(M,N+1:2*N); 进程2:A(M,2*N+1:3*N); 进程3:A(M,3*N+1:4*N). 由于在迭代过程中,边界点新值的计算需要相邻边界其他块的 数据,因此在每一个数据块的两侧各增加1列的数据空间,用 于存放从相邻数据块通信得到的数据。每个数据块的大小就 从M*N扩大到M*(N+2)。
cout<<"Hello World!"<<"process"<<myid<<" of "<<numprocs<<" on "<<processor_name<<endl;

if(myid==0)

{ strcpy (message,“ Hello, World!");

for (i=1;i<numprocs ; i++)
2019/5/31
6
下载地址
MPICH2(最新版本1.0.3 ) /mpi/mpich/
LAM-MPI(最新版本7.1.2) /download/
2019/5/31
7
机房环境
软件部分
操作系统:Windows Server 2019
IN buf:发送缓冲区的起始地址 IN count:将要发送的数据的个数 IN datatype:发送数据的数据类型 IN dest:目的进程标识号 IN tag:消息标志 IN comm:通信域
MPI_SEND将发送缓冲区中的count个datatype数据类型 的数据发送到目的进程,目的进程在通信域中的标识号是 dest,本次发送的消息标志是tag,使用这一标志,就可以把 本次发送的消息和本进程向同一目的进程发送的其他消息区 别开。
MPI实现:MPICH-1.2.5
硬件部分 集群系统有4个刀片(每片主要参数): 2CPU (Xeon3.2GHZ),2GB RAM,2(4)个千兆网
卡,2个SCSI硬盘
2019/5/31
8
机房集群环境
一个主节点(一个刀片)
启用双网卡,设置内/外网IP地址,用于用 户登陆、提交调试程序、管理员管理集群 等。主节点开启SSH、Ftp等服务。
2019/5/31
13
6、消息接收函数
MPI_RECV(buf,count,datatype,source,ta g,comm,status)
参数说明:
OUT buf:发送缓冲区的起始地址 IN count:将发送的数据的个数
IN datatype:发送数据的数据类型
IN dest:目的进程标识号

MPI_Init (&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

MPI_Comm_rank(MPI_COMM_WORLD, &myid);

MPI_Get_processor_name(processor_name, &namelen);
当MPI初始化后,每一个活动进程变成了一个叫做 MPI_COMM_WORLD的通信域中的成员。通信域是一个不 透明的对象,提供了在进程之间传递消息的环境。
在一个通信域内的进程是有序的。在一个有p个进程的通信 域中,每一个进程有一个唯一的序号(ID号),取值为0~p -1。
进程可以通过调用函数MPI_Comm_rank来确定它在通信 域中的序号。
#include< string.h>
void main (int argc, char **argv)
{

char message[20];

int i,myid,numprocs;

int namelen;

MPI_Status status;

char processor_name[MPI_MAX_PROCESSOR_NAME];
2019/5/31
15
一般的MPI程序设计流程图
程序参数说明 MPI_Init()
MPI_Comm_rank () MPI_Comm_size ()
建立新的通信器、定义新的数据类型和 进程拓扑结构
应用程序实体: 计算控制程序体; 进程间通信;
MPI_Finalize ()
退出MPI系统
End
2019/5/31
相应的 C 数据类型 signed char signed short int signed int signed long int unsigned char unsigned short int unsigned int unsigned long int float double long double 无对应类型 无对应类型

{ MPI_Send(message,strlen(message),MPI_CHAR,i,99,MPI_COMM_WORLD);

cout<<"process 0 send"<<message<<"to "<<"process "<<myid<<endl;

}} Nhomakorabeaelse

{ MPI_Recv(message,20,MPI_CHAR,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&status);
致,接收到的消息所包含的数据元素的个数最多不能超过
count。
2019/5/31
14
MPI预定义数据类型
MPI预定义类型与C数据类型对应关系
MPI 预定义数据类型 MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED
IN tag:消息标志
IN comm:通信域
OUT status:返回类型(是由三个域组成的结构类型, 这三个域分别是: MPI_SOURCE、MPI_TAG和 MPI_ERROR)
MPI_RECV从指定的进程source接收消息,并且该消息的
数据类型和消息标识和本接收进程的datatype和tag相一
三个从节点
用于从主节点接受计算任务并执行计算(返 回结果)。从节点开启SSH服务。
节点之间的通信通过SSH协议来实现
2019/5/31
9
六个接口构成的MPI子集
在MPI-1中,共有128个调用接口,在MPI-2中有287个, 应该说MPI是比较庞大的。但是从理论上说,MPI所有的 通信功能可以用它的6个基本的调用来实现,掌握了这6个 调用,就可以实现所有的消息传递并行程序的功能。
所有的MPI标识符,都以MPI前缀开头,后面紧跟一个大 写字母和一系列小写字母以及下划线。
MPI调用的参数说明
IN: 调用部分传递给MPI的参数,MPI除了使用该参数外不 允许对这一参数做任何修改
OUT: MPI返回给调用部分的结果参数,该参数的初始值 对MPI没有任何意义
相关主题