如果一方不知道另一方的级别,是否可以进行mpi-sendrecv交换?如果没有,那么最好的方法是什么(我的下一个猜测是发送和接收对)?
例如,在C语言中,如果我想在秩0和其他秩之间交换整数,这种类型的东西会起作用吗?以下内容:

MPI_Status stat;
if(rank){
  int someval = 0;
  MPI_Sendrecv(&someval, 1, MPI_INT, 0, 1, &recvbuf, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
}else{
  int someotherval = 1;
  MPI_Sendrecv(&someotherval, 1, MPI_INT, MPI_ANY_SOURCE, someotherval, &recvbuf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
}

编辑:
看来这是不可能的。我创建了下面的包装器来添加我需要的功能。
void slave_sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
    int dest, int sendtag, void *recvbuf, int recvcount,
    MPI_Datatype recvtype, int source, int recvtag, MPI_Status *status){

    MPI_Send(sendbuf, sendcount, sendtype, dest, sendtag, MPI_COMM_WORLD);
    MPI_Recv(recvbuf, recvcount, recvtype, source, recvtag, MPI_COMM_WORLD, status);
}

void anon_sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
    int sendtag, void *recvbuf, int recvcount,
    MPI_Datatype recvtype, int recvtag, MPI_Status *status){

    int anon_rank;
    MPI_Recv(recvbuf, recvcount, recvtype, MPI_ANY_SOURCE, recvtag, MPI_COMM_WORLD, status);
    anon_rank = status -> MPI_SOURCE;
    MPI_Send(sendbuf, sendcount, sendtype, anon_rank, sendtag, MPI_COMM_WORLD);
}

编辑2:根据patrick的回答,上面的slave_sendrev函数看起来是不需要的,您可以在知道它发送给谁的末尾使用常规的mpi_sendrev。

最佳答案

简而言之:不。
标准不允许在任何发送过程中使用MPI_ANY_SOURCE作为目的列dest。这是有道理的,因为你不知道目的地就不能发送信息。
但是,标准允许您将aMPI_Sendrecv与regularMPI_Send/MPI_Recv配对:
通过发送接收操作发送的消息可以通过常规接收操作接收
或由探测操作探测;发送接收操作可以接收发送的消息
通过常规的发送操作。
在您的情况下,process0必须首先接收,然后回答:

MPI_Status stat;
if(rank){
  int someval = 0;
  MPI_Sendrecv(&someval, 1, MPI_INT, 0, 1, &recvbuf, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
}else{
  int someotherval = 1;
  MPI_Recv(&recvbuf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
  // answer to process `stat.MPI_SOURCE` using `someotherval` as tag
  MPI_Send(&someotherval, 1, MPI_INT, stat.MPI_SOURCE, someotherval, MPI_COMM_WORLD);
}

08-17 02:43