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