高性能并行计算华为云实验一:MPI矩阵运算

目录

一、实验目的

二、实验说明

三、实验过程

3.1 创建矩阵乘法源码

3.1.1 实验说明

3.1.2 实验步骤

3.2 创建卷积和池化操作源码

3.2.1 实验说明

3.2.2 实验步骤

3.3 创建Makefile文件并完成编译

3.4 建立主机配置文件与运行监测

四、实验结果与分析

4.1 矩阵乘法实验

4.1.1 实验结果

4.1.2 结果分析

4.2 卷积实验

4.2 1 实验结果

4.2.2 结果分析

4.3 池化实验

4.3.1 实验结果

4.3.2 结果分析

五、实验思考与总结

5.1 实验思考

5.2 实验总结

END~

先苦不一定后甜,但先甜一定先甜!


一、实验目的

1.1 掌握简单的程序编写以及编译运行,集群 MPI 并行计算的配置以及加深对并行计算的了解。

1.2 实现在多台主机上编译运行矩阵乘法、卷积、池化的程序。

二、实验说明

华为鲲鹏云主机、openEuler 20.03 操作系统;

安装 mpich-3.3.2.tar.gz;

安装 OpenBLAS-0.3.8.tar.gz;

四台主机名称及ip地址如下:

122.9.37.146   zzh-hw-0001

122.9.43.213   zzh-hw-0002

116.63.11.160  zzh-hw-0003

116.63.9.62    zzh-hw-0004

三、实验过程

3.1 创建矩阵乘法源码

3.1.1 实验说明

随机生成大小为 1024 *1024 的矩阵作为输入,实现对应的矩阵乘法,矩阵乘法主要利用了矩阵划分方法,每一个工作节点的进程负责某一行和某一列的乘法,主节点则负责矩阵的划分以及分发到各个工作节点。

以下步骤均在 ecs-00-0001 上,以 zhangsan 用户执行。

3.1.2 实验步骤

执行以下命令,创建 matrix 目录存放该程序的所有文件, 并进入 matrix 目录(四台主机都执行)

mkdir /home/zhangsan/matrix

cd /home/zhangsan/matrix

然后输入vim gemm.cpp创建矩阵乘法源码gemm.cpp,部分代码如下

struct timeval start, stop; 
if (rank == 0) { 
randMat(m, n, leftMat); 
randMat(n, k, rightMat); 
randMat(m, k, resMat); 
} 
gettimeofday(&start, NULL); 
mpi_sgemm(m, n, k, leftMat, rightMat, resMat, rank, worldSize, blas); 
gettimeofday(&stop, NULL); 
if (rank == 0) { 
cout << "mpi matmul: " 
<< (stop.tv_sec - start.tv_sec) * 1000.0 + 
(stop.tv_usec - start.tv_usec) / 1000.0 
<< " ms" << endl; 
for (int i = 0; i < m; i++) { 
for (int j = 0; j < k; j++) 
if (int(resMat[i * k + j]) != n) { 
cout << resMat[i * k + j] << "error\n"; 
exit(-1); 
} 
// cout << resMat[i * k + j] << ' '; 
// cout << endl; 
} 
} 

3.2 创建卷积和池化操作源码

3.2.1 实验说明

实现卷积计算操作,卷积核的大小为 4*4,卷积算法种类很多,在这里我们主要使用 img2col 算法来加速卷积算法,img2col 算法原理为利用数据的重排布把卷积转化为矩阵乘法。

基于乘法的程序实现池化计算操作,池化使用的 kernel 大小为 4*4,池化操作与卷积操作类似,更为简单,只需取每一个感受野内的最大值。

以下步骤均在 zzh-00-0001 上,以 zhangsan 用户执行

3.2.2 实验步骤

首先输入cd /home/zhangsan/matrix进行marix目录,然后输入vim conv.cpp创建卷积操作源码,代码输入结束后,点击esc案件退出编辑模式,输入:wq完成编辑并保存文件。

然后输入vim conv.cpp创建卷积操作源码,输入所提供的源码,代码输入结束后同上操作进行保存。部分代码如下所示:

nt m = atoi(argv[1]);int n = atoi(argv[2]);int img2col = atoi(argv[3]);int xKernel = 3, yKernel = 3;int xStep = 1, yStep = 1;float *Img, *Conv;struct timeval start, stop;if (rank == 0) {randMat(m, n, Img);randMat(get_steps(xKernel, xStep, m), get_steps(yKernel, yStep, n),Conv);}

控制台输入ls -l,可查看三个cpp文件是否创建保存成功。

3.3 创建Makefile文件并完成编译

首先四台主机都输入vim Makefile进人编辑模式,然后输入如下内容:

(注:需注意代码缩进)

CC = mpic++
CCFLAGS = -O2 -fopenmp
LDFLAGS = -lopenblas
all: gemm conv pooling 
gemm: gemm.cpp${CC} ${CCFLAGS} gemm.cpp -o gemm ${LDFLAGS}
conv: conv.cpp${CC} ${CCFLAGS} conv.cpp -o conv ${LDFLAGS}
pooling: pooling.cpp${CC} ${CCFLAGS} pooling.cpp -o pooling ${LDFLAGS}
clean:rm gemm conv pooling

文件保存成功后输入“make”实现编译,正确编译后会得到如下三个可执行文件(预备实验四台主机均已经配置好OpenBLAS 环境):gemm、conv、pooling。

3.4 建立主机配置文件与运行监测

首先四台主机输入vim /home/zhangsan/matrix/hostfile进入文件编辑,输入如下内容:
zzh-hw-0001:2

zzh-hw-0002:2

zzh-hw-0003:2

zzh-hw-0004:2

然后输入vim run.sh创建并编写run.sh脚本,此处相比教程内容有所改动,具体内容如下:

app=${1}
if [ ${app} = "gemm" ]; then
mpirun --hostfile hostfile -np ${2} ./gemm 4024 4024 4024 ${3}
fi
if [ ${app} = "conv" ]; then
mpirun --hostfile hostfile -np ${2} ./conv 4096 4096 ${3}
fi
if [ ${app} = "pooling" ]; then
mpirun --hostfile hostfile -np ${2} ./pooling 1024 1024
fi

相较原内容改动之处在于矩阵乘法部分,我修改了参数的输入形式,将第四个参数设为命令行输入,而不是run.sh文件中设定(注:原参数默认为0,即不启用了img2col 操作),其他内容不做过多改动。

四、实验结果与分析

4.1 矩阵乘法实验

4.1.1 实验结果

首先在其中一台主机输入如下命令,执行对应程序,运行结果如下。

bash run.sh gemm 8 0       bash run.sh gemm 8 1

bash run.sh gemm 7 0       bash run.sh gemm 7 1

bash run.sh gemm 6 0       bash run.sh gemm 6 1

bash run.sh gemm 5 0       bash run.sh gemm 5 1

bash run.sh gemm 4 0       bash run.sh gemm 4 1

bash run.sh gemm 3 0       bash run.sh gemm 3 1

将这部分运行结果进行可视化,如下所示:

原教程run.sh文件对应的结果(处理机数量为1、2时的结果)

4.1.2 结果分析

①大致符合进程数越多,时间越短,符合并行计算的规律,但存在比较特别的现象,如进程数为5 的时候耗时34326ms(进程数为4的时候类似),而进程数为8的时候耗时却36745ms;

原因分析:

考虑负载均衡,在某些情况下,特定的数据分布和任务分配可能导致某些进程比其他进程执行更多的工作,从而导致负载不均衡。如果进程数为5时正好使得任务在各个进程之间能够更均匀地分配,那么可能会导致更好的性能表现。

考虑通信开销,通信开销可能随着进程数量的增加而增加,尤其是在进程数较多的情况下。当进程数为5时,可能刚好达到了一个性能的平衡点,使得通信开销相对较小,从而导致更短的执行时间。

②使用img2col 操作后,程序的执行速度均得到明显的提高;此情况下,更符合进程数越多,耗时越短的规律。

原因分析:img2col 操作会将输入图像转换为一个更大的矩阵,使得卷积操作可以转换为矩阵乘法,从而可以利用矩阵乘法的高效实现来加速计算。但其会增加内存消耗。

4.2 卷积实验

4.2 1 实验结果

注:受篇幅限制,仅展示处理机数量为1、4、8的结果

conv 后面的 1-8 数字表示启动处理的进程数量。最后面的 0 表示 vanilla convolution kernel,1 表示 img2col kernel。

4.2.2 结果分析

当进程数为1时,整个计算可能在单个处理器上运行,并且没有额外的通信开销,因此耗时很短是正常的。当进程数增加到2时,可能出现了额外的通信开销,以及在数据分割和合并过程中产生的开销,导致整体耗时增加。随着进程数继续增加,可能出现了更好的并行效果,减少了每个进程的工作量,同时也减少了通信开销,因此整体耗时下降。

4.3 池化实验

4.3.1 实验结果

将上述运行结果进行可视化

4.3.2 结果分析

①处理机为1时耗时短:这可能是因为当只有一个处理机时,没有通信开销,所有的计算都在单个处理机上完成,因此耗时最短。

②处理机为2时耗时变长:这可能是由于几个原因造成的:

通信开销:当处理机数量增加时,需要在处理机之间进行数据交换,这会引入通信开销。

负载不均衡:如果任务分配不均匀,一些处理机可能需要等待其他处理机完成工作,导致整体耗时增加。

资源争用:两个处理机可能在争用某些共享资源,如内存或I/O,这可能导致效率降低。

③随着处理机数量增加,耗时继续下降或者产生波动:这表明随着更多的处理机加入,任务可以更有效地分配,并且可能有更多的资源可供使用,从而减少了等待时间和通信开销。但是,这种下降并不是线性的,因为随着处理机数量的增加,通信开销和协调复杂性也可能增加,因此会产生一定的波动。

五、实验思考与总结

5.1 实验思考

1.如何添加 C、C+头文件以及库路径加入环境变量?

在Linux系统中,添加C或C++头文件以及库文件到环境变量通常涉及如下步骤:

①确定头文件和库文件的位置:

首先,需要确定C或C++头文件和库文件存放在哪个目录下。通常这些文件位于/usr/include、/usr/local/include或某个特定安装目录下。

②编辑环境变量:

环境变量C_INCLUDE_PATH和CPLUS_INCLUDE_PATH分别用于指定C和C++的头文件路径,而LD_LIBRARY_PATH用于指定库文件的路径。

③使用export命令:

可以通过export命令来设置环境变量。以想添加/usr/local/myapp/include到C和C++的头文件路径为例,可以使用以下命令:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/myapp/include

export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/myapp/include

④将环境变量添加到配置文件:

为了使这些更改永久生效,需要将上述export命令添加到你的shell配置文件中,如.bashrc、.profile或.zshrc。打开配置文件,添加上述命令,然后保存并重新加载配置文件:

source ~/.bashrc

通过这些步骤,可以将C或C++头文件和库文件的路径添加到环境变量中,从而确保编译器和链接器能够找到它们。

2.矩阵乘法与卷积运算、池化运算有什么关系?

①矩阵乘法与卷积运算的关系:

·卷积核(Convolutional Kernel):在卷积神经网络(CNN)中,卷积运算使用小的矩阵(通常称为卷积核或滤波器)来提取图像中的局部特征。这些卷积核本质上是权重矩阵。

·局部特征提取:卷积运算通过将卷积核与输入数据(如图像)的局部区域进行矩阵乘法来计算。这相当于在输入数据的局部区域内应用了一个线性变换。

②矩阵乘法与池化运算的关系:

·池化窗口:池化运算,如最大池化或平均池化,通常使用一个固定大小的窗口在输入数据上滑动,这个窗口可以看作是一个矩阵。

·降维:池化运算的目的是降低数据的空间维度,减少计算量,并使特征检测更加鲁棒。池化窗口在输入数据上滑动时,对窗口内的数据进行某种形式的矩阵乘法(如求和或取最大值)。

·非线性变换:与卷积运算不同,池化运算通常不涉及权重学习,而是一种确定性的非线性变换。然而,池化窗口内的操作(如求和或比较)可以看作是一种特殊的矩阵乘法。

5.2 实验总结

本实验在先前实验所建立的并行计算环境基础上进一步展开,成功实现了基础矩阵操作、卷积运算和池化运算。通过配置hostfile文件,实验成功扩展至八节点的处理机集群,旨在深入研究并行计算环境下的性能表现。

实验结果表明,随着处理机数量的增加,程序的并行化程度得到提升,从而显著降低了整体的执行时间。然而,值得注意的是,尽管并行化带来了性能上的普遍提升,但在某些特定情况下,由于通信开销的增加,其效率可能不如传统的串行计算。通过本次实验,我不仅掌握了基础的程序编写、编译及运行技能,还对集群MPI并行计算的配置有了深入的理解,并加深了对并行计算原理及其应用的认识。

END~

先苦不一定后甜,但先甜一定先甜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

压缩包文件密码破解软件 Ziperello 下载及使用教程

使用 Ziperello https://qweree.cn/index.php/416/ 对加了密码的压缩包进行密码破解&#xff0c;教程如下&#xff1a; 第一步&#xff0c;双击运行 Ziperello双击我打开程序.exe&#xff0c;如下图&#xff1a; 第二步&#xff0c;打开一个加了密的 ZIP 压缩包&#xff0c;再…

什么概率密度函数?

首先我们来理解一下什么是连续的随机变量&#xff0c;在此之前&#xff0c;我们要先理解什么是随机变量。所谓随机变量就是在一次随机实验中一组可能的值。比如说抛硬币&#xff0c;我们设正面100&#xff0c;反面200&#xff0c;设随机变量为X&#xff0c;那么X{100,200}。 X是…

STM32学习笔记(十)--I2C、IIC总线协议详解

概述&#xff1a;Inter Integrated Circuit&#xff0c;一组多从 多组多从 有应答 是一种同步&#xff08;具有时钟线需要同步时钟SCL&#xff09;、串行&#xff08;一位一位的往一个方向发送&#xff09;、半双工&#xff08;发送接收存在一种&#xff09;通信总线。 &…

【调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法】

调试笔记-系列文章目录 调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法 文章目录 调试笔记-系列文章目录调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调…

qmt量化交易策略小白学习笔记第46期【qmt编程之期货行情数据--如何获取5档盘口行情、期货结算价与持仓量】

qmt编程之获取期货数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取5档盘口行情 …

GeoJson 地图地理信息数据获取

效果图&#xff1a; 获取渠道&#xff1a; 通过阿里数据可视化平台获取通过Vector Maps获取通过geojson来获取 1、通过阿里数据可视化平台获取 2、通过Vector Maps获取 3、通过geojson获取

数据通信与网络(五)

交换机功能&#xff1a; 地址学习&#xff08;端口/MAC地址映射表&#xff09; 通信过滤&#xff08;基于端口/MAC地址映射表&#xff09; 生成树协议&#xff08;断开环路&#xff09; 隔离冲突域 生成树协议 隔离冲突域 交换机配置模式(用不同级别的命令对交换机进行配置) 普…

如何一步一步将Python中的应用打包成安卓的APK安装包文件

一、首先&#xff0c;按照如下链接操作 Python 应用打包成 APK【全流程】_python打包成apk-CSDN博客 二、运行 buildozer init会报错buildozer命令找不到&#xff0c;明明已经安装 解决方法&#xff1a; 这里重新创建一个conda环境 Installation — Buildozer 0.11 docum…

Oracle基本语法(SQLPlus)

目录&#xff1a; 前言&#xff1a; 准备工作&#xff1a; 登录&#xff1a; 1.打开SQL Plus命令行工具 第一种方式&#xff1a; 第二种方式&#xff1a; 2.以不同用户登录 SYSTEM&#xff08;普通管理员&#xff09;&#xff1a; SYS(超级管理员)&#xff1a; 不显示…

408计算机组成原理

todo:有逻辑的分门别类的整理笔记&#xff0c;方便复习 总 理解不了就直接背下来&#xff0c;学越多就越能理解 计算机系统概述 简要目录 基本概念 字长 MAR MDR PC IR CU ALU 通用寄存器、标志寄存器、标志控制器 ACC 地址译码器 通用寄存器 PU C语言编译过程 数据通路带…

DAY10-力扣刷题

1.最后一个单词的长度(简单) 58. 最后一个单词的长度 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子…

Unity3d自定义TCP消息替代UNet实现网络连接

以前使用UNet实现网络连接,Unity2018以后被弃用了。要将以前的老程序升到高版本,最开始打算使用Mirro,结果发现并不好用。那就只能自己写连接了。 1.TCP消息结构 (1). TCP消息是按流传输的,会发生粘包。那么在发射和接收消息时就需要对消息进行打包和解包。如果接收的消息…

Nutch爬虫在大数据采集中的应用案例

引言 在当今信息爆炸的时代&#xff0c;大数据的价值日益凸显。网络作为信息的海洋&#xff0c;蕴藏着丰富的数据资源。Nutch&#xff0c;作为一个开源的Java编写的网络爬虫框架&#xff0c;以其高效的数据采集能力和良好的可扩展性&#xff0c;成为大数据采集的重要工具。本文…

Mac安装多个jdk环境(jdk8+jdk17)保姆级

Mac安装多个jdk环境&#xff08;jdk8jdk17&#xff09;保姆级 背景&#xff1a;新机安装开发环境发现需要找很多文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;这里一篇文章安装所有环境 文章目录 Mac安装多个jdk环境&#xff08;jdk8jdk17&#xff09;保姆级&#x1f…

C语言入门系列:指针入门(超详细)

文章目录 一&#xff0c;什么是指针1&#xff0c;内存2&#xff0c;指针是什么&#xff1f; 二&#xff0c;指针的声明1&#xff0c;声明指针类型变量2&#xff0c;二级指针 三&#xff0c;指针的计算1&#xff0c;两个指针运算符1.1 *运算符1.2 & 运算符1.3 &运算符与…

【Arthas案例】应用包含两个相同全限定类名StaticLoggerBinder,引起log4j.Level类找不到异常

3分钟内解决问题 两个不同的GAV依赖冲突&#xff0c;包含相同全限定类名&#xff0c;引起ClassNotFoundException Maven依赖的三坐标体系GAV(G-groupId&#xff0c;A-artifactId&#xff0c;V-version) 【案例1】某应用依赖两个GAV不同的jar&#xff0c;但包含两个相同全限定类…

OpenCv形态学(一)

目录 形态学转换 结构元素 腐蚀 膨胀 开运算 闭运算 形态学梯度 顶帽 黑帽 图像轮廓 查找轮廓 绘制轮廓 形态学转换 形态变换是一些基于图像形状的简单操作。通常在二值图像上执行。它需要两个输入&#xff0c;一个是我们的原始图像&#xff0c;第二个是决定操作性…

6月21日(周五)AH股总结:沪指失守3000点,恒生科技指数跌近2%,多只沪深300ETF午后量能显著放大

内容提要 沪指全天围绕3000点关口来回拉锯&#xff0c;收盘跌破3000点。白酒及光刻机概念集体走低&#xff0c;中芯国际港股跌超2%。CRO医药概念及水利股逆势走强。 A股低开低走 沪指全天围绕3000点关口来回拉锯&#xff0c;收盘跌破3000点&#xff0c;跌0.24%。深成指跌0.04…

ubuntu 20.04 访问csdn报错 Secure connection failed 解决

问题原因&#xff1a; 我一边更新源 sudo apt update & apt upgrade一边在看csdn&#xff0c;估计是这个导致的. 所以我直接把华为源换成了阿里源。 sudo apt update & apt upgrade再更新一次&#xff0c;解决。

探索语言模型的智能飞跃:预训练损失与突现能力的新视角

在人工智能的辉煌编年史中&#xff0c;语言模型&#xff08;LMs&#xff09;的崛起标志着自然语言处理领域的一个巨大飞跃。随着技术的进步&#xff0c;这些模型不仅在规模上日益庞大&#xff0c;更在性能上不断刷新着人们的认知边界。它们在问答、翻译、文本摘要等任务上展现出…