gpt4 book ai didi

bash - 将嵌套 bash 脚本减少为单个文件/mpirun 命令

转载 作者:行者123 更新时间:2023-12-02 21:25:54 32 4
gpt4 key购买 nike

我经常使用类似于下面简化的 2 个脚本的东西,通过 PBS/MPI 在集群中分发令人尴尬的并行工作。我想知道是否可以将这些命令合并到一个文件中,以提高清晰度并减少困惑。我更感兴趣的是了解 bash/mpirun 的局限性,而不是寻找解决原始问题的替代方法(例如 PBS 数组)。

PBS 脚本:

#PBS -l nodes=2:ppn=2
#PBS -q debug
#PBS -V

mpirun -n $PBS_NP $PBS_O_WORKDIR/worker_script.sh

worker_script.sh

#!/bin/bash
NDATA=25
DATA_ARRAY=()
for ((DATA=${OMPI_COMM_WORLD_RANK};DATA<${NDATA};DATA=${DATA}+${PBS_NP}))
do
DATA_ARRAY+=(${DATA})
done
echo ${OMPI_COMM_WORLD_RANK} processing ${DATA_ARRAY[@]}

运行给出所需的输出:

0 processing 0 4 8 12 16 20 24
1 processing 1 5 9 13 17 21
3 processing 3 7 11 15 19 23
2 processing 2 6 10 14 18 22

----------------------------------------------------------------
Jobs exit status code is 0

有没有办法将worker_script.sh的内容与mpirun命令一起写入?除了单独的文件之外,还有其他方法可以解决父级的 shell 扩展吗?

最佳答案

感谢您的回答,他们引发了有趣的研究。到目前为止,我个人首选的解决方案是 Tripleee 的 bash -c 技巧的扩展,将工作命令包装在导出的函数中:

#!/bin/bash
#PBS -l nodes=2:ppn=2
#PBS -q debug
#PBS -V

# function
worker_function(){
NDATA=25
DATA_ARRAY=()
for ((DATA=${OMPI_COMM_WORLD_RANK};DATA<${NDATA};DATA=${DATA}+${PBS_NP}))
do
DATA_ARRAY+=(${DATA})
done
echo ${OMPI_COMM_WORLD_RANK} processing ${DATA_ARRAY[@]}
}

# main
export -f worker_function
mpirun -n $PBS_NP bash -c 'worker_function'

这遵循典型的程序结构并与 vim 的语法突出显示一起使用。

关于bash - 将嵌套 bash 脚本减少为单个文件/mpirun 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24376020/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com