我有一个脚本,看起来像这样:
for x in ...; do
for y in ...; do
# run several commands which depends on x and y and requires a single GPU
# (I also need to specify which GPU to use)
command1 $x $y GPU0
command2 $x $y GPU0
done
done
# Some stuff after the loop
我有4个GPU。我想使循环平行。也就是说,对于当前的(x,y)
迭代,我想等待一些GPU可用,运行命令,然后进行下一次迭代(不需要等待当前迭代完成(。我该怎么做?
我知道flock
命令,所以我可以为每个GPU创建一个锁定文件,并使用它来控制对GPU的访问。但是,据我所知,这需要我知道我当前的(x,y)
迭代计划使用哪个GPU。
另一个问题是如何保证在每次迭代中使用正确的x
和y
。也就是说,当我们进行下一次迭代时,x
和y
发生了变化,并且在上一次迭代中不能反映在command1 $x $y GPU...
中。
如果你有GNU并行:
parallel -j4 'echo Do {1} and {2} on GPU {%}; sleep 1.$RANDOM;' ::: a b c ::: X Y Z
要跟踪进度,请使用--lb
:
parallel -j4 --lb 'echo Do {1} and {2} on GPU {%}; sleep 1.$RANDOM; echo GPU {%} done' ::: a b c ::: X Y Z
要在命令中使用变量,您需要注意引用和导出变量:
a='a b ** $ < >'
export a
parallel 'echo "$a"' ::: test
有关详细信息,请参阅:https://www.gnu.org/software/parallel/man.html#quoting和https://www.gnu.org/software/parallel/man.html#example-使用外壳变量
如果eval
ed时变量的内容没有改变,您可以不引用:
a=ab
parallel echo $a ::: test