具有资源池的并行循环



我有一个脚本,看起来像这样:

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。

另一个问题是如何保证在每次迭代中使用正确的xy。也就是说,当我们进行下一次迭代时,xy发生了变化,并且在上一次迭代中不能反映在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-使用外壳变量

如果evaled时变量的内容没有改变,您可以不引用:

a=ab
parallel echo $a ::: test

相关内容

  • 没有找到相关文章

最新更新