MPI:如何在MPI_Wait中区分发送和接收

MPI:如何在MPI_Wait中区分发送和接收,mpi,openmpi,Mpi,Openmpi,假设我使用PMPI为MPI_Wait编写一个包装器,它等待MPI发送或接收完成 /* ================== C Wrappers for MPI_Wait ================== */ _EXTERN_C_ int PMPI_Wait(MPI_Request *request, MPI_Status *status); _EXTERN_C_ int MPI_Wait(MPI_Request *request, MPI_Status *status) { i

假设我使用PMPI为MPI_Wait编写一个包装器,它等待MPI发送或接收完成

/* ================== C Wrappers for MPI_Wait ================== */
_EXTERN_C_ int PMPI_Wait(MPI_Request *request, MPI_Status *status);
_EXTERN_C_ int MPI_Wait(MPI_Request *request, MPI_Status *status) { 
    int _wrap_py_return_val = 0;

  _wrap_py_return_val = PMPI_Wait(request, status);
    return _wrap_py_return_val;
}
包装器由生成

我想做的是:

/* ================== C Wrappers for MPI_Wait ================== */
_EXTERN_C_ int PMPI_Wait(MPI_Request *request, MPI_Status *status);
_EXTERN_C_ int MPI_Wait(MPI_Request *request, MPI_Status *status) { 
    int _wrap_py_return_val = 0;

  if(is a send request)
    printf("send\n");
  else // is a recv request
    printf("recv\n");

  _wrap_py_return_val = PMPI_Wait(request, status);
    return _wrap_py_return_val;
}

如何在开放MPI中区分发送和接收?假设我使用OpenMPI3.0.0。

我认为由于
MPI\u请求
是不透明的(我认为在一些版本中它只是一个
int
),您唯一的机会就是监视自己创建的
MPI\u请求

这里是一个命题(它是C++面向的,因为这是我喜欢它的方式):

输出:

waiting(0)-> sending
0 123456789
waiting(1)-> receiving
1 123456789

然而,我刚刚添加了一个带有MPI_Alltoall的测试,以查看是否只调用了PMPI函数,情况就是这样。所以这里没有奇迹。

MPI\u请求是一个不透明的处理程序,因此在这个级别上无法区分发送和接收(或集体…)。如果您的目标是OpenMPI的特定版本,那么您可以使用内部
ompi\u请求\u t
类型。注意,您的扩展应该与Open MPI一起编写和构建。@GillesGouaillardet ompi_请求的哪个元素包含用于区分发送和接收的信息?我查看了定义,但找不到元素。ompi请求类型?它不是用来发送和接收的。也许你们可以发布代码示例作为答案?我错过了一些步骤。如果这是一个
MPI\u请求\u PML
,则将请求转换为
mca\u PML\u base\u请求\u t
,并检查
req\u type
我在
src/adapters/MPI/SCOREP\u MPI\u P2p.c
SCOREP\u MPI\u请求中浏览的内容。它们在发送和接收期间手动注册请求。即,对于每个发送/接收,在等待期间注册请求并检索其源。(在链接的tarball中查找例如
score\u MPI\u REQUEST\u TYPE\u RECV
)。Score-P是MPI实现agnostic@GillesGouaillardetPML是什么的缩写?
int main(int argv, char ** args)
{
       int myid, numprocs;
      MPI_Init(&argv, &args);
      MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
      MPI_Comm_rank(MPI_COMM_WORLD, &myid);

      int i=123456789;
      MPI_Request request;
      MPI_Status status;
      if(myid==0)
      {
            MPI_Isend(&i, 1, MPI_INT, 1, 44444, MPI_COMM_WORLD, &request);
            MPI_Wait(&request, &status);
            std::cout << myid <<' '<<i << std::endl;
      }
      else if(myid==1)
      {
            MPI_Irecv(&i, 1, MPI_INT, 0, 44444, MPI_COMM_WORLD, &request);
            MPI_Wait(&request, &status);
            std::cout << myid <<' '<<i << std::endl;
      }
      int * sb = new int[numprocs];
      for(size_t i=0; i<numprocs; i++){sb[i]=(myid+1)*(i+1);}
      int * rb = new int[numprocs];
      MPI_Alltoall(sb, 1, MPI_INT, rb, 1, MPI_INT, MPI_COMM_WORLD  );
      MPI_Finalize();
}
waiting(0)-> sending
0 123456789
waiting(1)-> receiving
1 123456789