这可能是你看过最详细的centos7的openmpi的环境配置
因为之前没有接触过该内容,参考了网上大大小小博主的博客,他们大多还是一概而过,甚至直接就copy别人的博客,这种现象当代确实很常见,但并不太讨喜,至少我不喜欢做偷盗行为,这篇博客从零开始指导搭建openmpi+java+c环境。
文章目录
一. 前期准备
一.1 虚拟机或者双系统(CentOS7)
我并没有在其他系统上尝试因此,并不确定是否可行,但根据经验一般不是大版本跨越应该都是可以装配的。
一.2 较稳定的网络
慢点也没关系吗,但是装配过程中要下载很多东西,如果网络不稳定导致下载失败那就得从头开始。
二. 开始配置
二.1 GCC
用于编译C语言,必要存在。
yum -y install gcc gcc-c++ kernel-devel
检查是否安装成功
gcc -V
可能出现的意外情况:无root
解决方法:输入su,输入密码 或者 在指令前加sudo 输入密码,如下:
yum指令是常用的从软件包集合中下载,-y表示在遇到选择时,直接默认同意,gcc,gcc++,kernel-devel分别对应,c语言,c++,内核编程(我记得好像是这样)。
二.2 jdk
centos7默认是存在一个java环境的。这个环境内可能包含了jdk1.8和jdk1.7,且不论它包含了什么,文件是可能存在一定错误的,我并没有找到错误所在,但是确实重新配置java之后才解决问题。
检查原先的java环境
删除所有java环境,重新配置
编辑java的环境变量
yum list installed |grep java
yum -y remove java*
yum -y install java-1.8.0-openjdk* #安装软件包内java环境,版本:1.8.0
which java #查询java路径
ls -lrt /usr/bin/java #获取路径
ls -lrt /etc/alternatives/java #继续查询,获取jvm路径
cd /usr/lib/jvm #进入jvm
java* 是匹配所有以该字符串开头的文件,常识,以它开头的百分之九十九都是属于java的文件,所以放心删除,不会存在什么问题。
如上操作最后就是进入了java的安装目录,可以通过ll查看。
编辑环境变量:
vim /etc/profile
键入a进入修改模式。在如图所示位置,下添加如下内容
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
export JAVA_HOME=/usr/lib/jvm/java-1.8.0
export JRE_HOME=$JAVA_HOME/jre
export MPI_HOME=/opt/openmpi
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
键入esc,输入
wq!
退出保存编辑。运行配置
source /etc/profile
检查是否成功
java -version
这里注意 MPI_HOME这个值和这里可以直接加上,也可以选择在配置完openmpi后添加。
配置成功。
二.3 openmpi
该内容是本篇文章核心
利用wget获取源码
wget https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.0.tar.gz
解压缩
tar -zxvf openmpi-3.1.0.tar.gz
进入目录
cd openmpi-3.1.0/
如上几步基本不可能出错,如果出错了就要好好检查一下自己的基本配置是不是有问题了。是否有wget等命令。
熟悉的人都知道接下来要./config了,对于一部分人来说,可以顺利执行下去,并且不会有任何的问题,文件也齐全,但是我相信还有部分像我这样,环境配置比较命运多舛的同学,所以每一步都需要考虑很多,比如有的同学的问题就是在装完后发现没有mpijavac。这俩天同样有不少同学问过我,说博森呀,这没有mpijavac呀!我明明都装了。。。。于是这些问题迫使,我用他们利用教程走了一遍。。最终把问题解决了。。。
./configure --prefix=/opt/openmpi --enable-mpi-java
–enable-mpi-java一定要加,否则prefix是存在可能检测不到mpi.jar的,这就直接导致,mpijavac不复存在。
make && make insatll
完成后,
当时没加上的,记得加上这一条。
继续配置
vim ~/.bashrc
进入编辑,它是shell的配置文件,在linux中每种shell都会有这么一个文件,其作用我们可以理解为windows下的环境变量。
在如下位置添加我们的mpi指令位置
source ~/.bashrc
完成,这时我们可以,利用补全查询命令是否存在。
这种情况就是完全正确了,如果没有mpijava这些东西,建议回头看看自己的java路径是否配置正确毕竟有些版本可能会存在路径不一等情况。
特殊情况:
另外要提的一点如果在刚开的使用su进入了root模式的话,那个.bashrc就会是root的shell配置,而如果下次继续用用户是不会有mpi等命令的,所以.bashrc需要在用户处重新配置一遍。
如图:(我偷我自己)
三. 代码测试
三.1 c语言
first.c (from Niko 代码不是本人的,因为是测试就借了朋友的)
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
// Initialize the MPI environment. The two arguments to MPI Init are not
// currently used by MPI implementations, but are there in case future
// implementations might need the arguments.
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size = 0;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get the rank of the process
int world_rank = 0;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
// Get the name of the processor
char processor_name[MPI_MAX_PROCESSOR_NAME] = {
0};
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
// Print off a hello world message
printf("Hello world from processor %s, rank %d out of %d processors\n",
processor_name, world_rank, world_size);
// Finalize the MPI environment. No more MPI calls can be made after this
MPI_Finalize();
}
mpicc -o first first.c
./first
mpirun -np 8 -oversubscribe ./first
-oversubscribe 可以让你运行远对于内核量的线程,如果不加这个参数,可能会报错,因为mpirun是估算处理能力。。。但是好像每次估算的都特别小,实际上完全不用担心,数量你可以尽可能的调大。。。。现在的cpu撑得住。
三.2 java
first.java
import mpi.*;
class ComputePi {
public static void main(String args[]) throws MPIException {
MPI.Init(args);
int rank = MPI.COMM_WORLD.getRank(),
size = MPI.COMM_WORLD.getSize(),
nint = 100; // Intervals.
double h = 1.0/(double)nint, sum = 0.0;
for(int i=rank+1; i<=nint; i+=size) {
double x = h * ((double)i - 0.5);
sum += (4.0 / (1.0 + x * x));
}
double sBuf[] = {
h * sum },
rBuf[] = new double[1];
MPI.COMM_WORLD.reduce(sBuf, rBuf, 1, MPI.DOUBLE, MPI.SUM, 0);
if(rank == 0) System.out.println("PI: " + rBuf[0]);
MPI.Finalize();
}
}
创建hosts文件并输入
mpijavac first.java #编译java
mpiexec --hostfile hosts -np 4 java ComputePi