入门并行编程MPI(四)

本文介绍了MPI中的同步模式,包括MPI_Ssend和MPI_Rsend子程序,强调了它们的使用条件和性能影响。接着讨论了联合接收和传输,如MPI_Sendrecv和MPI_Sendrecv_replace子程序。还探讨了非阻塞交换,通过MPI_Isend和MPI_Irecv初始化交换,并使用请求标识符来检查交换是否完成。
摘要由CSDN通过智能技术生成

同步模式

  • 只有在另一个进程对信息的接收进行了初始化之后,传输才会终止。

  • 发送方将要求接收方发出交易的确认--"收据"。

  • int MPI_Ssend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)

模式 "待机"

  • 使用子程序进行 "待机 "转移。
  • int MPI_Rsend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)  MPI_Rsend(buf, count, datatype, dest, tag, comm, ierr)
  • 如果已经登记了相应的接收,必须启动 "待机 "传输。如果不满足这个条件,操作的结果是不确定的。
  • 它是立即完成的。如果没有登记接收,操作的结果是未定义的。
  • 传输的完成并不取决于另一个进程是否调用了一个子程序来接收信息,它只意味着传输缓冲区可以再次被使用。
  • 信息被简单地扔到通信网络上,希望收件人能收到它。这个希望可能会实现,也可能不会实现。
  • 现成的交换可以提高程序的性能,因为它不涉及进程间通信和缓冲步骤。
  • 这些都是耗时的操作。另一方面,"就绪 "交换有潜在的危险,也会使调试复杂化,所以建议只有在程序的逻辑结构能保证其正确运行,并且必须不惜一切代价获得性能增益时才使用。
     

联合接收和传输

  • MPI_Sendrecv子程序在接收和发送数据时都带有锁。
  •  int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status)
  • MPI_Sendrecv_replace子程序执行数据接收和发送,使用一个共同的缓冲区来发送和接收。
  •  int MPI_Sendrecv_replace(void *buf, int count,  MPI_Datatype datatype, int dest, int sendtag, int source,int recvtag, MPI_Comm comm, MPI_Status *status)

非阻塞式交换

  • 调用一个非阻塞的传输子程序会启动但不会终止传输。子程序可能在信息被复制到传输缓冲区之前终止。
  • 使用非阻塞操作可以提高程序性能,因为在这种情况下允许计算和交换的重叠(即同时执行)。从缓冲区传输数据或读出数据可以在进程进行其他工作的同时发生。
  • 为了完成一个非阻塞的交换,必须调用一个额外的过程来检查数据是否被复制到传输缓冲区。
  • 请注意! 一个非阻塞的交换将立即从交换子程序中返回,但之后你不能对缓冲区进行写入或读出--消息可能还没有被发送或接收,对缓冲区的操作可能会 "破坏 "其内容。 
  • 一个非阻塞性的交换分两步进行。
    •  初始化交易所。
    •  检查交换的完成情况。
  • 将这些步骤分开,就有必要对每个交换操作进行标记,这样就可以有针对性地对各自的操作进行完成检查。 
  • 交换操作标识符用于在非阻塞操作中进行标记。
  • MPI_I[S, B, R]发送例程被用来初始化非阻塞标准传输。
  • 标准的非阻塞传输是由一个子程序执行的。
  • int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
  • MPI_Isend(buf, count, datatype, dest, tag, comm, request, ierr)
  • 该子程序的输入参数与MPI_Send子程序的参数相同。
  • 输出参数请求是操作的标识符。
  • 非阻塞接收通过调用子程序进行初始化。
  • int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)
  • MPI_Irecv(buf, count, datatype, source, tag, comm, request, ierr)
  • 这里的参数分配与前面讨论的子程序相同,只是指定了源的等级,而不是接收者的等级。
  • 对非阻塞交换子程序的调用形成了一个执行交换操作的请求,并将其与请求操作标识符相关联。
  • 该请求确定了交换操作的属性。
    •  模式。
    •  剪贴板特征; - 交换缓冲器特征。
    •  背景。
    •  标签和等级。
  • 该查询包含关于待定交换操作状态的信息,可用于获取关于交换状态的信息或等待交换完成。  

检查交换是否正在进行中

在非阻塞模式下,实际的传输或接收是通过调用等待子程序来检查的,这些子程序阻塞进程直到操作完成,或者调用非阻塞检查子程序,如果操作完成则返回逻辑值 "true"

   

未完待续~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值