MPICH是MPI(Message-Passing Interface)的一个应用实现,是用于并行运算的工具。因特网提供开源代码下载,需要相应的编译包编译,需要安装GNU编译器套件(GNU Compiler Collection),gcc包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)
完成开发包的安装、mpich的编译、安装和运行,使用的mpich为mpich-3.1.3(stable release)版本。
注 :本文实验前已经创建好用户,配置好网络、yum源及关闭防火墙和做好主机映射,并ssh免密、NFS共享。
一、分别在node1、node2、node3、node4节点机上安装开发工具
如果连上因特网,则开发包可以使用yum安装
1、安装gcc开发包
yum -y install gcc
2、安装gcc-c++开发包
yum -y install gcc-c++
3、安装gcc-gfortran开发包
yum -y install gcc-gfortran
4、安装Java-1.7.0开发包
Java-1.7.0默认的工作目录为:/usr/lib/jvm/java-1.7.0。
yum -y install java-1.7.0-openjdk*
二、MPICH下载
地址为:http://www.mpich.org/static/downloads/3.1.3/mpich-3.1.3.tar.gz。
如果在Windows系统下载,可以使用WinSCP或FlashFXP上传mpich-3.1.3.tar.gz软件包到node1节点机的root目录下
用rz命令直接传也行
1、打开WinSCP,输入主机名或IP地址和用户名密码登录
2、登录后进入操作界面,直接把下载好的mpich-3.1.3.tar.gz拖到右边窗口即可
3、解压mpich压缩包
[root@node1 ~]# tar xvzf mpich-3.1.3.tar.gz
4、进入MPICH解压后的目录,执行配置操作
[root@node1 ~]# cd /root/mpich-3.1.3
[root@node1 mpich-3.1.3]# ./configure --prefix=/home/mpi
作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系。参数:–prefix=PREFIX 表示把所有文件装在目录PREFIX下而不是默认目录下。本系统安装目录为/home/mpi。配置时间较长,请稍等,配置成功后,则最后一行提示显示“Configuration completed”。
5、执行make指令进行编译,编译时间较长
[root@node1 mpich-3.1.3]# make
编译好后如下
6、执行make install进行安装
[root@node1 mpich-3.1.3]# make install
7、复制测试例子到/home/mpi目录下,修改/home/mpi文件的用户/组属性
[root@node1 mpich-3.1.3]# cp -r examples /home/mpi
[root@node1 mpich-3.1.3]# chown -R mpi:mpi /home/mpi
8、运行examples中自带的一个简单的测试程序cpi
①登录node1节点机,切换到mpi用户或直接以mpi用户登录系统
②测试在单一节点机运行
③测试在4个节点机运行
6个进程在不同权重的节点机上运行,先设置四台节点机运行的权重值
[mpi@node1 examples]$ vi nodes
node1:2
node2:1
node3:2
node4:1
然后执行命令
④单进程运行
三、分布式程序设计基础
A、最简单的并行程序
1、编写并行源代码
[mpi@node1 examples]$ vim hello.c
#include <stdio.h>
#include "mpi.h"
int main(int argc,char **argv)
{
MPI_Init(&argc,&argv); //并行部分开始
printf("hello ");
printf("欢迎来到我的博客。\n");
MPI_Finalize(); //并行结束
}
2、编译运行hello.c程序
[mpi@node1 examples]$ mpicc -o hello hello.c
[mpi@node1 examples]$ mpirun -n 4 -f nodes ./hello
hello 欢迎来到我的博客。
hello 欢迎来到我的博客。
hello 欢迎来到我的博客。
hello 欢迎来到我的博客。
B、获取进程标志和机器名的并行程序的编写
并行程序设计需要协调大量的计算节点参与计算,而且需要将任务分配到各个节点并实现节点间的数据和信息交换,面对成百上千的不同节点如没有有效的管理将面临计算的混乱,并行计算的实现将无法完成,因此各个进程需要对自己和其他进程进行识别和管理,每个进程都需要有一个惟一的ID,用于并行程序解决“我是谁”的问题,从而实现对大量计算节点的管理和控制,有效地完成并行计算任务。
因此获取进程标识和机器名是MPI需要完成的基本任务,各节点根据自己的进程ID判断哪些任务需要自己完成。
MPI函数:并行初始化函数:int MPI_Init(int *argc,char ***argv)
其中,argc为变量数目,argv为变量数组,两个参数均来自main函数的参数
关于MPI函数,详细请参考:https://blog.csdn.net/weixin_40255793/article/details/84201243
1、编辑文件aa1.c
[mpi@node1 examples]$ vim aa1.c
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] )
{
int rank;
int size;
char pcname[ MPI_MAX_PROCESSOR_NAME];
int pcnamelen;
MPI_Init( 0, 0 );
MPI_Comm_rank(MPI_COMM_WORLD, &rank); //获得本进程ID
MPI_Comm_size(MPI_COMM_WORLD, &size); //获得总的进程数目
MPI_Get_processor_name(pcname,&pcnamelen); //获得本进程到机器名
printf( "我的博客 from process %d of %d on %s\n", rank, size,
pcname);
MPI_Finalize();
return 0;
}
2、编译运行
C、有消息传递功能的并行程序的编写
消息传递是MPI编程的核心功能,也是基于MPI编程的设计人员需要深刻理解的功能,由于MPI的消息传递功能为我们提供了灵活方便的节点间数据交换和控制能力,掌握好MPI消息传递编程方法就掌握了MPI并行程序设计的核心。
关于并行计算机的消息传递,详细请参考:https://blog.csdn.net/shujian_tianya/article/details/104995140
1、编辑文件aa2.c
[mpi@node1 examples]$ vim aa2.c
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] )
{
int rank, numprocs, source;
MPI_Status status;
char message[50];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank); //获得本进程ID
MPI_Comm_size(MPI_COMM_WORLD, &numprocs); //获得总的进程数目
if (rank != 0){
strcpy(message," 欢迎来到我的博客");
MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,49, MPI_COMM_WORLD);
}
else {
for (source = 1 ;source < numprocs; source++) {
MPI_Recv(message,50,MPI_CHAR,source,49,MPI_COMM_WORLD,&status);
printf("我是进程%d,我从进程%d接收到'%s'。\n", rank, source, message
);
}
}
MPI_Finalize();
return 0;
}
2、编译运行