多进程并行的两种思路
主从模式:(1)将一个待求解的任务分成一个主任务(主进程)和一些从任务(子进程)(2)主进程负责将任务分解、派发和收集各个子任务的求解结果并最后汇总得到问题的最终解(3) 各子进程接收主进程发来的消息,并行进行各自计算,然后向主进程发回各自的计算结果。
单控制流多数据流模式:(1)首先需要将数据预先分配给各个计算进程(2)然后各个计算进程并行地完成各自的计算任务,包括计算过程中各进程间的数据交换(施行通信同步)(3)最后才将各计算结果汇集起来。
消息传递模型
发送/接收(send/receive)是一组最基本的消息传递原语。
通信机制--同步(发送方发送消息后等待接收方接受消息并回应,然后再开始处理其他工作)、异步(发送方在发送消息后不等待响应直接开始处理其他工作)。
MPI对比OpenMP
MPI | OpenMP |
多进程并行 | 多线程并行 |
消息传递 | 共享变量 |
数据分配方式显式 | 数据分配方式隐式 |
单机/多机 | 单机多核 |
MPI程序的特点
(1)用户必须通过显式地发送和接收消息来实现处理机间的数据交换。 (2)每个并行进程均有自己独立的地址空间。 (3)并行计算粒度大,特别适合于大规模可扩展并行算法。
MPI通信函数SEND&RECEIVE
MPI_Send( void* data, int count, MPI_Datatype datatype, int destination, int tag, MPI_Comm communicator)
MPI_Recv( void* data, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm communicator, MPI_Status* status)
为什么需要tag:当发送者连续发送两个相同类型消息给同一个接收者,如果没有消息标签,接收者将无法区分这两个消息。
e.g.
进程P:send(A,32,Q); send(B,16,Q)
进程Q:recv(X,32,P); recv(Y,16,P)
这段代码打算传送A的前32个字节进入X,传送B的前16个字节进入Y。但是,尽管消息B后发送,但可能先到达进程Q,就会被第一个接收函数接收在X中。
改为-- 进程P:send(A,32,Q,tag1); send(B,16,Q,tag2)
进程Q:recv(X,32,P,tag1); recv(Y,16,P,tag2)
这样会避免错误。
MPI数据类型的作用:使用数据类型参数是为了在异构环境中,例如在具有不同字节存储顺序或者不同基本数据类型长度的异构计算及系统上,当数据类型被指定后,MPI能够在内部转换成相应的字节数,保证通信顺利进行。
MPI的四种点对点通信
标准通信模式(MPI_Send):它如何发送数据由具体实现决定
就绪发送(MPI_Rsend):只有当接收方已经开始接收,发送方才可以发送,否则发送出错(ready send)
同步发送(MPI_Ssend):无论接收方是否启动都可以开始发送,但只有当接收方开始接收,函数才会返回(synchronous send)
缓冲发送(MPI_Bsend):由用户定义、使用缓冲区,无论接收方操作是否启动,只要缓冲区可用都可以开启发送(buffered send)
MPI的两类通信机制
阻塞通信:等待阻塞通信的返回条件发生后通信函数才能返回(阻塞通信返回条件 1 通信操作已完成,即消息已经被发送或接收 2 调用的缓冲区可用,对于发送是发送缓冲区的数据已经可以被其他操作更新了,对于接收操作是该缓冲区的数据已经完整了,可以被正确引用)
非阻塞通信:通信函数可以立即返回。
群集通信
按功能分类:通信功能(主要完成组内数据的传输),聚集功能(在通信的基础上对数据完成一定的操作),同步功能(实现组内所有进程在进度上取得一致)
按方向分类:一对多通信,多对一通信,多对多通信
集合通信同步点(Barrier)、规约(Reduce)
集合通信同步:所有进程在执行的时候都必须首先到达一个同步点才能继续执行。
规约:规约是函数式编程的一个概念,它接受一组数据,进行某些操作后,输出一组更小的数据。
单边通信(远端内存访问,RMA)
单边通信将数据传递和同步解耦,每个进程将一部分内存暴露给其他进程,其他进程可以任意访问该内存区域,在不需要同步的情况下传输数据。