如何继续运行MPI程序? 我用MPI编写了一个C++程序来模拟交通信号灯。基本上,我需要进程0每隔两秒钟向所有其他进程(交通灯)发送一条消息,说明它们需要更改颜色。我目前的方法是(我没有实际的代码): if(进程秩==0) { while(true) { 睡眠(2000);//我们睡2秒钟 对于(i=1;i

如何继续运行MPI程序? 我用MPI编写了一个C++程序来模拟交通信号灯。基本上,我需要进程0每隔两秒钟向所有其他进程(交通灯)发送一条消息,说明它们需要更改颜色。我目前的方法是(我没有实际的代码): if(进程秩==0) { while(true) { 睡眠(2000);//我们睡2秒钟 对于(i=1;i,c++,mpi,C++,Mpi,您的高级进程在接收后退出。如果它们不应该退出,则接收也必须在循环中 此外,程序的其他逻辑也必须适合于此。您可能会使用一些函数来完成其他有用的工作。甚至主程序和其他程序的完整代码也可能在不同的函数中 #include <stdio.h> #include "mpi.h" #include <unistd.h> int main(argc,argv) int argc; char *argv[];{ int color, rank, numtasks; M

您的高级进程在接收后退出。如果它们不应该退出,则接收也必须在循环中

此外,程序的其他逻辑也必须适合于此。您可能会使用一些函数来完成其他有用的工作。甚至主程序和其他程序的完整代码也可能在不同的函数中

#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();
}
#包括
#包括“mpi.h”
#包括
int main(argc、argv)
int-argc;
char*argv[]{
int颜色、等级、numtask;
MPI_状态;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI通信大小(MPI通信世界和numtasks);
如果(秩==0)
{
颜色=0;
而(1)
{
睡眠(2);//我们睡2秒钟

对于(int i=1;我明白了。这是有道理的。顺便问一下,你有工作样本吗?这对我真的很有帮助。非常感谢!我稍后会尝试代码,我会给出反馈。我尝试了你的解决方案,但由于某些原因我无法理解,输出很少出现。我的意思是,它应该每2秒钟打印一次内容吗?是的,而且它工作正常n我的系统(OpenMPI Linux)。您是如何运行它的?在哪里运行它的?您是否准确地复制了我的代码?您的代码中有几个错误。此外,如果您使用Windows,请将
sleep()
callback中的数字设置为2000并包含相应的标头。我不使用Windows(或至少不使用MPI)。
#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();
}