1、在linux虚拟机中配置多节点MPI计算机科学与技术系实验报告课程名称: 并行计算及编程 实验项目: 在linux虚拟机中配置多节点MPI 专业班级: 姓 名: 学 号: 实验时间: 批阅时间: 指导教师: 成 绩: 兰州交通大学并行计算及编程课程实验报告实验名称:在linux虚拟机中配置多节点MPI一、实验目的在linux虚拟机中配置多节点MPI,完成以下任务(2选1): 1、矩阵-向量乘法; 2、数据积分法求圆周率二、实验内容(1)分别用串行程序和MPI并行程序实现 (2)比较并行和串行程序的执行时间 (3)计算并行程序相对于串行程序的加速比三、 实验环境 Windows10,CentOS
2、四、实验过程(包括程序设计说明,实验步骤,经调试后正确的源程序,程序运行结果)1下载安装VMware Workstation图 1下载安装VMware Workstation2下载并安装Linux系统,这里我用的是CentOS,我开了两台虚拟机,centos 6和centos 6 64。保证台虚拟机都可以上网,且可以ping通。我的两个虚拟机的网络地址分别是192.168.20.128和192.168.20.129图 2保证都可上网图 3第一台的网络地址图 4第二台的网络地址图 5可以ping通3两个虚拟机中添加同名用户在不同节点中需要有同名的用户以方便SSH连接node1和node2中以ro
3、ot用户执行下列命令图 6修改主机名。node1和node2图 7分别再两个虚拟机中添加用户mpiuser图 8记住要设置密码才可使用图 9设置成功图 10此时在第一台虚拟机中ping第二台依旧可以ping通4保障两台虚拟机是互通的图 11dns域名5实现免密码SSH登陆,当前节点为node1,用户为mpiuser,工作目录为 家目录图 12当前节点为node1,用户为mpiuser,工作目录为 图 13建立本身的信任连接图 14图 15设置 node2 生成.ssh文件夹图 16scp node1:/.ssh/* ./ 拷贝node1上的.ssh文件夹到node2图 17设置 node2拷贝
4、node1上的hosts文件到node2 图 18ssh node ssh node1遇到问题:node2的ssh连接我好像是还没有设置好,依旧需要密码连接才可以。6配置MPI运行环境官方网站下载其中的mpich-3.2.tar.gz此处遇到问题,在下载时:图 19遇到问题:该问题在嵌入式作业中同样出现过,但我在改时,遇到了gedit的命令问题,实在是解决不了。我用共享内存的方式在windows中下载好,放在共享文件中。最开始使用的是rar文件,但Linux中需要安装RAR for Linux,我就直接在共享文件中解压了。图 20共享文件然后安装时又发现又各种问题,之后我又再次在官网下载了(之
5、前一直中途失败,具体原因不明)图 21官网下载好7解压并进入目录图 22解压tar xvf mpich-3.2.tar.gz图 23 cd mpich-3.3.2 ./configure prefix=/usr/local/mpich遇到问题:图23运行出错图 24解决问题:图 25解决问题:将图23命令改为此命令图 26解决问题:成功!configuration completed遇到问题:在node2时用了图25的命令,但显示其他错误:图 27 少了C+的编译器解决问题:图 28下载GCC编译器但依旧不可以,所以之后我全部一次安装好C的编译器图 29解决问题图 30解决问题之后node2
6、的安装成功!图 31解决问题图 32make编译图 33 make install安装8设置环境变量图 34设置环境变量 /.bashrc图 35更新环境变量至此MPI安装完成!9mpi多节点配置图 36新建一个配置文件图 37修改其中内容为10用示例程序进行测试单节点测试:遇到问题:图 38出现问题遇到问题:之后我就去改正环境变量,然后改错了!我的所有超级用户下的linux命令都不可以用了。所以要返回修改在超级用户下,用全路径的方式去修改!/usr/bin/gedit /.bashrc图 39重新修改环境变量,之后在用source ./bashrc来更新图 40 mpicc命令成功图 41单
7、节点测试成功-np 表示number of processors, 即进程数,N 自己取值图 42都在节点1上图 43 都在节点2上多节点测试:图 44多节点测试如上,在两个节点上分别运行了两个进程,配置过程结束。实验结果:(二)数据积分法求圆周率1.源程序(串行):#include #include #include static long num_steps = 10000000;/定义所分的块数int main(int argc, char* argv) int i; double x,sum = 0.0, pi; clock_t start_time, end_time; start_
8、time = clock(); double step = 1.0 / (double)num_steps; for (i = 0; i num_steps; i+) x = (i + 0.5) * step; sum = sum + 4.0 / (1.0 + x * x); pi = step * sum; end_time = clock(); printf(Pi is %.16fn,pi); printf(Wall time = %e n, end_time - start_time); return 0;结果:图 452.源程序(并行):#include #include #inclu
9、destatic long num_steps = 10000000;/定义所分的块数/*计算f(x) = 4.0 / (1 + x * x) */double f(double a) return (4.0 / (1.0 + a*a);void main(int argc,char* argv) int n, myid, np, i; /* 定义变量 */ double mypi = 0, pi, x, s_time, e_time; MPI_Init(&argc, &argv); /* 初始化MPI */ MPI_Comm_size(MPI_COMM_WORLD, &np); MPI_Co
10、mm_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(PI is %.16f n,pi); /*打印结果*/ printf(Wall time = %fn, MPI_Wtime() - s_time); MPI_Finalize(); 结果:图 46通过串行和并行程序运行结果可得:加速比=15.262/3.6819954.145
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2