0

MPI を使用して信号機をシミュレートする C++ プログラムを作成しています。基本的に、2 秒ごとに、プロセス 0 が他のすべてのプロセス (信号機) に色を変更する必要があるというメッセージを送信する必要があります。私の現在のアプローチは次のようなものです(実際のコードはありません):

if ( process_rank == 0)
{
   while(true)
   {
      Sleep(2000); //we sleep for 2 seconds

      for(i=1; i<=n;i++)
      {
         MPI_Send( message to change color to process i);
      }
   }
}
else
{
    MPI_Recv(message to change color);
}

コードは問題ありません。コンパイル エラーはありませんが、問題は私のロジックにあるようです。なんらかの理由で理解できません。プログラムは期待どおりに動作しません。MPI プログラムを継続的に実行し、X 秒ごとにメッセージを送信する良い方法はありますか? ありがとうございました

4

1 に答える 1

1

より高いプロセスは、受信後に終了します。そうでない場合は、受信もループする必要があります。

また、プログラムの他のロジックもそこに収まる必要があります。おそらく、他の便利なことを行うためにいくつかの関数を使用するでしょう。マスター用とその他用の完全なコードでさえ、別個の関数に含まれる場合があります。

#include <stdio.h>
#include "mpi.h"
#include <unistd.h>


int main(argc,argv)
  int argc;
  char *argv[];{
  int color, rank, numtasks;
  MPI_Status status;

  MPI_Init(&argc,&argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

  if ( rank == 0)
  {
     color = 0;
     while(1)
     {
        sleep(2); //we sleep for 2 seconds

        for(int i=1; i<numtasks;i++)
        {
           color = (color + 1) % 3;
           MPI_Send((void*)&color, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
        }
     }
  }
  else
  {
   while(1)
     {
      MPI_Recv((void*)&color, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
      printf("rank %i color is %i\n",rank, color);
     }
  }

  MPI_Finalize();
}
于 2013-11-06T07:26:25.653 に答える