2016-08-12 8 views
1

Iので、この1つの並列コマンドを作る方法がないため、unparallelizableループの性質上、以下のフォーム営巣GNUの類似

outer loop about 5-10 iterations can be parallelized 
    loop that cant be parallelized 
     inner loop about 100s operations in parallel 
     inner loop bit that can't be parallelized 

を持っているGNUの類似を使用して、ループを実行したいです。 私は、内側のループがその中で動作している間に何かするべきことがある外側のループのうちの1つ以上をシングルスレッドビットで動作させたいと思います。

CPUコアよりもはるかに多くのジョブが開始されないようにしたいと思いますが、並列コマンドのネスト時に実装するのは難しいようです。 さらに、内側のループのノードファイルを指定すると、内側のループが実行されるたびに同じ順序でノードが使用されるように見えるため、ノード数が増えるとスケーリングが非常に悪くなります。異なる順序でノードを持つ複数のノードファイルを使用する明白な方法があります。

同時ジョブ数を制御する良い方法は、このような入れ子ですか?名前付きセマフォの使用は、実行ごとに別のノードファイルを渡す可能性があると思われるか、間違ったツールを使用していますか?

答えて

0

簡単な解決策は、単純に内部ループを並列化することです。

しかし--loadもあなたのために働く可能性があります

inner() { 
    # Do inner stuff 
} 
export -f inner 

outer() { 
    parallel --load 100% -S .. --env inner inner ::: {1..100} 
} 
export -f outer 

parallel outer ::: {5..10}