后续为常规安装步骤,使用默认配置选项,建立nemesis communication device和Hydra process manager针对C、C++、Fortran-77和Fortran-90(如果有编译器的话),但是没有报错和调试功能?如果make的时候使用VPATH,建立的process会占据本地disk为了speed。
需要的文件有
点击此处下载mpich源码,我选择的是mpich-3.3 (stable release)(MPICH平台)
将下载好的mpich-3.3.tar.gz复制到一个文件夹下,解压
tar xfz mpich-3.3.tar.gz
新建安装目录,这我就直接在我的文件夹里新建了
mkdir mpich-install
然后选择一个build目录,build将会非常快如果它在文件系统被配置和执行,如果能和资源目录分开也很好的,这个目录在安装成功之后会有一个examples
文件夹,里面是MPICH的示例程序,最好复制出来以便测试,不然重启之后tmp就清空了。
mkdir /tmp/mpich-3.3
配置MPICH,切换至路径
cd /tmp/mpich-3.3/
执行配置程序
/home/kang/Desktop/mydir/MPICH/mpich-3.3/configure -prefix=/home/kang/Desktop/mydir/MPICH/mpi-install |& tee c.txt
此步骤可能会报错,比如我报错找不到任何Fortran编译器,两个解决措施,安装一个,或者忽略这个,我选择安装。
安装gfortran
sudo apt-get install gfortran
安装完之后再次执行上面的配置命令,在经过一堆Check之后,如果成功,会如下图所示
使用tee命令可以同时将显示在屏幕的内容输出到文件中
make进行编译
make |& tee m.txt
或者make 2>&1 | tee m.txt
如果make完成了应该能看到下面的图
执行下列命令进行安装
make install |& tee mi.txt
export PATH=/home/kang/Desktop/mydir/MPICH/mpi-install/bin:$PATH
是使用which mpicc或者mpiexec
测试时候添加到了PATH。
这似乎只是临时添加的PATH,因为重启之后他提示找不到文件,就是说路径没了,因此需要永久性添加PATH,具体操作如下
编辑vim /etc/profile
文件内容,添加之前你使用的临时导入的指令,如下图所示
随后执行指令source /etc/profile
更新,即可生效。
执行ssh othermachine date或者rsh othermachine date
查看需不需要使用密码,需要的话就需要重新配置。
使用如下命令进行测试,如正确,则安装成功,使用的examples文件夹是在build和make之后在tmp下生成的
mpirun -np 10 ./examples/cpi
,这里的examples
就是上面让你复制的那个文件夹。
编写代码如下保存为hello.c
#include "mpi.h"
#include
int main (int argc, char *argv[]) {
int i;
int id; /* Process rank */
int p; /* Number of processes */
void check_circuit (int, int);
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &id);
MPI_Comm_size (MPI_COMM_WORLD, &p);
for (i = id; i < 65536; i += p)
check_circuit (id, i);
printf ("Process %d is done\n", id);
fflush (stdout);
MPI_Finalize();
return 0;
}
/* Return 1 if 'i'th bit of 'n' is 1; 0 otherwise */
#define EXTRACT_BIT(n,i) ((n&(1<
执行mpicc -o hello hello.c
编译程序。
执行mpirun -n 2 ./hello
运行程序,-n参数值表示为两个处理器运行,mpiexec也可以,运行结果如下图所示
编写helloworld.c代码如下所示
#include "mpi.h"
#include
#include
void main(argc,argv)
int argc;
char *argv[];
{
int myid,numprocs;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stderr,"hello,world!Process %d of %d\n",myid,numprocs,processor_name);
MPI_Finalize();
}
执行mpicc -o helloworld helloworld.c
编译程序。
执行mpirun -n 4 ./helloworld
运行程序,结果如下图所示
我在某个教程上看是可以配置的,但是我并没有配置,好像没出什么问题。
联机运行的主要难点就是如何建立ssh连接,不仅仅是要安装ssh服务,还需要设置和对应的公钥和私钥。
如果报错
ssh: connect to host localhost port 22: Connection refused
那么因为你没有安装ssh的服务端,执行指令ps -e |grep ssh
,如下图所示
如果你只发现了ssh-agent,那么说明只有客户端,需要安装服务端程序,执行下述命令安装
sudo apt-get install openssh-server
安装好之后,再次运行ps -e|grep ssh
,你应该就会发现sshd的存在了,这就是我们需要的。
开启
service sshd start
关闭
service sshd stop
现在执行命令ssh localhost(127.0.0.1)
,然后输入你的系统登陆密码,不出问题的话应该就可以正确地登陆到本机了。
但是mpich需要的是免密登陆,因此安装好之后需要生成密钥进行配置,执行以下命令(在第一步生成密钥的时候,我们选择不设置密码,直接回车即可)
//生成密钥
ssh-keygen -t rsa //使用rsa加密
//利用公钥生成授权文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
添加至信任
ssh-add
随后使用ssh登陆本机,会发现不需要输入密码了,如下图所示
至此,免密登陆本机已经成功了
需要配置/etc/hostname
主机名和/etc/hosts
的主机IP映射,由于我不知道实体机和虚拟机怎么映射IP,因此采取VM开两个虚拟机,ubuntu和kali进行测试,在hosts文件中需要对主机名和IP地址进行映射,格式如下图所示吧,我这应该算是虚拟机里的内网地址吧,局域网。
ps.查看IP地址如下
ubuntu的主机配置如下所示
kali如下所示
至此主机的配置就搞定了,然后进行ssh的配置,关键就是ssh的两个主机免密登陆配置,这个配置网上有很多,但是似乎都不太全,记录一下。
大体步骤分为四步
安装ssh就直接安装,如ubuntu是sudo apt-get install openssh-server
,kali是sudo apt-get install ssh
,不同系统似乎不太一样。
安装好之后需要配置一下config
/etc/ssh/sshd_config
需要将如下的三个配置取消注释,如果没有的话主动添加进去就行了
随后重启ssh服务生效,ubuntu是service sshd restart
,kali是service ssh restart
。
下面生成密钥
以下步骤除特殊说明外,各节点操作相同,以ubuntu为例
执行命令ssh-keygen -t rsa
生成公钥和私钥,一路回车就行了,我们不需要密码。
将kali生成的id_rsa.pub
公钥文件复制到ubuntu的~/.ssh
文件夹中,可以重命名为id_rsa_from_kali.pub
方便区分,只是方便操作,在哪其实无所谓。
执行如下命令
#将本机公钥添加到授权文件中
cp ~/.ssh/id_rsa.pub authorized_keys
#将节点主机的公钥添加到授权文件中
cat ~/.ssh/id_rsa_from_kali.pub >> ~/.ssh/authorized_keys
授权文件内容如下图所示
这个授权文件在这个集群中其实是通用的,将其直接复制到kali的~/.ssh
文件夹下即可
随后对ubuntu和kali都进行添加私钥的操作ssh-add ~/.ssh/id_rsa
到这应该差不多了,但是其实还是有点小问题,就是在进行ssh连接的时候,主机名有点小问题,得用户加主机名才行,不能单纯的主机名,然后呢,我进行一个测试,在kali上测试一下,ssh连接到ubuntu
ssh kang@ubuntu
可以看到成功连接了,说明ssh好了,下面要试着继续弄mpich了。
其实还需要进行权限的分配的,但是默认似乎就可以用,我就不管了
此时我们就需要使用到machinefile文件了,编写文件内容如下所示
ubuntu # Run 1 process on ubuntu
#ubuntu2:4 # Run 4 processes on ubuntu2
其中前面的为主机的host名,冒号后面为运行的线程数,按理说格式应该是[IP] [HOSTNAME]
,如果是多机的话需要这么做,但是此时我是单机,因此不需要,保存退出。
执行命令
mpiexec -n 5 -f machinefile ./examples/cpi
结果如下图所示,不再提示SSH连接22端口失败了,而且可以看到主机名也变为我们localhost的ubuntu了。
至此我觉得这个东西初步应该就这么解决了。
在进行连机之前切记切记切记,各个主机的安装目录,运行程序所处的路径必须完全一样
我就是因为安装路径不一样,一个是mpi-install另一个是mpich-install,看了好久都没发现如果路径里有username,如/home/kang之类的,还要确保所有主机的用户名一致,不然路径也会变化
然后编写machinefile,可以在主机名后面加上冒号和数字,表示这个主机运行的线程数
ubuntu
ubuntu-node
之后执行如下命令,在这里文件的路径用绝对路径是为了保证一致性,避免其他主机找不到文件
mpiexec -f ~/Desktop/mydir/MPICH/exp/machinefile -n 4 ~/Desktop/mydir/MPICH/exp/examples/cpi
运行结果如下
这里看着没毛病,其实底下还有一堆隐约像报错又不像的东西我没有截进来。
难点主要就是保证路径什么的一致把,就没啥了
我给ubuntu重装了一下,感觉出了点问题,真奇怪,估计是没卸载干净吧,至少现在有点结果了,就问题不大了。
【linux 配置mpich环境ssh connect to host port 22 no route to host错误解决办法】 – 加贝木苇
Linux系统(Ubuntu)下,MPI的安装与配置 – 惰性求治
Linux CentOS下安装MPICH以及运行第一个并行程序 – houqingdong2012
【Linux添加$PATH环境变量】 – 百度百科
【Linux安装SSH本机免密登录】 – 很吵请安青争
【ubuntu下MPICH的安装以及多机环境运行】 – saihang1992