跨多个核心在bash中运行循环过程

时间:2011-10-26 18:47:12

标签: bash centos parallel-processing

我有一个包含以下循环的shell脚本。

i=0  
upperlimit=$verylargevariable  
do  
   complexstuff RunManager file $i  
   i= 'expr $i +1'  
done

此脚本在四核计算机上运行,​​根据top,在执行循环的一次迭代时,使用每个核心的大约15%。我想将它分布在四个核心上,以便循环的每次迭代执行complexstuff四次,每个核心一次,这样可以更有效地使用资源。我们谈论的是目前需要几个小时的计算,因此这里的效率不仅仅是良好的实践。 (每次迭代的输出显然与前一次迭代无关。)

PS:主机是运行Cent-OS的服务器,如果有帮助的话。

2 个答案:

答案 0 :(得分:10)

使用GNU Parallel,您可以:

seq $verylargevariable | parallel -j150% complexstuff RunManager file

150%将为每个核心运行1.5个进程,因此如果它目前使用15%,那么这将在所有4个核心上给你大约100%。

要了解详情,请观看介绍视频:http://www.youtube.com/watch?v=OpaiGYxkSuQ

答案 1 :(得分:3)

除了Ole Tange解决方案(看起来很棒),如果您的计算具有非常相似的持续时间,您可以尝试这样的事情:

i=0  
upperlimit=$verylargevariable  
do  
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   wait
done

这样,在循环的每次运行中,您将创建4个bash子进程,这些子进程将启动您的计算(并且系统很棒,它将在不同的核心上分派它们)。如果使用4个进程,仅仅烧掉所有cpus是不够的,请增加每个循环上创建的进程数。