如何并行循环的无数据依赖性

问题描述 投票:1回答:2

我试图将这个for循环并行。我无法弄清楚其他人的答案如何替换$a值,因为我的程序依赖于它。

这是我要并行化的原始代码。 cvp是一个可执行的Cpp程序。此脚本的目的是使用file_0到file_29从0到29循环,pc_0到pc_29,0到29作为参数,并生成从output_0到output_29的输出文件。请注意,该程序也是内存密集型,所以如果我可以只是并行4(这是我拥有的核心数量)那将是伟大的。

#!/bin/bash
#testing script

for a in {0..29}
do
      set -x
      ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_$a.gz >>output_$a pc_$a $a
done
bash gnu-parallel
2个回答
1
投票

像这样的东西:

parallel --results output_{} ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ::: {0..29}

要么:

parallel ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ">>" output_{} ::: {0..29}

0
投票

用bash简单腭化

您可以创建一个函数并将变量$a作为第一个参数传递并在后台&中运行,或者您可以在命令结尾处放置一个& for for循环,我更喜欢函数。

函数使用第一个参数$1并在每次调用时执行您喜欢的操作。

wait将等待所有后台进程完成,否则脚本可以在后台进程之前完成。

#!/bin/bash
#testing script

myfunction () {

./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_${1}.gz >>output_${1} pc_${1} ${1}

}


for a in {0..29}
do
        set -x
        myfunction ${a} &
done

wait

如果你想使用gnu-parallel,我相信有人也会提供帮助。这样可以更好地控制腭化,就像只运行许多cpu核心那样的工作。我上面的例子没有检查这些东西只是启动它们。

因此,如果您想立即启动大量流程,那么我的示例就不是一个好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.