高性能计算实验——矩阵乘法基于MPI的并行实现及优化

这篇具有很好参考价值的文章主要介绍了高性能计算实验——矩阵乘法基于MPI的并行实现及优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.实验目的

1.1.通过MPI实现通用矩阵乘法

熟练掌握MPI编程方法,并将通用矩阵乘法转为MPI并行实现,进一步加深MPI的使用与理解。

1.2.基于MPI的通用矩阵乘法优化

进一步熟悉MPI矩阵乘法的实现,学习MPI点对点通信与集合通信的异同点和各自的优缺点,学会比较二者的性能以及各自使用的情形。

1.3.改造实验1成矩阵乘法库函数

学习如何将自己编写的代码改造为标准库函数,供其他程序调用。
理解动态链接的过程。

2.实验过程和核心代码

2.1.通过MPI实现通用矩阵乘法

2.1.1.问题描述
通过 MPI 实现通用矩阵乘法(实验1)的并行版本,MPI并行进程(rank size)从 1 增加至 8,矩阵规模从 512 增加至 2048.

问题描述:随机生成 MN 和NK 的两个矩阵 A,B,对这两个矩阵做乘法得到矩阵 C.
输入:M , N, K 三个整数(512 ~2048)
输出:A,B,C 三个矩阵以及矩阵计算的时间

2.1.2.实现过程
这里可以选择点对点通信或者集合通信的方式实现,这里选择点对点方式,使用MPI_Send、MPI_Recv函数进行进程通信。
思想:

最简单的实现,按行并行:
主进程不参与计算,只负责分发和收集数据。在主进程中,A根据处理器数按行划分为大致相等的N部分,然后将部分的A和全部的B传递给子进程。子进程计算部分乘法并返回结果,主进程收集并整合报告结果。使用最简单的Send和Recv进行通信。

2.1.3.核心代码
①矩阵生成

void Gen_Matrix(int m,int n,int k){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            A[i][j] = rand()%5;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<k;j++){
            B[i][j] = rand()%5;
        }
    }
}

②MPI初始化
mpi矩阵乘法,高性能计算实验,MPI,并行计算

③获得进程数(通过bash)
mpi矩阵乘法,高性能计算实验,MPI,并行计算

④获得时间
mpi矩阵乘法,高性能计算实验,MPI,并行计算

⑤主处理器
mpi矩阵乘法,高性能计算实验,MPI,并行计算
这里主处理器通过Send传递给每一个处理器n/pnum行A、与整个的B,接着接受所有子处理器返回的结果进行拼接。

⑥子处理器
mpi矩阵乘法,高性能计算实验,MPI,并行计算
这里子处理器需要相应的接受Recv主处理器Send的过来的A部分行与整个的B,接着进行计算,即matMulti函数,最后Send回结果。

⑦矩阵乘法
mpi矩阵乘法,高性能计算实验,MPI,并行计算

这里就是简单的使用朴素计算方法,为了方便,直接将结果存在了部分结果矩阵返回。

2.2.通用矩阵乘法优化

2.2.1.问题描述
分别采用 MPI 点对点通信和 MPI 集合通信实现矩阵乘法中的进程之间通信,并比较两种实现方式的性能。
上面已经采用点对点通信的方式进行了实现,接下来针对集合通信来进行实验。

2.2.2.实现过程
这里分发A时,是将A平均的分配给了各个进程,使用Scatter分发比较何时,而B要完整的分发给所有处理器,所以使用Broadcast通信更为方便,收集计算结果使用Gather。
mpi矩阵乘法,高性能计算实验,MPI,并行计算
mpi矩阵乘法,高性能计算实验,MPI,并行计算
mpi矩阵乘法,高性能计算实验,MPI,并行计算

广播是最简单但也是最有用的集体操作之一。
改用Scatter分配数据后,每个进程分配的部分矩阵具有完全相等的规模。因此。记comm_sz为进程数,矩阵的维度需要是comm_sz的倍数。我们将矩阵的维度扩展到comm_sz的倍数,多余的部分用0填充,保证正确性。
改用Scatter分配数据后,计算任务平均地分配给每一个进程,所以主进程不仅要分发收集结果,也要参与计算。如果分发的行数不够,就不能保证结果正确;如果分发的行数超出,就会出现很多不同类型的内存错误(大多都源于free时内存泄漏等原因)。

2.2.3.核心代码
①给A、B矩阵赋初值
mpi矩阵乘法,高性能计算实验,MPI,并行计算
这里必须要平均分配给各个处理器,因此有必要在不够分配时扩大矩阵,就需要在无数据的位置补零。

②获取矩阵大小,这里需要假设矩阵大小相同(通过bash)
mpi矩阵乘法,高性能计算实验,MPI,并行计算
mpi矩阵乘法,高性能计算实验,MPI,并行计算
后续处理,将真实矩阵大小扩展到处理器个数的倍数。

③MPI初始化
同上第一部分;

④主线程
mpi矩阵乘法,高性能计算实验,MPI,并行计算
mpi矩阵乘法,高性能计算实验,MPI,并行计算
主线程额外进行初始化矩阵以及计算并输出时间的工作
mpi矩阵乘法,高性能计算实验,MPI,并行计算
使用Scatter平均分发A的行,Bcast分发B。
mpi矩阵乘法,高性能计算实验,MPI,并行计算
使用Gather收集结果。

⑤所有处理器计算
mpi矩阵乘法,高性能计算实验,MPI,并行计算

MatMulti函数与上面实验相同。

2.3.改造实验1成矩阵乘法库函数

2.3.1.问题描述
将Lab1 的矩阵乘法改造为一个标准的库函数 matrix_multiply(函数实现文件和函数头文件),输入参数为三个完整定义矩阵(A,B,C),定义方式没有具体要求,可以是二维矩阵,也可以是 struct 等。在 Linux 系统中将此函数编译为.so 文件,由其他程序调用。

2.3.2.实验过程
通常情况下,对函数库的链接是放在编译时期(compile)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无关系,因为所有需要的函数已拷贝到自己门下。所以这些函数库被称为静态库(static libaray),通常文件名为“libxxx.a”的形式。
由于动态链接库函数的共享特性,它们不会被拷贝到可执行文件中。在编译的时候,编译器只会做一些函数名之类的检查。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址无关代码(Position Independent Code (PIC))。
对gcc编译器,只需添加上 -fPIC 标签,如:=

gcc -fPIC -c file1.c
gcc -fPIC -c file2.c
gcc -shared libxxx.so file1.o file2.o

注意到最后一行,-shared 标签告诉编译器这是要建立动态链接库。这与静态链接库的建立很不一样,后者用的是 ar 命令。也注意到,动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”

2.3.3.核心代码
①Mat_mul.h头文件
mpi矩阵乘法,高性能计算实验,MPI,并行计算

这里自定义矩阵,包括行、列、矩阵体,同时声明需要的函数。

②Mat_mul.c头文件
mpi矩阵乘法,高性能计算实验,MPI,并行计算

Malloc_matrix函数用于根据矩阵rows\cols分配矩阵并进行初始化。
mpi矩阵乘法,高性能计算实验,MPI,并行计算

Free_matrix函数用于释放相应空间。
mpi矩阵乘法,高性能计算实验,MPI,并行计算

Mul_matrix函数是核心计算函数,会首先检查是否满足乘法条件。

3.实验结果

3.1.通过MPI实现通用矩阵乘法

mpi矩阵乘法,高性能计算实验,MPI,并行计算

编译得到相应的MPI程序;
mpi矩阵乘法,高性能计算实验,MPI,并行计算

执行得到2048大小的矩阵使用2个处理器时间消耗为186s
mpi矩阵乘法,高性能计算实验,MPI,并行计算

执行得到2048大小的矩阵使用4个处理器时间消耗为75s
结果可以看出在处理器足够的情况下,增加处理器数目可以大大提高运算速度,符合预期。

3.2.基于MPI的通用矩阵乘法优化

编译程序:
mpi矩阵乘法,高性能计算实验,MPI,并行计算
mpi矩阵乘法,高性能计算实验,MPI,并行计算

执行得到2048大小的矩阵使用4个处理器时间消耗为87s,2048大小的矩阵使用2个处理器时间消耗为140s。
结果可以看出在处理器足够的情况下,增加处理器数目可以大大提高运算速度,符合预期。

3.3.改造实验1成矩阵乘法库函数

mpi矩阵乘法,高性能计算实验,MPI,并行计算

编译为.so文件
mpi矩阵乘法,高性能计算实验,MPI,并行计算

改变当前动态库路径为当前目录
mpi矩阵乘法,高性能计算实验,MPI,并行计算

编写的测试文件;
测试结果:
mpi矩阵乘法,高性能计算实验,MPI,并行计算

查看链接:
mpi矩阵乘法,高性能计算实验,MPI,并行计算
自己的.so文件成功链接。

4.实验感想

本次实验是高性能实验的核心,主要是使用MPI进行矩阵乘法的实现与优化,总体来说并不是很难,需要掌握点对点与集群通信两种方式的MPI。
其中还有很多可以优化的点,比如传递给处理器的整个的B是没有必要的,我们可以简单的对B矩阵进行转置,接着把与传递A相同的几行传递给处理器即可,可以大大减少通信量。文章来源地址https://www.toymoban.com/news/detail-779705.html

到了这里,关于高性能计算实验——矩阵乘法基于MPI的并行实现及优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于高性能计算环境的HPC算力编程模式

    摘要 【目的】 随着云计算、大数据、人工智能等技术的兴起和广泛应用,促进了基于多元算力的融合计算发展。在国家“东数西算”战略的指引下,充分发挥HPC算力优势,提供新型HPC算力编程模式,是新一代计算基础设施可编程能力的重要变革。 【方法】 分析了高性能计算环境

    2024年02月02日
    浏览(9)
  • 企业如何构建高性能计算云?

    企业如何构建高性能计算云?

    HPC是推动科学和工程应用发展的重要组成部分。除了将处理器向Exascale迈进之外,工作负载的性质也在不断变化—从传统的模拟和建模到混合工作负载,包括企业内部和云应用,还需要整合、吸收和分析来自无数物联网传感器的数据。同时,随着HPC基础设施上的人工智能工作

    2024年02月03日
    浏览(12)
  • 高性能计算与AI融合成为刚需|什么是高性能计算?应用领域有哪些?与人工智能的关系梳理

    高性能计算与AI融合成为刚需|什么是高性能计算?应用领域有哪些?与人工智能的关系梳理

    本文一部分转载自杨净 整理自 MEET2023量子位 算力的需求,远比以往来得更为猛烈。甚至有人直呼:得算力者得未来。 元宇宙、AIGC、AI for Science的涌现,又给高性能计算(HPC)平添了好几把火。 在诸多挑战与机遇共存交织的当下,这一领域泰斗中国工程院院士、清华大学计算

    2024年02月08日
    浏览(10)
  • 从零开始学架构-计算高性能

    从零开始学架构-计算高性能

            高性能是每个程序员的追求,无论做一个系统、还是写一组代码,都希望能够达到高性能的效果。而高性能又是最复杂的一环,磁盘、操作系统、CPU、内存、缓存、网络、编程语言、数据库、架构等,每个都可能影响系统的高性能,一行不恰当的 debug 日志,一个

    2023年04月24日
    浏览(15)
  • 高性能计算HPC笔记(一):概论

    高性能计算HPC笔记(一):概论

    学习自: B站北京大学Linux俱乐部:https://space.bilibili.com/3461562830424779 学习视频:北大未名超算队 高性能计算入门讲座(一):概论 这里PPT中有个问题:客户端只上传公钥给服务器,私钥是自己保留的。 概念 SISD:用一个线程去执行一条指令。 SIMD:使用单个instruction来操作多条

    2024年01月19日
    浏览(17)
  • 【高性能计算】opencl安装及相关概念

    异构计算是一种利用多种不同类型的计算资源来协同解决计算问题的方法。它的核心思想是将不同特性和能力的计算设备(例如CPU、GPU、FPGA等)组合在一起,以充分发挥它们在不同类型的工作负载和任务中的优势。 传统的计算模型通常依赖于单一类型的处理器,如中央处理

    2024年02月11日
    浏览(13)
  • Intel oneAPI——让高性能计算触手可及

    Intel oneAPI——让高性能计算触手可及

    在人工智能兴起的今天,大规模、高性能计算已成为社会发展的刚需。动辄千万节点规模的社交网络、交通网络,语言聊天模型中的大规模神经网络,以及航空航天等涉及大规模计算的场景,都少不了并行计算的支持。并行计算是一种一次可执行多个指令的算法,目的是提高

    2024年02月01日
    浏览(42)
  • 理解高性能网络技术对云计算的影响

    作者:禅与计算机程序设计艺术 云计算是一个新兴的服务形态,它通过将软件资源池化、软件定义网络以及基础设施即服务(IaaS)等多种形式的服务提供给消费者,将资源和服务的部署自动化,并按需付费的方式将服务运行起来。云计算服务的流行使得各种网络环境的用户都能

    2024年02月03日
    浏览(13)
  • 高性能云计算构架与实践7-nova安装配置

    高性能云计算构架与实践7-nova安装配置

    1创建nova_api、nova、novacell0数据库,创建nova_api、nova、novacell0用户并授权,密码是123456.      2重启数据库 Systemctl restart mariadb 3创建nova用户,输入密码123456 添加admin角色到nova用户 openstack role add --project admin --user nova admin 创建服务实体 openstack service create --name nova --description \\\"O

    2023年04月10日
    浏览(8)
  • 【高性能计算】opencl语法及相关概念(三)事件,内存

    【高性能计算】opencl语法及相关概念(三)事件,内存

    当谈到OpenCL中的事件时,它们代表了执行的各个阶段或操作的状态信息。通过使用事件,您可以跟踪和管理内核执行以及内存操作的进度和顺序。以下是与OpenCL事件相关的关键概念: 创建事件:您可以使用 clCreateUserEvent 或 clCreateUserEventWithProperties 函数手动创建事件,或者使

    2024年02月10日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包