MPI编程(3)—点对点通信(阻塞式MPI_Send/MPI_Recv和非阻塞式MPI_Isend/MPI_Irecv)

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&
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MPI_WAITALL是一个MPI函数,用于等待一组阻塞通信操作的完成。它的语法如下: ```c int MPI_Waitall(int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[]); ``` 其中,count表示请求数组中的请求数量,array_of_requests是一个包含请求句柄的数组,array_of_statuses是一个用于存储请求状态的数组。 MPI_WAITALL函数会阻塞当前进程,直到所有的请求都完成。如果请求成功完成,MPI_WAITALL函数会返回MPI_SUCCESS,否则会返回一个错误码。 以下是一个使用MPI_WAITALL的示例: ```c #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { int rank, size; int send_buf[2], recv_buf[2]; MPI_Request requests[2]; MPI_Status statuses[2]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); // 发送和接收操作 if (rank == 0) { send_buf[0] = 1; send_buf[1] = 2; MPI_Isend(send_buf, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, &requests[0]); MPI_Irecv(recv_buf, 2, MPI_INT, 1, 1, MPI_COMM_WORLD, &requests[1]); } else if (rank == 1) { send_buf[0] = 3; send_buf[1] = 4; MPI_Isend(send_buf, 2, MPI_INT, 0, 1, MPI_COMM_WORLD, &requests[0]); MPI_Irecv(recv_buf, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &requests[1]); } // 等待所有请求完成 MPI_Waitall(2, requests, statuses); // 打印接收到的数据 printf("Rank %d received: %d %d\n", rank, recv_buf[0], recv_buf[1]); MPI_Finalize(); return 0; } ``` 在上面的示例中,两个进程进行相互通信,进程0发送数据给进程1,进程1发送数据给进程0。MPI_Waitall函数用于等待所有的发送和接收操作完成,然后打印接收到的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值