最新2019-MPI并行程序的设计-PPT课件
《MPI并行程序设计》课件
MPI的应用领域
MPI广泛应用于科学计算、 大规模数据处理和模拟等领 域,提供了高性能和高效率 的并行计算能力。
MPI基础
1
MPI的环境设置
在开始编写MPI程序之前,需要进行环境设置,包括MPI库的安装和配置,以及节点之间的 网络连接。
据的能力。
总结
1 MPI的优点和缺点
MPI具有高性能、可扩展性和灵活性的优点,但也面临数据通信和负载平衡等挑战。
2 MPI的未来发展趋势
MPI在超级计算和并行计算领域仍发展空间,如更高的并行度、更低的通信延迟和更丰富 的功能。
3 怎样提高MPI的性能
优化MPI程序的性能可以从算法、通信模式、负载均衡和并行度等方面入手,提高并行计 算的效率。
宏定义和预处理
MPI提供了丰富的宏定义和预处理功能,可以简化 并行程序的编写和调试过程,提高开发效率。
实战
1
MPI编程实战
通过实际编写MPI程序,学习如何利用
并行排序实战
2
MPI接口进行并行计算,解决实际问题, 如矩阵运算、图算法等。
利用MPI的并行计算能力,实现高效的排 序算法,提高排序性能和处理大规模数
2
MPI的通信模型
MPI采用消息传递的通信模型,通过发送和接收消息来实现不同进程之间的数据交换和同步。
3
点对点通信
MPI支持点对点通信操作,包括发送、接收和非阻塞通信,用于实现进程之间的直接消息传 递。
4
集合通信
MPI提供了集合通信操作,如广播、栅栏、归约等,用于在整个进程组中进行数据的统一和 协同计算。
MPI高级
MPI的拓扑结构
并行程序设计精品公开课件
是一个计数器,可以用来控制多个进程对共享资源的访问。
套接字(Sockets)
与其他进程通信有更强大的不同机器间通信的能力。
同步机制原理及ቤተ መጻሕፍቲ ባይዱ用
01
02
03
04
05
原子操作
锁机制
条件变量
栅栏(Barrier) 信号量( Semapho…
不可分割的操作,即该操 作要么全部完成,要么全 部不完成,不会结束在中 间某个环节。
强化学习
在复杂环境中进行大量试错实验,加速强化学习算法收敛过程。
面临挑战及未来发展趋势
挑战
随着数据规模和计算需求的不断增长,并行程序设计面临着可扩展性、能效比、 易用性等方面的挑战。
发展趋势
未来并行程序设计将更加注重异构计算、分布式计算等技术的融合应用,推动并 行计算向更高效、更智能的方向发展。同时,随着新型计算架构和编程模型的不 断涌现,并行程序设计也将迎来更多的发展机遇和创新空间。
06 实际应用案例分析与挑战
科学计算领域应用案例
气候模拟与预测
利用并行程序设计对大气、海洋等复杂系统进行 模拟,预测未来气候变化趋势。
生物信息学
通过并行计算加速基因序列比对、蛋白质结构预 测等生物信息学任务。
天体物理学
模拟宇宙演化、星系形成等天体物理过程,揭示 宇宙奥秘。
大数据处理领域应用案例
开启编译器优化选项
使用编译器提供的优化选项,如 O2、O3等,自动进行代码优化。
矢量化优化
利用编译器提供的矢量化优化功能 ,将循环中的标量操作转换为矢量 操作。
考虑目标平台特性
针对目标平台的特性选择合适的编 译器和优化选项。
MPI基础ppt全文
分子动力学等模拟计算。
MPI在工程仿真领域也发挥着重 要作用,如结构力学、电磁场仿
真、热传导等。
随着大数据时代的到来,MPI在 数据分析、机器学习等领域也展 现出巨大的潜力。
未来,随着计算机硬件和网络的 不断发展,MPI将继续优化和完 善,为更广泛的应用场景提供高 效、可靠的并行计算支持。
负载不均衡度(Load Imbalance)
基准测试程序设计与实现
基准测试程序选择 NAS Parallel Benchmarks (NPB)
High Performance Linpack (HPL)
基准测试程序设计与实现
Parallel Research Kernels (PRK)
代表性:能反映实际 应用的计算和通信模 式。
计算优化
采用更高效的算法,优化循环结构,减少浮点运算量。
通信优化
减少通信次数,优化通信模式,使用非阻塞通信等。
性能评估结果分析与改进
• I/O优化:采用并行I/O,减少I/O操作次数,优化数据读 写方式。
性能评估结果分析与改进
性能改进实施 重新编译并运行修改后的程序。
修改源代码,实现优化策略。 再次进行性能评估,验证改进效果。
02
通过具体案例,如矩阵乘法、排序算法等,详细讲解并行化实
现的过程和技巧。
并行化性能评估
03
介绍如何评估并行算法的性能,包括加速比、效率等指标的计
算和分析。
性能优化策略
01
02
03
通信优化
讲解如何通过减少通信量、 优化通信方式等手段来提 高MPI程序的性能。
计算优化
介绍如何通过优化计算过 程、提高计算效率等方式 来提升程序性能。
MPI并行程序的设计共45页PPT
2021/7/22
7
下载地址
MPICH2(最新版本1.0.3 ) /mpi/mpich/
LAM-MPI(最新版本7.1.2) /download/
2021/7/22
8
机房环境
软件部分
操作系统:Windows Server 2003
2021/7/22
14
6、消息接收函数
MPI_RECV(buf,count,datatype,source,ta g,comm,status)
参数说明:
OUT buf:发送缓冲区的起始地址 IN count:将发送的数据的个数
IN datatype:发送数据的数据类型
IN dest:目的进程标识号
2021/7/22
11
1、MPI初始化:MPI_Init函数
用法:MPI_Init(&argc , &argv)
每一个MPI进程调用的第一个MPI函数都是 MPI_Init。该函数指示系统完成所有的初始化工 作,以备对后续MPI库的调用进行处理。
2、 MPI结束:MPI_Finalize函数
用法:MPI_Finalize()
2021/7/22
23
为了并行求解,这里将参加迭代的数据按列进行 分割,假设有4个进程同时并行计算,数据的分割 结果如图:
进程0
进程1
按列划分
进程2
进程3
边界点新值的计算需 要相邻边界其他块的 数据,因此在每一个 数据块的两侧各增加1 列
2021/7/22
24
发送 接收 发送
接收 发送
接收
接收 进程0
2021/7/22
26
(数组初始化) do j=1,mysize+2
并行程序设计导论.ppt
SPMD类型的MPI程序 myprog.c
#include “mpi.h” int foo int i; {…} main(argc,argv) int argc; char *argv[ ]; { int i, tmp, sum=0, group_size,my_rank,N; MPI_Init(&argc,&argv); 消息标志 MPI_Comm_size(MPI_COMM_WORLD,&group_size); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); if (my_rank==0) { printf(“Enter N:”); scanf(“%d”,&N); for (i=1;i<group_size;i++) MPI_send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD); 目的进程 for (i=my_rank;i<N;i=i+group_size ) sum=sum+foo(i); for (i=1;i<group_size;i++) { MPI_Recv(&tmp,1,MPI_INT,i,i,MPI_COMM_WORLD,&status); sum=sum+tmp; } 源进程 结构指针 printf(“\n The result=%d”,sum); } else { MPI_Recv(&N,1,MPI_INT,0,i,MPI_COMM_WORLD,&status); for (i=my_rank;i<N;i=i+group_size ) sum=sum+foo(i); MPI_Send(&sum,1,MPI_INT,0,i,MPI_COMM_WORLD); } MPI_Finalize(); }
MPI并行程序设计
MPI并行程序设计MPI并行程序设计引言MPI(Message Passing Interface)是一种常用的并行计算编程模型,用于在分布式计算环境中实现并行程序设计。
MPI提供了在多个进程之间进行通信和同步的机制,使得程序能够充分利用集群或者超级计算机的并行性能。
本文将介绍MPI的基本概念和使用方法,并匡助读者了解如何进行MPI并行程序设计。
MPI基本概念MPI的核心思想是将计算任务划分为多个子任务,并将这些子任务分发给不同的进程进行并行计算。
MPI使用消息传递的方式来实现进程之间的通信和同步。
以下是一些MPI的基本概念:进程通信在MPI中,每一个并行计算的进程都有一个惟一的标识符,称为进程号(rank)。
进程之间可以使用通信操作进行消息传递,包括发送消息(send)、接收消息(receive)和同步(synchronize)等操作。
点对点通信点对点通信是指在两个进程之间进行消息传递,包括发送方和接收方。
发送方使用`MPI_Send`函数发送消息,接收方使用`MPI_Recv`函数接收消息。
广播通信广播通信是指一个进程向所有其他进程发送消息的操作。
发送方使用`MPI_Bcast`函数广播消息,接收方使用`MPI_Recv`函数接收消息。
归约操作归约操作是指将一组数值合并为一个数值的操作,如求和、求最大值等。
MPI提供了多种归约操作,包括`MPI_Reduce`和`MPI_Allreduce`。
并行计算模式MPI支持多种并行计算模式,包括主从模式、对等模式等。
在主从模式中,一个进程作为主进程,负责分发任务和采集结果;其余进程作为从进程,负责执行分配的子任务。
在对等模式中,所有进程都具有相同的任务和贡献。
MPI程序设计步骤编写MPI并行程序的普通步骤如下:1. 初始化MPI环境:使用`MPI_Init`函数初始化MPI环境,并获取进程数量和进程编号等信息。
2. 分配任务:根据进程编号和任务数量,将总计算任务划分为子任务,并分发给各个进程。
MPI并行程序设计
为什么要用MPI?—优点
➢ 高可移植性:
MPI已在IBM PC机上、MS Windows上、所有主要 的Unix工作站上和所有主流的并行机上得到实 现。使用MPI作消息传递的C或Fortran并行程序 可不加改变地运行在IBM PC、MS Windows、 Unix工作站、以及各种并行机上。
➢MPI_Send操作指定的发送缓冲区是由count个类 型为datatype的连续数据空间组成,起始地址为 buf。注意:不是以字节计数,而是以数据类型 为单位指定消息的长度。
➢其中datatype数据类型:MPI的预定义类型或用 户自定义。通过使用不同的数据类型调用 MPI_Send,可以发送不同类型的数据。
➢ MPI有完备的异步通信:使得send,receive能与 计算重叠。
➢ 可以有效的在MPP上或Cluster上用MPI编程。
MPI+C 实现的“Hello World!”
#include <stdio.h> #include "mpi.h " main( int argc, char *argv[] ) {
更新的“Hello World!”
#include <stdio.h> #include "mpi.h" int main(int argc, char **argv){
int myid, numprocs; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); printf(“Hello, World! I am %d of %d. /n, myid, numprocs); MPI_Finalize(); return 0; }
MPI程序设计ch4 PPT课件
③均匀洗牌一次,使主位下标降1,转②;
2. 形式描述
P110算法4.1 (略)
2019/9/18
Y.Xu Copyright
USTC
Parallel Algorithms 21 / Ch4
4.3.3 Stone双调并行排序算法
2019/9/18
Y.Xu Copyright
USTC
Parallel Algorithms 16 / Ch4
4.3 Stone双调排序算法(书中4.1)
络Stone双调排序算法:Batcher双调排序网 在SIMD-SE上的实现。
4.3.1 均匀洗牌函数性质 4.3.2 Stone的观察及其计算模型 4.3.3 Stone双调并行排序算法
Y.Xu Copyright
USTC
Parallel Algorithms 8 / Ch4
4.1.2 归拆排序算法
3.算法分析
预处理:
时间为
O(
n p
log
n p
);
第①和②步:时间为O(n/p); 细节如下:
传送Si+1到Pi的时间为O(n/p), 串行归并所需时间为2n/p,
传送Si+1返回到Pi+1的时间为O(n/p);
2.计算示例
2019/9/18
Y.Xu Copyright
USTC
Parallel Algorithms 13 / Ch4
4.2.2 Thompson&Kung双调排序算法
1.行主编号的双调排序算法
2019/9/18
MPI并行程序设计初步PPT课件
Part 1: 基本概念及MPI并行编程入门
1. 并行计算基本概念 2. MPI并行编程入门
1)MPI 简介 2)MPI 的基本函数及消息传递 3)MPI的常用函数 4)对等式编程思想的举例说明 ——全收集、矩阵相乘
2
一、 基本概念
1. 并行计算机简介
大规模并行计算——超级计算 (Supercomputing)/高性能 计算 (HPC)
3维 等 离 子 体 建 模
48 小 时 天 气 预 报 10MB
机翼设计 油藏建模
1980
1988
1991
化学动力学
1993
1995年 后
100Mflops
1Gflops 10Gflops 100Gflops 1Tflops 系 统 速 度
图 1-1
应用对计算资源的需求
3
● CFD的计算资源依赖性
➢ 为何需要超级计算? • 应用领域的巨大计算需求 • 单CPU的计算能力有限
存储器容量 1000GB 100GB
10GB 1GB
物体特性分析
72小 时 天气预报
全球气候变化 人类基因 湍流 飞行动力学 海洋环流 粘滞流体动力学 超导建模 半导体建模 量子染色动力学 视觉
结构生物学
药物设计
100MB
在“show directories for:” 的栏目选择“Library files”, 在 “Directories:” 下的对话框里面添加 MPICH Lib 的路径, 例如 “C:/Porgram files/mpich/SDK/lib”
2) 程序编译时,请把mpich.lib 添加在链接库里。 project->settings->link ; 在 objcet/Library modules 下的对话框里面添加
MPI并行编程讲稿
MPI并行编程讲稿张林波中国科学院数学与系统科学研究院科学与工程计算国家重点实验室2006年12月1日i目录参考材料1第一章预备知识21.1高性能并行计算机系统简介 (2)1.1.1微处理器的存储结构 (2)1.1.2Cache结构对程序性能的影响 (2)1.1.3共享内存SMP型并行计算机 (2)1.1.4分布式内存MPP型并行计算机 (3)1.1.5DSM型并行计算机 (3)1.1.6SMP/DSM机群 (3)1.1.7微机/工作站机群 (4)1.1.8TOP500 (4)1.2并行编程模式 (4)1.2.1自动并行与手工并行 (4)1.2.2OpenMP (5)1.2.3DSM编程模式 (5)1.2.4高性能Fortran:HPF (5)1.2.5消息传递并行编程模式 (5)1.3Unix程序开发简介 (6)1.3.1Unix中常用的编译系统 (6)1.3.2实用工具make (7)1.4消息传递编程平台MPI (8)1.4.1MPI程序的编译与运行 (8)1.4.2利用MPICH建立MPI程序开发与调试环境 (8)第二章MPI基础知识102.1下载MPI标准的PS文档 (10)2.2一些名词与概念 (10)2.3编程模式 (10)2.4MPI函数的一般形式 (11)2.5MPI的原始数据类型 (11)ii2.5.1Fortran77原始数据类型 (11)2.5.2C原始数据类型 (12)2.6MPI的几个基本函数 (12)2.6.1初始化MPI系统 (12)2.6.2检测MPI系统是否已经初始化 (12)2.6.3得到通信器的进程数及进程在通信器中的序号 (13)2.6.4退出MPI系统 (13)2.6.5异常终止MPI程序的执行 (13)2.6.6查询处理器名称 (13)2.6.7获取墙上时间及时钟精度 (14)2.7MPI程序的基本结构 (14)2.7.1Fortran77程序 (14)2.7.2C程序 (15)第三章点对点通信163.1标准阻塞型点对点通信函数 (16)3.1.1标准阻塞发送 (16)3.1.2阻塞接收 (16)3.1.3阻塞型消息传递实例 (17)3.1.4其它一些阻塞型消息传递函数 (18)3.2消息发送模式 (19)3.2.1阻塞型缓冲模式消息发送函数 (20)3.3阻塞型与非阻塞型函数 (20)3.4非阻塞型点对点通信函数 (21)3.4.1非阻塞发送 (21)3.4.2非阻塞接收 (21)3.4.3通信请求的完成与检测 (22)3.4.4通信请求的释放 (24)3.5消息探测与通信请求的取消 (24)3.5.1消息探测 (24)3.5.2通信请求的取消 (25)3.6点对点通信函数汇总 (26)3.7持久通信请求 (26)3.7.1创建持久消息发送请求 (26)3.7.2创建持久消息接收请求 (27)iii3.7.3开始基于持久通信请求的通信 (27)3.7.4持久通信请求的完成与释放 (27)第四章数据类型284.1与数据类型有关的一些定义 (28)4.1.1数据类型定义 (28)4.1.2数据类型的大小 (29)4.1.3数据类型的下界、上界与域 (29)4.1.4MPI LB和MPI UB (30)4.1.5数据类型查询函数 (31)4.2数据类型创建函数 (32)4.2.1MPI Type contiguous (32)4.2.2MPI Type vector (32)4.2.3MPI Type hvector (33)4.2.4MPI Type indexed (34)4.2.5MPI Type hindexed (35)4.2.6MPI Type struct (35)4.2.7地址函数MPI Address (36)4.3数据类型的使用 (37)4.3.1数据类型的提交 (37)4.3.2数据类型的释放 (37)4.3.3MPI Get elements (39)4.4数据的打包与拆包 (39)4.4.1数据打包 (39)4.4.2数据拆包 (39)4.4.3得到打包后的数据大小 (40)4.5MPI1.1中位移与数据大小的限制 (41)第五章聚合通信(Collective Communications)425.1障碍同步 (42)5.2广播 (42)5.3数据收集 (43)5.3.1收集相同长度数据块MPI Gather (43)5.3.2收集不同长度数据块MPI Gatherv (44)5.3.3全收集MPI Allgather (44)5.3.4不同长度数据块的全收集MPI Allgatherv (45)iv5.4数据散发 (46)5.4.1散发相同长度数据块MPI Scatter (46)5.4.2散发不同长度数据块MPI Scatterv (47)5.5全部进程对全部进程的数据散发收集 (48)5.5.1相同数据长度的全收集散发MPI Alltoall (48)5.5.2不同数据长度的全收集散发MPI Alltoallv (49)5.6归约 (50)5.6.1归约函数MPI Reduce (50)5.6.2全归约MPI Allreduce (52)5.6.3归约散发MPI Reduce scatter (52)5.6.4前缀归约MPI Scan (53)5.6.5归约与前缀归约中用户自定义的运算 (54)5.7两个程序实例 (55)5.7.1π值计算 (55)5.7.2Jacobi迭代求解二维Poisson方程 (55)第六章进程组与通信器596.1基本概念 (59)6.1.1进程组 (59)6.1.2上下文(Context) (59)6.1.3域内通信器(Intracommunicator) (59)6.1.4域间通信器(Intercommunicator) (59)6.2进程组操作函数 (59)6.2.1查询进程组大小和进程在组中的序号 (59)6.2.2两个进程组间进程序号的映射 (60)6.2.3比较两个进程组 (60)6.2.4进程组的创建与释放 (60)6.3域内通信器操作函数 (63)6.3.1比较两个通信器 (63)6.3.2通信器的创建与释放 (63)6.4通信器的附加属性(Caching) (65)6.5域间通信器(Intercommunicator) (65)6.6进程拓扑结构 (65)6.6.1迪卡尔拓扑结构 (65)6.6.2一般拓扑结构 (68)v6.6.3底层支持函数 (70)第七章文件输入输出717.1基本术语 (71)7.2基本文件操作 (72)7.2.1打开MPI文件 (72)7.2.2关闭MPI文件 (73)7.2.3删除文件 (73)7.2.4设定文件长度 (73)7.2.5为文件预留空间 (74)7.2.6查询文件长度 (74)7.3查询文件参数 (74)7.3.1查询打开文件的进程组 (74)7.3.2查询文件访问模式 (74)7.4设定文件视窗 (75)7.4.1文件中的数据表示格式 (75)7.4.2可移植数据类型 (76)7.4.3查询数据类型相应于文件数据表示格式的域 (76)7.5文件读写操作 (76)7.5.1使用显式位移的阻塞型文件读写 (77)7.5.2使用独立文件指针的阻塞型文件读写 (78)7.5.3使用共享文件指针的阻塞型文件读写 (78)7.5.4非阻塞型文件读写函数 (79)7.5.5分裂型文件读写函数 (79)7.6文件指针操作 (80)7.6.1独立文件指针操作 (80)7.6.2共享文件指针操作 (80)7.6.3文件位移在文件中的绝对地址 (81)7.7不同进程对同一文件读写操作的相容性 (81)7.7.1设定文件访问的原子性 (81)7.7.2查询atomicity的当前值 (82)7.7.3文件读写与存储设备间的同步 (82)7.8子数组数据类型创建函数 (83)vi本讲义仅供课程学员及其他感兴趣者个人参考用,尚处于逐步修改完善的过程中,许多内容代表的是作者的个人观点.未经作者同意,不得擅自散播、印刷、转引讲义中的部分或全部内容.viiviii参考材料•莫则尧等,《消息传递并行编程环境MPI》,科学出版社,2001.•都志辉等,《高性能并行计算编程技术MPI并行程序设计》,清华大学出版社,2001•张林波等,《并行计算导论》,清华大学出版社,2006.•:【*】•ftp:///pub/home/zlb/bxjs/bxjs.pdf:【*】ftp:///pub/home/zlb/bxjs/bxjs.pdf•本讲义中的程序实例的下载地址:ftp:///pub/home/zlb/bxjs/:【*】ftp:///pub/home/zlb/bxjs/1第一章预备知识§1.1高性能并行计算机系统简介§1.1.1微处理器的存储结构§1.1.2Cache结构对程序性能的影响例1.1矩阵乘法中不同循环顺序对程序性能的影响.c i,j=n∑k=1a i,kb k,j i,j=1,...,nDO J=1,NDO I=1,NC(I,J)=0.D0ENDDOENDDODO I=1,NDO J=1,NDO K=1,NC(I,J)=C(I,J)+A(I,K)*B(K,J)ENDDOENDDOENDDO矩阵乘法实例1:【matmul/matmul0.m4】矩阵乘法实例2:【matmul/matmul.f】§1.1.3共享内存SMP型并行计算机•对称多处理器(Symmetric Multi–Processors),或共享内存处理器(Shared Memory Processors).•多个处理器通过系统总线或交叉开关共享一个或多个内存模块.•优点:使用简单,维护方便.•缺点:受系统总线带宽限制,只能支持少量处理器(一般十几个).•并行编程方式:通常采用OpenMP,也可使用消息传递(MPI/PVM)及HPF.2•代表机型:SGI Power Challenge:【01-chall.sh】,Sun E10000,等.§1.1.4分布式内存MPP型并行计算机•Massively Parallel Processors的简称•指由大量具有局部内存的计算结点通过高速系统网络联接而构成的并行处理系统.•MPP系统的系统网络通常具有某种拓扑结构(如tree,mesh,torus,hypercube).§1.1.5DSM型并行计算机分布共享内存:Distributed Shared Memory•多个物理上具有独立内存的处理单元,通过高速网络联接在一起.•逻辑上作为共享内存并行机使用.•也称为NUMA结构(NonUniform Memory Access).•不同处理单元间内存的共享通过特殊的硬件/软件实现.•具有比SMP型并行机更好的可扩展性(超过100个CPU).•代表机型:SGI Origin2000/3000.§1.1.6SMP/DSM机群•将多台SMP或DSM并行机通过互联网络连接而成.•目前国内外最高性能的并行机大多是这种结构.3§1.1.7微机/工作站机群•微机机群(PC cluster,又称为Beowulf cluster),工作站机群(NOW,Network Of Workstations):将联网的多台微机或工作站组织成一台并行计算机.目前常用的网络有以太网(100Mbps),ATM (155/622Mbps),Myrinet(1.2Gbps,).•适合于构造中等规模的并行系统(多达数百个处理器).•根据机群中所使用的机型可为同构型和异构型两种.•根据机群的使用方式又可分为专用型和兼用型.前者指该机群专门用于并行计算•微机/工作站机群的优点是价格便宜、配置灵活.但其规模及并行效率受网络设备的制约.配以适当的系统管理工具及作业调度、性能监控、并行程序调试开发环境、及外设等,微机/工作站机群系统可以达到与商用MPP系统一样的使用效果.§1.1.8TOP500TOP500Supercomputer Sites:【/benchmark/top500.html】§1.2并行编程模式§1.2.1自动并行与手工并行•在SMP及DSM并行机上编译系统通常具有一定的对用户程序(C/Fortran)进行自动并行化的能力,但经常需要人工干预(通过指导语句、命令行选项等)以达到理想的并行效率.并行主要针对循环进行(细粒度并行).•在分布式内存并行机上尚无通用高效的自动并行工具,主要依靠人工编写并行程序.4•并行算法的设计及并行程序的编制已成为目前制约大规模并行计算机应用的主要障碍.§1.2.2OpenMP在串行程序的循环语句前插入特定的指导语句,告知编译系统一些有助于对该循环进行并行的信息以及/或是强制编译系统按指定的方式将该循环并行化.•主要限于SMP及DSM型的并行系统.现在也已发展到一些MPP系统.•通常结合编译系统的自动并行化功能使用.•也有一些自动并行化工具,它们对程序结构及数据流进行分析,然后自动插入适当的OpenMP 语句.•OpenMP的优点是学习及使用相对简单,很多情况下不需要对原有算法及程序做大的改动.缺点是只适合一类特定的机型,并且程序的可扩展性通常不如用消息传递方式编写的并行程序.•对一些具有强数据相关性的计算过程需要通过改变计算顺序或修改算法甚至设计新的算法来实现并行计算.•OpenMP程序实例:矩阵乘:【matmul/matmul-omp.f】§1.2.3DSM编程模式•建立在某种内存一致性协议之上,通过软件或软硬件结合的方式实现处理器间内存的共享.•通过要求DSM并行程序中对内存的读写遵循一定的规则来减小维护内存一致性的开销.•参看:/Parallel-programming/唐志敏/jiajia.ppt•软件DSM系统实例:JiaJia:【/chpc/chinese/field1.htm】§1.2.4高性能Fortran:HPF•基于数据并行的编程语言,即用户通过指导语句指示编译系统将数据分布到各处理器上,编译系统根据数据分布的情况生成并行程序.•主要面向Fortran90/95.•优点:编程相对简单,串并行程序一致.•适合于SMP/DSM/MPP/cluster系统.•主要缺点是并行过程对用户的透明度不高,程序的性能很大程度上依赖于所用的编译系统及用户对编译系统的了解,需要针对不同的HPF编译器做不同的优化,影响了程序的可移植性.•HPF程序实例:矩阵乘:【matmul/matmul-hpf.f】§1.2.5消息传递并行编程模式•并行程序由一组独立运行的进程构成.进程间通过相互发送消息来实现数据交换.•可以说消息传递并行编程是并行应用程序开发的最底层编程方式之一.很多其它并行开发语言或工具(如一些HPF编译器)将程序转化成消息传递型并行程序来实现并行.•常用的消息传递平台有PVM(Parallel Virtual Machine)和MPI(Message Passing Interface).•程序通用性好,用PVM或MPI编写的程序可以在任何并行计算机上运行.•能够达到很高的并行效率,具有很好的可扩展性.•缺点:程序的编制与调试比较困难,许多情况下要对程序甚至算法做大的改动.5§1.3Unix程序开发简介§1.3.1Unix中常用的编译系统•编译器由前端和后端组成.通常用户只需使用前端命令即可完成编译、链接.•C编译器:cc,gcc(GNU C)等.•Fortran编译器:f77,fc,g77(GNU Fortran),f90(Fortran90)等.•可用man查看使用手册,如:man cc,man f77等等.•命令行形式:%cc[options]files[options]%f77[options]files[options]•文件的类型由文件的扩展名决定:◦C源代码:.c;◦Fortran77源代码:.f;◦带预处理的Fortran源代码:.F;◦Fortran90源代码:.f90;◦C++源代码:.c++,.C,.cpp,.cc,.cxx;◦汇编代码:.s,.S;◦目标文件:.o;◦库文件:.a;◦共享库:.so;•命令行选项:◦-c:只编译,不链接,即只生成.o文件.◦-ofilename:指定输出文件名,缺省为*.o,a.out等.◦-I path:指定(增加)包含文件(如*.h)的搜索目录.◦-L path:指定(增加)库文件的搜索目录.◦-l name:与库文件lib name.a链接.◦优化开关:-O,-O1,-O2,-O3,等等.◦目标码中包含源文件名、行号等信息(用于程序调试):-g.•例:◦f77-O2-o prog file1.f file2.c file3.o file4.a◦f77-c file.ff77-o out file.o◦f77-c-I/usr/local/mpi/include file.ff77-o prog-L/usr/local/mpi/lib file.o-lmpi(等价于:f77-o prog file.o/usr/local/mpi/lib/libmpi.a)6§1.3.2实用工具make•命令形式:make[-f Makefile][options][target[target...]]其中-f选项给出定义规则的文件名(简称Makefile文件),缺省使用当前目录下的Makefile或makefile文件.target指明要求生成的目标(在Makefile中定义),当命令行中不给出target 时make只生成Makefile中定义的第一个目标.比较有用也较通用的命令行选项有下面一些: -f文件名:指定Makefile文件名.-n:只显示将要执行的命令而并不执行它们.-p:显示定义的全部规则及宏,用于对Makefile的调试.•通过Makefile文件定义一组文件之间的依赖关系及处理命令,方便程序开发过程中的编译与维护.•处理规则的建立以特定的文件扩展名及文件修改时间为基础.缺省支持常用的程序扩展名:.c, .f,.F,.o,.a,.h,等等.用户可以通过.SUFFIXES:目标定义新的文件扩展名.•基本规则:目标:依赖对象<tab>处理命令<tab>......例:prog:file1.f file2.f file3.cf77-O2-o prog file1.f file2.f file3.c其含义为:如果目标(prog)不存在,或者任何一个依赖对象(file1.f,file2.f,file3.c)比目标新,则执行指定的命令.•宏定义:SRC=file1.f file2.f file3.cprog:$(SRC)f77-O2-o prog$(SRC)环境变量可以在Makefile中作为宏使用,如$(HOME).•常用预定义的宏:◦$@:代表目标名(上例中为prog)◦$<:第一个依赖对象名(上例中为file1.f)◦$^:全部依赖对象名(上例中为file1.f file2.f file3.c)◦$?:全部比目标新的依赖对象名◦$*:用在隐式规则中,代表不含扩展名的依赖对象•隐式规则:prog:file1.o file2.o file3.of77-O2-o prog$?.c.o:cc-O2-c$*.c.f.o:f77-O2-c$*.f7Makefile实例:【Makefile.dummy】§1.4消息传递编程平台MPI•由全世界工业、科研和政府部门联合建立的一个消息传递编程标准,以便为并行应用程序的设计提供一个高效、统一的编程环境.它是目前最为通用的并行编程方式,也是分布式并行系统的主要编程环境.•MPI标准中定义了一组函数接口用于进程间的消息传递.这些函数的具体实现由各计算机厂商或科研部门来完成.•除各厂商提供的MPI系统外,一些高校、科研部门也在开发免费的通用MPI系统,其中最著名的有:◦MPICH(/mpi/mpich)◦LAM MPI(/)它们均提供源代码,并支持目前绝大部分的并行计算系统(包括微机和工作站机群).实际上许多厂商提供的MPI系统是在MPICH的基础上优化产生的.•MPI的第一个标准MPI1.0于1994年推出.最新的标准为2.0版,于1998年推出.§1.4.1MPI程序的编译与运行•MPI程序的编译:%mpicc-O2-o mpiprog mpisrc.c%mpif77-O2-o mpiprog mpisrc1.c mpisrc2.f•MPI程序的运行:%mpirun-np4mpiprogMPI程序实例:【/usr/local/mpi/examples/pi3.f】§1.4.2利用MPICH建立MPI程序开发与调试环境MPICH是目前最为流行的免费MPI系统,它支持几乎所有的Unix及Windows9x/NT环境,很适合于用来建立自己的MPI程序调试环境.建议在Linux环境下安装MPICH从而形成一个MPI 程序的开发调试环境•mpich.tar.gz的下载:/mpi/mpich/或ftp:///pub/mpich,目前最新版本为MPICH2-1.0.5.•解开MPICH源代码:%tar xzpvf mpich.tar.gz或:%gzip-dc mpich2-1.0.5p4.tar.gz|tar xpvf-或:%gzip-d mpich2-1.0.5p4.tar.gz%tar xpvf mpich2-1.0.5p4.tar展开后,doc子目录中含有MPICH的安装说明及使用说明.•配置、编译MPICH:8%cd mpich2-1.0.5p4(或cd mpich2-1.0.5p4)%./configure-prefix=/usr/local/mpi%make•在单机上编译运行简单测试程序:%cd examples/basic%../../bin/mpdboot%../../bin/mpicc-o cpi cpi.c%../../bin/mpirun-np1cpi%../../bin/mpirun-np2cpi在运行上述命令之前应该开启系统中的rsh服务,并检查文件~/.rhosts或/etc/hosts.equiv 是否存在并且其中包含本机的主机名,当文件不存在或没有包含本机主机名的话需要创建一个文件并且(或)在其中加入本机主机名.否则上述最后一条命令将产生permission denied错误.•以超级用户身份在目录mpich2-1.0.5p4下运行:#make install来将MPICH安装到目录/usr/local/mpi下,以便其它用户也能使用.然后可以删除mpich2-1.0.5p4目录.•使用C shell的用户应该在文件~/.cshrc中加入:setenv PATH${PATH}:/usr/local/mpi/binsetenv MANPATH${MANPATH}:/usr/local/mpi/man使用Bourne shell的用户应该在文件~/.profile中加入:PATH=${PATH}:/usr/local/mpi/binexport PATHMANPATH=${MANPATH}:/usr/local/mpi/manexport MANPATH以便可以直接使用/usr/local/mpi/bin中的命令(mpif77,mpicc,mpirun等等),以及用man命令来得到MPI函数的使用手册.9第二章MPI基础知识§2.1下载MPI标准的PS文档MPI1.1/2.0文档:【/】MPI2.0的PostScript文档中只有MPI1.2/2.0版新增加的内容,应该结合MPI1.1的文档阅读.§2.2一些名词与概念程序与代码我们这里说的程序不是指以文件形式存在的源代码、可执行代码等,而是指为了完成一个计算任务而进行的一次运行过程.进程(process)一个MPI并行程序由一组运行在相同或不同计算机/计算结点上的进程或线程构成.为统一起见,我们将MPI程序中一个独立参与通信的个体称为一个进程.在Unix系统中,MPI 的进程通常是一个Unix进程.在共享内存/消息传递混合编程模式中,一个MPI进程可能代表一组Unix线程.进程组(process group)指一个MPI程序的全部进程集合的一个有序子集.进程组中每个进程被赋于一个在该组中唯一的序号(rank),用于在该组中标识该进程.序号的取值范围是0到进程数−1.通信器(communicator)通信器(也有译成通信子的)是完成进程间通信的基本环境,它描述了一组可以互相通信的进程以及它们之间的联接关系等信息.MPI的所有通信必须在某个通信器中进行.通信器分域内通信器(intracommunicator)和域间通信器(intercommunicator)两类,前者用于属于同一进程组的进程间的通信,后者用于分属两个不同进程组的进程间的通信.域内通信器由一个进程组和有关该进程组的进程间的拓扑联接关系构成.MPI系统在一个MPI程序运行时会自动创建两个通信器,一个称为MPI_COMM_WORLD,它包含该MPI程序中的所有进程,另一个称为MPI_COMM_SELF,它指单个进程自己所构成的通信器.序号(rank)序号用来在一个进程组或通信器中标识一个进程.MPI程序中的进程由进程组/序号或通信器/序号所唯一确定.序号是相对于进程组或通信器而言的:同一个进程在不同的进程组或通信器中可以有不同的序号.进程的序号是在进程组或通信器被创建时赋予的.MPI系统提供了一个特殊的进程序号MPI_PROC_NULL,它代表空进程(不存在的进程).与MPI_PROC_NULL间的通信实际上没有任何作用.消息(message)MPI程序中在进程间传送的数据称为消息.一个消息由通信器、源地址、目的地址、消息标签和数据构成.通信(communication)通信指在进程之间进行消息的收发、同步等操作.§2.3编程模式SPMD编程模式Single Program Multiple Data的缩写.指构成一个程序的所有进程运行的是同一份可执行代码.不同进程根据自己的序号可能执行该代码中的不同分支.这是MPI编程中最常用的编程方式.用户只需要编写、维护一份源代码.10MPMD编程模式Multiple Program Multiple Data的缩写.指构成一个程序的不同进程运行不同的可执行代码.用户需要编写、维护多份源代码.主/从编程模式英文为Master/Slave.它是MPMD编程模式的一个特例,也是MPMD编程模式中最常见的方式.构成一个程序的进程之一负责所有进程间的协调及任务调度,该进程称为主进程(Master),其余进程称为从进程(Slave).通常用户需要维护两份源代码.§2.4MPI函数的一般形式C:一般形式为:int MPI_Xxxxxx(...)MPI的C函数名中下划线后第一个字母大写,其余字母小写.除MPI_Wtime()和MPI_Wtick()外,所有MPI的C函数均返回一个整型错误码,当它等于MPI_SUCCESS(0)时表示调用成功,否则表示调用中产生了某类错误.Fortran77:一般形式为:SUBROUTINE MPI_XXXXXX(....,IERR)除MPI_WTIME和MPI_WTICK外,Fortran77的MPI过程全部是Fortran77子程序(SUBROUTINE),它们与对应的MPI的C函数同名(但不区分大小写),参数表除最后多出一个整型参数IERR用于返回调用错误码及参数的类型不同外,也和MPI的C函数一样.§2.5MPI的原始数据类型MPI系统中数据的发送与接收都是基于数据类型进行的.数据类型可以是MPI系统预定义的,称为原始数据类型,也可以是用户在原始数据类型的基础上自己定义的数据类型.MPI为Fortran77和C定义的原始的数据类型在下面两个表格中给出.除表中列出的外,有的MPI实现可能还提供了更多的原始数据类型,如MPI_INTEGER2,MPI_LONG_LONG_INT,等等.§2.5.1Fortran77原始数据类型MPI数据类型对应的Fortran77数据类型MPI_INTEGER INTEGERMPI_REAL REALMPI_DOUBLE_PRECISION DOUBLE PRECISIONMPI_COMPLEX COMPLEXMPI_DOUBLE_COMPLEX DOUBLE COMPLEXMPI_LOGICAL LOGICALMPI_CHARACTER CHARACTER*1MPI_BYTEMPI_PACKED11§2.5.2C原始数据类型MPI数据类型对应的C数据类型MPI_INT intMPI_FLOAT floatMPI_DOUBLE doubleMPI_SHORT shortMPI_LONG longMPI_CHAR charMPI_UNSIGNED_CHAR unsigned charMPI_UNSIGNED_SHORT unsigned shortMPI_UNSIGNED unsignedMPI_UNSIGNED_LONG unsigned longMPI_LONG_DOUBLE long doubleMPI_BYTEMPI_PACKED§2.6MPI的几个基本函数本节介绍MPI系统的几个基本函数.§2.6.1初始化MPI系统Cint MPI_Init(int*argc,char***argv)Fortran77MPI_INIT(IERR)INTEGER IERR初始化MPI系统.通常它应该是第一个被调用的MPI函数.除MPI_Initialized外,其它所有MPI函数仅在调用了该函数后才可以被调用.在C接口中,MPI系统通过argc和argv得到命令行参数,并且会将其中MPI系统专用的参数删除而仅留下供用户程序解释的参数.§2.6.2检测MPI系统是否已经初始化Cint MPI_Initialized(int*flag)Fortran77MPI_INITIALIZED(FLAG,IERR)LOGICAL FLAGINTEGER IERR如果已经调用过MPI_Init则返回flag=true,否则返回flag=false.这是唯一可以在MPI_Init之前调用的函数.12§2.6.3得到通信器的进程数及进程在通信器中的序号Cint MPI_Comm_size(MPI_Comm comm,int*size)int MPI_Comm_rank(MPI_Comm comm,int*rank)Fortran77MPI_COMM_SIZE(COMM,SIZE,IERR)INTEGER COMM,SIZE,IERRMPI_COMM_RANK(COMM,RANK,IERR)INTEGER COMM,RANK,IERR上述两个函数分别返回指定通信器中的进程数及本进程在该通信器中的序号.§2.6.4退出MPI系统Cint MPI_Finalize(void)Fortran77MPI_FINALIZE(IERR)INTEGER IER退出MPI系统.所有MPI进程在正常退出前都必须调用该函数.它是MPI程序中最后一个被调用的MPI函数:调用MPI_Finalize后不允许再调用任何MPI函数.用户在调用该函数前应该确认所有的(非阻塞)通信均已完成.§2.6.5异常终止MPI程序的执行Cint MPI_Abort(MPI_Comm comm,int errorcode)Fortran77MPI_ABORT(COMM,ERRORCODE,IERR)INTEGER COMM,ERRORCODE,IERR调用该函数时表明因为出现了某种致命错误而希望异常终止MPI程序的执行.MPI系统会尽量设法终止通信器comm中的所有进程.在Unix系统环境中,errcode被作为进程的退出码(exit code)返回给操作系统.§2.6.6查询处理器名称Cint MPI_Get_processor_name(char*name,int*resultlen)Fortran77MPI_GET_PROCESSOR_NAME(NAME,RESULTLEN,IERR)CHARACTER*(*)NAMEINTEGER RESULTLEN,IERR13该函数在name中返回进程所在的处理器的名称.参数name应该提供不少于MPI_MAX_PROCESSOR_NAME个字节的存储空间用于存放处理器名称§2.6.7获取墙上时间及时钟精度Cdouble MPI_Wtime(void)double MPI_Wtick(void)Fortran77DOUBLE PRECISION FUNCTION MPI_WTIME()DOUBLE PRECISION MPI_WTICK()MPI_WTIME返回当前墙上时间,以从某一固定时刻算起的秒数为单位.而MPI_WTICK则返回MPI_WTIME函数的时钟精度,也是以秒为单位.例如,假设MPI_WTIME使用的硬件时钟计数器每1/1000秒增加1,则MPI_WTICK的返回值为10−3,表示用函数MPI_WTIME得到的时间精度为千分之一秒.在C中,这是唯一两个返回双精度值而非整型错误码的MPI接口函数.在Fortran77中,这是唯一两个FUNCTION形式的接口(其它Fortran77MPI的接口一律以SUBROUTINE的形式定义).§2.7MPI程序的基本结构§2.7.1Fortran77程序PROGRAM MPIPRGINCLUDE’mpif.h’INTEGER MYRANK,NPROCS,IERR*CALL MPI_INIT(IERR)CALL MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)......CALL MPI_FINALIZE(IERR)STOPEND程序实例:【02-mpi.f】14§2.7.2C程序#include"mpi.h"......int main(int argc,char*argv[]){int myrank,nprocs;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&nprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myrank);......MPI_Finalize();}程序实例:【02-mpi.c】15第三章点对点通信点对点通信指在一对进程之间进行的消息收发操作:一个进程发送消息,另一个进程接收消息.§3.1标准阻塞型点对点通信函数§3.1.1标准阻塞发送Cint MPI_Send(void*buff,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm)Fortran77MPI_SEND(BUFF,COUNT,DATATYPE,DEST,TAG,COMM,IERR)<type>BUFF(*)INTEGER COUNT,DATATYPE,DEST,TAG,COMM,IERRtag的取值范围为0-MPI_TAG_UB.dest的取值范围为0-np-1(np为通信器comm中的进程数)或MPI_PROC_NULL.count是指定数据类型的个数,而不是字节数.§3.1.2阻塞接收Cint MPI_Recv(void*buff,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Status*status)Fortran77MPI_RECV(BUFF,COUNT,DATATYPE,SOURCE,TAG,COMM,+STATUS,IERR)<type>BUFF(*)INTEGER COUNT,DATATYPE,SOURCE,TAG,COMM,IERRINTEGER STATUS(MPI_STATUS_SIZE)tag的取值范围为0-MPI_TAG_UB,或MPI_ANY_TAG.source的取值范围为0-np-1(np为通信器comm中的进程数),或MPI_ANY_SOURCE,或MPI_PROC_NULL.count给出接收缓冲区的大小(指定数据类型的个数),它是接收数据长度的上界.具体接收到的数据长度可通过调用MPI_Get_count函数得到.16§3.1.2.1status中的内容status返回有关接收到的消息的信息,它的结构如下:•在C中status是一个结构,它包含下面三个用户可以使用的域: typedef struct{......int MPI_SOURCE;消息源地址int MPI_TAG;消息标签int MPI_ERROR;错误码......}MPI_Status;•在Fortran77中status各个元素的含义如下:STATUS(MPI_SOURCE)消息源地址STATUS(MPI_TAG)消息标签STATUS(MPI_ERROR)错误码§3.1.2.2查询接收到的消息长度Cint MPI_Get_count(MPI_Status status,MPI_Datatype datatype,int*count)Fortran77MPI_GET_COUNT(STATUS,DATATYPE,COUNT,IERR)INTEGER DATATYPE,COUNT,IERRINTEGER STATUS(MPI_STATUS_SIZE)该函数在count中返回消息的长度(数据类型个数).§3.1.3阻塞型消息传递实例例3.1阻塞型消息传递:【03-ex1.f】17例3.2消息收发顺序导致的程序死锁:【03-ex2.f】例3.3长消息导致的程序死锁:【03-ex3.f】例3.40号进程先发,其它进程先收:【03-ex4.f】:通信过程是串行的.例3.5偶数号的进程先发,奇数号的进程先收:【03-ex5.f】:通信过程是并发的.当NPROCS=1时仍有可能发生死锁.如果将接收及求和中的数组B改成A,会得到什么结果?§3.1.4其它一些阻塞型消息传递函数§3.1.4.1发送与接收组合进行MPI_SENDRECV函数将一次发送调用和一次接收调用合并进行.它使得MPI程序更为简洁.更重要的是,MPI的实现通常能够保证使用MPI_SENDRECV函数的程序不会出现上节例子中出现的由于消息收发配对不好而引起的程序死锁.Cint MPI_Sendrecv(void*sendbuff,int sendcount,MPI_Datatype sendtype,int dest,int sendtag,void*recvbuff,int recvcount,MPI_Datatype recvtype,int source,int recvtag,MPI_Comm comm,MPI_Status*status)Fortran77MPI_SENDRECV(SENDBUFF,SENDCOUNT,SENDTYPE,+DEST,SENDTAG,+RECVBUFF,RECVCOUNT,RECVTYPE,SOURCE,RECVTAG,+COMM,STATUS,IERR)<type>SENDBUFF(*),RECVBUFF(*)INTEGER SENDCOUNT,SENDTYPE,DEST,SENDTAG,+RECVCOUNT,RECVTYPE,SOURCE,RECVTAG,+COMM,IERRINTEGER STATUS(MPI_STATUS_SIZE)例3.6用MPI SENDRECV替换MPI SEND和MPI RECV:【03-ex6.f】18§3.1.4.2发送与接收组合进行,收发使用同一缓冲区Cint MPI_Sendrecv_replace(void*buff,int count,MPI_Datatype datatype,int dest,int sendtag,int source,int recvtag,MPI_Comm comm,MPI_Status*status)Fortran77MPI_SENDRECV_REPLACE(BUFF,COUNT,DATATYPE,+DEST,SENDTAG,SOURCE,RECVTAG,+COMM,STATUS,IERR)<type>BUFF(*)INTEGER COUNT,DATATYPE,DEST,SENDTAG,+SOURCE,RECVTAG,COMM,IERRINTEGER STATUS(MPI_STATUS_SIZE)§3.2消息发送模式MPI共有四种模式的消息发送函数.这些函数具有完全一样的入口参数,但它们发送消息的方式或对接收方的状态要求不同.标准模式(standard mode)由MPI系统来决定是否将消息拷贝至一个缓冲区然后立即返回(此时消息的发送由MPI系统在后台进行),还是等待将数据发送出去后再返回.大部分MPI系统预留了一定大小的缓冲区,当发送的消息长度小于缓冲区大小时会将消息缓冲然后立即返回,否则则当部分或全部消息发送完成后才返回.标准模式发送被称为是非局部的,因为它的完成可能需要与接收方联络.标准模式的阻塞发送函数为MPI_Send.缓冲模式(buffered mode)MPI系统将消息拷贝至一个用户提供的缓冲区然后立即返回,消息的发送由MPI系统在后台进行.用户必须确保所提供的缓冲区大小足以容下采用缓冲模式发送的消息.缓冲模式发送操作被称为是局部的,因为它不需要与接收方联络即可立即完成(返回).缓冲模式的阻塞发送函数为MPI_Bsend.同步模式(synchronous mode)实际上就是在标准模式的基础上还要求确认接收方已经开始接收数据后函数调用才返回.显然,同步模式的发送是非局部的.同步模式的阻塞发送函数为MPI_Ssend.就绪模式(ready mode)调用就绪模式发送时必须确保接收方已经处于就绪状态(正在等待接收该消息),否则该调用将产生一个错误.该模式设立的目的是在一些以同步方式工作的并行系统上由于发送时可以假设接收方已经在接收而减少一些消息发送的开销.如果一个使用就绪模式的MPI程序是正确的,则将其中所有就绪模式的消息发送改为标准模式后也应该是正确的.就绪模式的阻塞发送函数为MPI_Rsend.后三种模式的消息发送函数名分别在标准模式消息发送函数MPI_Send中加上B,S和R得到,并且四个函数具有完全一样的参数.19。
MPI并行程序设计
%小写o
%np: The number of process.
• mpirun –np 4 a.out • mpirun –np 4 hello
– 4 指定np的实参,表示进程数,由用户指定. – a.out / hello 要运行的MPI并行程序.
2019年3月
MPI并行程序设计
17/217
:运行我们的MPI程序!
2019年3月 MPI并行程序设计 18/217
:Hello是如何被执行的?
• SPMD: Single Program Multiple Data(SPMD)
#include "mpi.h" #include <stdio.h> main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); printf( "Hello, world!\n" ); MPI_Finalize(); } #include "mpi.h" #include #include <stdio.h> "mpi.h" #include #include <stdio.h> "mpi.h" main( #include #include <stdio.h> "mpi.h" int main( argc,#include <stdio.h> char int main( *argv[] argc, ) { char int main( *argv[] argc, ) MPI_Init( { char int &argc, *argv[] argc, &argv ) ); printf( MPI_Init( { "Hello, char &argc, *argv[] world!\n" &argv ) ); ); MPI_Finalize(); printf( MPI_Init( { "Hello, &argc, world!\n" &argv ); ); } MPI_Finalize(); printf( MPI_Init( "Hello, &argc, world!\n" &argv ); ); } MPI_Finalize(); printf( "Hello, world!\n" ); } MPI_Finalize(); }
MPI并行编程入门
S SISD
S I
MISD
M 指令个数
SMP- Symmetric MultiProcessing
多个CPU连接于统一的内存总线 内存地址统一编址,单一操作系统映像 可扩展性较差,一般CPU个数少于32个 目前商用服务器多采用这种架构
聚集方式:
归约
扫描
通信模式
一对一:点到点(point to point) 一对多:广播(broadcast),播撒(scatter) 多对一:收集(gather), 归约(reduce) 多对多:全交换(Tatal Exchange), 扫描(scan) , 置
换/移位(permutation/shift)
Work Pool
P1
P2
并行算法
• 并行算法设计基本原则
– 与体系结构相结合——线性结构,二维网络结 构……
– 具有可扩展性——并行算法是否随处理机个数 增加而能够线性或近似线性的加速
– 粗粒度——通常情况,粒度越大越好 – 减少通信——减少通信量和通信次数 – 优化性能——单机计算效率和并行效率
流水线计算示意图
并行化分解方法
– 分而治之方法:
• 以一个简单的求和问题为例,说明什么是分而治之方法。假设在q = 2*2*2个处理机上计算:
可以将计算依次分解为两个小的求和问题,用下图简单的描述(图中给出 的是处理机号)。在图中,从上至下是分解的过程,从下至上是求部分 和的过程。这就是有分有治的一个简单过程,也既是一种分而治之方法。
sp (q) q
–
并行程序设计导论PPT课件
消息传递编程模型
特点
各个并行部分之间通过发送和接收消 息来进行通信和同步。
优点
可扩展性好,适用于分布式内存系统 。
缺点
编程复杂,需要显式地管理通信和同 步。
应用场景
适用于大规模并行处理系统、集群计 算等。
数据并行编程模型
特点
优点
将相同的操作同时应用于不同的数据元素 ,实现数据级别的并行性。
编程简单,易于实现并行化。
04
常用并行算法介绍
并行排序算法
如并行快速排序、并行归并排序等,用于大规模数据的排序。
并行图算法
如并行广度优先搜索、并行最短路径算法等,用于图论问题的求解。
并行矩阵运算
如矩阵乘法、矩阵分解等,是科学计算和工程应用中常见的并行算法。
并行数值计算
如并行蒙特卡罗方法、并行有限元方法等,用于数值计算问题的求解。
06
并行程序设计实践
并行程序设计实验环境搭建
硬件环境
选择适合并行计算的硬件设备,如多 核CPU、GPU或分布式计算集群。
网络环境
确保实验环境中的网络连接稳定,以 便进行分布式并行计算。
软件环境
安装并行程序设计所需的操作系统、 编译器、调试器和性能分析工具。
并行程序设计实验项目介绍
矩阵乘法
通过并行计算加速矩阵乘 法运算,提高计算效率。
Intel VTune Amplifier
针对NVIDIA GPU的并行程序性 能分析工具,可以对CUDA程序 进行性能分析和优化。
并行程序优化策略
任务划分与负载均衡
将并行任务划分为多个子任务,并分配 给不同的处理单元,实现负载均衡,提
高并行效率。
数据局部性优化
MPI并行程序设计..(1)
4、MPI的语言绑定 、 的语言绑定 MPI -1提出了 提出了MPI和FORTRAN77与C语言的绑定。 语言的绑定。 提出了 和 与 语言的绑定 MPI-2加入了对 加入了对Fortran 90和C++语言的绑定说明。 语言的绑定说明。 加入了对 和 语言的绑定说明 绑定示例: 绑定示例: MPI_COMM_RANK( comm, rank ) IN comm OUT rank int MPI_Comm_rank( MPI_Comm comm, int *rank ) 该函数用于得到当前进程标识。 该函数用于得到当前进程标识。
ห้องสมุดไป่ตู้
提供并行库
扩充语法成分
新语言
改动多少
并行语言的实现方式和实现难度之间的关系
二、并行算法
1 、并行算法分类 根据运算的基本对象的不同可以将并行算法分为数值并行 基本对象的不同可以将并行算法分为 根据运算的基本对象的不同可以将并行算法分为数值并行 算法(数值计算) 非数值并行算法(符号计算)。 算法(数值计算)和非数值并行算法(符号计算)。 根据进程之间的依赖关系可以分为同步并行算法( 根据进程之间的依赖关系可以分为同步并行算法(步调 依赖关系可以分为同步并行算法 一致)、异步并行算法(步调进展互不相同) )、异步并行算法 一致)、异步并行算法(步调进展互不相同)和纯并行算 各部分之间没有关系)。 法(各部分之间没有关系)。 根据并行计算任务的大小可以分为粗粒度并行算法( 根据并行计算任务的大小可以分为粗粒度并行算法(一个 任务的大小可以分为粗粒度并行算法 并行任务包含较长的程序段和较大的计算量)、 )、细粒度并行 并行任务包含较长的程序段和较大的计算量)、细粒度并行 算法(一个并行任务包含较短的程序段和较小的计算量) 算法(一个并行任务包含较短的程序段和较小的计算量)以 中粒度并行算法。 及介于二者之间的中粒度并行算法 及介于二者之间的中粒度并行算法。
超性能计算(mpi) ppt课件详解
• 近年来,集群式系统由于具有以下优点而得到了快速发展
低成本、高性能、短周期,大规模并行,分布式共享内存 平民的超级计算机
• 向量机 (芯片级的并行计算机) • MPP(Massively Parallel Processors)
研制难度逐 渐降底
(主板级的并行计算机)
• Cluster
高性能计算程序设计
课程内容
• 并行计算机与并行算法的基础知识
• MPI程序设计
• OpenMP程序设计
目的:
了解和掌握基本的高性能程序设计编程技术。
参考资料
• • • 《高性能计算并行编程技术—MPI并行程序设计》
都志辉
清华大学出版社
《并行算法实践》 阵国良等 高等教育出版社 《并行计算---结构、算法、编程》 阵国良等 高等教育出版社
4、MPI的语言绑定
MPI不是一门语言,而是一个库,必须和特定的语 言绑定才能进行 MPI_I:C、FORTRAN77 MPI_II:C++、FORTRAN90
5、目前MPI的主要实现
• MPICH: 美国的Argonne国家实验室 /mpi/mpich • CHIMP:
计算系统共有15台曙光W580双路服务器,CPU整体峰值 性能达到3.312万亿次/秒。每台计算节点配臵2颗 IntelXEON E5-2630 2.3G 6C CPU六核CPU,24G DDR3 内存。 GPGPU计算系统共有7台曙光W580I,GPU双精度浮点 峰值达到9.17万亿次/秒。每台GPGPU计算节点配臵2块 Nvidia K20 GPGPU卡。 系统配备1台管理/IO/登陆节点,存储裸容量为2.3TB, 部署曙光Gridview 2.6集群管理系统,用户可通过IP地址 实现Web访问。 系统配臵机房环境管理节点1台,部署曙光IMMS机房环 境管理系统。用户可通过IP地址实现Web访问。 系统配臵1套线速互联的56Gb FDR Infiniband网络。 系统共用9个服务器机柜、1个空调机柜、4个航空电源箱 供电,系统峰值功耗约为28kW。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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没有任何意义