我是一名业余 C++ 程序员,正在尝试学习基本的 shell 脚本。我有一个复杂的 C++ 程序,它当前从 Parameters.h
中读取不同的参数值,然后按顺序对每个参数值执行一个或多个模拟。这些模拟需要很长时间才能运行。由于我有一个可用的集群,我想有效地并行化这项工作,在单独的处理器上为每个参数值运行模拟。我假设为此目的学习 shell 脚本技术比 OpenMPI 更容易。我的集群在 LSF 平台上运行。
我如何在 Bash 中编写我的输入参数,以便它们分布在多个处理器中,每个处理器都使用该值执行程序?我想避免交互式提交。理想情况下,我会将输入保存在 Bash 读取的文本文件中,并将两个参数传递给每个作业:一个实际参数值和一个参数 ID。
提前感谢任何线索和建议。
我的解决方案
GNU Parallel 看起来很漂亮,但我最终(在 IT 管理员的帮助下)编写了一个简单的 bash 脚本来回显屏幕三个输入(治疗标识符、治疗/参数值和模拟标识符):
#!/bin/bash
j=1
for treatment in <code>cat treatments.txt</code>; do
for experiment in <code>cat simulations.txt</code>; do
bsub -oo <code>tr_${j}_sim_${experiment}_screen</code> -eo <code>tr_${j}_sim_${experiment}_err</code> -q short_serial "echo \"$j $treatment $experiment\" | ./a.out"
done
let j=$j+1
done
文件 treatments.txt
包含我想要改变的值的列表,simulations.txt
包含我想要的所有模拟标识符的列表运行(目前只有 1,...,s,其中 s 是每次治疗我想要的模拟总数),治疗的索引为 1...j
。
最佳答案
也许 checkout :http://www.gnu.org/software/parallel/
编辑:
或者,查看 xargs 的 -P 参数,例如:
time echo {1..5} | xargs -n 1 -P 5 sleep
关于c++ - 用于为并行 C++ 作业生成输入的 BASH 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673584/