MPI综合实验报告.docx
《MPI综合实验报告.docx》由会员分享,可在线阅读,更多相关《MPI综合实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
MPI综合实验报告
MPI综合实验报告
目前三次MPI实验已经结束,结合之前所写的实验报告,对总体的实验内容做一个总结。
参考资料:
MPI简介
多线程是一种便捷的模型,其中每个线程都可以访问其它线程的存储空间。
因此,这种模型只能在共享存储系统之间移植。
一般来讲,并行机不一定在各处理器之间共享存储,当面向非共享存储系统开发并行程序时,程序的各部分之间通过来回传递消息的方式通信。
要使得消息传递方式可移植,就需要采用标准的消息传递库。
这就促成的消息传递接口(MessagePassingInterface,MPI)的面世,MPI是一种被广泛采用的消息传递标准[1]。
与OpenMP并行程序不同,MPI是一种基于消息传递的并行编程技术。
消息传递接口是一种编程接口标准,而不是一种具体的编程语言。
简而言之,MPI标准定义了一组具有可移植性的编程接口。
各个厂商或组织遵循这些标准实现自己的MPI软件包,典型的实现包括开放源代码的MPICH、LAMMPI以及不开放源代码的IntelMPI。
由于MPI提供了统一的编程接口,程序员只需要设计好并行算法,使用相应的MPI库就可以实现基于消息传递的并行计算。
MPI支持多种操作系统,包括大多数的类UNIX和Windows系统。
三次实验总结
第一次实验:
实验要求:
配置好MPI运行的基本环境,测试MPI的基本通信程序。
程序:
#include"stdafx.h"
#include
voidmain(void)
{
MPI_Statusstatus;
char
string[]="xxxxx";
intmyid;
MPI_Init(NULL,NULL);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if(myid==2)
MPI_Send("HELLO",5,MPI_CHAR,7,1234,MPI_COMM_WORLD);
if(myid==7){
MPI_Recv(string,5,MPI_CHAR,2,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
printf("Got
%sfromP%d,tag
%d\n",string,status,status.MPI_SOURCE,status.MPI_TAG);
}
MPI_Finalize();
}
运行环境配置过程:
(这个是在根据网上的环境配置教程做的)
1、安装软件MPICH2,本次操作安装在C:
\ProgramFiles\MPICH2文件夹中。
2、打开安装好的MPICH2目录,打开bin文件夹中的wmpiregister.exe文件,进行注册。
填入本机的用户名和密码。
3、建立一个控制台应用程序空文档,MYMPI,
输入程序
4、添加库和包含文件
打开Tool->Options对话框
选择项目和解决方案下的VC++目录一栏,如下图所示:
分别添加包含文件C:
\ProgramFiles\MPICH2\include
和库文件C:
\ProgramFiles\MPICH2\lib
5、取消预编译头
打开Project->Property,设置框如下图所示
展开C/C++项,选择与编译头,在创建/使用预编译头中选择:
不使用预编译头
6、打开Project->Property,设置框如下图所示
将配置属性中的常规项中的字符集设置成未设置
展开连接器中输入项,在附件依赖项中添加mpi.lib
7、自定义多线程运行
打开MPICH2安装目录显得mpiexec.exe
装入运行产生的.exe文件并选择线程数,运行结果如下图所示
第二次实验
实验要求:
MPI实验第二部分
1.了解计算粒度、问题规模(计算负载)、并行程度概念;
2.测试基于MPI的Pi并行计算程序;
3.完成实验报告(MPI程序代码、运行结果截屏、实验分析总结)
在这次的实验过程中,我们的程序是通过数值方法计算
的值来观察运行时间。
程序:
#include"stdafx.h"
#include
#include"mpi.h"
staticlongnum_steps=100000;
voidmain(intargc,char*argv[])
{
inti_start,i_end,i,myid,numprocs;
doublepi,mypi,x,step,sum=0.0;
doublestart,end;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if(myid==0)
{
start=MPI_Wtime();
}
MPI_Bcast(&num_steps,1,MPI_INT,0,MPI_COMM_WORLD);
i_start=myid*(num_steps/numprocs);
i_end=i_start+(num_steps/numprocs);
step=1.0/(double)num_steps;
for(i=i_start;i{
x=(i+0.5)*step;
sum=sum+4.0/(1.0+x*x);
}
mypi=step*sum;
MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
if(myid==0)
{
printf("Pi=%f\n",pi);
end=MPI_Wtime();
printf("Runtimeis:
%.10f\n",end-start);
fflush(stdout);
}
MPI_Finalize();
}
实验原理:
利用公式PI的近似值计算圆周率[7],定积分的计算可以转化为求一个曲边梯形的面积问题。
将积分区间等分成n个小的子区间,可将每个小的子区间上的曲边梯形近似地看成矩形,这些矩形面积的和就近似地等于原来曲边梯形的面积。
这样最终将求圆周率的问题转化成了一个面积迭加的计算。
当进程数为2时,运算时间很小,要比进程数为1时时间要短,说明该情况下,多进程的运行效率要比单进程高。
然后,我使用了几台计算机在同一局域网之下构成了集群计算机系统,采用非共享内存方式利用多进程完成任务。
在两台机器构成的集群计算机系统之下,我分别测了多组进程之下并行计算的时间比较,运算结果如下所示:
做表格比较之:
进程数
1
4
8
12
16
运行时间
0.0004441905
0.0012051811
0.0011141081
0.0013336891
0.0012272509
结果分析:
因为计算规模较小,集群计算机系统并行多进程计算并不能很明显的表现出计算优势。
反而,经过验证,在较大规模计算量之下,集群计算机系统的计算速度优越性得到明显展现。
第三次实验
实验要求:
1.理解同步(synchronous)计算和同步路障(barrier)
2.测试基于MPI_Barrier()的并行程序
3.完成实验报告(MPI程序代码、运行结果截屏、实验分析总结)
程序:
#include"stdafx.h"
#include
#include"mpi.h"
intmain(intargc,char**argv)
{
inttaskid,ntasks;
intierr;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
MPI_Comm_size(MPI_COMM_WORLD,&ntasks);
if(taskid==0){printf("\n\n\n\n\n\n");}
ierr=MPI_Barrier(MPI_COMM_WORLD);
if(taskid==0){printf("Hel");fflush(stdout);}
if(taskid==1){printf("lo");fflush(stdout);}
if(taskid==2){printf("Wor");fflush(stdout);}
if(taskid==3){printf("ld!
");fflush(stdout);}
ierr=MPI_Barrier(MPI_COMM_WORLD);
if(taskid==0){printf("(Unordered)\n");fflush(stdout);}
if(taskid==0){printf("Hel");fflush(stdout);}
ierr=MPI_Barrier(MPI_COMM_WORLD);
if(taskid==1){printf("lo");fflush(stdout);}
ierr=MPI_Barrier(MPI_COMM_WORLD);
if(taskid==2){printf("Wor");fflush(stdout);}
ierr=MPI_Barrier(MPI_COMM_WORLD);
if(taskid==3){printf("ld!
");fflush(stdout);}
ierr=MPI_Barrier(MPI_COMM_WORLD);
if(taskid==0){printf("(Ordered)\n\n\n\n\n");}
MPI_Finalize();
return0;
}
实验原理:
同步计算和同步路障
Barriers:
Blocksuntilallprocessesinthecommunicatorhavereachedthisroutine.
Apointatwhichallprocessesmustwaituntilallotherprocesseshavereachedthatpoint.
Synchronous&Barrier:
Inafullysynchronousapplication,alltheprocessessynchronizedataregularpoints.
实验结果截屏:
结果分析:
如果大于等于4个进程的话,输出的语句就是顺序的,正常的,但是如果进程数目小于4,由于同步路障的存在,只有当所有进程到来之时才会被同步,这样由于进程数小于要求进程数,所以同步会出现问题,所以输出的语句会出现乱码。
MPI实验总结
通过这次实验,我们对MPI有了一个初步了解。
MPI是一种基于消息传递的并行编程技术,而不是一种具体的编程语言。
MPI程序与OpenMP程序的最大不同就是MPI程序不仅可以适用多线程的方式并行运算还可以让程序以多进程的方式执行,以这种方式执行的程序并不共享内存,各个进程是通过消息传递来进行通信的。
这样做的好处是完成某一计算任务的不同进程可以运行在不同处理器上(不只是处理器的不同核上),甚至是不同的结点计算机上,方便分布式计算系统的构建。
在实验的过程中,请教了老师很多问题,不管多么简单抑或繁琐,老师都一一耐心加以解答,再次表示衷心感谢。