并行与分布式计算复习大纲 华南农业大学

复习提纲:

在这里插入图片描述

1. 为什么要并行编程

(1)分布和并行计算的区别(重点)

:并行:单机多核,问题并行编程;分布:多机网络连接,对外以整体提供服务

(2)并行和并发的区别(重点)

:并发:支持同时存在;并行:支持同时执行。并行是并发的一个子集。

并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生,而并行是物理上的同时发生。

(3)进程、线程的区别

:进程是操作系统的资源分配的基本单位,线程是处理器任务调度的基本单位。

(4)并发编程中的两种观点

:消息传递和分布式内存。

(5)并行计算的核心内容(重点)

:并行计算的核心内容是指计算机能够以任何顺序来执行的独立计算

(6)并行程序编写的步骤


【1】寻找并发性
【2】设置算法结构 → \rightarrow 支持结构 → \rightarrow 实现机制

任务并行和数据并行的观点:

  • 任务并行就是多个任务分割并且分配到多个核进行执行
  • 数据并行就是对数据进行分割,然后将分割好的数据分配到多个核上执行。
(7)基于线程化方法学

:分析,设计实现,测试正确性,性能调优


2. 并行硬件和并行软件

(1)基于 Flynn 分类法的划分(重点)

:指令核数据,单流,多流。

SISD:
(Uint改正:Unit)
在这里插入图片描述
SIMD:
在这里插入图片描述
GPUs 都采用SIMD并行。

MIMD:
在这里插入图片描述

(2)MIMD 的进一步划分(重点,分布内容和共享内存,要求能画出图并详细说明)

:共享内存:每个内存区域都能被每个处理器访问的到。分布式内存是内存独立,但是大家能通过网络访问。

共享内存
在这里插入图片描述
一组自治的处理器通过互联网络与内存系统相连接,每个处理器能访问每个内存区域,每个处理器都可以访问每个存储单元,处理器通过访问共享的数据结构来隐式通信

分布式内存
在这里插入图片描述

(3)并行计算的度量,加速比(重点)

T p a r a l l l e l = T s e r i a l / P T_{paralllel} = T_{serial} / P Tparalllel=Tserial/P S = T s / T p S = T_s/T_p S=Ts/Tp


3. 寻找并发性设计空间

在这里插入图片描述
寻找并发性设计空间,如果从分解的角度去看问题的话:任务分解和数据分解,还有数据流分解。如果从依赖性分析的话:任务的分组,任务的排序,数据的共享。

(1)理解任务分解模式(重点,能举出例子或者分析例子)

:任务分解:计算被分解为一组独立的任务,多个线程可以用任意顺序执行这些任务。

例子:如果两个园丁到达一个客户家,一个修剪草坪,另一个铲除杂草。修剪草坪和铲除杂草是两个被分开的功能。

(2)理解数据分解模式(重点,能举出例子或者分析例子)

:数据分解:应用程序需要处理一个大型数据集,并且可以对数据集中的每个元素进行独立计算。

例子:如果园丁应用数据分解来分解他们的任务,他们两个会同时修剪一半的草坪,然后两个人分别铲除一半的杂草

任务分解:识别出多个可以并发执行的任务;
数据分解:识别出每个任务所需要的局部数据


4. 算法结构设计空间

浅谈并行编程中的任务分解模式
在这里插入图片描述

(1)理解任务并行模式(重点,能举出例子或者分析例子)

答:把问题分解为一个能够并发执行的任务集合。

一块草坪,需要完成修剪和除杂草的任务,现在两个园丁分配到不同的任务去完成。当然这个过程需要协调的,因为两个人不可能说同时处理一块地方的。

(2)了解分治策略

在这里插入图片描述

(3)了解几何分解模式(重点,能举出例子或者分析例子)

:几何分解模式基于正在解决问题的数据结构的并行化。在几何分解中,每个线程负责操作数据块

几何分解实际上就是数据的并行化,我们的园丁分到这块草坪的两半,每人负责一半,然后都同时完成:除草和修剪的任务。

(4)了解流水线模式(重点,能举出例子或者分析例子)

:流水线模式的意思类似于一条工厂的产品装配线。这种寻找并发的方式使计算被分割成一系列阶段,每个线程在不同的阶段同时工作。

生产者消费者的实现就是典型的流水线模式。一块草坪,我们把需要完成的任务进行步骤的分解,比如:拿出除草剂,插电,推动,每一步都由不同的园丁来完成。工厂的流水线就是一个最好的理解例子。

(5)理解基于事件的协作模式

:定义任务,表示事件流,强制执行事件的顺序,避免死锁,调度和处理器分配,事件的高效通信

当一个人完成了工作,就通知他人开始他的任务,这样可以做到很好的协作。


5. 支持结构设计空间(重点)

在这里插入图片描述

(1)了解 SPMD 模式

在SPMD程序中,所有UE并行执行同一个程序(单程序),但每个UE都拥有自己的私有数据集(多数据)

(2)了解主从模式(重点)

:主进程为从进程建立一个工作池和一个任务包。所有从进程并发执行,每个从进程迭代的从任务包中移除一个任务并处理它,指导所有任务都处理完毕或到达某些终止条件为止

核心思想是基于分而治之的思想,将一个原始任务分解为若干个语义等同的子任务,并由专门的工作者线程来并行执行这些任务,原始任务的结果是通过整合各个子任务的处理结果形成。

比如Master:RW,那么他的Slave是R和W,也就是我们常说的读写分离。

这个可以用线程池的思想去理解。

(3)理解派生聚合模式(重点,和主从模式之间的区别)

百度一下:Fork/Join 模式即可理解。

一个主UE里面Fork出多个子的UE,这些子UE并行完成任务,的一部分,等待这一步的全部子UE完成了这些任务之后,我们再继续分支。
在这里插入图片描述

(4)理解共享数据模式和队列模式(重点,能举出例子或者分析例子)

:共享队列:使用“线程安全”实现,即使并发执行的多个UE共同使用时,该实现也能保证正确。

如果使用共享数据的话,需要考虑:确保需要这种模式,定义抽象数据类型,实现一种合理的并发控制协议,一次执行一个操作,非干扰的操作集合,读访问者/写访问者,缩减临界区大小,嵌套锁,特定应用的语义释放,回顾其他考虑事项,任务调度

(5)了解分布式数组模式

:一维或多维数组,被划分为多个子数组,并在进程或线程间进行分配


6. 实现机制设计空间

在这里插入图片描述

(1)理解通信及相关技术实验相关(重点,以下内容都会出对应题目。会有简答题、程序填空题及案例分析题,实验会和上面的知识点结合一起出题)

消息传递,集合通信,其他通信构造。
消息是最基本的通信元素,包含信息标识。
广播:发送单条消息给所有UE
栅栏:程序中的同步点,所有UE都必须到达该点,然后才能继续向后执行
归约:获得一个对象集合,每个对象映射到一个UE,操作把它们组合为位于一个UE的单个对象,或组合它们并将结果广播到每个UE上


7. 实验思考:

三个实验例子:生命游戏,PAI计算,日志挖掘。

(1)任务分解和数据分解的具体应用(例子,生命游戏实验、计算π、车牌实验,怎么应用的?)

生命游戏的分解:如果从任务分解的角度去想的话,我们的对于每一个格子都需要判断多个条件,那么这些条件就是我们的任务步骤,也是我们可以对其进行分解的地方。如果从数据分解的角度去思考的话,我们把一个棋盘分为多块,那么我们就完成了数据分解。

计算π的分解
在这里插入图片描述
首先,我们对于算出:每个 1 2 n + 1 \frac{1}{2n+1} 2n+11进行步骤分解,这样就是任务分解,单很明显这个不大适合进行任务分解,因为每一个任务都非常小。我们进行数据分解,线程1计算 n ∈ [ 0 , 10 ] n \in[0,10] n[0,10],线程2计算 n ∈ [ 11 , 20 ] n\in[11,20] n[11,20]
如此类推,同时进行。

日志挖掘:文件读取的数据并行和处理数据时的任务并行。

(3)线程相关知识(线程创建、使用,线程安全访问共享变量。不考线程池。对于生命游戏,使用线程还是线程池效率高?为什么?对于计算π,使用线程还是线程池率高?为什么?类似在课堂上说过的对比。)

关于线程池:
在这里插入图片描述

在处理迭代生命游戏的时候,由于我们采用派生聚合的模式去完成任务,因此,我们在每迭代一次的时候同步一次再发起一次并行迭代,因此需要重复创建,销毁线程,需要消耗大量的资源,因此,更适合用线程池。

对于计算 π \pi π问题,我们可以指定多个线程同时计算多个任务,只需要最后一次合并,无需多次创建消耗资源,因此,我们使用线程池效率不见得比直接手动使用多线程效率高。

但在实际开发当中,为了安全考虑,我们是不应该直接手动创建多线程去处理问题的。(原因参见阿里的编程规范)

(4)共享资源的访问(要求,能以简单程序说明两个线程之间安全访问共享资源的伪代码)
global Var
lock = new Lock()
Thread:
    while(True):
        if lock.is_alive == False:
            lock.Lock()
            #do something fo Var
            lock.unLock()
        else:
            sleep(random)
            continue
T1 = Thread().start()
T2 = Thread().start()
(5)日志挖掘中,怎么样对数据进行划分?怎么样对数据进行预处理?

我们需要考虑是读取数据部分和处理数据部分。比如说,我们可以根据等长数据进行划分,或者根据日期数据进行划分。

数据分块存储,分块读取。

(6)支持结构中主从模式和派生聚合模式的区别和选择(生命游戏和计算π的实验对比,有什么区别?)
  • 生命游戏:派生聚合模式(按照数据更新迭代的次数进行任务分割)
  • 计算PAI:主从模式(指定一个工作池,运算完之后合并在一起)
(7)能画出生产者-消费者模型,并对各部分进行详细说明。

在这里插入图片描述

(8)生产者-消费者模型(重点,请参考阿里云 MQ 服务相关文档,会以阿里云消息服务MQ 为基础,包括基本概念(例如 Topic、生产者、消费者、Tag 等等),消息队列种类(如普通消息、顺序消息(全局顺序和分区顺序),消费模式(集群消费和广播消费),订阅关系一致。
  • Topic:消息主题,一级消息类型,通过Topic对消息进行分类
  • Tag:消息标签,二级消息类型,用来进一步区分某个Topic下的消息分类
  • 消息(Message):消息队列中信息传递的载体
  • Producer:消息生产者,也称为消息发布者,负责生产并发送消息。
  • Consumer:消息消费者,也称为消息订阅者,负责接收并消费消息。可分为两类:
    【1】Push Consumer:消息由消息队列RocketMQ版推送至Consumer。(被动消费者)
    【2】Pull Consumer:该类Consumer主动从消息队列RocketMQ版拉取消息。(主动消费者)
  • Group: 一类Producer或Consumer,这类Producer或Consumer通常生产或消费同一类消息,且消息发布或订阅的逻辑一致
  • 集群消费: 一个Group ID所标识的所有Consumer平均分摊消费消息。例如某个Topic有9条消息,一个Group ID有3个Consumer实例,那么在集群消费模式下每个实例平均分摊,只消费其中的3条消息。
  • 广播消费:一个Group ID所标识的所有Consumer都会各自消费某条消息一次。例如某个Topic有9条消息,一个Group ID有3个Consumer实例,那么在广播消费模式下每个实例都会各自消费9条消息。
  • 定时消息:Producer将消息发送到消息队列RocketMQ版服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到Consumer进行消费,该消息即定时消息。同理,延时消息也类似的意思
  • 顺序消息
    【1】全局顺序:对于指定的一个Topic,所有消息按照严格的先入先出(FIFO)的顺序进行发布和消费
    【2】分区顺序:对于指定的一个Topic,所有消息根据Sharding Key进行区块分区。同一个分区内的消息按照严格的FIFO顺序进行发布和消费。Sharding Key是顺序消息中用来区分不同分区的关键字段,电商的订单创建,以订单ID作为Sharding Key,那么同一个订单相关的创建订单消息、订单支付消息、订单退款消息、订单物流消息都会按照发布的先后顺序来消费
  • 订阅关系一致:订阅关系一致指的是同一个消费者 Group ID 下所有 Consumer 实例所订阅的 Topic、Group ID、Tag 必须完全一致。
(9)根据生产者-消费者模型衍生出来的相关并行化解决方案:(要求,能画图说清楚以上三种结构)
  • 【1】进程内实现相关结构;
  • 【2】进程之间实现的相关结构;
  • 【3】机器间之间的通信。

(分别对应生产者消费者实验)。
在这里插入图片描述


附:线程的五种状态

在这里插入图片描述

  • 51
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值