多核集群的MPI并行程序设计.docx
- 文档编号:7706716
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:12
- 大小:753.88KB
多核集群的MPI并行程序设计.docx
《多核集群的MPI并行程序设计.docx》由会员分享,可在线阅读,更多相关《多核集群的MPI并行程序设计.docx(12页珍藏版)》请在冰豆网上搜索。
多核集群的MPI并行程序设计
HarbinInstituteofTechnology
并行处理与体系结构
实验报告
实验题目:
多核集群的MPI并行程序设计
院系:
计算机科学与技术
姓名:
学号:
实验日期:
2011-12-18
哈尔滨工业大学
实验三:
多核集群的MPI并行程序设计
一、实验目的
1、理解并行计算的系统和模型,掌握并行计算的原理、方法、环境和工具。
理解并行编程的概念、环境和方法,理解消息传递编程模型。
2、掌握Linux下MPI并行集群环境的配置。
3、掌握MPI并行编程规范
(1)掌握MPI的体系结构、特点
(2)掌握MPI的基本语句、构成方式
(3)能够分析和编写简单的MPI并行程序
二、实验内容
在Linux下建立并行集群环境,掌握如何在Linux下构建多核集群的并行计算环境。
在已经建立的Linux并行集群环境下编译运行C/C++语言MPI程序,并与串行程序进行比较,分析其性能变化。
3、实验原理
并行计算的三种模式:
1、共享内存:
在这种模式下,所有的线程独立运作,但共享相同的内存资源。
例如,在一个多核心电脑上不同的线程共享内存里的矩阵、参数,等等。
这种模式在今天通常称为SymmetricMultiprocessor(SMP)。
这种模式下典型的并行计算程序可以使用OpenMP实现(一个API的多平台共享存储并行编程)。
2、分布式内存:
在这种模式下,进程(或处理器)都有自己的本地内存。
例如,内存可能会分布在整个网络,但是单个计算机上的每个线程只能用本地分配给它的内存。
甚至在同一台计算机上的不同进程都有独立的内存位置。
在这种模式下不同的进程通常需要与其他进程沟通以获取和发送数据。
在这种模式下典型的并行计算程序可以通过MPI(消息传递接口)实现。
3、混合分布式内存:
在这种模式下,共享存储的单元通常是一个SMP节点。
在给定的SMP处理器上内存是通用共享的。
程序所需的总内存分布在多个SMP构成的网络上。
每个SMP只知道自己的内存-而不包括其他的SMP内存。
因此,一个SMP和另一个SMP的网络通信是必须的。
这种模式下典型的并行计算程序可以通过同时使用OpenMP和MPI来实现。
MPI介绍:
MPI是分布式内存的并行,即利用多台机器(或一台机器上的多个线程,实际意义不大)分工合作,各个机器使用自己的内存存储数据并完成不同的任务。
当然不同机器间还需要数据通信。
MPI提供了这种分布的、基于消息传递的并行方式的实现规范和标准。
消息传递是目前使用最广,且已经在大型并行机上实现了并行计算的一种方式。
在消息传递模型中,计算由一个或多个进程组成,进程间的通信通过调用库函数发送和接收消息来完成。
通信是一种协同行为,即源进程调用库函数发送数据,目的进程调用相应库函数接收数据。
MPI并行执行的各个进程具有自己独立的堆栈和代码段。
主要有两类:
(1)单程序多数据(SingleProgramMultipleData,简称SPMD)
(2)多程序多数据MPMD
MPI程序的六个基本函数:
MPI_Init
MPI_Finalize
MPI_Comm_rank
MPI_Comm_size
MPI_SEND
MPI_RECV
MPI环境配置:
本次试验采用一台服务器一台终端的形式来搭建环境,其中服务器为node23,ip地址为172.16.238.122;终端为node24,ip地址为172.16.238.128。
1、配置网络环境
首先,关闭防火墙,在系统->管理->网络->DNS处设置主机名为node23,如下图:
其次,配置/etc/hosts文件,将服务器设置成scc-m,如上图:
2、配置SSH
首先,生成dsa密钥,在终端命令行下,输入命令ssh-keygen-tdsa,按照默认设置,生成密钥,并且复制id_dsa.pub为authorized_keys,如下图:
其次,分别对node23、node24建立连接,输入命令#sshnode23和#sshnode24,输入对应的密码。
再次,将/host/.ssh目录拷贝给终端电脑node24,拷贝到/root目录下,如上图。
最后,在node24上测试ssh连接。
输入命令sshnode23即可。
3、安装mpich2到目录/opt/mpi目录下,确保两台电脑安装到相同的路径下。
首先,执行解压命令tar-zxvfmpich2-1.0.3.tar.gz解压安装文件。
其次,进入mpich2-1.0.3目录,进行安装配置,输入命令#./configure-prefix=/opt/mpi。
最后,执行#make#makeinstall安装程序如下图:
4、配置一些环境变量
首先,编辑/root/.bashrc文件,加入MPI的bin目录:
PATH="$PATH:
/opt/mpi/bin"。
其次,执行#source.bashrc,使环境变量设置生效。
通过执行下面命令进行设置测试:
再次,修改/etc/mpd.conf文件,内容加入secretword=csglab,如下图:
最后,创建主机名称集合文件/root/mpd.hosts,加入各节点的主机名,如上图:
5、至此主服务器节点的mpich2安装已经完成。
node24也按照上述方法进行配置,按照下面命令来启动集群系统:
#mpdboot-n2–f/root/mpd.hosts
可以通过#mpdtrace命令来查看集群信息,通过#mpdallexit命令来退出所有运行mpi的程序。
四、实验结果和分析
1、helloworld.c程序的编译、运行和分析,程序代码如下:
#include"mpi.h"
#include
#include
intmain(intargc,char*argv[])
{
intmyid,numprocs;
intnamelen;
charprocessor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stderr,"HelloWorld!
Process%dof%don%s\n",myid,numprocs,processor_name);
MPI_Finalize();
return0;
}
从程序代码可以看出,首先调用MPI_Init来初始化执行环境,然后分别调用MPI_Comm_rank和MPI_Comm_size来取得进程号和进程数,MPI_Get_processor_name来取得主机名,MPI_Finalize来结束MPI执行环境。
执行:
#mpicc–ohelloworldhelloworld.c编译程序,执行#mpiexec–n6./helloworld来运行程序,其中参数-n表示指定有6个线程。
可以发现,程序一共有6个线程,分别在两台机器上执行,执行结果如图:
2、pi.c程序的编译、运行和分析,主要程序代码如下:
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stdout,"Process%dof%dison%s\n",myid,numprocs,processor_name);
fflush(stdout);
n=10000;
if(myid==0)
{
startwtime=MPI_Wtime();
}
//主进程给各个从进程分配任务
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
h=1.0/(double)n;
sum=0.0;
for(i=myid+1;i<=n;i+=numprocs)
{
x=h*((double)i-0.5);
sum+=f(x);
}
mypi=h*sum;
MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
从程序代码可以看出,主要的结构基本上与helloworld程序相似,只是在代码中加入了一些任务分配、收集数据的函数调用,如MPI_Bcast函数将按照自己的ID来执行任务总和的一部分,函数MPI_Reduce负责将各进程的任务返回值进行收集并求和。
执行:
#mpicc–opipi.c编译程序,执行#mpiexec–n6./pi来运行程序,可以发现,程序一共有6个线程,分别在两台机器上执行,编译执行后结果如下:
3、分别对nbody-mpi.c和nbody-serial.c程序运行对比
首先编译nbody-serial.c程序,运行命令gcc-onbody-serialnbody-serial.c–lm,运行命令./nbody-serialsample_input.in1000sample_input.out来执行程序,执行结果如下图,可以发现程序运行了比较长的时间,大约执行了41秒。
其次编译nbody-mpi.c程序,运行命令mpicc-lm-onbody-mpinbody-mpi.c,运行命令mpiexec-n6./noby-mpisample_input.in1000sample_input.out执行程序,执行结果如下图,可以发现,当采用集群来运行时,时间大大缩短,大约执行了15秒。
4、编写一个100000个数连加的程序,计算出执行结果和执行时间,采用MPI的环境,代码如下:
#include"mpi.h"
#include
#include
intmain(intargc,char*argv[])
{
intn,myid,numprocs,i;
doublemysum,h,sum,x;
doublestartwtime=0.0,endwtime;
intnamelen;
charprocessor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stdout,"Process%dof%dison%s\n",myid,numprocs,processor_name);
fflush(stdout);
n=100000;
if(myid==0)
startwtime=MPI_Wtime();
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
x=0.0;
for(i=myid+1;i<=n;i+=numprocs)
x+=i;
mysum=x;
MPI_Reduce(&mysum,&sum,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
if(myid==0)
{
endwtime=MPI_Wtime();
printf("sumis%f\n",sum);
printf("wallclocktime=%f\n",endwtime-startwtime);
fflush(stdout);
}
MPI_Finalize();
return0;
}
代码中,按照进程数进行任务分配,每个进程分配到自己倍数的数据进行相加,最后通过函数MPI_Reduce将所有结果收集,计算出最终结果,可以发现试验结果同试验二中编写的100000数字累加结果相同。
执行结果如图:
五、实验中遇到的问题和解决方法
在试验过程中,在生成SSH验证时出现了一些问题,当生成SSH密钥后,直接拷贝到终端,在每次建立SSH连接时都需要输入密码,之后发现问题所在,由于没有在主机端进行登陆认证,没有生成认证文件所导致,之后用主机分别对集群中的电脑进行SSH连接认证,之后重新将.ssh文件夹拷贝到各终端,解决问题。
六、结论和问题
根据试验可以发现,通过集群技术,可以利用已有的计算机平台,构建出一个计算性能优越的计算机集群,对于发挥现有资源提出了新的解决方案,从试验可以看出,普通的串行程序需要40秒执行时间,当采用集群技术和多线程并行技术后,计算耗时提高到了15秒,足足提高了2.6倍,极大的提高了程序执行的效用。
同时也发现系统存在了一些不稳定因素,在集群内执行程序时,偶尔会出现连接或运行错误,再次执行又可以正常。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多核 集群 MPI 并行 程序设计