尽管我@ HighPerformanceMark的巧妙方法最初的热情,我决定其实这使用GNU并行与-j 12
使用12个内核和模拟1个单位的工作与睡眠1秒标杆。
首先,我产生的职位列表与建议:
paste <(seq 1 72) <(seq 150 -1 79)
,看起来像这样:
1 150
2 149
3 148
...
...
71 80
72 79
然后我通过列表分为GNU并行,拿起剩下的并行末端6个作业:
paste <(seq 1 72) <(seq 150 -1 79) | parallel -k -j 12 --colsep '\t' 'sleep {1} ; sleep {2}'
sleep 73 &
sleep 74 &
sleep 75 &
sleep 76 &
sleep 77 &
sleep 78 &
wait
Th在16分钟24秒运行。
然后我用我的有些简单的方法,这只是先运行大的工作,所以你不太可能会留下任何大的末,从而得到不平衡的CPU负载,因为只是一个大的工作需要运行和你的CPU的其余什么都没有做:
time parallel -j 12 sleep {} ::: $(seq 150 -1 1)
而这15分48秒运行一次,因此它实际上要快。
我认为,与其他方法的问题是,第6轮12对工作后,有6个职位离开的时间代价78秒,所以有效地6个CPU坐在那里什么都不做最长78秒。如果任务数量可以被CPU数量整除,那么不会发生,但是150不会被12除。
您使用的是哪种语言? – bc004346
我认为这是* Bin包装问题*不是吗? https://en.wikipedia.org/wiki/Bin_packing_problem我认为你可能从最长的工作开始,继续逐渐缩短工作时间,否则你可以完成除一个工作外的所有工作,只发现这是最长的工作。 –
将任务1和150给予处理器1(它获得151个单位的工作时间),给处理器2(获得151个工作时间单元)提供任务2和149,... 12个处理器中的每一个获取这些块中的6个,剩下6个大致相等的任务(任务73-78)完成。给每一个处理器。这不是所述的装箱问题,或者如果是,它是一个很容易解决的问题。 –