高性能并行计算华为云实验四:快排算法实验

目录

一、实验目的

二、实验说明

三、实验过程

3.1 创建快排算法源码

3.2 makefile的创建与编译

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

四、实验结果与分析

4.1 结果一及分析

4.2 结果二及分析

五、实验思考与总结

5.1 实验思考

5.2 实验总结

END~


一、实验目的

1.1 掌握多台主机快排算法的编写。

1.2 实现多台主机快排算法的编译运行。

二、实验说明

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

设置的四台主机名称及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 创建快排算法源码

以下步骤均在四台主机上以 zhangsan 用户执行。

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

mkdir /home/zhangsan/quicksort

cd /home/zhangsan/quicksort

然后输入vim quick_sort.cpp,创建快排算法源码 quick_sort.cpp(四台主机都执行),代码输入成功后输入:wq保存文件。关键代码如下:

注:此部分代码在原教程的基础上添加了串行快排算法,并同样计算出了耗时,便于与并行快排算法的性能进行比较,体现并行化的优势。

// Serial Quick Sortgettimeofday(&start, NULL);serialQuickSort(array, 0, n - 1);gettimeofday(&stop, NULL);double serialTime = (stop.tv_sec - start.tv_sec) * 1000 +(stop.tv_usec - start.tv_usec) / 1000;cout << "串行快速排序数组长度为 " << n << " 时所花时间:" << serialTime << " ms" << endl;// Parallel Quick Sortfor (int i = 0; i < n; i++) array[i] = rand_r(&seed); // Reset arraygettimeofday(&start, NULL);#pragma omp parallel{#pragma omp single nowait{parallelQuickSort(array, 0, n - 1);}}gettimeofday(&stop, NULL);double parallelTime = (stop.tv_sec - start.tv_sec) * 1000 +(stop.tv_usec - start.tv_usec) / 1000;cout << "并行快速排序数组长度为 " << n << " 时所花时间:" << parallelTime << " ms" << endl;

3.2 makefile的创建与编译

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

CC = g++
CCFLAGS = -I . -O2 -fopenmp
LDFLAGS = # -lopenblas
all: quicksort
quicksort: quick_sort.cpp${CC} ${CCFLAGS} quick_sort.cpp -o quicksort ${LDFLAGS}
clean:rm quicksort

保存后输入make进行编译,最后可得到一个可执行文件quicksort,如下绿色英文所示:

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

首先输入vim /home/zhangsan/quicksort/hostfile开始配置主机文件,具体内容如下

然后输入vim run.sh编写脚本文件,内容如下

app=${1}
if [ ${app} = "quicksort" ]; then
./quicksort ${2} ${3}
fi

此处较原教程做出了如下改动,将数组长度设为可变,作为命令行参数输入,而原教程中数组长度固定为8000000。做出此改动,便于观察数组长度与程序耗时之间的联系。

具体的调整代码如下:

 srand(time(NULL));if (argc != 3) {cout << "Usage: " << argv[0] << " thread-num array-len\n";exit(-1); }int t = atoi(argv[1]);int n = atoi(argv[2]);int *array = new int[n];

除此之外,还添加了串行快速排序的代码,便于观察并行相对串行的优势。

四、实验结果与分析

4.1 结果一及分析

首先采用教程默认的数组长度-8000000进行测试,结果如下

整理数据如下:

处理机数量

数组长度

串行排序耗时

并行排序耗时

1

8000000

874

1265

2

8000000

875

643

3

8000000

876

649

4

8000000

874

646

5

8000000

875

652

6

8000000

874

654

7

8000000

874

663

8

8000000

875

674

将上述结果进行可视化,如下:

从实验结果中观察到如下现象

①对于串行快速排序,时间基本稳定在 874-876 毫秒之间。

②对于并行快速排序,随着线程数的增加,时间逐渐减少,但在 43线程及以上时基本保持稳定在 640-670 毫秒之间。

可认为此情况下的最佳进程数为2

对实验结果做出以下分析

①串行快速排序的性能稳定: 无论数组长度如何,串行快速排序的性能基本保持稳定。这是因为串行排序没有涉及到线程间的同步和通信,所以性能受到硬件资源限制的影响较小。

②并行快速排序的性能随线程数增加而提升: 随着线程数的增加,并行快速排序的性能逐渐提升。这是因为并行排序可以充分利用多核处理器的优势,在多个线程同时工作时可以更快地完成排序任务。

③并行快速排序性能在一定范围内趋于稳定: 当线程数达到一定数量后,进一步增加线程数并不会显著提升性能。这是因为在一定程度上,增加线程数可能会增加线程间的竞争同步开销、通信开销,导致性能提升不再明显。

4.2 结果二及分析

此部分尝试改变数组长度,研究数组长度对实验结果的影响

①增加数组长度

与之前情况类似,在处理机数量从1到2的过程,性能提升是最多的。

②缩小数组长度

将上述实验数据进行可视化,如下所示:

可以看到数组长度为99999时,依旧是处理机数量从1到2时性能提升最大,之后达到阈值。 处理机数量为8时变慢1ms,考虑开销增加的原因。

五、实验思考与总结

5.1 实验思考

①链接过程进行了什么操作?静态链接器和动态链接器的区别是什么?

链接过程是编译后的一个关键步骤,负责将程序的各个组成部分,包括源代码编译产生的目标文件和所需的库文件,组合形成一个单一的可执行文件。

此过程中,链接器执行多项任务:首先,进行符号解析以识别和匹配每个目标文件中定义的和引用的变量与函数;其次,进行地址和空间分配,为代码和数据设定内存地址并规划它们在可执行文件中的布局;接着,合并所有目标文件中的代码和数据,确保它们在内存中顺序存放;然后,处理库链接,将程序引用的库代码整合到可执行文件中;紧接着,执行重定位,调整代码和数据地址以保证程序运行时正确性;最后,生成可执行文件,使其能够直接在操作系统上运行。

    静态链接器在程序编译时将所有必需的库和代码整合到最终的可执行文件中,导致生成的文件体积较大,但启动速度快,适用于独立发行的软件,因为它们不依赖外部库。

相比之下,动态链接器在程序运行时才加载和解析库,使得可执行文件更小,但可能增加启动时的解析和加载时间。动态链接允许多个程序共享内存中的库代码,节省空间,并且便于库的更新,无需重新编译依赖它的程序。这两种链接方式各有优势,选择哪一种取决于程序的特定需求和运行环境。

②简述快排算法的并行化原理

算法并行化的原理是将任务分解成独立子任务,分配到多个处理器上同时执行,以减少总体计算时间。关键在于确保子任务的独立性,有效管理数据划分、通信和同步,以及实现负载均衡,从而提升计算效率。

5.2 实验总结

在华为鲲鹏平台上进行的快速排序算法实验中,我们深入研究了快速排序算法在串行与并行环境下的性能表现。串行快速排序显示出良好的稳定性,无论数组长度如何变化,执行时间均稳定在874-876毫秒之间,说明其性能受硬件资源限制较小,且不受线程间同步和通信的影响。并行快速排序则随着线程数的增加表现出显著的性能提升,尤其是在从单线程过渡到双线程时最为明显,之后当线程数增至4线程以上时,执行时间稳定在640-670毫秒之间,表明在本实验中最佳线程数为2,此时多核处理器的优势得到了充分发挥。然而,当线程数超过某个阈值后,性能提升不再显著,因为额外的同步和通信开销抵消了并行化的优势。此外,数组长度的改变也对性能有显著影响,在数组长度较大时,从单线程到双线程的性能提升最为显著,而在数组长度较小时,多线程环境下的性能提升幅度有所降低。

通过在华为鲲鹏平台上编译运行快速排序算法程序,我掌握快速排序算法的编写和编译运行技能。通过这些实验,我深入理解了快速排序算法在串行与并行环境下的性能特点,以及线程数和数据规模对算法效率的影响。这些知识对于优化算法性能和设计高效计算应用具有重要意义。

END~

 

生活不是函数,问题和答案不是一一对应的关系! 

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

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

相关文章

移动端 UI 风格,诠释精致

移动端 UI 风格&#xff0c;诠释精致

C++跨平台socket编程

C跨平台socket编程 一、概述1.1 TCP协议1.1 TCP 的主要特性1.2 TCP报文格式 UDP报文格式IP协议使用windows编辑工具直接编辑Linux上代码 二、系统socket库1.windows上加载socket库2.创建socket2.1 windows下2.2 linux下 3.网络字节序4.bind端口5.listen监听并设置最大连接数6.a…

什么是投保人豁免,第二投保人,什么是ROI和IRR

投保人豁免通常是指在保险合同中&#xff0c;如果投保人因意外伤害或疾病导致身故或全残&#xff0c;保险公司将免除后续的保险费用&#xff0c;而被保险人的保险合同仍然有效。这意味着&#xff0c;如果投保人因意外身故&#xff0c;保险公司将不再收取保费&#xff0c;但被保…

css布局之flex应用

/*父 100*/.parent-div {/* 这里添加你想要的属性 */display: flex;flex-direction: row; //行justify-content: space-between; //左右对齐align-items: center;flex-wrap: wrap; //换行}/*中 90 10 */.middle-div {/* 这里添加你想要的属性 */display: flex;flex-direction:…

Redis 入门篇

文章目录 Redis简介关系型数据库:非关系型数据库 Redis应用场景Redis下载和安装Redis 数据类型Redis 常用命令字符串 string 操作命令哈希 hash 操作命令列表 list 操作命令集合 set 操作命令有序集合 sorted set 操作命令通用命令 Jedis 快速入门配置依赖建立连接 / 操作 Jedi…

【物联网】802.15.4简介

目录 一、概述 二、802.15.4主要特点 2.1 工作频段和数据速率 2.2 支持简单器件 2.3 信标方式和超帧结构 2.4 数据传输和低功耗 三、低功耗 一、概述 802.15.4包括用于低速无线个人域网(LR-WPAN)的物理层和媒体接入控制层两个规范。它能支持消耗功率最少&#xff0c;一般…

使用python下载图片且批量将图片插入word文档

最近有一个小的功能实现&#xff0c;从小某书上下载指定帖子的图片们&#xff0c;然后批量插入到word文档中&#xff0c;便于打印。于是有了以上需求。 一、下载图片 1、首先获取图片们的链接img_urls 首先&#xff0c;获取到的指定帖子的所有信息可以存入一个json文件中&am…

NeRF从入门到放弃4: NeuRAD-针对自动驾驶场景的优化

NeuRAD: Neural Rendering for Autonomous Driving 非常值得学习的一篇文章&#xff0c;几乎把自动驾驶场景下所有的优化都加上了&#xff0c;并且也开源了。 和Unisim做了对比&#xff0c;指出Unisim使用lidar指导采样的问题是lidar的垂直FOV有限&#xff0c;高处的东西打不…

深入源码设计!Vue3.js核心API——Computed实现原理

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

华为HCIP Datacom H12-821 卷5

1.单选题 下列哪种工具不能被 route-policy 的 apply 子句直接引用? A、IP-Prefix B、tag C、community D、origin 正确答案: A 解析: 因route-policy工具中, apply 后面跟的是路由的相关属性。 但是ip-prefix是用来匹配路由的工具。 2.单选题

Map.entry方法总结

Map.entry方法总结 大家好&#xff0c;在下是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的程序员&#xff0c;也是穿着拖鞋写代码&#xff0c;穿着拖鞋调BUG&#xff0c;穿着拖鞋也要拯救世界的“拖鞋王”&#xff01; 什么是Map.entry方法&#xff1f; 在Java中&…

Leetcode 力扣 128. 最长连续序列 (抖音号:708231408)

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…

【AI技术】GPT-4o背后的语音技术猜想

前言&#xff1a; 本篇文章全文credit 给到 台大的李宏毅老师&#xff0c;李宏毅老师在机器学习上风趣幽默、深入浅出的讲解&#xff0c;是全宇宙学AI、讲中文学生的福音&#xff0c;强力推荐李宏毅老师的机器学习课程和深度学习 人工智能导论&#xff1b; 李宏毅老师的个人长…

bazel build ‘...‘

Okay, let’s discuss the Bazel build command: bazel build ‘…’. Bazel Build Command: The bazel build command is used to build the targets (e.g., libraries, binaries, tests) specified in a Bazel-based project. Target Selection: The ‘…’ part of the com…

力扣(2024.06.22)

1. 59——螺旋矩阵2 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 标签&#xff1a;数组&#xff0c;矩阵&#xff0c;模拟 代码&#xff1a; class Solution:def generateMatrix(sel…

SVN 安装教程

SVN 安装教程 SVN&#xff08;Subversion&#xff09;是一个开源的版本控制系统&#xff0c;广泛用于软件开发和文档管理。本文将详细介绍如何在不同的操作系统上安装SVN&#xff0c;包括Windows、macOS和Linux。 Windows系统上的SVN安装 1. 下载SVN 访问SVN官方网站或Visu…

wordpress教程自动采集并发布工具

随着互联网的快速发展&#xff0c;越来越多的人开始关注网络赚钱。而对于许多人来说&#xff0c;拥有一个自己的个人网站是一个不错的选择。然而&#xff0c;要让自己的个人网站内容丰富多样&#xff0c;就需要不断地进行更新。那么&#xff0c;有没有一种方法可以让我们轻松地…

如何用单位圆解释sin(150°)?

单位圆是半径为1的圆&#xff0c;它被用来解释三角函数。在单位圆中&#xff0c;角度是按照逆时针方向测量的&#xff0c;从正x轴开始。对于角度150&#xff0c;我们可以按照以下步骤来解释sin(150)&#xff1a; 1. **确定角度位置**&#xff1a;150位于第二象限。在单位圆中&a…

【图像生成技术】人工智能在医疗健康领域的应用实例:图像生成技术的革新实践

在当今医疗健康的前沿阵地&#xff0c;人工智能(AI)技术正以前所未有的速度重塑着医疗服务的面貌&#xff0c;其中图像生成技术尤其在提升诊断精度、优化治疗策略及增强医疗教育方面展现出了巨大潜力。以下将通过一个简化的示例&#xff0c;展示如何利用深度学习模型&#xff0…

1-Wire的使用

代码&#xff1a; ds18b20.c /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;1-Wire 单总线的使用文件&#xff1a;ds1820.c说明&#xff1a;DS18B20驱动文件。为了简单&#xff0c;没有读取芯片地址&#xff0c;也没有计算校验作者&#xff1a;邵子扬时间&…