在这个例子中,每个进程初始化了一个包含三个整数(send_buf)和一个包含三个MPI_Request对象(requests)的数组。然后使用非阻塞发送将每个整数发送给它的邻居,并使用MPI_Waitany等待三个发送中的任何一个完成。
当MPI_Waitany返回时,它将index变量设置为requests数组中已完成发送的索引。程序然后从邻居接收相应的整数,并打印有关已完成请求的一些信息。
那个进程发送完了就可以继续之后的工作了。各个进程不关联。
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int num_requests = 3;
MPI_Request requests[num_requests];
int send_buf[num_requests], recv_buf[num_requests];
for (int i=0; i<num_requests; i++) {
send_buf[i] = rank*num_requests + i;
recv_buf[i] = -1;
MPI_Isend(&send_buf[i], 1, MPI_INT, (rank+1)%size, 0, MPI_COMM_WORLD, &requests[i]);
}
int index;
MPI_Status status;
MPI_Waitany(num_requests, requests, &index, &status);
printf("进程 %d 完成了请求 %d。发送的值为: %d\n", rank, index, send_buf[index]);
MPI_Recv(&recv_buf[index], 1, MPI_INT, (rank-1+size)%size, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("进程 %d 接收到值 %d\n", rank, recv_buf[index]);
MPI_Finalize();
return 0;
}