分类: 系统运维
2010-07-08 10:29:54
并行计算 2008-08-18 18:01:19 阅读446 评论1 字号:大中小
在前面的文章里已经阐述了windows下并行编译环境的配置,得到了可执行程序,怎么运行呢?
一、单机测试。
1、命令行方式:
注册:mpiexec -register
输入你当前登陆帐户名和密码,不注册的话每次执行程序都要求输入帐户和密码。
运行:mpiexec -n 2 helloworld.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,更重要的是密码也要一样!我把老婆的机器也装上MPICH2了,我们两个平时都用的是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的格式如下:
exe c:\mpi\helloworld.exe
hosts
192.168.1.123 2
192.168.1.104 2
运行:
用MPICH2格式的配置文件,mpiexec -configfile config_mpich2
用MPICH1格式的配置文件,mpiexec -file config_mpich1
不用配置文件,mpiexec -hosts 2 192.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那个文本框中填入想使用的机器的机器名,如WXFENG,JLU-F0BCE9654EA,就是配置那一步所查询到可用的机器。点击“Execute”执行程序。
这里有一个简单的代码,用来检查程序是否在多台机器启动了,
program main
! include 'mpif.h'
use mpi
implicit none
integer i,ierr,rc,namelen,num,l,m
character(MPI_MAX_PROCESSOR_NAME) name
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,i,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,num,ierr)
call MPI_GET_PROCESSOR_NAME(name,namelen,ierr)
write(*,"('hello world ! processor',I2,' of ',I1,' on ',20A)")i,num,name
do l=1,100000
do m=1,100000
enddo
enddo
write(*,"('program is 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 Process Manager, Argonne National Lab”
开机时启动smpd进程,它打开端口8676和另一个端口
3 拷贝所需的程序和DLL到每台机器, 如d:\mpi\目录
包括任务程序如testMPI.exe,及所有mpich2*.dll(在完整安装了mpich2的机器system32\下)
任务程序也可以放在服务器的共享目录
4 D:\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
命令行也可以用图形界面的wmpiexec.exe来代替,可以方便的设置一些选项,可以保存/加载job
首次运行时需要输入用户名和密码,这可以用wmpiregister.exe输入并(加密)保存起来
wmpiconfig.exe用来配置一些MPI运行环境参数,比如可以把优先级改为idle
运行结果的观察:
1 每次执行mpiexec.exe -hosts 2 host1 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 2 testmpi.exe
第2次运行mpiexec -n 3 testmpi.exe
则第1个任务的numprocs=2
则第2个任务的numprocs=3
互不影响