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

本文介绍了MPI的点对点通信方式,包括阻塞式MPI_Send/MPI_Recv和非阻塞式MPI_Isend/MPI_Irecv。阻塞式通信会导致进程阻塞直至通信完成,而非阻塞式则允许进程在等待通信完成的同时进行其他计算。文中通过代码示例展示了如何使用这两种通信方式,并强调了避免死锁和非阻塞发送时修改缓冲区的问题,以及如何利用非阻塞接口实现计算和通信的重叠。
摘要由CSDN通过智能技术生成
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);
	
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值