高性能并行计算华为云实验一: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~
先苦不一定后甜,但先甜一定先甜!
相关文章:

高性能并行计算华为云实验一:MPI矩阵运算
目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建矩阵乘法源码 3.1.1 实验说明 3.1.2 实验步骤 3.2 创建卷积和池化操作源码 3.2.1 实验说明 3.2.2 实验步骤 3.3 创建Makefile文件并完成编译 3.4 建立主机配置文件与运行监测 四、实验结果与分析 4.1 矩阵乘法…...

库卡机器人减速机维修齿轮磨损故障
一、KUKA机器人减速器齿轮磨损故障的原因 1. 润滑不足:润滑油不足或质量不佳可能导致齿轮磨损。 2. 负载过重:超过库卡机械臂减速器额定负载可能导致齿轮磨损。 3. 操作不当:未按照说明书操作可能导致KUKA机器人减速器齿轮磨损。 4. 维护不足…...

【C/C++】我自己提出的数组探针的概念,快来围观吧
数组探针 在许多编程语言中如果涉及到数组那么就可以使用这个东西,便于遍历数组 中文名 数组探针 外文名 arrProbe 适用领域 大数据 所属学科 软件技术、编程 提出者 董翔 目录 1 概述2 工作原理3 应用场景 ▪ 数据处理和分析▪ 图像处理▪ 游戏开发▪…...

ArcGIS图斑分区(组)排序—从上到下从左到右
点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 ArcGIS图斑分区(组)从上到下从左到右排序 是之前的内容的升级 GIS技巧100例——12ArcGIS图斑空间排序 关于今天的内容 我们在19年已经和大家分…...

React useRef 组件内及组件传参使用
保存变量, 改变不引起渲染 import { useRef} from react; const dataRef useRef(null) ... dataRef.current setTimeout(()>console.log(...),1000)绑定dom const inputRef useRef(null) <input ref {inputRef} />绑定dom列表 - ref 回调 const ite…...

Intelij IDEA中Mapper.xml无法构建到资源目录的问题
问题场景: 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时,在配置文件均与eclipse一致的情况下出现了如下报错: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…...

2024.6.23周报
目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、网络架构 四、创新点 五、文章解读 1、Introduction 2、Method 3、实验 4、结论 二、代码实验 总结 摘要 本周阅读了一篇题目为NAS-PINN: NEURAL ARCHITECTURE SEARCH-GUIDED PHYSICS-INFORMED NEURAL N…...

鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(中)
前言 在鸿蒙开发的广袤天地中,网络层的搭建与封装无疑是构建高效、稳定应用的基石。继上篇的探索之后,本文将继续深入网络层的优化之旅,揭秘如何通过类型转换器、请求查询附加器以及丰富的常量参数,将网络层的构建艺术推向一个新…...

docker in docker 连私有仓库时报错 https
背景 jenkins 是使用 docker 方式部署的, 在 jenkins中又配置了 docker 的命令, 使用的宿主机的 docker 环境, 在jenkins 中执行 docker 相关命令的时候报错 jenkinse0e7b943b6e4:/$ docker login -u admin -p Harbor12345 172.16.100.15:80 WARNING! Using --password via t…...

mac怎么压缩pdf文件,苹果电脑怎么压缩pdf文件大小
在当今数字化时代,PDF文件已成为广泛使用的文档格式之一。然而,PDF 文件可能会因其包含的图像、图形和其他元素而导致文件较大,这可能会影响文件的传输、存储和共享。因此,对 PDF 文件进行压缩以减小其文件大小是很有必要的。今天…...

兴顺物流管理系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,驾驶员管理,物流资讯管理,车辆管理,基础数据管理 员工账户功能包括:系统首页,个人中心,物流资讯管理&…...

力扣(2024.06.21)
1. 54——螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照顺时针螺旋顺序 ,返回矩阵中的所有元素。 标签:数组,矩阵,模拟 代码: class Solution:def spiralOrder(self, matrix: List[List[int]]) -&…...

飞机大战java
"飞机大战"是一种经典的射击游戏,通常在各种平台上都有实现,包括Java。如果你想要开发一个Java版本的飞机大战游戏,你可能需要考虑以下几个方面: 游戏设计:确定游戏的基本规则,比如玩家控制的飞机…...

Springboot的自动配置原理
文章目录 Springboot的自动配置原理?1. Spring Boot Starter 依赖2.SpringBootApplication注解3.自动触发配置4.Auto-configuration Classes5.条件注解6. 外部配置文件7. 优先级和排除总结 Springboot的自动配置原理? 1. Spring Boot Starter 依赖 Spring Boot 提供了各种 …...

Interview preparation--elascitSearch深分页问题
深度分页出现原因 当我们需要查询的数据页数特别大的时候,比如from size 大于10000 的时候,可能出现“window is too large” 异常,如下网图: 查询语句如下 { "query": { "bool": { "must": [ {…...

C语言笔试题:实现把一个无符号整型数字的二进制序列反序后输出
目录 题目 实例 方法一:直接交换 方法二:间接交换 拓展 题目 编写一个函数,将一个无符号整数的所有位逆序(在32位机器下) 实例 例如有一个无符号整数 unsigned int num 32; unsigned int 在32位系统中占4个字…...

elementplus如何实现dialog遮罩层外的元素可以被操作点击
elementplus如何实现dialog遮罩层外的元素可以被操作点击 element plus 组件库中的 dialog 组件可以说是使用频率最高的组件之一,它的效果是弹出一个对话框,外面默认会有一个蒙层。 现在我碰到的需求是,弹窗要正常显示,但是蒙层下…...

Springboot整合Kafka消息队列服务实例
一、Kafka相关概念 1、关于Kafka的描述 Kafka是由Apache开源,具有分布式、分区的、多副本的、多订阅者,基于Zookeeper协调的分布式处理平台,由Scala和Java语言编写。通常用来搜集用户在应用服务中产生的动作日志数据,并高速的处…...

kotlin——MVVM框架下的大型项目优化
目录 概要 优化思路 一、重构过长的Activity 二、优化臃肿的ViewModel 示例代码: 概要 在大型项目中,随着项目越做越大,activity和viewmodel的代码会越来越多,尽量保持Activity和ViewModel的代码精简和易于维护是非常重要的。个人…...

echarts实现折线图点击添加标记
文章目录 背景一、代码示例 背景 业务场景体现在功能层面主要两点, 折线图表设置点击事件点击事件与图标渲染标记绑定 对于节点没有被添加标记的可以,弹框提示添加标记,并提供标记内容输入框,已经添加过标记的点,点…...

循环赛日程表
描述 n 2 ^ k个选手 每个选手必须与其他n-1个选手各赛一次每个选手一天赛一次比赛打n-1天 思路 k 3时的解 我们先进行假设:每个选手第一天和自己比,然后分解成4个子问题: (1)14号的第14天,对手1~4号; (2)14号的第58天&a…...

计算机网络:运输层 - 概述
计算机网络:运输层 - 概述 运输层的任务端口号复用与分用UDP协议首部格式 TCP协议面向字节流 运输层的任务 物理层、数据链路层以及网络层,他们共同解决了将主机通过网络互联起来所面临的问题,实现了主机到主机的通信。 网络层的作用范围是…...

使用阿里开源的Spring Cloud Alibaba AI开发第一个大模型应用
背景 前段时间看到Spring推出了SpringAI,可以方便快速的接入ChatGPT等国外的大模型,现在阿里巴巴也紧追脚步推出了Spring Cloud Alibaba AI,Spring Cloud Alibaba AI 目前基于 Spring AI 0.8.1 版本 API 完成通义系列大模型的接入。通义接入…...

`THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。
demo案例 THREE.PointsMaterial 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。下面是对其构造函数的参数、属性和方法的详细讲解。 构造函数 const material new THREE.PointsMaterial(parameters);参数&am…...

Android-Android Studio-FAQ
1 需求 2 接口 3 Android Studio xml布局代码补全功能失效问题 最终解决方案就是尝试修改compileSdk 为不同SDK版本来解决问题,将原本34修改为32测试会发现xml代码补全功能有效了! 参考资料 Android Studio xml布局代码补全功能失效问题_android studi…...

架构师指南:现代 Datalake 参考架构
这篇文章的缩写版本于 2024 年 3 月 26 日出现在 The New Stack 上。 旨在最大化其数据资产的企业正在采用可扩展、灵活和统一的数据存储和分析方法。这一趋势是由企业架构师推动的,他们的任务是制定符合不断变化的业务需求的基础设施。现代数据湖体系结构通过将数…...

通讯协议大全(UART,RS485,SPI,IIC)
参考自: 常见的通讯协议总结(USART、IIC、SPI、485、CAN)-CSDN博客 UART那么好用,为什么单片机还需要I2C和SPI?_哔哩哔哩_bilibili 5分钟看懂!串口RS232 RS485最本质的区别!_哔哩哔哩_bilibili 喜欢几位…...

基于EXCEL数据表格创建省份专题地图
1 数据源 随着西藏于5月1日发布2022年一季度经济运行情况,31省份一季度GDP数据已全部出炉。 总量方面,粤苏鲁稳居前三;增速方面,23省份高于“全国线”,新疆表现最佳,增速达到7.0%。 表格表现数据不够直观…...

基于java+springboot+vue实现的电商应用系统(文末源码+Lw)241
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本电商应用系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…...

好文!12个策略解决 Kafka 数据丢失问题
哥们儿!有遇到Kafka数据丢失问题的问题吗,你是如何解决的?今天的文章,V哥来详细解释一下,整理了12种解决策略,希望可以帮助你解决项目中的问题:以下是一些常见的解决方案和最佳实践。 生产者确认…...