MPI实现非阻塞型点对点通信

发布时间 2023-10-15 19:18:23作者: 祥瑞哈哈哈

#include <mpi.h>
#include<stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
MPI_Init( &argc, &argv );

int rank;
int size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank); // 获取当前进程的rank
MPI_Comm_size(MPI_COMM_WORLD, &size); // 获取总进程数
if (rank == 0) {
int message = 123;
for (int i = 1; i < size; ++i) {
MPI_Request request;
// 非阻塞发送消息
MPI_Isend(&message, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &request);

// 等待接收消息
while (1) {
int flag;
MPI_Test(&request, &flag, MPI_STATUS_IGNORE);
if (flag) {
int message_recv;
MPI_Recv(&message_recv, 1, MPI_INT, i, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf( "Process 0 received message:%d\n " , message_recv );
break;
}
usleep(1000); // 等待1秒
}
}
}
else {
int message = 456;
for (int i = 0; i < size - 1; ++i) {
MPI_Request request;
// 非阻塞接收消息
MPI_Irecv(&message, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &request);
int message_1=345;
MPI_Isend(&message_1, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &request);

// 等待发送消息
while (1) {
int flag;
MPI_Test(&request, &flag, MPI_STATUS_IGNORE);
if (flag) {
printf( "Process %d received message:%d \n",i+1 , message);;
break;
}
usleep(1000); // 等待1秒
}
}
}

MPI_Finalize();
return 0;
}