在MPI中的MPI_Recv函数中:
int MPI_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_Comm comm, MPI_Status *status)
参数source和tag可以设定为任意的,即库里定义好的MPI_AN_SOURCE和MPI_ANY_TAG,但是MPI里面接收个发送不是对等操作,MPI_Send函数并没有这个选项。下面是一个简单的例子:
#include<stdio.h>
#include"mpi.h"
int main(int argc, char** argv)
{
int rank, value, size;
value = 1;
int i;
MPI_Status status;
char name[MPI_MAX_PROCESSOR_NAME];
int len;
int buf;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0)
{
for ( i = 0; i < 10*(size-1); i++)
{
MPI_Recv(&buf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
printf("Msg=%d from %d with tag %d\n", buf, status.MPI_SOURCE, status.MPI_TAG);
//fflush(stdout);
}
}
else
{
for (i = 0; i < 10; i++)
{
buf = rank + i;
MPI_Send(&buf, 1, MPI_INT, 0, i, MPI_COMM_WORLD);
}
}
MPI_Finalize();
return 0;
}
每个进程给0号进程发送10个消息,结果如下: