需要软件及配置,首先是CYGWin下需要安装的软件包。
并行计算环境的搭建需要rsh-server 以及rlogin的支持,所以需要安装这两个包,这两个包位于Net->inetdutils下,安装时选择安装即可。
如果需要开发基于OpenGL的程序,请安装Graphics下的freeglut包以及opengl。
mpich2的安装需要perl的支持,请安装Perl下的perl包。 到mpich2官方网站http://www-unix.mcs.anl.gov/mpi/mpich2/下载最新的软件包mpich2- 1.0.3 .tar.gz
配置并行环境:
系统rsh的配置:inetd 服务包的配置文件位于/etc/inetd.conf inetd的每次启动都会去读取这个文件。
注销掉不需要的服务:只留下rlogind和rshd两个服务。通过以下的命令
$ inetd --install-as-service
$ inetd --remove-as-service
来把inetd安装为系统服务或者注销。
通过如下的命令来重启或者停止inetd服务。
$ net start inetd
$ net stop inetd
通过$ inetd --install-as-service以及$ net start inetd把inetd服务启动。
在当前用户目录$HOME下创建文件$touch .rhosts 里面写入你希望不用密码就可以登陆本机的主机名称,并把权限设置为644
$ cd $HOME
$ touch .rhosts
$ echo “localhost” > .rhosts
$ chmod 644 .rhosts
然后用rsh localhost 命令测试是否可以无需密码验证即可登入。
如果不能需要检查/etc下的hosts以及hosts.equiv文件。
在/etc/下面创建hosts.equiv文件,里面是你允许登入的主机名称和用户名,中间用tab键隔开,同rhosts。 hosts.equiv文件的具体用法参考:http://www.unet.univie.ac.at/aix/files/aixfiles/hosts.equiv.htm 里面有详细的用例。可同时参考我的另一篇文章,关于rh4下rsh的设定一文。
# See "man 8 inetd" for more information.
# If you make changes to this file, either reboot your machine or restart
# inetd:
# "net stop inetd"
# "net start inetd"
# The inetd will then re-read this file.
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
echo stream tcp nowait root internal
echo dgram udp wait root internal
discard stream tcp nowait root internal
discard dgram udp wait root internal
daytime stream tcp nowait root internal
daytime dgram udp wait root internal
chargen stream tcp nowait root internal
chargen dgram udp wait root internal
time stream tcp nowait root internal
time dgram udp wait root internal
#
# The external services are typically called via 'tcpd' for
# security reasons, eg.
# ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
#
# but tcpd is not part of the inetutils, unfortunately.
# Nevertheless there's a port contributed by Prentis Brooks <[email protected]>
#
# We are calling the services here directly.
#
# These are standard services.
#
#ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
#telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
#
# Shell, login, exec and talk are BSD protocols.
#
shell stream tcp nowait root /usr/sbin/in.rshd in.rshd -L
login stream tcp nowait root /usr/sbin/in.rlogind in.rlogind
#exec stream tcp nowait root /usr/sbin/in.rexecd in.rexecd
#talk dgram udp wait root /usr/sbin/in.talkd in.talkd
#ntalk dgram udp wait root /usr/sbin/in.talkd in.talkd
#
# The Internet UUCP service.
#
#uucp stream tcp nowait uucp /usr/sbin/in.uucpd in.uucpd
#
# Tftp service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers."
#
# tftp dgram udp wait nobody /usr/sbin/in.tftpd in.tftpd
下面就进入到了mpi的安装。
mpi的实现版本有许多。开源的主要有mpich 和 lammpi。个人比较倾向于mpich,所以文中的安装以mpich为例。mpich目前的版本主要有mpich1.2 和mpich2,由于mpich2实现的是mpi2的标准,是以后的发展趋势,所以文中选用了mpich2- 1.0.3 作为本机上的mpi版本。
mpich2安装过程如下:
$ tar zxvf mpich2- 1.0.3 .tar.gz
$ cd mpich2- 1.0.3
$ ./configure –-prefix=/usr/local/mpich2- 1.0.3 –-enable-cxx --disable-f77 --disable-f90
$ make && make install
附注:因为我的开发中不需要fortran,所以明白的disable掉了。增加了C++ binding。
安装完成后,需要设置mpich的路径, 在$HOME目录下,修改.bash_profile文件,在其中增加如下部分:
export MPICH2_HOME=/usr/local/mpich2- 1.0.3
export PATH=$MPICH2_HOME/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/mpich2- 1.0.3 /lib:$LD_LIBRARY_PATH
在$HOME目录下创建.mpd.conf文件,包含“secretword=<secretword>”行,并把权限设置为600.
$ cd $HOME
$ touch .mpd.conf
$ echo “secretword=abcdef” > .mpd.conf
$ chmod 600 .mpd.conf
下面测试mpi是否可用了。
$ mpd &
$ mpdtrace
$ mpdallexit
第一条命令启动进程管理工具mpd,如果成功,第二条会输出主机名称。最后一条退出所有的mpd进程。
如果是一个集群,在文件mpd.hosts定义的所有主机(或者部分主机)上启动deamon进程。
$ mpdboot -n <number to start> -f mpd.hosts
其中启动时指定的数目可以比文件mpd.hosts中指定的主机数目+1小,但是不能比mpd.hosts中指定的主机数目+1大。无论本地的主机名称是否在mpd.hosts文件中指定,mpd都是在运行的。如果你只打算在本机上模拟多个进程,就不需要这一步了。
下面进行实例的测试:
到安装目录所在的examples目录。并行执行计算pi的程序cpi
$ cd /usr/local/mpich2- 1.0.3 /examples
$ mpiexec -n 5 ./cpi
表示用5个进程执行cpi程序。
在我的机器上测试结果如下:
在编译mpi的过程中,加入了C++ bindings , 而C++跟stdio.h定义的SEEK_SET, SEEK_CUR, and SEEK_END.有冲突,官方描述如下:
// There is a name conflict between stdio.h and the MPI C++ binding
// with respect to the names SEEK_SET, SEEK_CUR, and SEEK_END. MPI
// wants these in the MPI namespace, but stdio.h will #define these
// to integer values. #undef'ing these can cause obscure problems
// with other include files (such as iostream), so we instead use
// #error to indicate a fatal error. Users can either #undef
// the names before including mpi.h or include mpi.h *before* stdio.h
// or iostream.
解决方案中的一个就是在包含mpi.h时,要放在stdio.h或者iostream前面。
另外关于opengl的使用说明需要参考/usr/share/doc/opengl- 1.1.0 目录下的README.txt里面有库的详细调用情况。(在link时需要的主要事项。)
Reference:
1. MPICH2 user-install doc