用于生成并行C ++作业输入的BASH脚本

时间:2011-01-12 20:15:50

标签: c++ bash shell scripting

我是一名业余C ++程序员,正在尝试学习基本的shell脚本。我有一个复杂的C ++程序,它当前从Parameters.h读取不同的参数值,然后按顺序执行每个参数值的一个或多个模拟。这些模拟需要很长时间才能运行。由于我有一个可用的集群,我想有效地并行化这个作业,在一个单独的处理器上运行每个参数值的模拟。我假设为了这个目的,比OpenMPI更容易学习shell脚本技术。我的集群在LSF平台上运行。

如何在Bash中编写输入参数,以便它们分布在多个处理器中,每个处理器都使用该值执行程序?我想避免互动提交。理想情况下,我在Bash读取的文本文件中有输入,并且我将两个参数传递给每个作业:实际参数值和参数ID。

提前感谢任何线索和建议。


我的解决方案

GNU Parallel确实看起来很漂亮,但我最终(在IT管理员的帮助下)编写了一个简单的bash脚本来回显屏幕三个输入(治疗标识符,治疗/参数值和模拟标识符): / p>

#!/bin/bash 
j=1
for treatment in cat treatments.txt; do
  for experiment in cat simulations.txt; do
   bsub -oo tr_${j}_sim_${experiment}_screen -eo tr_${j}_sim_${experiment}_err -q short_serial "echo \"$j $treatment $experiment\" | ./a.out"
  done
  let j=$j+1 
done

文件cat treatments.txt包含我想要改变的值的列表,cat simulations.txt包含我想要运行的所有模拟标识符的列表(目前只有1,... ,s,其中s是我想要的每次治疗的模拟总数),治疗的索引为1 ... tr_${j}_sim_${experiment}_screen

3 个答案:

答案 0 :(得分:5)

也许请查看:http://www.gnu.org/software/parallel/

编辑:

或者,查看xargs的-P参数,例如:

time echo {1..5} | xargs -n 1 -P 5 sleep

答案 1 :(得分:2)

假设您要同时使用输入simulatefoobarbaz运行程序quux,那么最简单的方法是:< / p>

inputs="foo bar baz quux"

# Launch processes in the background with &
children=""
for x in $inputs; do
    simulate "$x" > "$x.output" &
    $children = "$children $!"
done

# Wait for each to finish
for $pid in $children; do
    wait $pid
done

for x in $inputs; do
    echo "simulate '$x' gave:"
    cat "$x.output"
    rm -f "$x.output"
done

问题在于所有模拟都是同时启动的,因此如果您的输入数量远大于您的CPU /核心数量,它们可能会淹没系统。

答案 2 :(得分:0)

我最好的做法就是为你的程序设置多个实例,并让操作系统的调度程序接管将它们放在不同的处理器上。 AFAIK在任何shell中都无法指定给定进程应在哪个处理器上运行。

产生效果:

#!/bin/sh

for arg in foo bar baz; do
   ./your_program "$arg" &
done