使用boost :: mpi send / recv进行消息同步?

时间:2013-01-26 00:20:36

标签: mpi thread-synchronization boost-mpi

我用“-np 2”调用mpirun。我指的是将等级0称为“主”的过程,将等级1称为“从属”的过程。

目标:

  1. master偶尔会向{@ 1}}等奴隶发送消息。其他消息类型包括DIE,COMPUTE等。这些消息类型是具有唯一值的常量整数。
  2. slave运行一个无限循环,“监听”来自主服务器的任何消息。收到消息后,它会向主服务器发送确认。
  3. 实施

    奴隶跑:

    mpi::send(1, UPDATE, data);

    当主人跑:

    ...
    int updateData, computeData;
    mpi::request updateRequest = world.irecv(0,UPDATE, updateData);    
    mpi::request computeRequest = world.irecv(0,COMPUTE, computeData);    
    
    do {
      cerr << "slave ready to take a command" << endl;
      if(updateRequest.test()) {
        cerr << "slave ireceived UPDATE" << endl;
        world.send(0, UPDATE_ACK, 0);
        cerr << "slave sent UPDATE_ACK" << endl;
    
        /* do something useful 
        ...
        ...
        */
    
        updateRequest = world.irecv(0, UPDATE, updateData);
    
      } else if (computeRequest.test()) {
        ...
      } else {
        boost::this_thread::sleep( boost::posix_time::seconds(1) );
      }
    }
    

    主代码的更多上下文:

    ...
    world.send(1, UPDATE, 10);
    cerr << "master sent UPDATE" << endl;
    int dummy;
    world.recv(1, UPDATE_ACK, dummy);
    cerr << "master received UPDATE_ACK" << endl;
    ...  
    

    输出:

      

    ...

         

    奴隶准备接受命令

         

    master发送UPDATE

         

    奴隶获得更新

         

    slave发送了UPDATE_ACK

         

    master收到UPDATE_ACK

         

    奴隶准备接受命令

         

    ...

         

    奴隶准备接受命令

         

    master发送UPDATE

         

    奴隶获得更新

         

    slave发送了UPDATE_ACK

         

    奴隶准备接受命令

         

    ...

    问题: 主人第一次发送UPDATE消息时,一切似乎都没问题。但是,在第二次,主服务器没有收到UPDATE_ACK。

0 个答案:

没有答案