1.MPI的两种点对点通信方式
MPI的点对点通信包括阻塞式和非阻塞式:
- 阻塞式通信调用 MPI_Send/MPI_Recv
MPI_Send不会返回,调用MPI_Send发送数据的进程会被阻塞,直到缓存为空
MPI_Recv不会返回,调用 MPI_Recv接收数据的进程会被阻塞,直到缓存被填充
- 非阻塞式通信调用 MPI_Isend/MPI_Irecv
调用MPI_Isend或MPI_Irecv会马上返回
非阻塞式操作允许进行重叠的计算和通信
2. MPI_Send/MPI_Recv
- 代码示例
MPI_Send/MPI_Recv的代码示例如下,
int rank, data[101];
MPI_Init(0, 0);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0)
{
for (int i = 0; i < 101; ++i)
{
data[i] = i + 1;
}
//发送消息
MPI_Send(data, 101, MPI_INT, 1, 0, MPI_COMM_WORLD);
printf("process %d send 101 个int\n", rank);
}
else if (rank == 1)
{
MPI_Status status;
//接收消息
MPI_Recv(data, 101, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
int count;
//获取消息个数
MPI_Get_count(&status, MPI_INT, &count);
printf("process %d recv %d 个int\n", rank, count);