并行时代已经到来,我猛然觉得自己有点落伍了,自身对此方面的知识可以用贫瘠来形容。亡羊补牢,为时未晚。三日前,开始着手调查相关资料,先从集群多进程入手,选择了MPI(Message Passing Interface)作为实践对象。就像STL一样,作为一个标准,MPI有多家厂商提供了实现,其中最常用的是MPICH和Open MPI。MPI为C/C++/Fortran这三种语言的提供了接口,需要进行科学计算的学生和研究人员可根据自己的需要选择相应的接口。
为了对MPI有个感性的认识,我安装了MPICH2(http://www.mcs.anl.gov/research/projects/mpich2/),该软件在Windows环境中需要DotNet Framework 2.0,计划使用VS2005和Eclipse CDT来感受一下。
首先,需要在IDE中设置include和lib路径。
第二,需要引用lib路径中的库文件mpi.lib,这时使用的是C接口,如果想使用C++接口还需要添加cxx.lib文件。这一步中,如果是使用Eclipse+GCC来构建MPI程序,则需要将
库文件改成libmpi.a和libmpicxx.a,在g++的编译选项中使用 -lmpi -lmpicxx。
第三,include必备的头文件,在mian函数中调用必备的函数,一个使用MPI的C++接口的详细示例如下
特别注意的是,如果使用的是MPI的C接口,则域作用符::都变成了下划线,一些函数的用法也有些改变。示例如下:
第四,编译之后生成相应的可执行文件,将其复制到一个自己定义目录中,这个目录将作为MPI的工作路径中,在所有参与集群的机器上名称相同,且将MPI的bin目录添加到系统PATH中。
第五,MPICH2提供了一些MPI检测工具wmpiexec.exe,在bin目录中。可以用来测试一下上一步生成的可执行文件的有效性,可使用多核电脑来测试多个进程示例直接的通讯。
第六,在部署集群之前,建议采用虚拟机进行测试。我在三核的电脑上安装了两个Windows 2000虚拟操作系统,这两个操作系统均需要安装MPICH2 + DotnetFramework 2.0,所有的系统上均需要使用wmpiregister.exe来注册一个用户,这个用户必须是本机上具有管理员权限的账户。此外,具有防火墙的系统应当关闭防火墙或作特例处理。
第七,将所有参与集群的机器设置为同一个工作组中,使用MPI配置工具wmpiconfig.exe来检验各个机器是否能够正确运行MPI,列表中的机器名称背景变为绿色时,表明可以运行。然后就可以启动MPI程序,示例如下
mpiexec.exe -hosts 3 JUSTIN 3 192.168.1.150 1 192.168.1.200 1 C:/TestMPI/1.exe
以上代码表示使用3个机器,且第一个机器使用3个进程,其它机器各使用1个进程。第一个机器可以使用标识名,其它机器使用IP地址。
第八,测试成功之后,可以迁移到实际的集群中。目前,由于机器数量的限制,我只是迁移到一台三核的HP PC和一台双核Asus的Laptop。
总结,经过三天的时间总算部署好了MPI,当初部署过程中没有注意到C和C++接口的区别,导致链接出错,耽误了大量的时间,谨记!
下一步,逐步领会多节点进程并行