@ HighPerformanceMarkの独創的なアプローチのための私の最初の熱意にもかかわらず、私は実際にベンチマークGNUを使用して、これは睡眠の1秒で12個のコアや仕事のシミュレートされた1つのユニットを使用すること-j 12
でパラレルすることを決めました。で示唆したように
まず私は、ジョブのリストを生成:次のようになります
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つのCPUがために何もしないそこに座って、78秒を要したの最長を残した仕事の12組の最初の6ラウンド後、6つのジョブがあるということだと思います
78秒。タスクの数がCPUの数で割り切れる場合、それは発生しませんでしたが、150は12で除算しません。
どのような言語を使用していますか? – bc004346
これは* Bin Packing Problem *だと思いますか? https://en.wikipedia.org/wiki/Bin_packing_problem私はあなたがおそらく最も長い仕事から始まり、徐々に短いものを取っていくと思います。それ以外の場合は、1つを除いてすべて完了することができます。 –
タスク1と150をプロセッサ1(151単位の作業時間を得る)に割り当て、タスク2と149をプロセッサ2に与えます(作業時間は151単位になります)... 12個のプロセッサのそれぞれに6個のチャンク6つのほぼ等しいタスク(タスク73〜78)が終了する。各プロセッサに1つのプロセッサを割り当てます。それは記載されているように、ビンの梱包の問題ではない、またはそれが解決するための非常に簡単なものです。 –