mpich2官方版是MPI并行程序在WINDOWS系统下的安装包,mpich2官方版能直接在windows7下安装使用,并且支持最新的MPI-2接口标准,安装起来也是非常简单的。
使用方法
Windows下的安装配置
我用的参与计算的系统都是WindowsXP Pro SP2,安装的过程没什么太特别的,一般就是默认就可以,只是其中有个地方要填一个什么passphrase,上面提示说所有系统都要用相同的passphrase,照做就是了,在所有参与计算的结点机器上都填一样的passphrase就好了。另外就是需要.net framework 2的运行环境。
mpich2官方版默认安装的位置是C:/Program Files/MPICH2,下面的bin目录下是系统配置运行需要的程序,为了方便在控制台使用,可以把C:/Program Files/MPICH2/bin加到系统的PATH变量中去。Include是头文件,开发的时候用,lib是链接程序的时候用的库文件。Jumpshot下有个pdf的文档,干什么用的可以看看这个文档,我没仔细看,感觉我暂时还用不上。Examples下面是一个样本程序,就是一个用MPI计算圆周率的程序,分别有C,C++和Fortran版,C/C++的应该可以用VS2003以上版本打开。同时,安装程序还会自动向系统注册一个服务MPICH2 Process Manager,我们从控制面板-管理工具-服务里就能找到,这是管理运行MPI程序的一个服务,安装好后就是自动启动的,所以一般也就不用动它。
安装完毕后开始菜单-程序中就添加了一个MPICH2目录,其中就有上面提到的Jumpshot,另外wmpiconfig.exe是用来配置运行环境的,我在网上有找到的说明都是以前旧版本的,和现在的差别比较大,感觉这新版本用的不爽,没搞明白这个程序该咋用,不过好像默认状态下不改什么就能正常使用,所以也就不管它了。wmpiregister.exe则是用来注册用户的,使用MPI之前需要在这个程序里注册一个系统里已经存在的用户,而且这个用户必需拥有管理员权限,拥有运行我们安装了的MPI系统的能力。比如我就在所有参与运算的机器上添加了一个管理员mpi,密码也是mpi。
接下来,我们就可以开始试着运行一下MPI的程序了。就用examples目录下面的那个计算圆周率的程序。如果要多机并行计算的话,就需要在所有机器上的相同位置放置要运行的程序,我的情况就是在所有机器的C盘下建了一个mpiexe的目录,并把cpi.exe拷到所有机器的这个目录下。然后,在其中的某台机器上进入控制台(运行MPI程序其实也可以用开始菜单的MPICH2下的wmpiexec.exe,这是个gui程序,但是我觉得用的不爽,不如直接在控制台下敲命令来得灵活),敲下命令mpiexec -hosts 2 192.168.10.142 192.168.0.23 c:/mpiexe/cpi.exe。mpiexec是安装目录下bin目录里的一个程序,在本文的例子中就是C:/Program Files/MPICH2/bin/mpiexec.exe,因为刚才说了,我把这个地址加入到PATH里了,所以可以在任何地方直接执行,它是用来启动MPI程序的,-hosts参数说明是启动多台机器并行运算,后面跟着的2就是说要在两台机器上执行程序,再后面的就是那两台机器的ip地址,其中第一个就是我启动程序的机器,当然,这个地方也可以写机器名,只要它的机器名能被正常的解析就可以,最后面的就是要运行的程序,也就是刚才提到的所有机器都要在相同位置放置的那个MPI程序。如果只是在本机运行,则命令为mpiexec –n 2 cpi.exe,?-n表示是在本地运行,后面的2表示启动的进程数。程序运行后就会提示让你输入一个数字intervals,这个数字影响计算的精度,值越大精度越高,当然计算时间就越长了,然后程序会打印出计算的结果和花费的时间。
比如,我使用单机单进程运行,intervals设为99999999,耗时1.253849秒,而用两台机器双进程则只有0.628954秒,明显快很多,并行运算还是很有效果的。不过,如果我们把intervals改为9999,单机运行只用了0.000279秒,而两台机器却花了0.001548秒,这是因为并行运算过程中,参与运算的机器需要通过网络传递一些消息,如果计算量不大的话,花在了这上面的时间影响会比较明显,因而反不如单机版的来得快。
到现在我们的MPI运行环境就基本安装好了,当然,MPI还有很多其他的命令参数,只不过最常用估计也就这两条了,其他的用得着的时候就去查上面提到的文档,里面有比较详细的介绍。另外,如果按照以上的介绍进行安装配置,在运行多机并行MPI程序的时候却出现连接错误的话,八成是因为网络的问题,看看你的防火墙是不是开着,打开相应的端口,或者干脆关掉防火墙就好了。