0

私は実行したい独立したタスクが非常に多く、各プロセッサが同じ量の作業を行い、効率を最大化するように並列システムに分散したいと考えています。並列タスク配布のための等価ロード

私は、この問題の解決策を見つけるための一般的なアプローチがあるかどうか、あるいはおそらく私の正確な問題の良い解決策があるかどうかを知りたいと思います。

私は、実行したいT = 150のタスクを持っています。各タスクにかかる時間はt = Tです。つまり、task1は1単位の時間を、task2は2単位の時間を取る... task150は150単位の時間を要する。私はn = 12のプロセッサを持っていると仮定して、作業を開始してクリーンアップするのにかかる時間を無視すると、作業負荷を作業者間で分ける最善の方法は何ですか?

+0

どのような言語を使用していますか? – bc004346

+0

これは* Bin Packing Problem *だと思いますか? https://en.wikipedia.org/wiki/Bin_packing_problem私はあなたがおそらく最も長い仕事から始まり、徐々に短いものを取っていくと思います。それ以外の場合は、1つを除いてすべて完了することができます。 –

+0

タスク1と150をプロセッサ1(151単位の作業時間を得る)に割り当て、タスク2と149をプロセッサ2に与えます(作業時間は151単位になります)... 12個のプロセッサのそれぞれに6個のチャンク6つのほぼ等しいタスク(タスク73〜78)が終了する。各プロセッサに1つのプロセッサを割り当てます。それは記載されているように、ビンの梱包の問題ではない、またはそれが解決するための非常に簡単なものです。 –

答えて

1

@ 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で除算しません。

関連する問題