好不容易实验室来了两台性能还可以的服务器,正好师兄师姐比较忙没空来配置服务器,所以我可以暂时使用服务器来学一下怎么配置集群,哈哈,单机已经满足不了我了。
首先,我们那比较简单的mpich进行开刀,配置一个简单的mpich集群。
先介绍一下MPI:
MPI 全称Message Passing Interface 消息传递接口,是一种编辑接口标准,而不是一种具体的编辑语言。该标准是由消息传递论坛(MEssage Passing Interface Form,简称MPIF)发起讨论并进行规范化的。
MPI标准从1992年开始起草,1994年发布第一个版本MPI-1(MPI v1.0,进而发展出1.1和1.2版),到1997年发布第二个版本MPI-2(MPI v2.0)。MPI标准如今已经成为事实意义上的消息传递并行编程标准,也是最为流行的并行编程接口。
由于MPI提供了统一的接口,该标准受到各种并行平台上的广泛支持,这也使得MPI程序具有良好的可移植性。目前,MPI支持多种编程语言,包括Fortran77,Fortran90以及C/C++,目前看到的是python,java也支持了mpi;尽管MPI属于OSI参考模型的第五层或者更高,他的实现可能通过传输层的sockets和Transmission Control Protocol (TCP)覆盖大部分的层;MPI还支持多核(Multicore)、对称多处理机(SMP)、集群(Cluster)等各种硬件平台。
我们这边使用的是MPICH,是由阿公国家实验室和芝加哥大开发的,是一个开源软件开源在http://www.mpich.org/上下载到。
首先从http://www.mpich.org/downloads上下载mpich源码。
我们这里使用了mpich-3.2.1版本
下载好后,
tar -zxvf mpich-3.2.1.tar.gz
cd mpich-3.2.1
./configure -prefix=/usr/local/mpich
prefix参数表示安装的路径
接下来:
make
sudo make install
mpich被安装在/usr/local/mpich目录下面
接下来添加环境变量:
sudo vi /etc/profile
在末尾添加
export PATH=/usr/local/mpich/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/mpich/lib:$LD_LIBRARY_PATH
接着执行
source /etc/profile
使环境变量生效
可以在mpich-3.2.1目录下面运行:
cp -r examples/ /usr/local/mpich
mpiexec -n 10 /usr/local/mpich/examples/cpi
如果最后输出的无误,则到这里单机版本的mpich环境配置好了。
接下来配置多机版本,
这里设置有两台机器,主机为A,从机为B
现在A,B两机上按上述方法配置mpich
这里MPI是使用ssh进行消息的传递
所以先在A,B两台机器上下配置ssh:
sudo apt-getinstallopenssh-server
/etc/init.d/ssh start
为了方便我们对B机进行ssh无密码登陆访问的设置
在A机上生成公钥
ssh-keygen -t rsa
按提示输入三次回车,在默认的~/.ssh目录下生成一个公钥
在A机上执行
scp /home/A'sname/.ssh/id_rsa.pub B'name@B'sIP:/home/B'sname/.ssh/authorized_keys
其中A‘sname,B’s name为A,B机的用户名,B’sIP为B的ip地址,可以在B机上用ifconifg看到
这时候可以在A机上直接用
ssh B'sname@B'sIP
登陆B机
如果A,B两机的登陆用户名相同可以简化为:
ssh B'sIP
如出现:Could not open a connection to your authentication agent.
则
eval `ssh-agent -s`
ssh_add
接下来在mpich3.2.1目录下,创建machinefile,里面填写其他机器的用户名,IP和线程数:
B’sname@B’sIP:thread count
C’sname@C’sIP:thread count
mpiexec -n 10 -machinefile ./machinefile /usr/local/mpich/examples/cpi
用多机来计算圆周率
测试在多机上执行时要注意在两台机器相同路径上有相同的文件
如果使用python的话可以安装mpi4py
下面是openmp与mpi之间的区别:
openmp 全称 Open Multi-Processing是一套支持跨平台共享内存方式的多线程并发的编程API(当然多核还可以用OPENCL),openmp的编程方式有点像openacc的编辑形式,在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。现在常用的编译器如Visual Studio都支持openmp,只需要加入mpi.h的头文件,不过openmp是线程上的并发,所以是共享内存的,无法多机并发,这与mpi有区别。
但mpi的编程比较繁琐,由此出现的openmp+mpi组合的形式