高性能MPI编程实验

一、实验目的

通过华为云上的计算资源开展实践,认识华为鲲鹏高性能计算开发技术体系,进一步学习掌握云平台的功能特性和实践步骤,熟悉大数据系统云上开发部署的方式方法。通过高性能MPI编程与大数据MapReduce框架验证分析实验,掌握多节点高性能编程方法和基本原理,分析大数据开发框架中并行计算的实现方法。为开展大数据系统研发和云上部署打下基础。

二、实验要求

1.掌握云平台的功能特性和实践步骤;
2.掌握高性能MPI编程开发方法;
3.运用MPI编程实现WordCount算法;
4.分析高性能MPI编程与大数据MapReduce异同。

三、华为云平台的功能特性和实践关键步骤

1.功能特性:华为云平台提供可视化、一键式部署服务,支持并行部署,在部署好一台主机之后,可以编写脚本,分发到各个脚本,然后在另外几台主机上直接执行这个脚本,可以完成软件的安装;同时支持自定义镜像,通过华为云提供的“桶”容器,可以将已经部署好的一台主机打包成镜像,上传到“桶列表”,之后选择另外几台主机的时候直接选择列表里的私有镜像,便可以省去重复的部署过程;CloudIDE对接Git仓库,从而在安装软件OpenBlas的时候可以直接从GitHub拉下来,而不受墙内网络的影响,同时支持40多种语言的语法高亮以及缩进,在编写cpp文件的时候很方便。
2.实践关键步骤:在安装mpich的时候,进行配置(./configure……)之前,需要先安装好gcc、gfortran、g++等编译器,如果在configure和make 过程中不需要gfortran可以在命令里面加上 - -disable gfortran;因为mpich目前绑定的语言只有C/C++、fortran,这个实验中,我们使用C++,所以其实不需要fortran编译器;之后,安装OpenBlas的时候,要从Git仓库直接拉取软件源,然后是和安装mpich类似的步骤;安装好环境之后,编写代码以及保障多节点间免密登录是非常重要的一步。
3.关键图:
1).节点间免密登录
在这里插入图片描述

2).单节点执行WordCount程序:
节点1上执行:
在这里插入图片描述

节点2上执行:
在这里插入图片描述

节点3上执行:
在这里插入图片描述

节点4上执行:
在这里插入图片描述

3).在ecs-hw-0001(节点1)上使用分布式多节点资源并行执行:
2节点,4进程:
在这里插入图片描述

3节点,6进程:
在这里插入图片描述

4节点,8进程:
在这里插入图片描述

四、高性能MPI编程开发关键过程

  1. MPI的消息传递过程可以分为三个阶段:
    (1)消息装配,将发送数据从发送缓冲区中取出,加上消息信封等形成一个完整的消息。
    (2)消息传递,将装配好的消息从发送端传递到接收端。
    (3)消息拆卸,从接收到的消息中取出数据送入接收缓冲区。
    在这三个阶段,都需要类型匹配:
    (1)在消息装配时,发送缓冲区中变量的类型必须和相应的发送操作指定的类
    型相匹配;
    (2)在消息传递时,发送操作指定的类型必须和相应的接收操作指定的类型相
    互匹配;
    (3)在消息拆卸时,接收缓冲区中变量的类型必须和接收操作指定的类型相匹配。归纳起来,类型匹配规则可以概括为: 有类型数据的通信,发送方和接收方均使用相同的数据类型。 无类型数据的通信,发送方和接收方均以MPI_BYTE作为数据类型。打包数据的通信, 发送方和接收方均使用MPI_PACKED。
  2. MPI是一种在多节点的情况下能快速进行数据交流的标准。在MPI这种标准下的并行编程中,用户必须通过显式地发送和接收消息来实现处理机间的数据交换,每个并行进程都有自己独立的地址空间,相互之间不能直接访问;有了通信标准,之后必须要定义要传递的消息并确定消息的数据类型(MPI对象);使用常用的基本函数,完成不同主机、不同进程之间的消息通信;

五、WordCount算法的MPI实现关键点

1.使用并行I/O读取,并行I/O可以避免读取再Scatter的过程,这样减少了消息传递时间,但是同时也消耗了更多的内存。
2.使用虚拟进程,虚拟进程(MPI_ PROC_ NULL)是不存在的假想进程,在MPI中的主要作用是充当真实进程通信的目或源,引入虚拟进程的目的是为了在某些情况下编写通信语句的方便。当一个真实进程向一个虚拟进程发送数据或从一个虚拟进程接收数据时,该真实进程会立即正确返回,如同执行了一个空操作。在很多情况下为通信指定一个虚拟的源或目标是非常方便的,这不仅可以大大简化处理边界的代码,而且使程序显得简洁易懂。在捆绑发送接收操作中经常用到这种通信手段。一个真实进程向虚拟进程MPI PROC NULL发送消息时会立即成功返回; 一个真实进程从虚拟进程MPI _PROC NULL的接收消息时也会立即成功返回,并且对接收缓冲区没有任何改变。
在这里插入图片描述

MPI_File fh;
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
bufsize = FILESIZE/nprocs;
nints = bufsize/sizeof(int);
MPI_File_open(MPI_COMM_WORLD, “./project_file”, MPI_MODE_ RDONLY, MPI_INFO_NULL, &fh);
MPI_File_seek(fh, rank * bufsize, MPI_SEEK_SET); MPI_File_read(fh, buf, nints, MPI_INT, &status); MPI_File_close(&fh);

六、MPI编程与MapReduce的比较分析

MPI是基于消息传递的经典代表,是消息传递并行程序设计的标准,用于构建高可靠的、可伸缩的、灵活的分布式应用程。消息传递并行处理开销比较大,适合于大粒度的进程级并行计算,相对其他并行编程环境,它具有很好的可移植性,几乎能被所有的并行环境支持;还具有很好的可扩展性,具有完备的异步通信功能,能按照用户的要求很好地分解问题,组织不同进程之间进行数据交换,适合大规模可扩展性的并行算法。
MapReduce这种编程模型不仅适用于云计算,在多核和多处理器、Cell processor以及异构机群上同样有良好的性能。利用MapReduce,程序员能够轻松地编写紧耦合的程序,在运行时能高效地调度和执行任务,在实现时,在Map函数中指定对各分块数据的处理过程,在Reduce函数中指定如何对分块数据处理的中间结果进行归约。用户只需要指定Map和Reduce函数来编写分布式的并行程序,不需要关心如何将输入的数据分块、分配和调度,同时系统还将处理集群内节点失败及节点间通信的管理等。而MPI仅仅是一个并行计算标准,没有相应的分布式文件系统的支撑,在大数据场景下大文件的存储及访问都会成为一个问题,同时用户还需要考虑集群节点之间的通信协调、容错等问题,这些使得MPI的编程难度比较大,集群本身的规模也很难做到像MapReduce那样的超大规模。
MPI模式在学术研究领域应用较多,而在商业领域,云计算系统大多采用的是Google云计算系统中的MapReduce并行编程模型。云计算强调的就是简单的编程模型,而MapReduce就是一种高效的、简单的并行编程模式,也是一种高效的任务调度器。

七、小结

MPI是一种基于消息传递的并行编程技术,而不是一种具体的编程语言。MPI程序不仅可以适用于多线程的方式并行计算还可以让程序以多进程的方式执行,以这种方式执行的程序并不共享存储,各进程通过消息传递来进行通信。这样的好处是完成某一计算任务的不同进程可以运行在不同处理器上,甚至是在不同节点的计算机上,方便分布式计算系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看不见的罗辑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值