centos7配置openmpi+编程环境配置

这可能是你看过最详细的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

在这里插入图片描述

Done

猜你喜欢

转载自blog.csdn.net/qq_45804132/article/details/120520642