高性能期末复习之第三章:并行程序设计

名词解释:一个3分 总分30
简答题:一个5分 总分40
编程题:一个10分 总分30

高性能计算导论复习(根据复习范围)

第三章:并行程序设计

进程

  • 是执行中的一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。
  • 进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

线程

  • 单个进程中执行中每个任务就是一个线程。
  • 线程是进程中执行运算的最小单位。

主 - 从式(重点)

  • 基本思想
    • 将一个待求解的任务分成一个主任务(主进程)和一些从任务(子进程)。
    • 主进程负责将任务的分解、派发和收集诸子任务的求解结果并最后汇总得到问题的最终解。
    • 诸子进程接收主进程发来的消息;并行进行各自计算;向主进程发回各自的计算结果。

单程序多数据流(SPMD)(重点,可能考简答题)

  • 亦称为单控制流多数据流模式
  • 基本思想
    • 并行运行的进程均执行相同的代码段,但却操作在各自不同的数据上。
  • 这种编程模式首先需要将应用程序的数据预先分配给各个计算进程(处理器);
  • 然后诸计算进程并行地完成各自的计算任务,包括计算过程中各进程间的数据交换(施行通信同步);
  • 最后才将各计算结果汇集起来。
  • image-20201130111647529
  • 特点
    • MPI 编程中最常用的编程方式。
    • 用户只需要编写、维护一份源代码。
    • 没有主从进程之分,各个进程的地位是相同的。
    • 通常进程0或多或少会担负一些基本控制任务。
    • 该模式由于没有明显的性能瓶颈并且便于有效利用MPI的聚合通信函数,并行可扩展性比较好,适合大规模并行。

PCAM(并行应用编程过程)四个阶段

  • 划分

    • 分解成小的任务,开拓并发性;

    • 分为两类

      • 域分解

        • 对象是数据,可以是程序中的输入数据、中间处理数据和输出数据;
        • 将数据分解成大致相等的小数据片;
        • 划分时考虑数据上的相应操作;
        • 如果一个任务需要别的任务中的数据,则会产生任务间的通信
      • 功能分解

        • 划分的对象是计算(亦称为任务分解或计算划分),将计算划分为不同的任务,其出发点不同于域分解
        • 划分后,研究不同任务所需的数据。如果这些数据不相交的,则划分是成功的;
        • 如果数据有相当的重叠,意味着存在大量的通信开销,要重新进行域分解和功能分解
        • 功能分解是一种更深层次的分解
  • 通信

    • 确定诸任务间的数据交换,监测划分的合理性;
  • 组合

    • 依据任务的局部性,组合成更大的任务;
  • 映射

    • 将每个任务分配到处理器上,提高并行性能。

重复计算(重要)

  • 重复计算减少通信量,但增加了计算量,应保持恰当的平衡
  • 重复计算的目标应减少算法的总运算时间

并行计算

  • 循环程序并行化

    • 数据划分与处理器指派

      • 带状划分方法

        • 又叫行列划分,就是将矩阵的整行或整列地分成若干组,各组指派给一个处理器。
        • 四个处理器上16*16矩阵带状划分
          • image-20201130112612498
      • 块状划分方法

        • 又叫棋盘划分,就是将矩阵划分成若干个子矩阵,每个子矩阵指派给一个处理器,此时任一处理器均不包含整行或整列。
        • 四个处理器上4*4矩阵棋盘划分
          • image-20201130133015830
      • 棋盘划分比带状划分可开发更高的并行度。

        • 例如,对于一个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
//如何从循环体中划分出几个独立的模块,这要使用功能分解的方法。 
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值