适用于Rocky Linux的MPI 管理程序

某些场景下需要在节点上同时部署openmpi和mpich,根据需要决定使用哪种。此时若有一种方法可以进行轻松切换则会极其便捷。

故而文中方法应运而生

文件 1:配置文件

路径:/etc/mpi-manager/mpi.conf

复制代码
MPI_IMPLEMENTATION=openmpi

文件 2:自动加载脚本

路径:/etc/profile.d/mpi.sh

复制代码
# /etc/profile.d/mpi.sh - Auto MPI loader (Default: OpenMPI)

# 读取配置
[[ -f /etc/mpi-manager/mpi.conf ]] && source /etc/mpi-manager/mpi.conf || MPI_IMPLEMENTATION=openmpi

# 检测架构并映射到模块名
case "$(uname -m)" in
    x86_64)     ARCH=x86_64 ;;
    aarch64|arm64) ARCH=aarch64 ;;
    ppc64le)    ARCH=ppc64le ;;
    ppc64)      ARCH=ppc64 ;;
    s390x)      ARCH=s390x ;;
    riscv64)    ARCH=riscv64 ;;
    *)          ARCH=x86_64 ;;
esac

# 模块映射表
case "${MPI_IMPLEMENTATION}_${ARCH}" in
    mpich_x86_64)      MODULE=mpi/mpich-x86_64 ;;
    mpich_aarch64)     MODULE=mpi/mpich-aarch64 ;;
    mpich_ppc64le)     MODULE=mpi/mpich-ppc64le ;;
    mpich_ppc64)       MODULE=mpi/mpich-ppc64 ;;
    mpich_s390x)       MODULE=mpi/mpich-s390x ;;
    mpich_riscv64)     MODULE=mpi/mpich-riscv64 ;;
    openmpi_x86_64)    MODULE=mpi/openmpi-x86_64 ;;
    openmpi_aarch64)   MODULE=mpi/openmpi-aarch64 ;;
    openmpi_ppc64le)   MODULE=mpi/openmpi-ppc64le ;;
    openmpi_ppc64)     MODULE=mpi/openmpi-ppc64 ;;
    openmpi_s390x)     MODULE=mpi/openmpi-s390x ;;
    openmpi_riscv64)   MODULE=mpi/openmpi-riscv64 ;;
    mpich_*)           MODULE=mpi/mpich ;;
    openmpi_*)         MODULE=mpi/openmpi ;;
    *)                 MODULE=mpi/openmpi ;;
esac

# 加载模块(如果module命令可用)
if command -v module >/dev/null 2>&1; then
    module purge >/dev/null 2>&1
    module load "$MODULE" >/dev/null 2>&1 || echo "MPI module $MODULE not available"
fi

# 设置基本变量
export MPI_IMPL=$MPI_IMPLEMENTATION
export MPI_ARCH=$ARCH
export MPI_MODULE=$MODULE

# 便利命令
mpi-status() {
    echo "MPI: $MPI_IMPL ($MPI_ARCH)"
    echo "Module: $MODULE"
    command -v module >/dev/null 2>&1 && module list | grep -i mpi || echo "Module command not available"
}

文件 3:设置工具

路径:/usr/local/bin/mpi-set

复制代码
#!/bin/bash
# Set MPI implementation

if [[ $# -ne 1 ]] || [[ "$1" != "mpich" && "$1" != "openmpi" ]]; then
    echo "Usage: $0 {mpich|openmpi}"
    current=$(grep MPI_IMPLEMENTATION /etc/mpi-manager/mpi.conf 2>/dev/null | cut -d'=' -f2)
    echo "Current: ${current:-openmpi}"
    exit 1
fi

echo "MPI_IMPLEMENTATION=$1" > /etc/mpi-manager/mpi.conf
echo "MPI set to: $1"
echo "New logins will use $1 automatically"

文件 4:安装脚本

路径:/usr/local/sbin/install-mpi-manager

复制代码
#!/bin/bash
# One-step robust installation (Default: OpenMPI)

set -e

# 创建文件
sudo mkdir -p /etc/mpi-manager
echo "MPI_IMPLEMENTATION=openmpi" | sudo tee /etc/mpi-manager/mpi.conf >/dev/null

# 创建自动加载脚本
sudo tee /etc/profile.d/mpi.sh >/dev/null << 'EOF'
# /etc/profile.d/mpi.sh - Auto MPI loader (Default: OpenMPI)

[[ -f /etc/mpi-manager/mpi.conf ]] && source /etc/mpi-manager/mpi.conf || MPI_IMPLEMENTATION=openmpi

case "$(uname -m)" in
    x86_64)     ARCH=x86_64 ;;
    aarch64|arm64) ARCH=aarch64 ;;
    ppc64le)    ARCH=ppc64le ;;
    ppc64)      ARCH=ppc64 ;;
    s390x)      ARCH=s390x ;;
    riscv64)    ARCH=riscv64 ;;
    *)          ARCH=x86_64 ;;
esac

case "${MPI_IMPLEMENTATION}_${ARCH}" in
    mpich_x86_64)      MODULE=mpi/mpich-x86_64 ;;
    mpich_aarch64)     MODULE=mpi/mpich-aarch64 ;;
    mpich_ppc64le)     MODULE=mpi/mpich-ppc64le ;;
    mpich_ppc64)       MODULE=mpi/mpich-ppc64 ;;
    mpich_s390x)       MODULE=mpi/mpich-s390x ;;
    mpich_riscv64)     MODULE=mpi/mpich-riscv64 ;;
    openmpi_x86_64)    MODULE=mpi/openmpi-x86_64 ;;
    openmpi_aarch64)   MODULE=mpi/openmpi-aarch64 ;;
    openmpi_ppc64le)   MODULE=mpi/openmpi-ppc64le ;;
    openmpi_ppc64)     MODULE=mpi/openmpi-ppc64 ;;
    openmpi_s390x)     MODULE=mpi/openmpi-s390x ;;
    openmpi_riscv64)   MODULE=mpi/openmpi-riscv64 ;;
    mpich_*)           MODULE=mpi/mpich ;;
    openmpi_*)         MODULE=mpi/openmpi ;;
    *)                 MODULE=mpi/openmpi ;;
esac

if command -v module >/dev/null 2>&1; then
    module purge >/dev/null 2>&1
    module load "$MODULE" >/dev/null 2>&1 || echo "MPI module $MODULE not available"
fi

export MPI_IMPL=$MPI_IMPLEMENTATION
export MPI_ARCH=$ARCH
export MPI_MODULE=$MODULE

mpi-status() {
    echo "MPI: $MPI_IMPL ($MPI_ARCH)"
    echo "Module: $MODULE"
    command -v module >/dev/null 2>&1 && module list | grep -i mpi || echo "Module command not available"
}
EOF

# 创建设置工具
sudo tee /usr/local/bin/mpi-set >/dev/null << 'EOF'
#!/bin/bash
if [[ $# -ne 1 ]] || [[ "$1" != "mpich" && "$1" != "openmpi" ]]; then
    echo "Usage: $0 {mpich|openmpi}"
    current=$(grep MPI_IMPLEMENTATION /etc/mpi-manager/mpi.conf 2>/dev/null | cut -d'=' -f2)
    echo "Current: ${current:-openmpi}"
    exit 1
fi
echo "MPI_IMPLEMENTATION=$1" > /etc/mpi-manager/mpi.conf
echo "MPI set to: $1"
EOF

# 设置权限
sudo chmod 644 /etc/mpi-manager/mpi.conf /etc/profile.d/mpi.sh
sudo chmod 755 /usr/local/bin/mpi-set

echo "Installation completed! (Default: OpenMPI)"
echo "Config: /etc/mpi-manager/mpi.conf"
echo "Current: $(grep MPI_IMPLEMENTATION /etc/mpi-manager/mpi.conf)"
echo ""
echo "Usage:"
echo "  mpi-set mpich      # Switch to MPICH"
echo "  mpi-set openmpi    # Switch to OpenMPI (default)"
echo "  source /etc/profile"
echo "  mpi-status"

文件 5:卸载脚本(可选)

路径:/usr/local/sbin/uninstall-mpi-manager

复制代码
#!/bin/bash
sudo rm -f /etc/mpi-manager/mpi.conf
sudo rm -f /etc/profile.d/mpi.sh
sudo rm -f /usr/local/bin/mpi-set
echo "Uninstalled"

安装和使用

安装

复制代码
sudo /usr/local/sbin/install-mpi-manager

切换 MPI 实现

复制代码
sudo mpi-set mpich      # 切换到 MPICH
sudo mpi-set openmpi    # 切换到 OpenMPI(默认)

生效和使用

复制代码
# 新登录自动生效(默认 OpenMPI)
# 当前 shell 生效:
source /etc/profile

# 查看状态:
mpi-status
相关推荐
2401_841495641 个月前
并行程序设计与实现
c++·python·算法·cuda·mpi·并行计算·openmp
戴草帽的大z3 个月前
rk3588上用rk_mpi_vi_test与ffmpeg实战
ffmpeg·rk3588·mpi·rk_mpi_vi
CrazyMo_1 年前
并行编程——Mindspore大规模分布式并行基本概念学习(一)
分布式·mindspore·并行编程·openmpi
Eloudy1 年前
编译安装调试 scaLapack 和 openmpi 以及 lapack
mpi·lapack
noravinsc2 年前
paraview 跨节点并行渲染
mpi·paraview
长安er2 年前
高性能并行计算华为云实验一:MPI矩阵运算
华为云·并行·高性能·mpi·高性能并行计算·串行
canmoumou2 年前
【分布式通信】NPKit,NCCL的Profiling工具
人工智能·mpi·nccl
piaopiaolanghua2 年前
MPI和C++/Qt混用的收发消息的例子(主从模式)
qt·mpi
KingOfMyHeart2 年前
MPI之通信模式(标准,缓存,同步,就绪)
缓存·同步·mpi·并行计算·通信模式·标准·就绪