|
MPI_Request request;
MPI_Isend(t,size,MPI_INT,destinationRank,tag,MPI_COMM_WORLD,&request);
return request;
}
MPI_Request
nonBlockingRecv(int *&t, int &size, const int tag, const int
senderRank)
{
MPI_Status s1;
MPI_Recv(&size,1,MPI_INT,senderRank,0,MPI_COMM_WORLD,&s1);
t = (int *) malloc(size*sizeof(int));
MPI_Request request;
MPI_Irecv(t,size,MPI_INT,senderRank,tag,MPI_COMM_WORLD,&request);
return request;
}
void
communicationComplete(MPI_Request &r)
{
MPI_Status status;
MPI_Wait(&r,&status);
}
void
barrier()
{
MPI_Barrier(MPI_COMM_WORLD);
}
int main(int argc, char *argv[])
{
MPI_Init(&argc,&argv);
int numProcs,rank;
MPI_Comm_size(MPI_COMM_WORLD,&numProcs);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int numIts = 10000000;
int bufSize = 10;
// Setup send buffers
int *sendData = (int *) malloc(bufSize*sizeof(int));
for(int i=0;i<bufSize;i++)
sendData[i] = i;
// Perform send and recvs
for(int i=0;i<numIts;i++)
{
if(rank==0)
{
for(int proc = 1; proc<numProcs;proc++)
{
MPI_Request r = nonBlockingSend(sendData,bufSize,proc,proc);
communicationComplete(r);
}
}
else
{
int *recvData;
int size;
MPI_Request r = nonBlockingRecv(recvData,size,rank,0);
communicationComplete(r);
free(recvData);
}
barrier();
}
free(sendData);
MPI_Finalize();
return 1;
}
|