Programming Using the Message-Passing Paradigm(使用消息传递模式编程)
消息传递编程的原理
两个关键特性:假设存在一个分块地址空间(个人理解就是物理内存分块,每个处理器对应一块局部内存),只支持显示并行化
分块地址空间的含义:
1. 每一数据单元必须属于空间的分块之一(属于某一个局部内存),数据必须被显示地划分和存放。(促进存取本地化,对非UMA结构很重要)。
2. 所有的相互操作需要两个进程间的协作。
消息传递程序的结构:
1. 异步:所有的并发任务都异步执行,由于存在竞争条件可能导致不确定的行为
2. 松散同步:同步执行交互,但是交互之间任务的执行是完全异步的
绝大多数消息传递程序使用单程序多数据(SPMD)方法来编写。如果不同处理器执行的是不同的程序,这样很难扩展(分布式计算的目的是提高某一个程序的运行效率,而不是同时执行两个不相干的程序)
操作构件:发送和接收操作
绝大多数消息传输平台都有另外的硬件来支持消息的发送和接收,他们能支持DMA和使用网络接口硬件的异步消息传输。这两者都不需要CPU的干预,所以在调用send之后就在通信完成之前返回了,如果下面代码修改了发送的内存位置的值,可能导致发送给另一个进程的值不对。
阻塞式消息传递操作
1. 阻塞式无缓冲发送/接收:会出现空闲开销,以及更容易出现死锁(两个进程都在阻塞发送)。
2. 阻塞式有缓冲发送/接收:也可能发生死锁(两个进程都在接收阻塞)有通信硬件则可以负责将发送方缓冲区内容发送到接收方缓冲区内容。否则则需要一端中断传输数据给另一端,将数据放入缓冲区中。
无阻塞式消息传递操作:
消息传递接口(MPI)
MPI_Init和MPI_Finalize必须被所有的进程调用。
一个通信域是可以相互通信的一组进程的集合。(MPI_Comm:通信器)
奇偶排序
如何理解并行计算的计算流程呢?我是这样想的。按并行的方式写一段并行的程序,然后在集群环境里主机上运行apirun的时候指定需要的进程数。接着,计算机在集群环境下尽可能找到对应 的节点,分配进程任务并给他们编号。此后,将程序拷贝一份给每一个节点,每个节点在这个共同的工作中都担任着一份角色。接着,他们就按程序中设计的方式,各自运行着由自己编号决定的自己的那一段代码,相互之间进行通讯,最后共同完成这项任务。
拓扑结构与嵌入
物理处理器之间的连接是使用了某种拓扑结构,一般都不是一维的。为了让进程间的通信尽可能发生在之间相连的处理器上减少通信的耗费。我们需要按照拓扑
结构来安排进程。
矩阵相乘的例子
计算与通信重叠
无阻塞式通信操作