如何并行一个无数据依赖的循环
How to parallel a no data dependence for loop
我正在尝试并行这个 for 循环。我无法弄清楚其他人的答案是如何替代 $a
值的,因为我的程序依赖于它。
这是我要并行化的原始代码。 cvp 是一个可执行的 Cpp 程序。此脚本的目的是使用 file_0 到 file_29 以 pc_0 到 pc_29 和 0 到 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
您可以创建一个函数并将变量 $a
作为第一个参数传递,然后 运行 它在后台 &
,或者您可以只在 &
在 for 循环中结束你的命令,我更喜欢函数。
函数使用第一个参数 </code> 并在每次调用时执行您喜欢的操作。</p>
<p><code>wait
将等待所有后台进程完成,否则脚本可以在后台进程之前完成。
#!/bin/bash
#testing script
myfunction () {
./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_.gz >>output_ pc_
}
for a in {0..29}
do
set -x
myfunction ${a} &
done
wait
如果您喜欢使用 gnu-parallel,我相信也会有人提供帮助。这样可以更好地控制腭化,就像你拥有的 cpu 个核心一样,只有 运行 个工作。我上面的例子没有检查这些东西只是启动它们。
因此,如果您想一次启动大量进程,我的示例并不是一个好的解决方案。
像这样:
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}
我正在尝试并行这个 for 循环。我无法弄清楚其他人的答案是如何替代 $a
值的,因为我的程序依赖于它。
这是我要并行化的原始代码。 cvp 是一个可执行的 Cpp 程序。此脚本的目的是使用 file_0 到 file_29 以 pc_0 到 pc_29 和 0 到 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
您可以创建一个函数并将变量 $a
作为第一个参数传递,然后 运行 它在后台 &
,或者您可以只在 &
在 for 循环中结束你的命令,我更喜欢函数。
函数使用第一个参数 </code> 并在每次调用时执行您喜欢的操作。</p>
<p><code>wait
将等待所有后台进程完成,否则脚本可以在后台进程之前完成。
#!/bin/bash
#testing script
myfunction () {
./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_.gz >>output_ pc_
}
for a in {0..29}
do
set -x
myfunction ${a} &
done
wait
如果您喜欢使用 gnu-parallel,我相信也会有人提供帮助。这样可以更好地控制腭化,就像你拥有的 cpu 个核心一样,只有 运行 个工作。我上面的例子没有检查这些东西只是启动它们。
因此,如果您想一次启动大量进程,我的示例并不是一个好的解决方案。
像这样:
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}