MPI单机多机方法

一、单机测试。

1、命令行方式:

注册:mpiexec -register

输入你当前登陆帐户名和密码,不注册的话每次执行程序都要求输入帐户和密码。

运行:mpiexec -n 2helloworld.exe

这里用两个进程执行当前目录下的helloworld.exe,如果在linux下就应该写为mpiexec -n 2./helloworld.exe

2、GUI方式:

注册:开始菜单=>所有程序=>MPICH2=>wmpiregister.exe

填上当前登陆用户名和密码,点击“register”将信息写入磁盘再点“ok”关闭程序。若先点击“ok”则是写入内存重启机器后还要再注册。想更换其他用户运行mpi程序时,点“remove”将原来的信息删除。

运行:开始菜单=>所有程序=>MPICH2=>wmpiexec.exe

在Application处选择可执行程序,在Number of processes处选择用几个进程。点

“Execute”执行,“Break”终止程序。下面有个选项“more options”,选中后有更多的参数

可选用,包括用配置文件执行程序,单机测试没必要写配置文件了吧。

二、多机协同作业

首先、在其他的机器上也安装mpich2,版本不应该相差太远,最好同样版本,如mpich2-1.0.6。

其次、每个机器上的帐户要一样,如administrator,更重要的是密码也要一样!希望新手要注意:用户和密码都要求一致

再次、一定要把所有机器的防火墙都关掉,windows防火墙最好也关掉,不然可能相互连接不上,或者执行的时候有奇怪的错误。

最后、是注册,配置,运行,还是有两种方式,分别介绍一下。

1、命令行方式:

注册:将每台机器都注册,与单机测试时一样。

配置:写配置文件,在MPICH2中配置文件config_mpich2的格式如下:

     -n 2 -host 192.168.1.104 c:\mpi\helloworld.exe

     -n 2 -host 192.168.1.123 c:\mpi\helloworld.exe

表示在两台机器上各启动两个进程,这里可以写IP,也可以写机器名,如我WXFENG,JLU-F0BCE9654EA等等。

在MPICH1中配置文件config_mpich1的格式如下:

exec:\mpi\helloworld.exe

hosts

192.168.1.123 2

192.168.1.104 2

运行:用MPICH2格式的配置文件,mpiexec -configfileconfig_mpich2

用MPICH1格式的配置文件,mpiexec -fileconfig_mpich1

不用配置文件,mpiexec -hosts 2192.168.1.123 192.168.1.104 c:\mpi\helloworld.exe

这里都假定可执行文件在各机器同一工作目录下c:\mpi\helloworld.exe,若用配置文件执行程序的话,可以指定不同的目录。

2、GUI方式:

注册:开始菜单=>所有程序=>MPICH2=>wmpiregister.exe,将每台机器都注册,与单机测试时一样。

配置:开始菜单=>所有程序=>MPICH2=>wmpiconfig.exe

只在提交任务的机器上配置就可以了,其他机器可以不做。先在Domain里写上所有机器所在的工作组,如workgroup,然后Get Hosts找到在这个工作组下的所有机器,再Scan Hosts找出哪些机器安装了MPICH,而哪些没有。安装了的会显示绿色,没安装的显示灰色。这时一般就有版本信息了,若没有的话,Scan for Version试试。将绿色显示的机器名记下来,在运行的时候用。

运行:开始菜单=>所有程序=>MPICH2=>wmpiexec.exe

点击“more options”,hosts那个文本框中填入想使用的机器的机器名,如WXFENGJLU-F0BCE9654EA,就是配置那一步所查询到可用的机器。点击“Execute”执行程序。

这里有一个简单的代码,用来检查程序是否在多台机器启动了,

program main

! include 'mpif.h'

use mpi

implicit none

integeri,ierr,rc,namelen,num,l,m

character(MPI_MAX_PROCESSOR_NAME)name

call MPI_INIT(ierr)

callMPI_COMM_RANK(MPI_COMM_WORLD,i,ierr)

callMPI_COMM_SIZE(MPI_COMM_WORLD,num,ierr)

callMPI_GET_PROCESSOR_NAME(name,namelen,ierr)

write(*,"('helloworld ! processor',I2,' of ',I1,' on ',20A)")i,num,name

do l=1,100000

do m=1,100000

enddo

enddo

write(*,"('programis over ! processor',I2,' of ',I1,' on ',20A)")i,num,name

call MPI_FINALIZE(rc)

end program main

打开各机器的任务管理器,看看是不是CPU都用上了。我发现spmd.exe会占用90%多的CPU,而真正的可执行程序占的CPU并不多,不知道是怎么回事,以后试试其他的程序再说吧,而且spmd.exe占用内存也很大。

结束语,想说说GUI方式的“配置”这个步骤,个人觉得没什么用,也许是现在我还不会用吧。只不过是查询一下有哪个机器可以安装了MPICH,可以被使用而已,记录下这些机器的机器名,在wmpiexec.exe中当做参数使用。比较而言,还是以命令行方式执行程序,写配置文件比较顺手一些,似乎也更地道一些,本来MPICH大多数都是在linux下使用的嘛。

在需要运行MPI程序的机器上:

1 安装.net框架(dotnetfx.exe)

2 拷贝smpd.exe, 并运行smpd –install

这会安装一个服务“MPICH2 ProcessManager, Argonne National Lab”

开机时启动smpd进程,它打开端口8676和另一个端口

3 拷贝所需的程序和DLL到每台机器, d:\mpi\目录

包括任务程序如testMPI.exe,及所有mpich2*.dll(在完整安装了mpich2的机器system32\)   任务程序也可以放在服务器的共享目录

4D:\mpi>mpiexec.exe -hosts 2 host1 host2 d:\mpi\testMPI.exe

前提是两台机器都启动了smpd。该命令会在每台机器上启动testMPI.exe,并行完成任务

对于前面那个计算Pi的例子程序,只在第1台机器(即运行mpiexec的localhost)上有输入输出,它相当于master processor任务程序如果在服务器,则运行D:\mpi>mpiexec.exe-hosts 2 host1 host2 \\server\mpi\testMPI.exe

命令行也可以用图形界面的wmpiexec.exe来代替,可以方便的设置一些选项,可以保存/加载job

首次运行时需要输入用户名和密码,这可以用wmpiregister.exe输入并(加密)保存起来 wmpiconfig.exe用来配置一些MPI运行环境参数,比如可以把优先级改为idle

运行结果的观察:

1 每次执行mpiexec.exe -hosts 2host1 host2 d:\mpi\testMPI.exe 会在目标机上增加一个testMPI.exe进程和smpd.exe进程

运行mpiexec.exe -n 3 testMPI.exe会生成3个testMPI.exe进程,但只有一个smpd.exe

2 关掉运行mpi的cmd窗口时,会自动退出mpi任务,显示(我抓图看到的:)

mpiexec aborting job...

job aborted:

rank: node: exit:code[: error message]

0: host1: 123:mpiexec aborting job

1: host2: 123

3 多次运行mpiexec,它们的进程通信空间是独立的。

如第1次运行mpiexec -n 2testmpi.exe

第2次运行mpiexec -n 3testmpi.exe

则第1个任务的numprocs=2

则第2个任务的numprocs=3

互不影响

你可能感兴趣的:(交流学习)