在许多节点上嵌套gnu并行



我希望运行一个循环,使用gnu并行程序,格式如下

outer loop about 5-10 iterations can be parallelized
    loop that cant be parallelized
        inner loop about 100s operations in parallel
        inner loop bit that can't be parallelized 

由于不可并行循环的性质,没有办法使这个1并行命令。我希望至少有一个外部循环开始有事情要做,而内部循环在它的单线程位中运行。

我希望它不会比CPU内核启动更多的作业,尽管这在嵌套并行命令时似乎很难实现。更糟糕的是,如果我为内部循环指定一个节点文件,那么每次运行内部循环时,似乎都会以相同的顺序使用节点——随着节点数量的增加,会导致非常糟糕的可伸缩性。有一种明显的方法是使用多个节点文件,这些节点以不同的顺序排列。

控制同时作业数量的好方法是像这样的一个巢吗?使用命名信号量似乎是可能的,每次运行时传递不同的节点文件似乎很笨拙,或者我使用了错误的工具?

简单的解决方案是只并行化内部循环。

--load可能也适用于您:

inner() {
   # Do inner stuff
}
export -f inner
outer() {
    parallel --load 100% -S .. --env inner inner ::: {1..100}
}
export -f outer
parallel outer ::: {5..10}

最新更新