高性能并行计算华为云实验二:WordCount算法实验

目录

一、实验目的

二、实验说明

三、实验过程

3.1 创建wordcount源码

3.1.1 实验说明

3.1.2 文件创建

3.2 Makefile文件创建与编译

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

3.3.1 主机配置文件建立

3.3.2 运行监测

三、实验结果与分析

4.1 实验结果

4.2 结果分析

4.2.1 原始结果分析

4.2.2 改进后的结果分析

五、实验总结与思考

5.1 实验思考

5.2 实验总结

END~


一、实验目的

1.1 掌握简单的程序编写,如 WordCount 中的 getWords、countWords、treeMerge

1.2 理解集群 WordCount 算法,实现多台主机 WordCount 算法的编译运行

二、实验说明

华为鲲鹏云主机、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 创建wordcount源码

3.1.1 实验说明

实验将提供两个文件夹,第一个文件夹包含 100 个小文件,第二文件夹包含一个大文件。请针对这两种情况分别实现 WordCount 算法,同时把结果打印到屏幕上。WordCount 算法可分解为三步,分别为 getWords 、countWords 、treeMerge。

3.1.2 文件创建

注:以下步骤均需要在四台主机上进行

首先创建 wordcount 目录存放该程序的所有文件, 并进入 wordcount 目录,具体通过输入如下命令:

mkdir /home/zhangsan/wordcount

cd /home/zhangsan/wordcount

然后输入mkdir –p project_file/big_file 、mkdir –p project_file/small_file创建存放测试数据的目录。最后创建wordcount源码wordcount.cpp文件。输入vim wordcount.cpp,添加代码并输入:wq完成保存。

部分代码如下:

 int rank;
 int worldSize;
 MPI_Init(&argc, &argv);
 MPI_Comm_size(MPI_COMM_WORLD, &worldSize);
 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 /*
 * Word Count for big file
 */
{
 struct timeval start, stop;
 gettimeofday(&start, NULL);
 std::string big_file = "./project_file/big_file/big_100.txt";
 auto content = readFile(big_file);
 auto partContent = getWords(content, rank, worldSize);
 auto counts = countWords(partContent);
 treeMerge(rank, worldSize, counts);
 gettimeofday(&stop, NULL);
 if (rank == 0) {
 cout << "word count: "
 << (stop.tv_sec - start.tv_sec) * 1000.0 +
 (stop.tv_usec - start.tv_usec) / 1000.0
 << " ms"<< endl;
 }

3.2 Makefile文件创建与编译

注:以下步骤四台主机均需要完成

首先输入vim Makefile ,进行编辑模式,输入如下内容,注意缩进:

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

然后输入make完成编译,结果如下,生成了一个可执行文件-wordcount

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

3.3.1 主机配置文件建立

注:该步骤需要在四台主机上运行

首先输入vim /home/zhangsan/wordcount/hostfile,编辑如下内容

zzh-hw-0001:4

zzh-hw-0002:4

zzh-hw-0003:4

zzh-hw-0004:4

此处对原教程的内容进行了改进,将处理机数量整体上从8个提升到了16个,观察运行时间的变化规律

3.3.2 运行监测

输入vim run.sh编写 run.sh 脚本,编辑内容如下:

app=${1}
if [ ${app} = "wordcount" ]; then
mpirun --hostfile hostfile -np ${2} ./wordcount
fi

分别执行以下命令,查看 wordcount 运行结果(此步骤仅需在任意一台实现)

bash run.sh wordcount 2
bash run.sh wordcount 4
bash run.sh wordcount 6
bash run.sh wordcount 8
bash run.sh wordcount 10
bash run.sh wordcount 12
bash run.sh wordcount 14
bash run.sh wordcount 16

三、实验结果与分析

4.1 实验结果

I 处理机数为2、4、6、8时

II 处理机数量为10、12、14、16时

将上述结果进行可视化,观察耗时随处理机数量、文件大小的变化关系,如下:

由实验说明中指出第一个文件夹包含100 个小文件,于是尝试将文件

"./project_file/big_file/big_100.txt"改为 "./project_file/big_file/big_99.txt",观察结果变化

部分结果如下

4.2 结果分析

4.2.1 原始结果分析

由可视化结果知,此程序处理机数量增加,耗时反而增加,大文件小文件一致。考虑如下原因:

·通信开销:在分布式系统中,多个进程需要相互通信来协调工作。随着处理器数量的增加,通信开销可能会增加,特别是如果通信模式是全对全(all-to-all)或者需要频繁同步。

·负载不平衡:如果工作负载在各个处理器之间分配不均匀,一些处理器可能会早早完成任务而空闲,而其他处理器还在忙碌,这会导致整体性能下降。

4.2.2 改进后的结果分析

变化趋势依旧不变,仍然是处理机数量越多,耗时越长;仍然考虑通信开销及负载不平衡的原因。切换文件后,耗时依旧变化不大,可能是"./project_file/big_file/big_100.txt"和"./project_file/big_file/big_99.txt"大小差不多,导致最后的运行时间变化不大。

整个实验中,串行的耗时均小于并行的耗时,并没有很好的体现并行化的优势,我认为最可能的原因是用于计数的文件数据量及规模较小,导致并行化的通信开销等造成的性能下降幅度大于并行化处理造成的性能上升幅度。最终使得并行化效果不如串行。

五、实验总结与思考

5.1 实验思考

①实现 WordCount 算法中比较关键的是哪些?

·输入分割:将输入文本分割成单词或词元。

·映射(Map):生成每对(单词,1)。

·键(Key)设计:确保相同的单词映射到相同的键。

·归约(Reduce):对每个单词的所有出现次数进行汇总。

·并行处理:设计算法以支持并行处理,提高效率。

·性能优化:减少不必要的数据传输和计算,优化性能。

②WordCount 算法实现并行化的原理

首先将输入文件分割成多个数据块并分配给不同的进程进行数据分发。每个进程独立地对所接收的数据块执行WordCount操作,完成本地处理并生成局部的单词计数。随后,通过MPI的归约操作,如Reduce或全局汇总操作,例如Gather或Allgather,将所有进程的局部计数合并起来,形成全局的单词计数。最终,结果可以收集到一个主进程中,或者通过广播操作将结果分发到所有进程。

5.2 实验总结

在华为鲲鹏平台上实现WordCount程序的并行化实验中,我成功掌握了MPI并行编程的基本技巧,包括数据的分割、分布式处理、以及结果的归约合并。实验结果显示,随着并行化程度的提高,理论上处理速度应加快,但实际上观察到了耗时增加的现象。我认为有如下原因:

①通信开销:随着进程数量的增加,进程间的数据传输和同步所需的时间可能超过了单机处理的时间。

②负载不均衡:数据在不同进程间可能分配不均,导致部分进程空闲等待,而其他进程仍在处理数据。

③资源限制:硬件资源(如内存或CPU)的限制可能成为瓶颈,限制了并行化的效率。

通过这次实验,我认识到并行化并不是简单地增加进程数就能提升性能,而是需要细致地考虑数据分配、通信策略和资源管理等多个方面。未来,我计划进一步优化算法,比如通过动态负载平衡和减少通信开销来提高并行效率。

END~

享受过程就不要考虑结果
考虑结果就不要享受过程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第3天|数据集 Dataset

1. 学习内容复盘 集数据 什么是数据集 数据是深度学习的基础&#xff0c;高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎&#xff0c;通过数据集&#xff08;Dataset&#xff09;和数据变换&#xff08;Transforms&#xff09;实…

el-input-number 限制输入正整数

vue 页面 限制输入最小值为0 :min"0" <el-input-number v-model"scope.row.num" change"handleNumChange(scope)" keydown.enter.prevent style"width: 200px; " :min"0" />methods 里面限制输入的数字不为小数 使…

虚拟机没关机,电脑直接关机导致虚拟机无法使用

虚拟机没关机&#xff0c;电脑直接关机导致虚拟机无法使用 虚拟机未正常关机 无法打开虚拟机&#xff0c;移除 删除虚拟机目录下的该文件夹CentOSXX.vmx.lck&#xff08;或者重新命名&#xff09; 虚拟机正常打开

引擎霸屏推广9招带你驰骋市场战场-华媒舍

在现代市场竞争激烈的环境下&#xff0c;企业如何快速上车&#xff0c;脱颖而出&#xff0c;引擎霸屏推广成为了一种有效的市场推广手段。本文将为您介绍9招带您驰骋市场战场&#xff0c;让您的品牌广告在市场中快速传播。 一、选对渠道 选择合适的渠道是成功的关键。通过市场…

【C++LeetCode】【热题100】字母异位词分组【中等】-不同效率的题解【3】

题目&#xff1a; 暴力方法&#xff1a; class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {std::unordered_set<std::string> uniqueWord;//单词字符唯一化集合vector<vector<std::string>>…

【CPP】插入排序、希尔排序

目录 1.插入排序1.1直接插入排序简介代码分析 1.2直接插入对比冒泡排序简介代码对比分析(直接插入排序与冒泡的复杂度效率区别) 1.3希尔排序简介代码分析 1.插入排序 基本思想&#xff1a;把一个待排数字按照关键码值插入到一个有序序列中&#xff0c;得到一个新的有序序列。 …

IDEA快速入门06-插件

六、插件 6.1 IDEA插件介绍和管理 手动演示IDEA中怎么下载插件&#xff0c;管理插件等。 File -> Settings -> Plugins 6.2 Alibaba Java Coding Guidelines 6.2.1 实时检查 6.2.2 主动检查 选中【项目名称】或者【某一个具体类】&#xff0c;右键点击【编码规约扫…

【MySQL进阶之路 | 高级篇】InnoDB存储结构

1. 数据库的存储结构 : 页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的.确切说是存储在页结构中.另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入操作.不同的存…

cesium for unity 打包webgl失败,提示不支持

platform webgl is not supported with HDRP use the Vulkan graphics AR instead.

学习es6

1、let变量 2、const常量 3、解构赋值 4、模板字符串 5、简化对象写法 6、参数默认值 7、rest参数 8、扩展运算符 9、扩展对象方法 10、扩展数组方法 11、Set 12&#xff0c;Promise 13、Module模块

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下

1.从某超市顾客中随机抽取5名&#xff0c;他们的购物篮数据的二元0/1表示如下&#xff1a; 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…

如何将图片转换为表格?方法并不难!

如何将图片转换为表格&#xff1f;在数字化时代&#xff0c;图片中的表格信息提取和整理成为了我们日常工作中不可或缺的一部分。不论是学术研究、商业分析还是个人生活&#xff0c;快速、准确地将图片转换为表格都显得尤为重要。今天&#xff0c;我们就来介绍四款强大的图片转…

区块链会议投稿资讯CCF A--WINE 2024 截止7.15 附录用率 附录用的区块链文章

Conference&#xff1a;The Conference on Web and Internet Economics (WINE) CCF level&#xff1a;CCF A Categories&#xff1a;Cross-cutting/comprehensive/emerging Year&#xff1a;2024 Conference time&#xff1a; December 2-5, 2024 录用率&#xff1a; sele…

兴顺物流管理系统的设计

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

51学习记录(一)——51介绍及震动感应灯

文章目录 前言一、STC89C522.内部结构及引脚 二、继电器原理及震动传感器原理三、项目搭建及实现 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、STC89C52 1.简介 所属系列&#xff1a;51单…

API网关在微服务中的应用(1)

API拥有一些职责&#xff0c;如身份验证、监控、负载均衡、缓存、流控。API网关方式的核心要点是&#xff0c;所有客户端和消费端都通过统一的网关接入微服务&#xff0c;在网关层处理所有的非业务功能。 简洁图&#xff1a; 生产图&#xff1a; 网关优点 通过上图中API网关…

Linux工具(包含sudo提权与vim快捷配置)

目录 什么是软件包 查看软件包 如何安装软件 1.官方yum源下载 2.扩展yum源下载 如何卸载软件 补充知识如何将普通用户加入白名单 补充知识rzsz vim编辑器 1.命令模式&#xff08;进入默认为这个模式&#xff09;用户所有的输入都会被当成命令 2.插入模式 3.底行模…

01--MySQL数据库概述

目录 第1章 MySQL数据库概述 1.1 基本概念 1.2 MySQL数据库管理系统 1.3 表的关系 第2章 MySQL卸载、安装、登录 第3章 客户端使用演示 3.1 命令行客户端 3.1.1 数据库 3.1.2 数据表 3.1.3 导入数据 3.1.4 导出数据 3.2 可视化客户端 第4章 SQL语句 4.1 SQL的分类…

驾考小技巧:老北京布鞋!距离高考出分还剩3天,我却看到有些孩子已经拿了“满分”——早读(逆天打工人爬取热门微信文章解读)

我20年驾校4000多块钱&#xff0c;你呢&#xff1f; 引言Python 代码第一篇 洞见 距离高考出分还剩3天&#xff0c;我却看到有些孩子已经拿了“满分”第二篇 视频新闻结尾 引言 昨天的文章顺利发出 看来“梅西” 这两个字在我们这边 不是敏感词 只是很多个罗粉搞得有点过头了 …

代码随想录——分发饼干(Leetcode455)

题目链接 贪心 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count 0;for(int i 0, j 0; i < g.length && j < s.length; i, j){if(s[j] > g[i]){count;}else{i--;}}return count;} }