数据传输问题:MPI_Isend后接MPI_Probe和MPI_Recv
我有以下代码数据传输问题:MPI_Isend后接MPI_Probe和MPI_Recv,mpi,Mpi,我有以下代码 int main(int argc, char* argv[]) { int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); MPI_Request mpiRequest; MPI_Status mySt
int main(int argc, char* argv[])
{
int rank, size;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
MPI_Request mpiRequest;
MPI_Status myStatus;
int tag = 11;
int testData = 12;
MPI_Isend(&testData,1,MPI_INT,(rank+1)%size,tag,MPI_COMM_WORLD,&mpiRequest);
MPI_Wait (&mpiRequest,&myStatus);
int source = (rank+size-1)%size;
int sizeProb = MPI_Probe(source,tag,MPI_COMM_WORLD,&myStatus);
int * recvTransferArray = new int [sizeProb];
MPI_Recv(recvTransferArray,sizeProb,MPI_INT,source,tag,MPI_COMM_WORLD,&myStatus);
MPI_Finalize();
return 0;
}
问题是在sizeProb中我得到了0,我应该得到1
我可以用MPI_ISend发送数据,用MPI_Probe/MPI_Recv组合接收数据吗?事实上,
sizeProb
始终为0是一件好事MPI_Probe()
返回一个错误代码,在您的情况下,这意味着MPI_成功
。要检索其他进程发送的数组的大小,可以使用MPI\u Get\u count(&myStatus、MPI\u INT和&sizeProb)代码>
两个环节:
- 范例
MPI\u Get\u count()
以下是一个基本示例:
#include "mpi.h"
int main(int argc, char* argv[]) { int rank, size;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
MPI_Request mpiRequest;
MPI_Status myStatus;
int tag = 11;
int testData = rank;
MPI_Isend(&testData,1,MPI_INT,(rank+1)%size,tag,MPI_COMM_WORLD,&mpiRequest);
MPI_Wait (&mpiRequest,&myStatus);
int source = (rank+size-1)%size;
MPI_Probe(source,tag,MPI_COMM_WORLD,&myStatus);
int sizeProb;
MPI_Get_count(&myStatus, MPI_INT, &sizeProb);
int * recvTransferArray = new int [sizeProb];
MPI_Recv(recvTransferArray,sizeProb,MPI_INT,source,tag,MPI_COMM_WORLD,&myStatus);
std::cout<<"proc "<<rank<<" received "<<sizeProb<<" int, first being "<<recvTransferArray[0]<<std::endl;
MPI_Finalize();
return 0;
}
#包括“mpi.h”
intmain(intargc,char*argv[]){intrank,size;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
MPI_请求MPI请求;
MPI_状态myStatus;
int-tag=11;
int testData=rank;
MPI Isend(&testData,1,MPI INT,(秩+1)%size,tag,MPI通信世界和MPI请求);
MPI_Wait(MPI请求和myStatus);
int source=(秩+大小-1)%size;
MPI_探测器(源、标记、MPI_通信世界和myStatus);
int sizeProb;
MPI_Get_count(myStatus、MPI_INT和sizeProb);
int*RecvTransferray=新的int[sizeProb];
MPI_Recv(RecvTransferray、sizeProb、MPI_INT、源、标记、MPI_COMM_WORLD和myStatus);
标准::cout