单机上mpi环境配置
1.配置好ssh
命令如下:
在当前主机下,执行ssh-keygen,将提示密钥存放的目录,敲回车确定。提示输入密码,为了运行程序时方便,不需要输入密码,直接输入两次回车确认即可。
然后将共有密钥放在自己的认证密钥里,cd ~/.ssh 进入.ssh后执行 cp id_rsa.pub authorized_keys这样ssh 时不用输入密码了。
修改 /etc/hosts文件,从localhost localhost.localdomain下一行凯斯,填入需要运行MPI的所有节点名及其ip地址:
(本机ip) node1
(本机ip) node2
(本机ip) node3
(本机ip) node4
然后修改或者创建 /etc/hosts.equiv文件,将允许访问本节点进行mpi计算的所有其他节点填入,一行一个节点名。这一步是使本节点对其他结点放权,文件如下:
node1
node2
node3
node4
然后测试
若果不用输入密码,则配置成功。如果是新手,会遇到ifconfig问题,参考https://blog.csdn.net/sinat_35605242/article/details/80941483
2.安装mpich
我太难了,我可能是个🐖,,,windows的文件一直拖都拖不到Xshell,改了文件夹权限chmod 777还是不行,最后还是用MobaXterm_Personal_10.9才解决,我呜呜呜~~~~
安装包的解压
安装包所在的目录下,运行tar xzvf mpich-x.x.x.tgz
。
tar xzvf mpich.tar.gz
切换到解压出来的包目录下cd mpich-x.x.x
cd mpich-1.2.7p1/
configure配置编译环境,我这里为它选择了一个安装路径。./configure --prefix=/usr/local/mpich-x.x.x
./configure --prefix=/usr/local/mpi -rsh=ssh --disable-weak-symbols
缺少编辑器,按需求确认安装C、C++、F77和F90编译器即可。
yum install gcc gcc-c++ gcc-fortran kernel-devel -y
./configure --prefix=/usr/local/mpi -rsh=ssh --disable-weak-symbols
安装
make
make install
至此,mpich安装完成
下一步就要配置环境变量了(其实主要就是你要扒拉到你的安装文件夹下,看哪些文件夹比较重要的,要想办法添加到PATH中去。比如/usr/local/mpi/bin
这个文件夹等等。)
分别将/usr/local/mpi/bin和/usr/local/mpi/man加入环境变量PATH和MANPATH中,只需要在目录/etc/profile.d中创建mpich.sh和mpich.csh这两个文件即可,它们分别对Bourne shell和C shell起作用,这两个文件的内容如下:
mpich.sh
mpich.csh
使该配置文件生效
cd /etc
source /etc/profile
授予全部权限(简单粗暴。。)
至此,环境变量的配置完成。
3.开发第一个MPI程序
太激动了,,,呜呜呜,要哭liao
在当前文件夹里,建立一个 test.c文件,并编写代码
或者
在解压出来的MPI安装目录下有个examples文件夹,里面有若干示例程序可供测试。
- 编译测试
使用cd命令切换到示例程序文件夹下,使用mpicc sendmany.c -o sendmany
进行编译。 - 运行测试
mpirun -np N sendmany
这里的N改成一个常数,表示你要用来运行这个并行程序的节点。如果不是在集群环境上,一个CPU一个节点,进程数也就是一个,本地机子默认的编号就是0。你N的不同就是把程序跑N遍。
#include"mpi.h"
#include<stdio.h>
#include<math.h>
void main(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);
printf("Hello World!Process %d of %d on %s\n,myid,numprocs,processor_name");
MPI_Finalize();
}