首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带MPI_ANY_SOURCE的MPI Sendrecv

带MPI_ANY_SOURCE的MPI Sendrecv
EN

Stack Overflow用户
提问于 2015-04-06 21:14:05
回答 1查看 5.8K关注 0票数 5

在一方不知道另一方的等级的情况下,是否可以进行MPI_Sendrecv交换?如果不是,那么最好的方法是什么(我的下一个猜测将是一对发送和记录)?

例如,在C中,如果我想在秩0和其他秩之间交换整数,这种类型的东西能工作吗?:

代码语言:javascript
复制
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);
}

编辑:看起来是不可能的。我把下面的内容作为一种包装来添加我所需要的功能。

代码语言:javascript
复制
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:根据帕特里克的回答,上面的slave_sendrecv函数看起来是不需要的,您可以只在知道它发送给谁的端使用常规MPI_Sendrecv。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-06 23:24:49

简短回答:不。

该标准不允许在任何发送过程中使用MPI_ANY_SOURCE作为目标等级dest。这是有意义的,因为您不能在不知道目的地的情况下发送消息。

但是,该标准允许您将MPI_Sendrecv与常规MPI_Send/MPI_Recv配对。

由发送接收操作发送的消息可以由常规接收操作接收或由探测操作探测;发送-接收操作可以接收由常规发送操作发送的消息。

在您的情况下,process 0必须首先接收,然后回答:

代码语言:javascript
复制
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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29479807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档