ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:235.52KB ,
资源ID:29975254      下载积分:2 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29975254.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MPI编程.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MPI编程.docx

1、MPI编程MPICH2在Windows系统Visual Studio 2010的环境搭建MPICH的安装和配置文中使用的MPICH2安装文件是mpich2-1.4-win-ia32 (http:/www-unix.mcs.anl.gov/mpi/mpich),在Windows下安装MPICH2比较简单,但是要有Microsoft .NET Framework 2.0的支持。安装基本上只要单击“Next”即可。在安装过程中会提示输入进程管理器的密码,这个密码被用来访问所有的程序,这里使用的密码为admin。如果是多台机器执行mpi,那么这多台机器上必须配置相同的mpi用户,就是新用户的用户名和密

2、码必须相同。安装完成后,安装目录下的include子目录包含了编程所需要的所有头文件,lib子目录包含了相应的程序库,而子目录bin则包含了MPI在Windows下面必须的运行程序。运行时需要的动态链接库被安装在了Windows系统目录中。在Windows平台下可以使用Microsoft Visual Studio来开发MPI程序。首先,新建一个Win32控制台项目,然后将MPICH2安装目录下的include子目录加入到头文件目录中。在VS 2005的菜单 工具选项项目解决方案VC+目录对话框中添加include子目录,如图3-1所示。图3-1 配置头文件目录再用相同的方法将MPICH2li

3、b加入到库文件目录中,如图3-2。图3-2 配置库文件目录为了避免名字冲突,需要在预编译头文件stdafx.h中加入#inlcude mpi.h语句。现在就可以在主程序文件中编写MPI程序了,MPI的开发环境配置完毕。在Windows下如何运行MPI程序本文MPI程序的开发是在Windows平台下,使用Visual Studio 2005 + MPIEXEC wrapper 进行的,首先用一个简单的Hello World 程序说明运行环境的配置。按照上面配置好开发环境之后,在VS 2005中新建立一个Win32 控制台项目,并取名MPI1,在MPI1.CPP文件中输入下面的程序。在项目属性的“

4、配置属性”“常规”项中的“字符集”设置为“未设置”,如图3-3所示。例3_1int _tmain(int argc, _TCHAR* argv) int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); printf(Hello World from thread %d of %dn, rank, size); MPI_Finalize(); return 0;这个程序比较简单,在函数MPI_Init()和MPI_Fina

5、lize()之间是程序并行执行的地方,MPI_Init()、MPI_Comm_rank()、MPI_Comm_size()和MPI_Finalize(),这四个函数是MPI中最重要和最常用的函数。下面分别说明:图3-3 配置项目属性(1) MPI_Init和MPI_FinalizeMPI_Init用来初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。而MPI_Finalize则是结束MPI执行环境。这两个函数就是定义MPI程序的并行区的,除了检测是否初始化的函数之外,不应该在这两个函数定义的区域外调用其它MPI函数。这两个函数都返回整型值,标识函数是否调用成功。(2) MP

6、I_Comm_rankMPI_Comm_rank函数就是用来标识各个MPI进程的,给出调用该函数的进程的进程号。MPI_Comm_rank返回整型的错误值,需要提供两个参数: MPI_Comm类型的通信域,标识参与计算的MPI进程组。上面例子中使用的是MPI_COMM_WORLD,这个进程组是MPI实现预先定义好的进程组,指的是所有MPI进程所在的进程组。如果想要申请自己的特殊的进程组,则需要通过MPI_Comm定义并通过其它MPI函数生成。 &rank返回调用进程中的标识号。MPI还定义了另一个进程组MPI_COMM_SELF,只包含各个进程自己的进程组。(3) MPI_Comm_size这

7、个函数则用来标识相应进程组中有多少个进程,它也有两个参数: MPI_Comm类型的通信域,标识参与计算的MPI进程组。上面的例子中用的是MPI_COMM_WORLD。 &size返回相应进程组中的进程数。运行这个程序,运行结果如图3-4,按照并行执行的方式,上面程序运行结果应该打印两行文字信息,为:Hello World from thread 0 of 2Hello World from thread 1 of 2图 3-4 例3_1在windows上的运行结果本机系统环境变量OMP_NUM_THREADS值是2,但是运行结果确只打印了一行,显然函数MPI_Init和MPI_Finalize

8、之间的代码仅被一个线程串行执行了。MPI程序若要被正确运行,需要使用MPICH2安装目录下的运行工具MPIEXEC wrapper运行用VS 2005生成的exe文件。启动这个程序,程序的界面如图3-5图 3-5 MPIEXEC wrapper程序界面由于该程序只有操作系统的管理员才有权使用,所以在第一次运行时需要输入计算机用户名和口令,并且不允许口令为空,如图3-6。图 3-6 输入系统用户名和口令输入完毕后,单击“Register”按钮完成注册,之后就可以使用该工具运行MPI程序了。在“Application”栏中选择要运行的exe程序,在“Number of process”栏中选择要运

9、行程序的线程数,然后单击“Execute”按钮运行程序。如用4线程运行上面的示例程序,输出结果如图3-7所示。图 3-7 使用MPIEXEC wrapper运行例3_1的结果4线程分别执行MPI_Init和MPI_Finalize之间的代码,打印4行信息,程序执行结果正确。3.4 MPI的点对点通信点对点通信是MPI程序的基础,MPI_Send和MPI_Recv是两个最重要的函数。这两个函数的标准形式是: int MPI_Send(buf, counter, datatype, dest, tag, comm)参数作用如下: buf:发送缓冲区的起始地址,可以是数组或结构指针 count:非负

10、整数,发送的数据个数 datatype:发送数据的数据类型 dest:整型,目的的进程号 tag:整型,消息标志 comm:MPI进程组所在的通信域这个函数返回整型的错误码,它的含义是向通信域中的dest进程发送数据,数据存放在buf中,类型是datatype,个数是count,这个消息的标志是tag,用以和本进程向同一目的进程发送的其它消息区别开来。 int MPI_Recv(buf, count, datatype, source, tag, comm, status)参数作用如下: buf:接收缓冲区的起始地址,可以是数组或结构指针 count:非负整数,最多可接收的数据个数 datat

11、ype:接收数据的数据类型 source:整型,接收数据的来源,即发送数据进程的进程号 tag:整型,消息标识,应与发送操作的消息标识相同 comm:消息接收进程所在的通信域 status:MPI_Status结构指针,返回状态信息这个函数返回整型的错误码,它的含义是进程从comm域中source进程接收标签号为tag的数据,并保存到buf中。接收缓冲区buf的大小不能小于发送过来的消息的长度。否则会由于数组越界导致程序出错。参数status是MPI_Status类型的,status主要显示接收函数的各种错误状态。通过访问status.MPI_SOURCE、status.MPI_TAG和sta

12、tus.MPI_ERROR就可以得到发送数据的进程号、使用的标签以及接收操作的错误代码。另外,还可以使用函数MPI_Get_count来获得实际接收到的数据项数。MPI_Get_count的标准定义为:int MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int *count);将实际接收到数据项数存放到count中。下面用一个程序说明上面提到的函数的使用方法。示例程序见例3_2程序的运行结果如图3-8(4个进程)函数MPI_Get_processor_name用于获得计算机名,并存放在processor_name中,长度为n

13、amelen,宏定义MPI_MAX_PROCESSOR_NAME是机器名的最大长度。这个程序的完成的任务是使进程i发送数据给进程i+1,并等待由进程i-1发送来的数据。最后一个进程则发送数据给进程0。3.5统计时间函数为了验证程序并行化后的效果,MPI提供了两个用于统计时间的函数 MPI_Wtime和 MPI_Wtick。其中MPI_Wtime返回一个双精度数,表示从过去某点的时刻到当前时刻所消耗的时间秒数。而函数MPI_Wtick则返回MPI_Wtime结果的精度。修改例3_2程序,在并行代码两端加入统计时间的函数,如例3_3:例 3_3(完整程序见示例程序4_3) begin = MPI_

14、Wtime(); end = MPI_Wtime(); diff = end - begin; printf(%d process time is %9.7fn, myid, diff); printf(%d process tick is %9.7fn, myid, MPI_Wtick();运行结果如图3-9:图 3-8 例3_2的运行结果图 3-9 例3_3的运行结果开发实例下面将在Windows平台上使用MPI编写一个用数值积分法计算圆周率的程序。利用公式PI的近似值计算圆周率7,定积分的计算可以转化为求一个曲边梯形的面积问题。将积分区间等分成n个小的子区间,可将每个小的子区间上的曲边梯

15、形近似地看成矩形,这些矩形面积的和就近似地等于原来曲边梯形的面积。这样最终将求圆周率的问题转化成了一个面积迭加的计算。每个小矩形的宽为(n为将积分区间等分的份数),高可以将x值带入函数求得。用循环将每个小矩形的面积累加起来便是PI的近似值。具体的算法实现见附加中的程序“mpi_pi”。图3-10、3-11分别是用一个进程和两个进程运行的结果。图3-10 使用一个进程的运行结果图3-11 使用两个进程的运行结果从运行结果可以看到使用两个进程时的计算速度反而不如用一个进程运行时的速度,这时由于本程序的计算规模不大,另外引入一个进程的开销大于程序并行所带来的益处,所以进程数越多反而程序的运行速度越慢。看下面一组数据8(表3-1)这组数据是在不同的硬件平台下实现本开发实例程序的计算时间。运行环境为3 台计算机组成的集群, 配置均为CPU : Intel PentiumIII 733MHz,相同的算法,随着参与计算的机器数增加,计算时间减少。MPI是针对分布式计算机系统提出的,它采用非共享内存的方式利用多进程完成并行任务,当计算规模不大或处理器数量不多时,更多进程的维护会增加系统的开销,而且进程之间的通信存在延时。它比较适合集群计算机系统。计算机数计算时间11.6364320.8318030.55622表3-1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1