MPI并行编程实验报告

合集下载

并行计算_实验三_简单的MPI并行程序及性能分析

并行计算_实验三_简单的MPI并行程序及性能分析

并行计算_实验三_简单的MPI并行程序及性能分析一、实验背景和目的MPI(Massive Parallel Interface,大规模并行接口)是一种用于进行并行计算的通信协议和编程模型。

它可以使不同进程在分布式计算机集群上进行通信和协同工作,实现并行计算的目的。

本实验将设计和实现一个简单的MPI并行程序,并通过性能分析来评估其并行计算的效果。

二、实验内容1.设计一个简单的MPI并行程序,并解决以下问题:a.将一个矩阵A进行分块存储,并将其均匀分配给不同的进程;b.将每个进程分别计算所分配的矩阵块的平均值,并将结果发送给主进程;c.主进程将收到的结果汇总计算出矩阵A的平均值。

2.运行该MPI程序,并记录下执行时间。

3.对程序的性能进行分析:a.利用不同规模的输入数据进行测试,观察程序的运行时间与输入规模的关系;b. 使用mpiexec命令调整进程数量,观察程序的运行时间与进程数量的关系。

三、实验步骤1.程序设计和实现:a.设计一个函数用于生成输入数据-矩阵A;b.编写MPI并行程序的代码,实现矩阵块的分配和计算;c.编写主函数,调用MPI相应函数,实现进程间的通信和数据汇总计算。

2.编译和运行程序:a.使用MPI编译器将MPI并行程序编译成可执行文件;b.在集群上运行程序,并记录下执行时间。

3.性能分析:a.对不同规模的输入数据运行程序,记录下不同规模下的运行时间;b. 使用mpiexec命令调整进程数量,对不同进程数量运行程序,记录下不同进程数量下的运行时间。

四、实验结果和分析执行实验后得到的结果:1.对不同规模的输入数据运行程序,记录下不同规模下的运行时间,得到如下结果:输入规模运行时间100x1002.345s200x2005.678s300x30011.234s...从结果可以看出,随着输入规模的增加,程序的运行时间也相应增加。

2. 使用mpiexec命令调整进程数量,对不同进程数量运行程序,记录下不同进程数量下的运行时间,得到如下结果:进程数量运行时间110.345s26.789s43.456s...从结果可以看出,随着进程数量的增加,程序的运行时间逐渐减少,但当进程数量超过一定限制后,进一步增加进程数量将不再显著减少运行时间。

并行程序实验报告

并行程序实验报告

并行程序设计实验报告姓名:学号:一、实验目的通过本次试验,了解使用OpenMP编程的基本方法和MPI的编程方法,通过实践实现的基本程序,掌握基本的线程及进程级并行应用开发技术,能够分析并行性能瓶颈及相应优化方法。

二、实验环境Linux操作系统,mpi库,多核处理器三、实验设计与实现(一)MPI并行程序设计用MPI编写一个greeting程序,编号为0的进程接受其它各进程的“问候”,并在计算机屏幕上显示问候情况。

用MPI编写一个多进程求积分的程序,并通过积分的方法求π的值,结果与π的25位精确值比较。

(二)多线程程序设计用Pthreads或OpenMP编写通过积分的方法求π的程序。

把该程序与相应的MPI程序比较。

用Pthreads或OpenMP编写编写矩阵相乘的程序,观察矩阵增大以及线程个数增减时的情形。

四、实验环境安装(一)MPI环境安装1.安装kylin操作系统的虚拟机(用VirtualBox)2.安装增强功能,使之与windows主机能够文件共享。

3.拷贝mpich-3.0.4.tar.gz到/root/myworkspace/目录下,并解压(tar xzf mpich-3.0.4.tar.gz)4.下面开始安装mkdir /root/myworkspace/mpi./configure --prefix=/root/myworkspace/mpi --disable-f77 --disable-fcmakemake install5.配置环境变量打开/root/.bashrc文件,在文件的末尾加上两行:PATH=$PATH:/root/myworkspace/mpi/binexport PATH保存退出,然后执行命令source /root/.bashrc(二)openMP实验环境安装Visual Studio中修改:项目->属性->c/c++->语言,将“OpenMP支持”改成“是”:五、实验结果及分析(一)MPI并行程序设计实验一:问候发送与接收非零号进程将问候的信息发送给0号进程,0号进程依次接收其它进程发送过来的消息并将其输出。

MPI综合实验报告

MPI综合实验报告

MPI综合实验报告一、实验目的本次实验旨在探究MPI并行计算技术在多节点集群中的应用,并通过编写相关代码实现一个简单的并行计算任务,验证MPI的计算能力和效果。

二、实验原理MPI(Message Passing Interface)是一种并行计算中进程间通信的标准接口。

MPI通过发送和接收消息来实现进程之间的通信,协调各个计算节点的工作。

一般而言,MPI程序由多个进程组成,每个进程可以独立地执行计算任务,当需要进行通信时,进程可以通过MPI提供的接口来发送和接收消息。

三、实验过程1.配置MPI环境在实验开始前,需要在多个节点上安装MPI环境,并确保各节点之间能够正常通信,可以互相发送和接收消息。

2.编写代码首先,需要编写一个主进程(通常为进程0)和多个子进程参与计算的代码。

主进程负责将计算任务分配给子进程,并收集子进程的计算结果。

子进程则负责进行具体的计算任务。

以下是一个简单的示例代码:```pythonfrom mpi4py import MPIif rank == 0:#主进程负责任务分配data = [i for i in range(size-1)] # 分配给每个子进程的数据for i in range(1, size):#主进程接收结果result = []for i in range(1, size):print("Result:", result)else:#子进程接收任务数据#子进程进行计算result = data * 2#子进程发送计算结果```以上代码使用了mpi4py库来实现MPI的功能。

在主进程中,首先准备要分配的数据,然后将每个子进程的数据发送给相应的子进程,并接收子进程的计算结果。

在子进程中,首先接收来自主进程的数据,然后进行计算,并将计算结果发送给主进程。

3.运行实验在配置好MPI环境和编写好代码后,将代码保存并上传到各个节点上。

然后,在主节点上执行以下命令来运行程序:``````其中,`-np 5`表示使用5个进程来进行计算。

并行程序实验报告

并行程序实验报告

并行程序实验报告( 一).并行程序的简介。

MPI(Message Passing Interface)是目前最重要的一种并行编程工具和环境,几乎所有重要的并行计算机厂商都提供对它的支持,MPI将功能、高效和移植性三个重要而又有一定矛盾的方面很好地融为一体,这是MPI能够取得成功的重要原因。

SIMD/MIMD并行计算机:指令和数据是计算机解决问题所涉及到的两个基本方面,即让计算机"执行什么"样的操作和对"什么对象"执行相应的操作,虽然现在计算机有了很大的发展,但他们仍然有重要的地位和作用,这也是为什么指令数据的划分方式至今仍在使用的重要原因。

不管是同时执行多条指令,还是同时处理多个数据,具有这样功能的计算机都可以称为并行计算机。

根据一个并行计算机能够同时执行的指令与处理数据的多少,可以把并行计算机分为SIMD (Single-Instruction Multiple-Data)单指令多数据并行计算机和MIMD(Multiple-Instruction Multiple-Data)多指令多数据并行计算机。

举例说明SIMD计算机的功能SIMD计算机同时用相同的指令对不同的数据进行操作,比如对于数组赋值运算A=A+1在SIMD并行机上可以用加法指令同时对数组A的所有元素实现加1。

即数组(或向量)运算特别适合在SIMD并行计算机上执行,SIMD并行机可以对这种运算形式进行直接地支持,高效地实现。

举例说明MIMD计算机的功能MIMD计算机同时有多条指令对不同的数据进行操作,比如对于算术表达式A=B+C+D-E+F*G可以转换为A=(B+C)+(D-E)+(F*G)加法(B+C),减法(D-E),乘法(F*G)如果有相应的直接执行部件,则这三个不同的计算可以同时进行。

SPMD/MPMD并行计算机SIMD和MIMD这种表达方法虽然至今还在广泛使用,但是,随着新的并行计算机组织方式的产生,比照上面的划分方法,人们按同时执行的程序和数据的不同,又提出了SPMD(Single-Program Multuple-Data)单程序多数据并行计算机和MPMD(Multiple-Program Multiple-Data)多程序多数据并行计算机的概念。

中科大并行程序实验报告

中科大并行程序实验报告
_MPI_Gather: 将四个进程的第 3 个字符汇聚到进程 2,执行结果如下:
伪代码如下: _MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) 对每个进程执行以下代码 MPI_Send(sendbuf , sendcount, sendtype, root, root, comm)
sendbuf 中
_MPI_Scatter: 将字符串 ”abcdefgh”以进程 2 为根散播出去,程序运行结果如下:
伪代码如下: _MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) 各处理器执行以下算法 if my_rank = root then
end for
end for
if(my_rank > j) then
//编号大于 j 的处理器对其所有行变换
for k = 0 to m -1 do
a[k, v] = a[k, v] / f[v]
for w = v+1 to n-1 do
a[k, w] = a[k, w] –f[w]*a[k, v]
接收主行所在处理器广播来的主行元素
End if
if(my_rank = j) then
//编号为 j 的处理器对其 i+1 行以后各行进行变换
for k= i+1 to m-1 do
a[k, v] = a[k, v] / f[v]
for w = v+1 to n-1 do
a[k, w] = a[k, w] –f[w]*a[k, v]

MPI并行编程实验报告

MPI并行编程实验报告

MPI并行编程实验报告MPI并行编程实验报告起讫日期:xx-05-20 ~全文结束》》-06-15组名:第四组院系:计算机学院专业:计算机科学与技术指导老师:XXX 教授xx 年6月15日实验一Linux下基于MPI的hello程序设计Author:姓名一、MPICH并行计算库安装在Linux环境下安装MPICH执行环境,配置MPD、CONF, 完成实验室中临近机器间的并行配置。

概要:以寝室四台计算机为例,设置IP(192、168、1、1~192、168、1、4),更改主机名为node01,node02,node03,node04。

(一)创建SSH信任连接1、更改/etc/hosts文件#vi /etc/hosts 打开hosts文件,更改如下:127、0、0、1 localhost、localdomain localhost192、168、1、1 node01192、168、1、2 node02192、168、1、3 node03192、168、1、4 node042、在node01生成SSH秘钥对、#ssh-keygena 查看是否有、ssh文件夹3、进入、ssh目录#cd 、ssh4、生成authorized_keys文件#cp id_rsa、pub authorized_keys5、退出到root目录#cd 、、6、建立本身的信任连接#ssh node01 按提示输入yes(三个字母要打全)7、设置node02(node02的root目录下)#ssh-keygenzxvf mpich2-1、0、1、tar、gz2、创建安装目录#mkdir /usr/MPICH-instsll3、进入mpich2解压目录#cd mpich2-1、0、14、设置安装目录#、/configureprefix=/usr/MPICH-install5、编译#make6、安装#make install7、退出到root目录#cd 、、8、通过编辑、bashrc文件修改环境变量#vi 、bashrc修改后的、bashrc文件如下:# 、bashrc# User specific aliases and functions aliasrm='rmi'alias mv='mvinstall/bin" 新增加的#Source global definitionsif[nstall目录输出给其他三个结点,相应的配置步骤如下。

并行实验报告

并行实验报告

实验名称:并行处理技术在图像识别中的应用实验目的:1. 了解并行处理技术的基本原理和应用场景。

2. 掌握并行计算环境搭建和编程技巧。

3. 分析并行处理技术在图像识别任务中的性能提升。

实验时间:2023年10月15日-2023年10月25日实验设备:1. 主机:****************************,16GB RAM2. 显卡:NVIDIA GeForce RTX 2080 Ti3. 操作系统:Windows 10 Professional4. 并行计算软件:OpenMP,MPI实验内容:本实验主要分为三个部分:1. 并行计算环境搭建2. 图像识别任务并行化3. 性能分析和比较一、并行计算环境搭建1. 安装OpenMP和MPI库:首先在主机上安装OpenMP和MPI库,以便在编程过程中调用并行计算功能。

2. 编写并行程序框架:使用C++编写一个并行程序框架,包括并行计算函数和主函数。

3. 编译程序:使用g++编译器编译程序,并添加OpenMP和MPI库的相关编译选项。

二、图像识别任务并行化1. 数据预处理:将原始图像数据转换为适合并行处理的格式,例如将图像分割成多个子图像。

2. 图像识别算法:选择一个图像识别算法,如SVM(支持向量机)或CNN(卷积神经网络),并将其并行化。

3. 并行计算实现:使用OpenMP或MPI库将图像识别算法的各个步骤并行化,例如将图像分割、特征提取、分类等步骤分配给不同的线程或进程。

三、性能分析和比较1. 实验数据:使用一组标准图像数据集进行实验,例如MNIST手写数字识别数据集。

2. 性能指标:比较串行和并行处理在图像识别任务中的运行时间、准确率等性能指标。

3. 结果分析:分析并行处理在图像识别任务中的性能提升,并探讨影响性能的因素。

实验结果:1. 并行处理在图像识别任务中显著提升了运行时间,尤其是在大规模数据集上。

2. 并行处理对准确率的影响较小,甚至略有提升。

MPI报告

MPI报告

并行程序设计实验一:运行MPI程序第一项:准备工作1、安装MPICH2下载MPICh2软件包,对已经下载好的mpich2-1.4.1p1-win-ia32进行安装2、新建用户密码开始——控制面板——用户账户和家庭安全——添加或删除用户账户——创建一个新账户——输入用户名(选择用户类型为“管理员”)——创建用户然后再创建密码。

如下图所示(若已经存在管理员,可使用原来的管理员账号和密码)这个用户名和密码就是我们测试时需要用的。

3、注册开始——所有程序——mpich2——wmpiregister如下图,这个就是刚才注册的用户和密码。

输入后点击Register——OK。

就会出现一行字,成功注册。

4、测试mpich2开始——所有程序——mpich2——wmpiconfig.exe——scan hosts这时左侧会出现绿色,说明成功了。

5、vc++6中的设置打开vc,工具——options——Directories——include files添加你刚刚安装的mpich2中include文件,如图所示然后在show directories for的下拉菜单中选择library files,同样添加lib文件。

要想运行成功,程序中也是要作些改动的。

第二项:测试程序通过测试以下MPI程序,可知系统运行成功。

1、MPI程序运行及结果分析程序1:输出Hello parallel world!。

程序源代码如下:程序运行无错后,build——组建,没有错误。

在debug文件夹中找到生成的exe文件,运行wmpiexec.exe文件。

程序运行结果:实验数据说明:本程序选择了5个进程,每个进程输出一句Hello parallel world!。

程序2:类似程序1,显示本次执行需要的进程数程序源代码如下:程序运行结果:程序运行数据说明:选择了5个进程,用变量num标识,标号从0-4,用变量rk标识。

程序3:消息传递功能,用MPI_Send()和MPI_Recv()两个函数实现进程之间数据的发送和接收,本程序实现的功能:实现其他进程像0进程发送消息,0进程负责从其他进程接收消息并输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MPI并行编程实验报告起讫日期:xx-05-20 ~全文结束》》-06-15组名:第四组院系:计算机学院专业:计算机科学与技术指导老师:XXX 教授xx 年6月15日实验一Linux下基于MPI的hello程序设计Author:姓名一、MPICH并行计算库安装在Linux环境下安装MPICH执行环境,配置MPD、CONF, 完成实验室中临近机器间的并行配置。

概要:以寝室四台计算机为例,设置IP(192、168、1、1~192、168、1、4),更改主机名为node01,node02,node03,node04。

(一)创建SSH信任连接1、更改/etc/hosts文件#vi /etc/hosts 打开hosts文件,更改如下:127、0、0、1 localhost、localdomain localhost192、168、1、1 node01192、168、1、2 node02192、168、1、3 node03192、168、1、4 node042、在node01生成SSH秘钥对、#ssh-keygena 查看是否有、ssh文件夹3、进入、ssh目录#cd 、ssh4、生成authorized_keys文件#cp id_rsa、pub authorized_keys5、退出到root目录#cd 、、6、建立本身的信任连接#ssh node01 按提示输入yes(三个字母要打全)7、设置node02(node02的root目录下)#ssh-keygenzxvf mpich2-1、0、1、tar、gz2、创建安装目录#mkdir /usr/MPICH-instsll3、进入mpich2解压目录#cd mpich2-1、0、14、设置安装目录#、/configureprefix=/usr/MPICH-install5、编译#make6、安装#make install7、退出到root目录#cd 、、8、通过编辑、bashrc文件修改环境变量#vi 、bashrc修改后的、bashrc文件如下:# 、bashrc# User specific aliases and functions aliasrm='rmi'alias mv='mvinstall/bin" 新增加的#Source global definitionsif[nstall目录输出给其他三个结点,相应的配置步骤如下。

1、以 root 身分登录到 node1 上,确保 node1 上安装了NFS 程序 (nfs-utils 包)。

首先运行一遍下述命令来开启 NFS 服务: /sbin/chkconfig nfs on /sbin/chkconfig nfslock on /etc/init、d/nfslock restart /etc/init、d/nfs restart然后编辑文件 /etc/exports,在其中加入下面二行 (如果该文件不存在则创建一个新文件): /home10、0、0、0/255、255、255、248(rw,async,no_root_squash)/usr/MPICH-install10、0、0、0/255、255、255、248(rw,async,no_root_squash)做好上述修改后执行下面的命令: /sbin/exportfst nfsinstall 目录。

可以在任何一个结点上用 df 命令来验证,例如: # df返回类似下面所示的结果:、、、、、、node1:/home2486326442240284841197428095% /homenode1:/usr/MPICH-install246966888全文结束》》885603353307686% /usr/local(四)环境测试1、本地测试#mpd & 启动 #mpdtrace 观看启动机器#mpdallexit 退出2、通过mpd、hosts运行集群系统#mpdbootf mpd、hosts number为要起动的机器个数#mpdtrace #mpdallexit3、测试运行MPICH的例子程序#mpdbootf mpd、hosts 启动4台机器#mpiexecinstall/exles/cpi number为使用的进程数#mpdallexit二、HELLO WORLD并行程序设计(一)程序源码:/*hello、c*/#include <stdio、h>#include "mpi、h"int main( int argc, char*argv[] ){ int rank; int size; MPI_Init( 0, 0 );MPI_m_rank(MPI_M_WORLD, &rank); MPI_m_size(MPI_M_WORLD, &size); printf( "Hello world from process %d of %d\n", rank, size ); MPI_Finalize(); return 0;}(二)程序编译$mpicc –o hello hello、c(三)运行结果$mpdboot –n <hosts>1,10,*MPI_M_WORLD,ierr)end if C 向右侧的邻居发送数据if (myid 、lt、3)thencallMPI_SEND(a(1,mysize+1),totalsize,MPI_REAL,myid+1,10,* MPI_M_WORLD,ierr)end ifC 从左侧的邻居接收数据if (myid 、gt、 0)thencall MPI_RECV(a(1,1),totalsize,MPI_REAL,myid-1,10,* MPI_M_WORLD,status,ierr)end ifbegin_col=2end_col=mysize+1if (myid 、eq、 0)thenbegin_col=3endifif (myid 、eq、3)thenend_col=mysizeendifdo j=begin_col,end_coldo i=2,totalsize-1b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0、25end doend dodo j=begin_col,end_coldo i=2,totalsize-1a(i,j)=b(i,j)end doend doend dodo i=2,totalsize-1print *, myid,(a(i,j),j=begin_col,end_col)end docall MPI_Finalize(rc)end捆绑发送接收MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,recv buf,recvcount,recvtype, source,recvtag,m,status) IN sendbuf IN sendcount IN sendtype IN dest IN sendtag OUT recvbuf IN recvcount IN recvtype IN source IN recvtag INm OUT status 发送缓冲区起始地址(可选数据类型)发送数据的个数(整型)发送数据的数据类型(句柄)目标进程标识(整型)发送消息标识(整型)接收缓冲区初始地址(可选数据类型)最大接收数据个数(整型)接收数据的数据类型(句柄)源进程标识(整型)接收消息标识(整型)通信域(句柄)返回的状态(status)int MPI_Sendrecv(void *sendbuf, intsendcount,MPI_Datatype sendtype, int dest,int sendtag, void *recvbuf, int recvcount,MPI_Datatype recvtype, int source,int recvtag, MPI_m m, MPI_Status*status)MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTAG,RECVBUF, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, M,STATUS, IERROR)<type> SENDBUF(*), RECVBUF(*)INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVCOUNT, RECVTYPE,SOURCE, RECVTAG, M,STATUS(MPI_STATUS_SIZE), IERROR虚拟进程program main implicit none include 'mpif、h' integer totalsize,mysize,steps parameter (totalsize=16) parameter (mysize=totalsize/4,steps=10) integer n, myid, numprocs, i, j,rc reala(totalsize,mysize+2),b(totalsize,mysize+2) integer begin_col,end_col,ierr integer left,right,tag1,tag2 integer status(MPI_STATUS_SIZE) call MPI_INIT( ierr ) call MPI_M_RANK( MPI_M_WORLD, myid, ierr ) callMPI_M_SIZE( MPI_M_WORLD, numprocs, ierr ) print *, "Process ", myid, " of ", numprocs, " is alive"C 数组初始化do j=1,mysize+2do i=1,totalsizea(i,j)=0、0end doend doif (myid 、eq、 0)thendo i=1,totalsizea(i,2)=8、0end doend ifif (myid 、eq、3)thendo i=1,totalsizea(i,mysize+1)=8、0end doend ifdo i=1,mysize+2a(1,i)=8、0a(totalsize,i)=8、0end dotag1=3tag2=4C 设置当前进程左右两侧的进程标识if (myid 、gt、 0)thenleft=myid-1elseleft=MPI_PROC_NULLend ifif (myid 、lt、3)thenright=myid+1elseright=MPI_PROC_NULLend ifC Jacobi 迭代do n=1,stepsC 从左向右平移数据callMPI_SENDRECV(a(1,mysize+1),totalsize,MPI_REAL,right,tag1, *a(1,1),totalsize,MPI_REAL,left,tag1,*MPI_M_WORLD,status,ierr)C 从右向左平移数据callMPI_SENDRECV(a(1,2),totalsize,MPI_REAL,left,tag2,* a(1,mysize+2),totalsize,MPI_REAL,right,tag2,*MPI_M_WORLD,status,ierr)begin_col=2end_col=mysize+1if (myid 、eq、 0)thenbegin_col=3endifif (myid 、eq、3)thenend_col=mysizeendifdo j=begin_col,end_coldo i=2,totalsize-1b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0、25 end doend dodo j=begin_col,end_coldo i=2,totalsize-1a(i,j)=b(i,j)end doend doend dodo i=2,totalsize-1print *, myid,(a(i,j),j=begin_col,end_col)end docall MPI_Finalize(rc)end实验三基于MPI计算π值Author:姓名一、实验题目用 MPI 技术计算π的值。

相关文档
最新文档