windows下mpi多机通信

mpi在linux下可以通过ssh相互连接。而在windows下则只能通过用户名密码登陆来达到连接的目的。
以下是配置步骤:
1.安装MPICH2,如果要输入密钥则自己写一个(例如:behappy)
2.编写MPI程序,生成exe。注意生成的程序要复制到需要mpi的其它机器的相同路径下。
3.设置mpi的用户名密码,注意,不需要写domainuser,只需要写user就行了。要求多台机器都有这个用户名和相同的密码。在每一台机器上可以运行以下命令注册:
mpiexec -register
user
password
password
4.运行mpiexec -hosts 2 xxx.xxx.xxx.xxx xxx.xxx.xxx.xxy aaa.exe
5.如果发现说cannnot connect to xxx.xxx.xxx.xxx,那么可能是以下原因:
1)用户名密码不匹配,登陆不了
2)对应的密钥不同(也有可能安装的时候并没有设置口令,例如server 08上MPICH2并不会跳出口令设置这一步),这时候运行regedit,找到HKEY_LOCAL_MACHINESOFTWAREMPICHSMPD,看看里面有没有一项是phrase,如果没有的话就加一项phrase,字符串类型,内容是之前(1.)写的密钥(例如behappy)。然后重启smpd服务(smpd -restart)

windows下MPI程序访问网络磁盘映射

MPI并行计算框架因为是基于C的,所以对于已有的C++代码只需要小改动就能实现并行化。
但是,使用MPI的时候,如果要访问通过网络磁盘映射的方式得到的路径,要怎么访问呢?

错误的方式:
在windows下利用磁盘映射,将\server_ipfolder映射到Z:
MPI程序中读取Z:xxx
这种方式对于普通的程序有效,但是MPI无法得知系统的映射对象(MPI只会读取本地磁盘盘符)参见:http://lists.mcs.anl.gov/pipermail/mpich-discuss/2007-September/002759.html
于是如果在MPI程序中写了读Z:xxx文件,会读取失败。

正确的方式:
FILE *fi=fopen("\\server_ip\folder\xxx","r");

直接通过这种网络位置的方式来读取。

这个小bug居然搞了我两个小时。。路漫漫其修远兮啊~

11.11.23,这忙碌的一天

今日行程:学校-上地-北大昌平校区-学校
今日完成的事:起床-调了两个bug-坐了三个小时公交-拼凑了一台nb闪闪的服务器-服务器搬回学校-装系统-赶点洗澡-二b青年欢乐多-现在
起床:7点不到就醒了……难道生物钟知道我要去昌平可以提醒我么……(昌平校车7:00从p大东门发车)
调bug:一个小时fix了两个bug,效率算很高的了
3小时公交:699-345-345快-昌53-昌53,因为昌平西关环岛修路,所以昌53路分两段运行。。下车步行一站接着坐。。用时3小时orz
拼凑服务器:昌平那边实验室堆着老旧的服务器们,但是老家伙们也是可以焕发新的活力的。比如说我从5台服务器中拼拼凑凑,最终的配置是:两个4核CPU、2G*6的内存,300G的硬盘。5台机器的配置是:CPU是双核*2或者四核*1的;内存是1G*4或者2G*2的;硬盘是146GB的。最终的结果就是找服务器们的最优子集,然后拼装就行了。颇有成就感啊~而且这服务器以后就归我使用了~
搬服务器:昌平校车4:25从昌平校区发车,而我早早就去等车了。。服务器也就10kg不到,但是我居然搬着很累,身体素质不行了啊……(虽然体重已经直奔85kg了……)
装系统:开始装了ubuntu server,可是。。命令行界面如何连网关啊。。不会啊。。sudo apt-get 不能用啊。。于是就歇菜了。。尝试了两个小时未果,于是果断ubuntu destop走起,半个小时就搞定了。所以菜鸟还是乖乖用destop吧。
赶点洗澡:大澡堂10:15停止进入,10:30停水。我10:00从实验室出发,一路狂骑,10:10到宿舍,然后奔上楼拿东西下楼冲到澡堂。洗完澡都还没缓过来。。
二b青年欢乐多:小浩浩学弟生日,给我们宿舍送了蛋糕吃。小浩浩切成了三块,结果只有我和他两个人在寝室。一人一块下肚后,就商量着剩下一块怎么办了。给王胖和汤圆中早回来的那个?给撸老师?最后一致的结论是我们两个分了第三块。然后,就找刀来切蛋糕了。诶?刀呢?诶?我前面居然没用小叉子而是直接拿刀来吃的蛋糕!好吧,难得2一回啊~
现在:吃饱喝足(阿牛烧仙草),正面对着屏幕看着动画。在这样忙碌的一天的末尾,用这样的方式来结束,再合适不过了~(虽然每天晚上其实基本都是吃饱喝足看动画的吧=。=)

附图一张,p大昌平校区校门

linux下多台机器mpi的部署

首先修改hosts,例如:
192.168.1.21 computer1
192.168.1.22 computer2
之类的,在/etc/hosts文件内

然后安装mpi:
sudo apt-get install libc6 mpich2
在/home/user目录下新建一个叫.mpd.conf的文件,里面写上MPD_SECRETWORD=xxx

然后是安装ssh
参考:
http://blog.sciencenet.cn/home.php?mod=space&uid=43242&do=blog&id=275185
最终目的是computer1能够ssh直接连接其它的机器而不用输入密码。

对每一台需要用到的机器都要执行上面三步

在computer1的/home/user下建立.mpd.host文件,里面写上:
computer1
computer2
之类的,相当于将任务分配给各个机器的顺序

最后是启动mpi集群:
mpdboot -n 2 -f /home/user.mpd.host
这时查看mpdtrace,会看到2个机器名。
然后编译运行你的程序:
编译的命令是:mpicc xxx.c -o xxx.o 可能需要-lstdc++
执行的命令是:mpiexec -machinefile /home/user.mpd.host -n 2 xxx.o

注意:上面启动mpdboot的时候一定要在computer1上面启动computer2的mpd,否则相当于computer2自己当主机了,也就是computer1没法连接到computer2,最终会产生:
unable to start all procs; may have invalid machine names
> remaining specified hosts:
这样的错误。而网上铺天盖地都是说这时候应该在computer2上mpd到computer1,试了一下发现木有效果。。。