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

news2024/11/25 10:24:26

目录

一、实验目的

二、实验说明

三、实验过程

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 Sort
    gettimeofday(&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 Sort
    for (int i = 0; i < n; i++) array[i] = rand_r(&seed); // Reset array
    gettimeofday(&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.coloradmin.cn/o/1852604.html

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

相关文章

吴恩达机器学习 第三课 week2 推荐算法(上)

目录 01 学习目标 02 推荐算法 2.1 定义 2.2 应用 2.3 算法 03 协同过滤推荐算法 04 电影推荐系统 4.1 问题描述 4.2 算法实现 05 总结 01 学习目标 &#xff08;1&#xff09;了解推荐算法 &#xff08;2&#xff09;掌握协同过滤推荐算法&#xff08;Collabo…

正则表达式之三剑客grep

正则表达式匹配的是文本内容&#xff0c;linux的文本三剑客 都是针对文本内容 grep 过滤文本内容 sed 针对文本内容进行增删改查 awk 按行取列 文本三剑客都是按行进行匹配。 grep grep 的作用就是使用正则表达式来匹配文本内容 选项&#xff1a; -m …

vivado SLR

描述 超级逻辑区&#xff08;SLR&#xff09;是包含在堆叠硅中的单个FPGA芯片 互连&#xff08;SSI&#xff09;设备。堆叠式硅互连&#xff08;SSI&#xff09;技术使用无源硅 具有微凸块和硅通孔&#xff08;TSV&#xff09;的内插器&#xff0c;用于组合多个FPGA管芯 切片&a…

最长考拉兹序列

题目&#xff1a; 考虑如下定义在正整数集上的迭代规则&#xff1a; n n/2 (若n为偶数) n 3n1 &#xff08;若n为奇数&#xff09; 从13开始&#xff0c;可以迭代生成如下的序列&#xff1a; 13 40 20 10 5 16 8 4 2 1 可以看出这个序列&#xff08;从13…

实时语音翻译软件哪个好?多语言实时沟通无负担

众所周知&#xff0c;英语是国际交流的共同语言。无论是跨国商务洽谈还是学术研讨&#xff0c;英语的流畅使用至关重要。 然而&#xff0c;语言的障碍依然存在&#xff0c;这时一款高效的英语语音翻译软件就显得尤为关键。它们能够即时转换语言&#xff0c;让我们的对话无国界…

跨境电商系列02:跨境电商的本质,是一场现代文明的“侵x入”吗

作者|夏虫&#xff08;题图&#xff1a;中国龙&#xff09; 公号&#xff0c;数据虫巢(ID: blogchong) “ 不知道有没有人想过一个问题&#xff0c;海出电商市场是增量的没问题&#xff0c;那为何是跨境电商的模式呢&#xff1f;所谓跨境电商&#xff0c;一定是存在商品流动&a…

pytest测试框架pytest-rerunfailures插件重试失败用例

Pytest提供了丰富的插件来扩展其功能&#xff0c;介绍下插件pytest-rerunfailures &#xff0c;用于在测试用例失败时自动重新运行这些测试用例。 pytest-rerunfailures官方显示的python和pytest版本限制&#xff1a; Python 3.8pytest 7.2 或更新版本 此插件可以通过以下可…

《计算机英语》Unit2 Operating System and Computer Architecture 操作系统和计算机构造

SectionA Operating System操作系统 不同操作系统 批处理操作系统(Batch Processing Operating System) 分时操作系统(Time Sharing Operating System) 实时操作系统(Real Time Operating System) 个人操作系统(Personal Operating System) 网络操作系统(NOS, Network Operati…

【Vue3组件】分享一下自己写的简约风格评论区组件

代码比较简单&#xff0c;方便大家二次开发&#xff0c;旨在快速提供基础的样式模板&#xff0c;自行迭代定制 预览 简介 通用评论组件 组件功能 此组件旨在创建一个具备嵌套回复能力的通用评论区域&#xff0c;适用于构建动态、互动性强的用户讨论场景。 接收数据结构 组件通…

运营管理和服务支撑阶段

我前面的所有设备都部署好了&#xff0c;现在就需要运营管理和服务支撑 遇到问题了迅速解决&#xff0c;避免风险扩大 我们也可以给客户提供上面的服务&#xff0c;提高客户的预警能力&#xff0c;安全风险处理能力 我们不仅提供设备&#xff0c;还提供服务 我们公司成立了安…

如何选择服务器?快解析能搭建私人服务器吗?

随着网络的发展&#xff0c;搭建私人服务器逐渐成为网络达人们的热门选择&#xff0c;比如建立私人性质的博客、论坛、FTP、个人网站、服务器集群等。通过源搭建私人服务器&#xff0c;就可以将很多资源分享到网络上进行信息共享。随之而来的是服务器市场不断扩大&#xff0c;在…

马尔可夫聚类算法

马尔可夫聚类算法&#xff08;Markov Clustering Algorithm&#xff0c;MCL&#xff09;是一种用于图聚类的算法&#xff0c;广泛应用于生物信息学、社交网络分析、推荐系统等领域。 其核心思想是模拟随机游走过程&#xff0c;通过迭代地扩散和收缩图上的概率分布来识别图中的…

Java基础的重点知识-01-基础

文章目录 开发前言Java语言开发环境入门程序说明常量变量和数据类型数据类型转换运算符方法解析 开发前言 常用DOS命令 Java语言的初学者&#xff0c;学习一些DOS命令&#xff0c;会非常有帮助。DOS是一个早期的操作系统&#xff0c;现在已经被Windows系统取代&#xff0c;对于…

【mysql】建库

通过命令建库&#xff1a; CREATE DATABASE database_name; 如果是用Workbench&#xff1a;

React+TS前台项目实战(十六)-- 全局常用组件Pagination封装

文章目录 前言Pagination组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 [PC端&手机端] 总结 前言 在上篇文章中&#xff0c;我们封装了表格组件Table&#xff0c;本文则继续封装配套使用的分页器组件。想看Table表格组件的&#xff0c;可自行查看全局常用组件Tab…

【pytorch04】创建Tensor

numpy中的数据创建tensor 数据已经在numpy中了&#xff0c;将numpy中的数据转到tensor中来&#xff0c;因为我们将使用tensor在GPU上进行加速运算 从NUMPY导入的FLOAT其实是DOUBLE类型 list中的数据创建tensor FloatTensor()和大写的Tensor()接收的是shape&#xff08;即数据的…

敏捷开发笔记(第7章节)--什么是敏捷设计

目录 1&#xff1a;PDF上传链接 7.1: 软件出了什么错 7.2: 设计的臭味--腐化软件的气味 7.2.1: 什么激化了软件的腐化 7.2.2: 敏捷团体不允许软件腐化 7.3: “copy”程序 1: 初始设计 2: 需求在变化 3: 得寸进尺 4: 期望变化 7.3.1: “copy”程序的敏捷设计 7.3.2:…

【职场人】职场故事:与邀功精的共舞

在我的职业生涯中&#xff0c;我遇到过一位特别引人注目的同事&#xff0c;我们都叫他李经理。他的工作能力并不差&#xff0c;但他有一个习惯&#xff0c;那就是喜欢邀功。他的这种习惯&#xff0c;不仅让我印象深刻&#xff0c;也让我在合作中学会了不少东西。 恶心的四件事 …

MySQL学习笔记-进阶篇-视图和存储过程

四、视图和存储过程 视图 存储过程 基本语法 创建 CREATE PROCEDURE ([参数列表]) BEGIN --SQL END; 调用 CALL 存储过程名&#xff08;[参数列表]&#xff09; 查看 --查看指定数据库的存储过程及状态信息 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SHCEMA…

AI-智能体

什么是 AI 智能体&#xff1f; 「AI 智能体」这个术语并没有真正被定义&#xff0c;对智能体究竟是什么也存在很多的争议。 AI 智能体可以定义为「一个被赋予行动能力的 LLM&#xff08;通常在 RAG 环境中进行函数调用&#xff09;&#xff0c;以便在环境中对如何执行任务做出…