并行多核体系结构基础——概述(笔记)
目录
- 一、多核体系结构概述
- 1.1 指令集并行执行到多核设计
- 1.1.1 性能回报逐步降低
- 1.1.2 功耗问题(功率墙)
- 1.1.3 并行多核
- 1.2 并行计算机概述
- 1.2.1 并行计算机的Flynn分类法
- 1.2.2 MIMD并行计算机分类
- 1.2.3 片外带宽(带宽墙)
- 二、并行编程概述
- 2.1 并行程序性能的限制因素
- 2.2 并行编程模型
- 2.2.1 共享存储与消息传递模型对比
- 2.2.3 其他编程模型
- 参考文献
一、多核体系结构概述
多核体系结构:是指单一【管芯】(die)上集成多个处理器【核】(core)的一种体系结构。
在《并行多核体系结构基础》书中,不管一个管芯继承多少核,统一使用【多核】。有人依据核数量,区分【多核】(multicore)和【众核】(manycore)
1.1 指令集并行执行到多核设计
1.1.1 性能回报逐步降低
在浮点运算单元继承、高速缓存、流水线、乱序执行、向量指令集这些改动的性能回报逐步降低后,人们开始在一个管芯上继承多个核进行更深的研究。(低挂果现象:低处容易摘得果子先摘,高的难的果子后摘)
1.1.2 功耗问题(功率墙)
指令集并行导致的高功耗问题无法解决。即“功率墙”。
管芯功耗分为:静态和动态两种功耗.
- 动态功耗是由晶体管开关活动(1->0,0->1)引起的
- 静态功耗则是理想绝缘体泄露的小电流引起的,【泄露电流】
动态功耗公式为:
DynP=ACV2fDynP=ACV^2fDynP=ACV2f
- AAA :正在开关的晶体管占比
- CCC:晶体管的总电容
- VVV:提供给晶体管的电压(电源电压)
- fff:开关或时钟频率
功耗与电源电压的平方相关,与时钟频率为线性关系。
晶体管的时钟频率为:
fmax=c(V−Vthd)aVf_{max} = c\frac{(V-V_{thd})^a}{V}fmax=cV(V−Vthd)a
- VthdV_{thd}Vthd:阈值电压,晶体管导通的最小电压
- aaa与ccc:常量。 aaa大约为1.3
阈值电压:
是指在半导体器件中,当施加的电压达到一定程度时,器件开始工作或产生可观测效应的最小电压
由上述方程可得:
DynP=c(V−Vthd)aACVDynP= c(V-V_{thd})^aACVDynP=c(V−Vthd)aACV
功耗受电压影响较大,但如果电压降低,则会让逻辑电路变慢以及降低时钟频率。除非我们降低V的同时降低VthdV_{thd}Vthd,但这并不容易,因为阈值电压的降低,将导致泄露电流功耗的增加。
泄露电流(静态功耗)与阈值电压表达式如下:
Ileak>f1(w)e−Vthdf2(V,T)I_{leak}>f_1(w)e^{-V_{thd}f_2(V,T)}Ileak>f1(w)e−Vthdf2(V,T)
- f1f_1f1:栅极宽度www的函数
- f2f_2f2:电源电压和温度的函数
- >>>:泄露电流的原因有很多,右侧只是其中主要的原因
栅极宽度(Gate Width):
是指在场效应晶体管(FET)中,栅极的横向尺寸。它通常与沟道长度(Channel Length)一起被用来描述晶体管的特性。
栅极宽度的大小决定了晶体管的导通能力和开关速度,影响着整个电路的性能。
- 越大,流过的电流越大,电阻越小
- 越小,开关频率越高
泄露电流随着阈值电压的降低呈现指数增长。
1.1.3 并行多核
增加一倍核的数量,并不意味着性能增加一倍。(线性加速比)
对于在大量数据元素上执行相同计算的程序,具有较高的数据并行性,同常可以实现线性加速比。
此外,这也取决于程序员要选择是否要付出更多的编程代价获取更高的性能。
1.2 并行计算机概述
并行计算机是一些列处理单元的集合,他们通过通信和协作以快速解决一个大的问题。
- 处理单元:具有处理一条指令能力的逻辑。流行的观点认为,处理器核是定义处理单元的边界。核之间的并行可认为是并行计算机,核内部则不是。
- 但是这样的定义仍有缺陷:【多线程】(SMT)的核具有多个程序计数器,可以执行来自不同线程甚至程序的指令,SMT核似乎也是并行计算机
- 因此更好的处理单元定义为:从单个程序计数器提取指令且每个指令对单个数据项集合进行操作的逻辑
- 通信:处理单元彼此发送的数据。
- 共享存储系统:处理单元上运行的并行任务通过读取和写入公共存储空间来通信
- 消息传递系统:所有数据都是本地的,并行任务必须向彼此发送显式消息以传递数据
- 协作:并行任务在执行过程相对于其他任务的同步
除非对高密及计算有紧迫的需求(超级计算机),否则考虑到程序开发成本(开发、调优、加速比不高)与计算机本身的成本,一般不会购买并行计算机。
相比之下,低成本【分布式计算机】(集群)比并行计算机更便宜,但处理器之间通信延迟更高。
1.2.1 并行计算机的Flynn分类法
Flynn分类法是一种广泛应用于并行计算机分类的方法。它根据【指令流】(Instruction Stream)和【数据流】(Data Stream)两个独立的维度进行分类,从而得出四种不同类型的计算机体系结构。
四种计算机体系结构类型
-
单指令流单数据流(SISD):这是传统的串行计算机,每个时钟周期处理一条指令和一条数据。早期的大型机、微型机和单核PC都属于这一类。不是并行计算机。
-
单指令流多数据流(SIMD):在这种体系结构中,所有处理器在单个时钟周期内使用相同的指令处理多条数据。矩阵处理器和向量流水线是典型的例子(GPU)。
-
多指令流单数据流(MISD):在这种极少见的体系结构中,多个处理单元使用不同的指令独立处理同一条数据。实时容错计算机和单一信号多频滤波器可能采用这种架构。
-
多指令流多数据流(MIMD):每个处理器执行各自的指令和处理各自的数据。超级计算机、集群服务器和多核计算机都是这一类的代表。是最灵活的体系结构,
1.2.2 MIMD并行计算机分类
- 共享高速缓存
早期的多核体系结构允许核共享L2高速缓存,二最新的多核体系结构允许共享L3高速缓存。
L1 高速缓存(L1 Cache):与核紧密集成的小型存储器
L2 高速缓存(L2 Cache):容量空间比L1更大但更慢,可独立可共享,为L1与L3的桥梁。
L3 高速缓存(L3 Cache):容量最大,但也是最慢的存储器,主要用于多核场景支持。
- 一致存储访问(UMA)
也可以叫做【对称多处理器】(SMP),利用总线、环、交叉开关或点对点网络,共享存储器。
- 非一直存储访问(NUMA)
每个存储器都有私有高速缓存和本地存储的体系结构,但硬件提供跨越所有本地存储器的互连以给出单个存储器的抽象。
- 分布式系统
每个处理器都是一个完整的节点,具有自己的高速缓存和磁盘。I/O连接的延迟很大,所以不会提供单个存储器的抽象。因此被称为分布式计算机系统(集群)。每个节点都有自己的系统,运行自己的操作系统(OS)实例。
1.2.3 片外带宽(带宽墙)
多核体系除了功率墙外,还要解决片外带宽,及带宽墙。
多核处理器(CMP)中加倍核的数量和高速缓存的容量以利用不断增长的晶体管数量会导致片外存储器访问量的相应翻倍,意味着访问请求提供服务的速率也需要加倍。如果片外存储器的带宽不能支持产生访存请求的速率,则请求将会排队,迫使核性能下降。
二、并行编程概述
2.1 并行程序性能的限制因素
分析程序并行执行时间的一个有用工具是Amdahl定律。
假设一个算法或代码的串行执行时间是T1T_1T1,而其在ppp个处理器上并行的时间为TpTpTp(假设有ppp个线程),假设程序中sss的比例无法并行。则可得理想加速比公式:
Speedupp=1s+1−spSpeedup_p=\frac{1}{s+\frac{1-s}{p}}Speedupp=s+p1−s1
但拥有极多处理器时,加速比公式变为:
Speedup∞=limp→∞1s+1−sp=1sSpeedup_\infty=\lim_{p\rightarrow\infty}\frac{1}{s+\frac{1-s}{p}}=\frac{1}{s}Speedup∞=p→∞lims+p1−s1=s1
上式表明,要获得高可扩展性是困难的,要求程序的所有部分几乎都可以完全完美的并行化。且处理器的增加带来的回报是递减的。
弱可扩展(weak scaling):输入集合的大小随线程个数按比例增长
强可扩展(strong scaling):输入集合是固定的,无论线程个数是多少
此外除了串行比例,还有其他因素:
- 负载不均衡
- 同步开销
- 通信开销
- 线程管理开销
2.2 并行编程模型
主要有两种广泛应用的并行编程模型:
- 共享存储
不同线程或者进程执行的并行任务能够访问内存的任何位置,通过【写入】(store)与【读取】(load)内存位置实现相互间的隐式通讯。
- 消息传递(大系统较多使用该方式)
一个线程不能访问另一个线程的内存,线程加交换为了交换数据,就需要通过显式地传递包含数据值的消息彼此通信,这与多个进程互不共享地址空间类似
2.2.1 共享存储与消息传递模型对比
硬件支持:
- 共享存储抽象一般需要专门的硬件支持。
在类似多核处理器这种小规模系统上,处理器核间可能已经共享最后一集高速缓存,因而要支持共享存储抽象就比较简单,在某些情况下是自动支持的。
但在多节点时,提供共享存储的代价随着处理器个数的增加而增大。
- 消息传递则不需要硬件支持
开发难度:
- 共享存储并行程序通常在开始时更易于开发,开发者无需考虑数据如何排布以及如何映射到处理器
- 消息传递则需要开发人员考虑多个处理器间如何划分,如何显式的消息发送/接受来传递数据
- 使用共享存储并行模型开发后,如果开发者希望将其扩展到更多处理器上,数据存放在哪里以及如何排布就会对性能造成显著的影响。消息传递模型的程序员在开始变成的时候就需要考虑这一问题。
2.2.3 其他编程模型
- 分区化全局地址空间(PGAS):消息传递模型的数据局部性(分区)和共享存储模型的数据访问便利特点
- 数据并行编程模型:用于向量计算,一个寄存器上带着多组要计算的值进行计算(比如128位的寄存器分成4组,每组32位,一次计算算4组,比如GPU中的计算)。
- MapReduce:主要用于集群计算。见MapReduce
- 事务内存(Transactional Memeory,TM)一种编程模型。通过类似数据库事务(ACID)的特性,让开发者从线程同步中释放出来。但他的原子性较弱只有其他事务干扰事务执行时,事务才会全部失败(系统失效或者系统调用等失败,不导致事务全部失败)。且一致性较弱,在事务失败时,仍然有效。
如今主流语言的内存模型可以参考Memory Models。
参考文献
【1】《并行多核体系结构基础》【美】汤孟岩
【2】Memory Models