私はM個の独立したジョブを持っているとします。各ジョブにはN個のステップがあります。ジョブは互いに独立していますが、各ジョブのステップはシリアルでなければなりません。言い換えると、J(i、j)は、J(i、j-1)が終了した後にのみ開始されるべきである(iはジョブインデックスを示し、jはステップを示す)。これは、Mの幅とNの高さを持つ壁を構築することと同形です。Intel MPI分散メモリ:q <Mプロセッサを使用してM * Nブロックから壁を構築する
各ジョブブロックは1回だけ実行する必要があります。 1つのCPUを使用して1つのCPUを使用して(同じ順序でも)1ブロックの作業を行うのにかかる時間は、ブロックごとに異なり、事前には分かっていません。
MPIを使用してこれを行う簡単な方法は、作業ブロックをプロセッサに割り当て、すべてのプロセッサが次の割り当て前にブロックを終了するまで待機することです。このようにして、優先順位を強制することができますが、待ち時間が多くなります。
これを行うより効率的な方法はありますか?つまり、プロセッサが何らかの環境変数や共有メモリを使用して仕事を終え、他のプロセッサが仕事を終えて通信を使用して一括決定を待つことなく、次に行うべき仕事のブロックを決めることができます。
これは、[Wavefront Parallel Processing](http://x265.readthedocs.io/en/default/threading.html#wavefront-parallel-processing)でh.265(ビデオコーデック)と同じように聞こえます。ビデオの各ブロックは、その上のブロックと左のブロックに依存します。そのパターンへの依存関係を制限することで、任意の依存関係よりも多くの並列性が可能になります。そのシステムがあなたのアイデアを得るためにどのように設計されているかを見ることができますが、ジョブ間に依存関係がないことは明らかですが、依然としてお互いに待つ必要があります。 –
Mの仕事はすべて同じような進歩を遂げているのはなぜ重要なのですか? M個のジョブのうちのいくつかが他のジョブが終了するまで(つまり、すべてのN個のステップを単一のジョブスケジューラジョブに入れる)開始しない場合は、問題ありませんか?それとも、それはあなたがいくつかのシリアルジョブが残っているだけなので、すべてのCPUを利用できない状況につながるでしょうか?各ステップのサイズに応じて、キャッシュが重要な場合があるため、同じマシン(同じクラスタノードの同じCPU)上の同じデータに対して複数のステップを実行することが重要になります。 –
もう1つの簡単な方法は、スケジューラ/アービタとして1つのCPU(たとえばp0)を割り当てて、すべてのCPUがフリーであるときに登録する必要があるようにすることです。 p0は適応的にジョブ/ブロックを注文し、それらをCPUに割り当てることができます。これは、いくつかの通信オーバーヘッドの考えを導入するでしょう。同様のことが誰でも自由な人が共有メモリで行うことができます。簡単なピッキングのための「注文」を作成するタスクは共有されます。 – makadev