Posts Tagged MPI

关于MPI的另外一些笔记


openmpi似乎比mpich2更加易用(不用通过mpdboot起一大堆daemons,当然也就不用mpdallexit来清理),而且也是Ubuntu下MPI的首选。有不少人说它的计算效率比另外几个实现更高,目前的Top 500有很多都用openmpi.  最后一个好处就是它的插件架构使得它可以更灵活,比如说同时支持infiniband, tcp, 还有shared memory等等。目前我手上的这个project要求用mpich2, 等弄完了我再仔细研究一下怎么用openmpi —- 看起来和装mpich2差不多(甚至更简单)。

, , ,

留下评论

在Ubuntu system上安装MPI的笔记


基本介绍:这个笔记并不全面(全面的满街都是),我假定你懂Linux基本的配置,会编译程序等等。

配置:两部电脑,一部叫做node1有4核,另外一部叫做node2双核。系统都是Ubuntu 10.04, x86_64. 目前mpich2还不支持在不同架构的电脑上并行运算,所以系统相同,mpich2的版本号一致等等是一个前提条件。

1. 安装

sudo aptitude install mpich2 libmpich2-dev mpich2-doc

其中mpich2是MPI的一个比较新的implementation, 如果你只需要跑别人编译好的mpi程序只装这个包就够了。这个包提供了这些工具:mpd, mpdboot, mpdcheck, mpdcleanup, mpdexit, mpdhelp, mpdrun, mpdtrace, mpiexec等等。
mpich2-doc,顾名思义,是它的一些文档(装在/usr/share/doc/mpich2-doc/下),但更重要的是这个包还包括了一些examples, 通过它们第一可以检查你安装的对不对,第二可以学习一下简单的MPI编程。

libmpich2-dev提供了编译MPI程序所必须的libraries(比如/usr/lib/libmpich.so),header文件(比如/usr/include/mpich2/mpicxx.h),还有gcc的一些wrapper(比如/usr/bin/mpicc)。

2. 网络设置
这一步非常重要:改/etc/hosts, 让所有的机器的hostname都解析成对方能连上的IP:

127.0.0.1     localhost
192.168.1.101 node1
192.168.1.102 node2

讲一下道理。mpd之间是这样通讯的,每个mpd都能记住自己机器的hostname(比如说node1)和在/etc/hosts里对应的IP,并且把这个IP报告给别的机器。在Ubuntu系统上,缺省设置你的hostname对应的是一个内部IP,比如说127.0.1.1。你如果不改的话,从node1上连node2就会连node2报上来的这个假IP(127.0.1.1),结果是连回自己了。这是新手极其容易犯的一个错误,而且很不好debug。

一个相关的事情是你得想办法让两部机器的文件同步。标准的办法是通过某种网络文件系统(比如说NFS或者SSHFS),这里我就不介绍了。但其实很多人不知道,如果你的MPI程序不要求多个nodes同时读写,NFS并不是必要的。理论上讲,只要你编译的程序本身在两部机器上都在一个路径下即可。

最后,使用MPI的一个前提就是在所有nodes之间可以用ssh无密码登录。这个的实现不难,google一下passwordless ssh即可。
3. 调试MPI编译环境
把/usr/share/doc/mpich2-doc/examples/拷贝到某个目录下。随便找一个例子(比如说examples_graphics/cpi.c)编译一下试试看

mpicc cpi.c -o cpi

注意:你暂时不可以用例子里自带的makefile自动编译,因为那个makefile调用了MPE。而由于MPE的软件许可和GPL不兼容,Ubuntu把所有和MPE有关的包都删了。但Ubuntu保留了一个mpe-source。我回头有时间写一下怎么通过这个包来安装MPE,装上了就可以直接make。就一般的MPI使用来讲这个东西也没什么必要。

4. 调试MPI运行环境
首先,在自己的home directory里生成一个mpd的控制文件~/.mpd.conf, 里头的内容是secretword=something。并且修改该文件属性只有本人可读(chmod 600 ~/.mpd.conf)。稍微解释一下,这个secretword其实没什么用,只是在一些比较特殊的情况下系统用来区分哪些process是你生成的哪些是别人的而已。所以,你完全可以随便生成一些随机字符串。对了,mpd是一个守护进程,负责分派管理MPI进程和它们的通讯的。

假设你没有这个文件,或者这个文件的属性不对,你就会得到如下的非常神秘的出错信息:

mpdboot_node1 (handle_mpd_output 420): from mpd on node1, invalid port info:
no_port

其次,在你的working directory(不一定非得是home directory)里生成一个文件叫做mpd.hosts, 里头内容如下:

node1
node2

解释一下,这个文件是给mpdboot用的。它告诉mpdboot(最多)有两部电脑可用。mpdboot本身只是一个很简单的wrapper, 它通过ssh在那两部电脑上同时跑mpd而已。你要愿意,也完全可以不用mpdboot,而是到两部机器上自己手动运行mpd,效果是一样的。

 

好了,现在可以开始开始做实验。第一步检查一下这两个nodes是否都能连上。

mpdcheck -f mpd.hosts -ssh

如果一切正常,我们就开始正式启动mpd

mpdboot -n 2 -f mpd.hosts
mpdtrace

第一个命令启动两个nodes上的mpd, 第二个命令检查是否两个nodes上的mpd都起来了。记住,这里的参数-n 2指的是两个nodes, 不是两个cpu!

最后就是用mpiexec执行一个测试程序(以开头编译的cpi为例)。因为mpdboot其实并不负责管每个node有几个CPU,而我们这个例子里的两个nodes的CPU数量不一样,所以我们还得写最后一个配置文件给mpiexec每个node最多能同时起多少个processes。这个文件可以就放在working directory下,比如说就叫做machine_file:

node1:4
node2:2

这个文件说明node1能同时跑四个进程,node2能跑两个。
最后的试验:

mpiexec -machinefile machine_file -n 6 /path/to/cpi

注意一下,这里面的-n说的不是nodes, 而是多少个进程了。另外重复一遍,/path/to/cpi在两部机器上必须一样。NFS倒是没有必要。

, , , ,

留下评论