MPI:如何在MPI_Wait中区分发送和接收
假设我使用PMPI为MPI_Wait编写一个包装器,它等待MPI发送或接收完成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
/* ================== 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