某些场景下需要在节点上同时部署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