编写针对多组文件对运行带指定参数的MPI程序的脚本需求
我来帮你写一个实用的Bash脚本来批量处理这些MPI程序的运行任务,两种方案供你选择,看哪种更符合你的需求:
方案一:静态配置文件组的脚本
这个方案适合你提前知道所有要处理的文件组和对应SIZE值的情况,把配置直接写在脚本里,运行起来很方便:
#!/bin/bash # -------------------------- 配置区 -------------------------- # 设置MPI并行进程数 MPI_NP=4 # 指定你的MPI可执行文件路径(如果不在当前目录,写绝对路径) EXE="./myexe" # 定义所有要处理的文件组:每行格式为 "文件前缀 对应SIZE值" # 比如"abc 10"对应abc.mtx、abc.txt和-SIZE 10 file_groups=( "abc 10" "def 20" "ghi 15" "jkl 25" ) # ----------------------------------------------------------- # 循环处理每个文件组 for group in "${file_groups[@]}"; do # 拆分出文件前缀和SIZE值 prefix=$(echo "$group" | awk '{print $1}') size=$(echo "$group" | awk '{print $2}') # 构造对应的两个输入文件名 file_mtx="${prefix}.mtx" file_txt="${prefix}.txt" # 提前检查文件是否存在,避免程序报错 if [[ ! -f "$file_mtx" ]]; then echo "⚠️ 警告:文件 $file_mtx 不存在,跳过该组" continue fi if [[ ! -f "$file_txt" ]]; then echo "⚠️ 警告:文件 $file_txt 不存在,跳过该组" continue fi # 打印要执行的命令(方便调试) echo "🚀 正在运行:mpirun -np $MPI_NP $EXE $file_mtx $file_txt -SIZE $size" # 实际执行MPI命令 mpirun -np "$MPI_NP" "$EXE" "$file_mtx" "$file_txt" -SIZE "$size" # 检查命令执行结果,给出反馈 if [[ $? -ne 0 ]]; then echo "❌ 错误:该组运行失败(前缀:$prefix,SIZE:$size)" else echo "✅ 成功完成:前缀 $prefix,SIZE $size" fi echo "--------------------------------------------------------" done
使用方法
- 把上面的代码保存为
run_mpi_batch.sh - 修改配置区的
MPI_NP、EXE和file_groups,匹配你的实际需求 - 给脚本添加执行权限:
chmod +x run_mpi_batch.sh - 运行脚本:
./run_mpi_batch.sh
方案二:命令行传入文件组的脚本
如果你的文件组经常变动,不想每次修改脚本,这个方案更灵活——直接在运行脚本时传入要处理的文件组:
#!/bin/bash # -------------------------- 配置区 -------------------------- MPI_NP=4 EXE="./myexe" # ----------------------------------------------------------- # 检查用户是否传入了参数 if [[ $# -eq 0 ]]; then echo "用法:$0 <文件前缀:SIZE> [<文件前缀:SIZE> ...]" echo "示例:$0 abc:10 def:20 ghi:15" exit 1 fi # 处理每个传入的参数 for arg in "$@"; do # 用冒号拆分前缀和SIZE值 IFS=':' read -r prefix size <<< "$arg" file_mtx="${prefix}.mtx" file_txt="${prefix}.txt" if [[ ! -f "$file_mtx" ]]; then echo "⚠️ 警告:$file_mtx 不存在,跳过" continue fi if [[ ! -f "$file_txt" ]]; then echo "⚠️ 警告:$file_txt 不存在,跳过" continue fi echo "🚀 正在运行:mpirun -np $MPI_NP $EXE $file_mtx $file_txt -SIZE $size" mpirun -np "$MPI_NP" "$EXE" "$file_mtx" "$file_txt" -SIZE "$size" if [[ $? -ne 0 ]]; then echo "❌ 错误:$prefix:$size 运行失败" else echo "✅ 成功完成:$prefix:$size" fi echo "--------------------------------------------------------" done
使用方法
- 保存为
run_mpi_batch.sh,添加执行权限 - 运行时直接传入文件组,比如:
./run_mpi_batch.sh abc:10 def:20 ghi:15
额外实用技巧
日志记录:如果需要把每个运行的输出保存到日志文件,可以修改MPI命令行,把输出重定向:
mpirun -np "$MPI_NP" "$EXE" "$file_mtx" "$file_txt" -SIZE "$size" > "${prefix}_run.log" 2>&1这样每个文件组的运行日志会保存到
abc_run.log、def_run.log这类文件里,方便后续排查问题。并行运行多个MPI任务:如果你想同时运行多个MPI任务(注意系统资源是否足够),可以在命令末尾加
&让它后台运行,比如:mpirun -np "$MPI_NP" "$EXE" "$file_mtx" "$file_txt" -SIZE "$size" > "${prefix}_run.log" 2>&1 &不过这种情况下要注意进程管理,避免系统负载过高。
内容的提问来源于stack exchange,提问作者Mani
相关产品推荐
相关产品推荐

