因为之前没有接触过该内容,参考了网上大大小小博主的博客,他们大多还是一概而过,甚至直接就copy别人的博客,这种现象当代确实很常见,但并不太讨喜,至少我不喜欢做偷盗行为,这篇博客从零开始指导搭建openmpi+java+c环境。
文章目录
- 这可能是你看过最详细的centos7的openmpi的环境配置
- 一. 前期准备
- 一.1 虚拟机或者双系统(CentOS7)
- 一.2 较稳定的网络
- 二. 开始配置
- 二.1 GCC
- 二.2 jdk
- 二.3 openmpi
- 三. 代码测试
- 三.1 c语言
- 三.2 java
- Done
一. 前期准备 一.1 虚拟机或者双系统(CentOS7)
我并没有在其他系统上尝试因此,并不确定是否可行,但根据经验一般不是大版本跨越应该都是可以装配的。
一.2 较稳定的网络慢点也没关系吗,但是装配过程中要下载很多东西,如果网络不稳定导致下载失败那就得从头开始。
二. 开始配置 二.1 GCC用于编译C语言,必要存在。
yum -y install gcc gcc-c++ kernel-devel
检查是否安装成功
gcc -V
可能出现的意外情况:无root
解决方法:输入su,输入密码 或者 在指令前加sudo 输入密码,如下:
二.2 jdkyum指令是常用的从软件包集合中下载,-y表示在遇到选择时,直接默认同意,gcc,gcc++,kernel-devel分别对应,c语言,c++,内核编程(我记得好像是这样)。
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后添加。
配置成功。
该内容是本篇文章核心
利用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需要在用户处重新配置一遍。
如图:(我偷我自己)
first.c (from Niko 代码不是本人的,因为是测试就借了朋友的)
#include#include 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 processorsn", 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
三.2 java-oversubscribe 可以让你运行远对于内核量的线程,如果不加这个参数,可能会报错,因为mpirun是估算处理能力。。。但是好像每次估算的都特别小,实际上完全不用担心,数量你可以尽可能的调大。。。。现在的cpu撑得住。
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 ComputePiDone



