【问题标题】:Master-Slave non-blocking listener主从非阻塞监听器
【发布时间】:2014-03-28 05:43:51
【问题描述】:

目前,我正在尝试创建一个带有“监听器”循环的主从程序,在该循环中,主机等待来自从机的消息以从那里做出决定。但是,尽管使用了非阻塞 MPI 例程,我还是遇到了错误。我需要使用一些阻塞例程吗?

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char** argv)
{
  // Variable Declarations
  int rank, size;
  MPI_Request *requestList,requestNull;
  MPI_Status  status;
  // Start MPI
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  if( rank == 0 )
  {
    // Process Zero
    int   dataOut=13, pr;
    float dataIn = -1;
    requestList =(MPI_Request*)malloc((size-1)*sizeof(MPI_Request));

    while(1){
      dataIn = -1;
      // We do NOT  need to wait for the MPI_ Isend(s), it is the job of the receiver  processes.
      for(pr=1;pr<size;pr++)
      {
        MPI_Irecv(&dataIn,1,MPI_FLOAT,pr,1,MPI_COMM_WORLD,&(requestList[pr-1]));
      }
      if((dataIn > 1.5)){
        printf("From the process: %f\n", dataIn);
        break;
      }
    }
  }
  else
  {
    // Receiver Process
    float message;
    int index;
    //MPI_Request request;
    MPI_Status  status;

    while(1){
      message = random()/(double)1147483648;
      // Send the message back to the process zero
      MPI_Isend(&message,1,MPI_FLOAT,0,1,MPI_COMM_WORLD, &requestNull);

      if(message > 1.5)
      break;
    }
  }
  MPI_Finalize();
  return 0;
}

【问题讨论】:

    标签: c mpi nonblocking master-slave


    【解决方案1】:

    问题似乎是您从不等待 MPI 调用完成。

    非阻塞调用在 MPI 中的工作方式是,当您发出非阻塞调用(如 MPI_IRECV)时,最后一个输入参数是 MPI_REQUEST 对象。当初始化调用 (MPI_IRECV) 完成时,该请求对象包含非阻塞调用的信息。但是,该调用尚未完成,并且您无法保证调用已完成,直到您对请求使用完成调用(MPI_WAIT/MPI_TEST/ 和朋友)。

    在您的情况下,您可能不必要地使用了非阻塞调用,因为您依赖于在下一行的MPI_IRECV 调用期间收到的信息。您可能应该将您的非阻塞呼叫替换为阻塞MPI_RECV 呼叫并使用MPI_ANY_SOURCE,这样您就不必在通信器中为每个等级发布单独的接收呼叫。或者,您可以使用MPI_WAITANY 来完成您的非阻塞调用,但是您需要担心在完成后清理所有额外的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多