名词解释:一个3分 总分30
简答题:一个5分 总分40
编程题:一个10分 总分30
高性能计算导论复习(根据复习范围)
第三章:并行程序设计
进程
- 是执行中的一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。
- 进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
线程
- 单个进程中执行中每个任务就是一个线程。
- 线程是进程中执行运算的最小单位。
主 - 从式(重点)
- 基本思想
- 将一个待求解的任务分成一个主任务(主进程)和一些从任务(子进程)。
- 主进程负责将任务的分解、派发和收集诸子任务的求解结果并最后汇总得到问题的最终解。
- 诸子进程接收主进程发来的消息;并行进行各自计算;向主进程发回各自的计算结果。
单程序多数据流(SPMD)(重点,可能考简答题)
- 亦称为单控制流多数据流模式
- 基本思想
- 并行运行的进程均执行相同的代码段,但却操作在各自不同的数据上。
- 这种编程模式首先需要将应用程序的数据预先分配给各个计算进程(处理器);
- 然后诸计算进程并行地完成各自的计算任务,包括计算过程中各进程间的数据交换(施行通信同步);
- 最后才将各计算结果汇集起来。
- 特点
- MPI 编程中最常用的编程方式。
- 用户只需要编写、维护一份源代码。
- 没有主从进程之分,各个进程的地位是相同的。
- 通常进程0或多或少会担负一些基本控制任务。
- 该模式由于没有明显的性能瓶颈并且便于有效利用MPI的聚合通信函数,并行可扩展性比较好,适合大规模并行。
PCAM(并行应用编程过程)四个阶段
-
划分
-
通信
- 确定诸任务间的数据交换,监测划分的合理性;
-
组合
- 依据任务的局部性,组合成更大的任务;
-
映射
- 将每个任务分配到处理器上,提高并行性能。
重复计算(重要)
- 重复计算减少通信量,但增加了计算量,应保持恰当的平衡
- 重复计算的目标应减少算法的总运算时间
并行计算
-
循环程序并行化
-
数据划分与处理器指派
-
带状划分方法
- 又叫行列划分,就是将矩阵的整行或整列地分成若干组,各组指派给一个处理器。
- 四个处理器上16*16矩阵带状划分
-
块状划分方法
- 又叫棋盘划分,就是将矩阵划分成若干个子矩阵,每个子矩阵指派给一个处理器,此时任一处理器均不包含整行或整列。
- 四个处理器上4*4矩阵棋盘划分
-
棋盘划分比带状划分可开发更高的并行度。
- 例如,对于一个n×n的方阵,棋盘划分最多可使用 个处理器;而带状划分可用的处理器数不能多于n个。
-
数据划分准则
- 数据相关性准则
- 划分后的数据要指派给各处理器去执行一些操作,所以划分应该减少处理器间的通信,把那些彼此相关的数据尽可能分配到同一个处理器上,以使各处理器能独立地工作或只进行少量的通信。
- 数据相关性准则
-
-
循环重构
- 循环交换
- 通过交换内外循环的先后次序对循环体结构进行调整,以实现划分后处理器内部数据的局部相关,从而减少通信开销,提高计算的并行性
- 轮转法
- 对于初值为0,步长为1的循环,我们称之为正规循环。
- 对正规循环可以通过实施轮转法来挖掘其中的并行性
- 对于非正规的循环,我们总可以通过简单的下标变换使之变为正规循环。
- 轮转法的作法与拉伸法很类似,对循环j和循环i进行拉伸,拉伸系数为1
- 并列法
- 将循环体中无相关关系可以互相并行的部分折分成几个并列的循环,使这几个循环之间可以互相并行执行
- 循环交换
-
//数据划分与处理器指派
//设矩阵A有n行和m列,对其串行处理的程序段如下:
for i=1 to n do
for j=1 to m do
Process(a[i, j])
endfor
endfor
//其中,Process(a[i,j])表示对矩阵元素a[i,j]某种处理过程。设有p个处理器。
//行划分
for k=1 to p par-do
for i1=1 to r do
for j =1 to m do
Process(a[(k-1)r+i1, j])
endfor
endfor
endfor
//其中“par-do”表示对循环体用p个处理器并行执行。
//列划分
for k=1 to p par-do
for j1=1 to s do
for i=1 to n do
Process(a[i, (k-1)s+j1])
endfor
endfor
endfor
//行循环划分
for k=1 to p par-do
for i1=1 to r do
for j=1 to m do
Process(a[(i1-1)p+k, j])
endfor
endfor
endfor
//列循环划分
for k=1 to p par-do
for i=1 to n do
for j1=1 to s do
Process(a[i, (j1-1)p+k])
endfor
endfor
endfor
//数据划分与处理器指派
//基于数据内部相关分析(同一数据划分的相关分析)的划分
//设A为一个n阶方阵,有如下串行程序段:
for i=1 to n do
for j=1 to n do
a[i, j] = a[i-1, j]
endfor
endfor
/*
分析矩阵A的元素下标i和j,
则i和j的相关方向向量为(1,0),
各列之间数据无任何相关关系。
因此对矩阵A可按列划分。
*/
//串行程序段可转化为如下并行程序段
for k=1 to P Par-do
for j1=1 to m do
for i=1 to n do
a[i, (k-1)m+j1]=a[i-1, (k-1)m+j1]
endfor
endfor
endfor
//基于数据内部相关分析的划分
for i=1 to n do
for j=1 to n do
a[3i, 2j] = a[3i-2, 2j-1]
endfor
endfor
/*
其相关方向向量为(1,1),可知行和列间同时存在数据相关。
在此我们可以试用行划分、列划分和方块划分.
在行划分的情况下令m=[n/p]
*/
for k=1 to P Par-do
for i1=1 to m do
for j=1 to n do
a[3(k-1)m+3i1, 2j]=a[3(k-1)m+3i1-2, 2j-1]
endfor
endfor
endfor
//循环重构
//循环交换
//对如下循环
for i= 1 to n do
for j= 1 to n do
a[i, j] = a[i-1, j]
endfor
endfor
/*
按数据相关性准则,
i,j的相关方向向量为(1,0),
应该对矩阵A按列划分。
按并行粒度准则,
循环的最外层是i,
应该对矩阵A按行划分。
两条准则发生矛盾。
现交换i,j循环的先后次序。
*/
//通过重构得到如下并行程序
for j= 1 to n par-do
for i= 1 to n do
a[i, j] = a[i-1, j]
endfor
endfor
/*
上例中,对i的循环具有相关性,对它应该串行执行。
因此可利用循环交换,使无相关性的分量调换至最外层。
在循环交换时,应该注意循环初值和终值的变化。
*/
//对于如下循环:
for i=1 to n do
for j=i+1 to n do
Process(a[i, j])
endfor
endfor
/*
由于内层循环j的初值是外层循环i的函数,在循环交换后,这样的初值和终值也相应地变化为:
*/
for j=2 to n do
for i=1 to j-1 do
Process(a[i, j])
endfor
endfor
//轮转法
//对于如下正规循环
for i=0 to n-1 do
for j=0 to m-1 do
Process(a[i, j])
endfor
endfor
//转换为并行程序
for k=0 to P-1 Par-do
for i=0 to n-1 do
for j=0 to r-1 par-do
Process(a[i, k*r+j])
endfor
endfor
endfor
//并列法
//对于如下循环
for i=1 to n do
for j=1 to n do
S1;S2;…;Sm
endfor
endfor
/*
这里S1,S2,…,Sm为相互之间无相关关系的程序段,
而且在任意Sk与Sl对循环变量i,j的任意不同取值的计算之间也无相关关系。
*/
//上述串行程序可变换为如下并行程序
for k=1 to m par-do
for i=1 to n do
for j=1 to n do
Sk
endfor
endfor
endfor
//如何从循环体中划分出几个独立的模块,这要使用功能分解的方法。