在linux虚拟机中配置多节点MPI.docx
《在linux虚拟机中配置多节点MPI.docx》由会员分享,可在线阅读,更多相关《在linux虚拟机中配置多节点MPI.docx(15页珍藏版)》请在冰豆网上搜索。
在linux虚拟机中配置多节点MPI
计算机科学与技术系
实验报告
课程名称:
并行计算及编程
实验项目:
在linux虚拟机中配置多节点MPI
专业班级:
姓名:
学号:
实验时间:
批阅时间:
指导教师:
成绩:
兰州交通大学《并行计算及编程》课程实验报告
实验名称:
在linux虚拟机中配置多节点MPI
一、实验目的
在linux虚拟机中配置多节点MPI,完成以下任务(2选1):
1、矩阵-向量乘法;
2、数据积分法求圆周率π
二、实验内容
(1)分别用串行程序和MPI并行程序实现
(2)比较并行和串行程序的执行时间
(3)计算并行程序相对于串行程序的加速比
三、实验环境
Windows10,CentOS
四、实验过程(包括程序设计说明,实验步骤,经调试后正确的源程序,程序运行结果)
1 下载安装VMwareWorkstation
图1下载安装VMwareWorkstation
2 下载并安装Linux系统,这里我用的是CentOS,我开了两台虚拟机,centos6和centos664。
保证台虚拟机都可以上网,且可以ping通。
我的两个虚拟机的网络地址分别是192.168.20.128和192.168.20.129
图2保证都可上网
图3第一台的网络地址
图4第二台的网络地址
图5可以ping通
3 两个虚拟机中添加同名用户在不同节点中需要有同名的用户以方便SSH连接node1和node2中以root用户执行下列命令
图6修改主机名。
node1和node2
图7分别再两个虚拟机中添加用户mpiuser
图8记住要设置密码才可使用
图9设置成功
图10此时在第一台虚拟机中ping第二台依旧可以ping通
4 保障两台虚拟机是互通的
图11dns域名
5 实现免密码SSH登陆,当前节点为node1,用户为mpiuser,工作目录为~家目录
图12当前节点为node1,用户为mpiuser,工作目录为~
图13建立本身的信任连接
图14
图15设置node2生成.ssh文件夹
图16scpnode1:
~/.ssh/*./拷贝node1上的.ssh文件夹到node2
图17设置node2拷贝node1上的hosts文件到node2
图18sshnodesshnode1
遇到问题:
node2的ssh连接我好像是还没有设置好,依旧需要密码连接才可以。
6 配置MPI运行环境
官方网站下载其中的mpich-3.2.tar.gz
此处遇到问题,在下载时:
图19
遇到问题:
该问题在嵌入式作业中同样出现过,但我在改时,遇到了gedit的命令问题,实在是解决不了。
我用共享内存的方式在windows中下载好,放在共享文件中。
最开始使用的是rar文件,但Linux中需要安装RARforLinux,我就直接在共享文件中解压了。
图20共享文件
然后安装时又发现又各种问题,之后我又再次在官网下载了(之前一直中途失败,具体原因不明)
图21官网下载好
7 解压并进入目录
图22解压tarxvfmpich-3.2.tar.gz
图23cdmpich-3.3.2./configure–prefix=/usr/local/mpich
遇到问题:
图23运行出错
图24
解决问题:
图25解决问题:
将图23命令改为此命令
图26解决问题:
成功!
configurationcompleted
遇到问题:
在node2时用了图25的命令,但显示其他错误:
图27少了C++的编译器
解决问题:
图28下载GCC编译器
但依旧不可以,所以之后我全部一次安装好C的编译器
图29解决问题
图30解决问题
之后node2的安装成功!
图31解决问题
图32make编译
图33makeinstall安装
8 设置环境变量
图34设置环境变量~/.bashrc
图35更新环境变量
至此MPI安装完成!
9 mpi多节点配置
图36新建一个配置文件
图37修改其中内容为
10 用示例程序进行测试
单节点测试:
遇到问题:
图38出现问题
遇到问题:
之后我就去改正环境变量,然后改错了!
!
!
我的所有超级用户下的linux命令都不可以用了。
所以要返回修改在超级用户下,用全路径的方式去修改!
/usr/bin/gedit~/.bashrc
图39重新修改环境变量,之后在用source~./bashrc来更新
图40mpicc命令成功
图41单节点测试成功
-np表示numberofprocessors,即进程数,N自己取值
图42都在节点1上
图43都在节点2上
多节点测试:
图44多节点测试
如上,在两个节点上分别运行了两个进程,配置过程结束。
实验结果:
(二)数据积分法求圆周率π
1.源程序(串行):
#include
#include
#include
staticlongnum_steps=10000000;//定义所分的块数
intmain(intargc,char**argv){
inti;
doublex,sum=0.0,pi;
clock_tstart_time,end_time;
start_time=clock();
doublestep=1.0/(double)num_steps;
for(i=0;i{
x=(i+0.5)*step;
sum=sum+4.0/(1.0+x*x);}
pi=step*sum;
end_time=clock();
printf("Piis%.16f\n",pi);
printf("Walltime=%e\n",end_time-start_time);
return0;
}
结果:
图45
2.源程序(并行):
#include
#include
#include
staticlongnum_steps=10000000;//定义所分的块数
/*计算f(x)=4.0/(1+x*x)*/
doublef(doublea){
return(4.0/(1.0+a*a));}
voidmain(intargc,char**argv){
intn,myid,np,i;/*定义变量*/
doublemypi=0,pi,x,s_time,e_time;
MPI_Init(&argc,&argv);/*初始化MPI*/
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if(myid==0){/*进程0获得划分矩阵的个数n*/
n=num_steps;
s_time=MPI_Wtime();
}
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);/*进程0将n进行广播*/
for(i=myid+1;i<=n;i+=np){
x=((double)i+0.5)/(double)n;
mypi+=f(x)/(double)n;}
MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,/*进程0归约求和*/MPI_SUM,0,MPI_COMM_WORLD);
if(myid==0){
printf("PIis%.16f\n",pi);/*打印结果*/
printf("Walltime=%f\n",MPI_Wtime()-s_time);}
MPI_Finalize();
}
结果:
图46
通过串行和并行程序运行结果可得:
加速比=15.262/3.681995≈4.145