我使用bash脚本来通过使用&
符号在后台运行C ++程序来使用多核。 (我是一名做蒙特卡罗模拟的数学家)。
这样我可以在后台多次运行C ++程序。例如:
for x in $(seq 1 1 100)
do
./program_name &
done
有时program_name
会快速运行,有时会运行缓慢。这是随机的,不可能提前知道。这提示我的问题:
如何制作,以便在任何给定时间,同时运行的作业不会超过4个? 让我们假设目前正在运行4个作业。我想要它,所以一旦完成,下一个开始。
答案 0 :(得分:1)
在GNU,FreeBSD和OSX上,您可以使用xargs
:
echo {1..100} | xargs -n 1 -P 4 ./program_name
或者,您可以安装和使用GNU parallel,这是针对这类事情而做的(对于4个作业而不是1个作业/核心,添加-j 4
):
parallel --gnu ./program_name ::: {1..100}
答案 1 :(得分:1)
这篇文章的其他解决方案比我在这里展示的更好。但我想记录我的“不完美的一个”来完成整理。它完成后无法将新作业添加到队列中......这是一件坏事,因为它会创建空闲时间。
但优点是你不需要安装任何东西。我希望这也不会容易出错。
count=1 # current number of jobs processing
j=4 ## maximum number of jobs
for x in $(seq 1 1 10)
do
echo Currently running programe $x
## CPP code goes here
sleep $x & ## Pretend it takes x seconds to complete
count=$((count+1)) ## add one to the no. jobs running
if [ "$count" -gt "$j" ]; then
echo "Waiting for jobs to finish"
wait
count=1
fi
done
一种效率明显低的方法,我欢迎任何改进。
答案 2 :(得分:0)
( #Start a subshell
N=4 #Specify number of jobs
for((i=1;i<100;i++))
do [ $((i%N)) = 0 ] && wait #Wait every N jobs
(sleep 1; echo "$i";)& #Some task
done
wait
)
逻辑非常简单,可以变成单行。 您需要一个subhel来防止干扰我们不想等待的当前会话后台运行的进程。