并行程序设计-第二讲.并行硬件与并行软件


第二讲 并行硬件和并行软件

冯诺依曼结构

image-20221010214750673

缺点:cpu和存储器离得太远,取指令时间很长

冯诺依曼模型改进

利用cache

  • 多级缓存

  • cpu向cache写数据时,cache和主存中的值不一致的问题

    • 写直达:当CPU 向Cache写数据时,高速缓存行会立即写入 主存中。
    • 写回:Cache中,数据不是立即 更新到主存中,而是将发生数据更新的高速 缓存行标记称脏(dirty)。当发生高速缓存行 替换时,标记为脏的高速缓存行被写入主存 中。

虚拟内存

内存不够用时,再磁盘中开辟一块区域作为虚拟内存

但是常用的指令还是要放到内存中

指令级并行ILP

通过让多个处理器或者功能单元同时执 行指令来提高处理器的性能。

  • 流水线:将功能单元分阶段安排

  • 多发射:让多条指令同时启动

    • 静态多发射:功能单元在编译时调度
    • 动态多发射:功能单元再运行时间调度
      • 支持动态多发射的处理器叫做超标量
    • 这两种发射方式都是硬件级别的,不是程序员控制的
    image-20221010223142729
  • 超标量

    • 为了能够利用多发射,系统必须找出能够同时执行的指令

    • 在预测技术中,编译器或者处理器对一条指令进行猜测,然后在猜测的基础上执行代码。(可能会猜错

    • 例1

      image-20221021205239913

      如果*a_p指向的是z,那么这两条指令不能同时执行

    • 例2

      image-20221021211033384

      z可能为正数也可能为负数

      如果系统猜错了,必须返回并重新计算w=y

进程和线程

  • 进程:是运行着的程序的一个实例

    • 多任务操作系统

      给人一种单一处理器系统同时运行多个程序的错觉

      实际上每个进程轮流运行

      执行了一个时间片的时间后,他会等待一段时间直到再次运行

  • 线程

    • 线程包含在进程中

    • 每个线程相互独立

      当某个任务阻塞时能执行其他任务

    • 线程间的切换比进程间的切换要快

image-20221010220356970

硬件多线程

硬件多线程为系统提供一种机制,使得当前执行的任务被阻塞时,系统能够继续其他有用的工作

硬件多线程分为一下三种类型:

图示?????????????????????????????

  • 细粒度(程序员不可见

    • 处理器在每条指令完成后切换线程,从而跳过被阻塞的线程
    • 优点:能够避免因为阻塞而导致机器时间的浪费
    • 缺点:执行很长一段指令的线程在执行每条指令的时候都要等待
  • 粗粒度(程序员不可见

    • 只切换那些需要等待较长时间才能完成操作而被阻塞的线程
    • 优点:不需要线程间的立即切换
    • 缺点:处理器还是可能在短阻塞时空闲,线程间的切换会导致延迟
  • 同步多线程(程序员可见,可以通过写程序来控制

    • 类似于多核(真正的同时
    • 允许多个线程同时使用多个功能单元来利用超标量处理器的性能
    • 局限性:一个核上面不会有太多的线程,常见的是2个线程

并行硬件

Flynn’s 分类法

image-20221021214151218

SIMD(单指令多数据流)

概述

通过将数据分配给多个处理器实现并行化

使用相同的指令来操纵数据子集

这种并行称为数据并行

例子

  • image-20221022091601607
  • image-20221022091638479

SIMD缺点:

  • 所有ALU(算术处理单元)要么执行相同的指令,要么同时处于空闲状态
  • ALU没有指令存储器
  • 在经典的SIMD系统中,ALU必须同步操作
  • SIMD并行性在大型数据并行问题上非常有用,处理其他并行问题时并不优秀

SIMD典型应用

向量处理器
  • 向量处理器是对数组或者数据向量进行操作,而传统的cpu是对单独数据元素或者标量进行操作

  • 原理

    • 向量寄存器

      能够存储由多个操作数组成的向量,并且能够同时对其内容进行操作的寄存器

    • 向量化和流水化的功能单元

      对向量中每个元素做同样的操作,这些操作需要应用到2个或以上对应元素上

    • 向量指令

      在向量上操作而不是在标量上操作

    • 交叉存储器(不太重要

      内存系统由多个内存“体”组成,每个内存体能够独立访问

      如果向量中各个元素分布在不同的内存体中,那么在装入/存储连续数据时几乎能够无延迟访问

    • 步长式存储器访问和硬件的散射/聚集(不太重要

      程序能够访问向量中固定间隔的元素

  • 向量处理器优点(理解即可

    • 速度快

    • 容易使用

    • 向量编译器擅长于识别向量化的代码

    • 编译器也能提供代码为什么不能向量化的原因

      帮助程序员重新评估代码

    • 很高的内存带宽

    • 每个加载的数据都会使用

  • 向量处理器缺点

    • 不能处理不规则的数据结构和其他并行结构
      • 不规则:例如加一个判断语句y>0之类的就不适用
    • 他的可扩展性是个限制,可扩展性是指能够处理更大问题的能力
      • 想要提高性能就只能增加向量处理器的数量,而不是提高向量处理器的能力
GPU(图形处理单元)
  • GPU使用图形处理流水线将物体表面的内部表示转化成一个像素的数组
  • 流水线的许多阶段(通过着色函数实现)是可编程的
  • GPU常使用SIMD来优化性能
  • 现在所有的GPU都使用SIMD并行
    • 尽管GPU不是纯粹的SIMD系统(GUP里有很多很多核
    • 1个控制单元对应多个处理单元???

MIMD(多指令多数据流)

  • 支持同时多个指令流在多个数据流上操作

  • 通常包括完全独立的处理单元或者核,每个处理单元或者核都有自己的控制单元和ALU

    • 对比SIMD:

      SIMD系统那些指令单元必须同步执行相同指令

MIMD分为两大类

共享内存系统
  • 一组自治的处理器通过互联网络与内存系统相互连接

    • 意思是这些处理器共享所有内存,每个处理器能够访问每个内存区域
    • 处理器通过访问共享的数据结构隐式的通信
  • 最广泛使用的共享内存系统使用一个或者多个多核处理器

    • 在一块芯片上有多个cpu或者核
  • 图示

    image-20221022100256140
  • 共享内存系统可以分为两类:

    • UMA一致内存访问系统

      image-20221022100638935

    • NUMA非一致内存访问系统

      image-20221022101055916

      这是共享内存系统,而不是分布式内存系统!!

分布式内存系统
image-20221022101027522
  • 集群(最广泛使用
    • 这些系统中的节点是通过通信网络互相连接的独立计算单元

互联网络

  • 在分布式内存系统和共享内存系统都扮演了一个决定性的角色

  • 分为两类

    共享内存互联网络

    分布式内存互联网络

    =======================草,从这往后好像都没讲草草草草

共享内存互联网络
  • 总线互连

    • 需要排队,但成本低
    • 随着连接到总线的设备数量的增加,对总线 的使用的竞争会增加,性能会下降。
  • 交换互连网络

    灵活但造价高

    允许不同设备之间同时进行通信

    image-20221023182726222
    cache一致性问题

    image-20221031083552339

    Y1,z1为1号核的私有变量

    y0为0号核的私有变量

    image-20221031083920604

  • 监听cache一致性协议

    • core0更新x时,会在总线上广播更新信息,core1可以监听到(⚠️不是直接传递x的信息,而是广播共享)
  • 基于目录的cache一致性协议

    • 使用一个叫做目录的结构,存储每个内存行的状态
    • 当一个变量需要更新时,就会查询目录,并将所有包含该变量的高速缓存行设置为非法
分布式内存互联网络
分为两种:直接互连(要求全部掌握)、间接互连
  • 直接互连

    • 每个交换器与一个处理器-内存对直接相连,交换器之间也互相连接

    • 一个环

      可以同时进行通信

      image-20221023183528459
    • 二维环面网络

      可以同时进行信息交换的节点更多

      造价更高

      image-20221023183648796
  • 间接互连

    • 交换器不一定与处理器直接相连

    • 间接网络中相对简单的例子:

      • 交叉开关矩阵

        区分共享互联网络中的交叉开关矩阵

        image-20221023192547825
      • Omega网络

        image-20221031082637682

一些定义(直接互连中)
  • 等分宽度(需要会计算

    • 衡量“同时通信的链路数目”或者“连接性”的一个标准

    • 想象并行系统被分成两部分,每部分都 有一半的处理器或者节点。在这两部份 之间能同时发生多少通信呢?

    • 例1:一个环的两种等分image-20221023184507171

      等分宽度求的是最少的情况下的同时通信链路数目

      这个环的等分宽度是2而不是4

    • 例2:一个二维环面网格的等分

      image-20221023185215144 image-20221023185239861

      把红线全部删掉才能把网格结构等分成两份,把两部分完全分开,由图一变成图二,要剪断8根线

      总结

      二维环面网格的等分宽度2*p^(0.5)

      p表示处理器的数目

  • 延迟

    • 指从发送源开始传送数据到目的地开始接受数据之间的时间
    • image-20221031082906633
  • 带宽

    • 传输数据的速度
    • 通常用兆位每秒或者兆字节每秒来表示
  • 等分带宽

    • 等分带宽=等分宽度×带宽
    • 用来衡量网络的质量
    • 不是计算连接两个等分之间的链路数,而是计算链路的带宽
几个直接互连的例子
  • 全相连网络

    • image-20221023190651837
    • 等分宽度太大,造价高,不切实际
  • 超立方体

    • 假如维度为d,则有2^d(p=2^d)个节点,等分宽度为p➗2
结构 图片 等分宽度(p为交换器数目)
image-20221023191549780 2
二维环面网状结构 image-20221023191734686 image-20221023191644099
超立方体 image-20221023191804315 image-20221023191829753

当p>4时,性能:超立方体结构>二维环面网状结构、环


下面这块是从w4l2开始的,中间部分老师跳过了

并行算法分析

基本指标(🌟必考)

  • 串行算法评价:

    • 算法时间复杂度表示为输入规模的函数
  • 并行算法评价

    • 除了输入规模之外,还需要考虑处理器的树木、处理器相对运算速度、通信速度

    • 运行时间

    • 加速比:选择串行算法最优的时间和并行算法时间做除法

      • 默认串行算法和并行算法所用的处理器相同

      image-20221102104746771

加速比

    • image-20221102105459233

      image-20221102105529255

    • 初始:每个进程保存一个数,最终由一个进程保存累加和

    • 树形结构:logn个步骤

      每个步骤进行一次加法:

      和一个机器字的传输

      image-20221102112240099

      没懂???

  • 例。加速比的计算(‼️考试容易考)

    • image-20221102112435610

    • p为核数

    • 搜索分解导致超线性的例子

      image-20221102113015030

阿姆达尔定律
  • 定义

    • 除非一个串行程序的执行几乎全部都并行化,否则不论多少可以利用的核,通过并行化所产生的加速比都会是受限的
    • image-20221102200500482
  • 例子

    • 理想化:0.9的可完全并行,拥有线性加速比image-20221102200035338

    • 从公式可以看出来,s和串行程序运行时间是无关的

效率

  • 效率:度量有效计算时间

  • image-20221102200902075

  • 例1

    • n个核对n个数求和
    • image-20221102201204778
  • 例2

    • image-20221102201235794

可扩展性

  • 我们希望,保持问题规模不变时,效率不随着线程数的增加而降低,则称程序是可扩展的

    • 强扩展的
  • 问题规模增大时,效率不随着线程数的增加而降低,则称程序是可扩展的

    • 弱扩展的
  • 例子

    image-20221102203837409

  • 例子:快速傅立叶变换

    • image-20221102204141865

并行程序设计的复杂性

  • 足够的并发度
  • 并发粒度
    • 独立的计算任务的大小
  • 局部性
    • 对临近数据进行计算
    • 尽量减少数据的计算,对离得比较近的数据进行计算
  • 负载均衡
    • 每个处理器工作量相近
  • 协调和同步

并行算法额外开销

  • 进程间通信
    • 也可能是线程通信
    • 最大开销,大部分并行算法都需要
  • 进程空闲
    • 负载不均,同步操作,不能并行化的部分
  • 额外计算
    • 最优串行算法难以并行化,将很差的串行算法并行化,并行算法计算量>最优串行算法
    • 最优串行算法并行化也会产生额外计算
      • 并行快速傅立叶变换
      • 旋转因子的重复计算

文章作者: zxn
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zxn !
  目录