我是一名业余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
。
答案 0 :(得分:5)
也许请查看:http://www.gnu.org/software/parallel/
编辑:
或者,查看xargs的-P参数,例如:
time echo {1..5} | xargs -n 1 -P 5 sleep
答案 1 :(得分:2)
假设您要同时使用输入simulate
,foo
,bar
和baz
运行程序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