2012-02-11 16 views
0

私はmpi.netを使用しています。私は各プロセッサ(proc 0以外)が任意の順序で0を処理するためにデータを送ることを望みます。ここで、コードの簡略化された部分である:プロセスが任意の順序でデータを送信する方法

  if (rank == 0) 
      { 
       int all = nTasks-1; //wich is the number of processes -1 

       while (all > 0) 
       { 
        Communicator.world.Receive<Pixelator>(Communicator.anySource, 1, out pixelus); 
        if (pixelus.x == -1) 
        { 
         all--; 
        } 
       } 
      } 
      else 
      {      
       for (int i = 0; i < 5; i++) 
       { 
        Communicator.world.Send<Pixelator>(some_data, 0, 1); 
       }      
       Communicator.world.Send<Pixelator>(-1, 0, 1); 
      } 

問題は、プロセス0が、別のプロセスから件のデータを受け取ってで前進時に他のプロセスからのすべての情報を受信することです。たとえば、プロセス0は 1 1 1 1 1 2 2 2 2 2 5 5 5 5 4 4 4 4 3 3 3 3 3(これらはデータを送信するプロセスのランクです)を取得します。そして私はそれが1 5 2 3 1 1 4 3 ...または任意の順序であることを望みます...私に提案を与えてください。私の英語を叫ぶ

+0

私は特にmpi.netに精通していませんが、投稿したコードは任意の注文を許可する必要があります。あなたはおそらく同じマシン上のすべてのプロセスを実行していますか?そうであれば、スケジューラは各ノードのジョブを一度に完了することができます。ワーカーノードの 'for'ループの中に短い(〜1秒)スリープを入れてみてください。 – suszterpatt

+0

tryin 'の睡眠を取るこのアイデアは私の頭の中にポップ。しかし、私のプログラムは何らかのイメージモーフィングを行い、速くなければなりません。もし私がより良い解決策を見つけるつもりがなければ、私はこれを行うでしょう。なぜなら、私は試験のためにプロジェクトを提示しなければならないからです... –

+1

睡眠は、メッセージがどんな順序でも受信できることを実証するために役立つだけで、最終的なコードにする必要があります。 – suszterpatt

答えて

0

hereを見てください。他のすべてのプロセスが同じポイントに達するまで、ある処理ポイントに達すると、プロセスをさらにアクションからブロックする方法があります。 うん、何か助けになるだろう。あなたのコードは次のようになります:

if (rank == 0) 
{ 
    int all = nTasks-1; //wich is the number of processes -1 

    while (all > 0) 
    { 
     Communicator.world.Receive<Pixelator>(Communicator.anySource, 1, out pixelus); 
     if (pixelus.x == -1) 
     { 
      all--; 
     } 
    } 
} 
else 
{      
    for (int i = 0; i < 5; i++) 
    { 
     Communicator.world.Send<Pixelator>(some_data, 0, 1); 
     //Here's the barrier 
     Communicator.Barrier(); 
    }      
    Communicator.world.Send<Pixelator>(-1, 0, 1); 
} 

これは間違いなくあなたの出力のようなものを提供します。しかし、障壁が合わないと、プロセスにもっと多くの仕事を与えてお互いにコミュニケーションする時間が短くなるということ以外の推測はありません。

関連する問題