并行程序设计-并行复习


并行复习

并行硬件与并行软件

冯诺依曼瓶颈

cpu去主存储器中去指令的过程比cpu执行指令要慢很多

三方面改进:

缓存

CPU Cache是一组相比于 CPU 主存更能快速访问的内存区域

虚拟内存(了解)

主存中放不下,把不常用的放到虚拟内存中

低层次并行

1)指令级并行

不是多核

让多个处理器或者功能单元 同时执行指令

两种实现方式

  • 流水线

    • ![image-20230220164322035](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220164322035.png)

      7000ns➡️1006ns

  • 多发射

    • 复制功能单元来同时执行程序中的不同指令
    • 静态多发射:功能单元在编译时调度
    • 动态多发射:功能单元在运行时间调度。 超标量

超标量

必须找出能同时执行的指令

猜测

![image-20230220170043087](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220170043087.png)

2)硬件多线程

分为3种

  • 细粒度 每条指令完成后都切换
  • 粗粒度 只切换那些需要等待较长时间而阻塞的线程
  • 同步多线程/超线程 真正意义上的同时 一个核上多个线程

Cache相关概念

局部性原理

程序访问完一个存储区域往往会访问接下来的区域

  • 空间的局部性
  • 时间的局部性

cache命中

cache缺失

cache的问题

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

Cache一致性

![image-20230220203121263](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220203121263.png)

z1的值取决于什么时候更新x

解决

  • 监听Cache一致性协议
  • 基于目录的Cache一致性协议

![image-20230221163041208](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230221163041208.png)

并行、多线程相关概念

1.1.3

SIMD MIMD(共享内存、分布式内存、网络连接等)

Flynn‘s分类法

![image-20230220171506418](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220171506418.png)

SIMD

数据并行

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

相同指令来操作数据子集

缺点

  • 所有ALU要么执行相同的指令,要么同时处于空闲状态
  • ALU同步操作
  • ALU没有指令存储器 一次只能执行一条指令
  • SIMD并行在大型数据并行问题上有用,但是处理其他并行问题并不优秀

向量处理器

对数组或者数据向量进行操作

向量寄存器 能够存储多个数组成的向量并操作

向量指令 在向量上操作

向量化和流水化的功能单元 对向量中每个元素做同样的操作

优点

  • 速度快 容易使用 向量编译器擅长识别向量化的代码
  • 编译器能够提供代码为什么不能向量化的原因
  • 内存带宽高 每个加载的数据都会使用

缺点

  • 不能处理不规则数据结构和其他的并行结构
  • 可扩展性受限 可扩展性:处理更大问题的能力

GPU

使用SIMD并行

并不是纯粹的SIMD系统

MIMD

多指令流多数据流

完全独立的处理单元或者核

每个处理单元或者核都有自己的控制单元和ALU

分为:

1)共享内存系统

内存共享

处理器通过访问共享的内存来隐式通信

一个/多个多核处理器 一块芯片上有多个CPU或者核

![image-20230220175039016](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220175039016.png)

分为两类

  • 一致内存访问系统

    ![image-20230220190140406](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220190140406.png)

  • 非一致内存访问系统

    ![image-20230220190203183](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220190203183.png)

2)分布式内存系统

集群

大多数混合系统

![image-20230220190316207](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220190316207.png)

互连网络

分为两类

  • 共享内存互连网络
  • 分布式内存互连网络
共享内存互连网络

1)总线互连

随着连接到总线的设备数量增加,竞争增加,性能会下降

2)交换互连网络

交换器

交叉开关矩阵

![image-20230220191320436](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220191320436.png)

分布式内存互连网络

分为两种

  • 直接互连
  • 间接互连

1)直接互连

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

![image-20230220191821362](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220191821362.png)

和总线互连不同:P1,P2,P3可以同时信息交换,因为有交换器控制

2)间接互连(了解)

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

例子

  • 交叉开关矩阵 和共享内存网络中的交叉矩阵不同
  • Omega网络
评价网络好坏 (掌握)

等分宽度 针对分布式内存网络 中的 直接互连网络

衡量同时通信的链路数目 连接性

计算方法:计数去除最少的链路数从而将节点分为两份

环 等分宽度=2

![image-20230220194912747](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220194912747.png)

二维网格结构 p为处理器数目

![image-20230220194747171](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220194747171.png)

带宽:传输数据的速度

等分带宽=带宽✖️等分宽度

如果在环中,链路的带宽是10亿位每秒,等分带 宽就是20亿位每秒

全相连网络

![image-20230220195555960](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220195555960.png)

超立方体

递归构造

维度 d。

节点数
$$
p=2^d
$$
等分宽度
$$
p/2
$$

总结

结构 二维环面 超立方体 全相连
等分宽度 2 ![image-20230220200426667](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220200426667.png) p/2 ![image-20230220200530472](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220200530472.png)

并行程序设计的复杂性

  • 足够的并发度
  • 并发粒度
    • 独立的计算任务的大小
  • 局部性
    • 临近数据
  • 负载均衡
    • 处理器任务量相近
  • 协调和同步

并行算法设计(竞争条件 数据依赖 同步等概念)

额外开销

  • 进程间通信 最大开销
  • 进程空闲 负载不均、同步操作、不能并行化的部分
  • 额外计算

W8L1里面

看书

或者W4L1乱七八糟

飞书共享空间ppt上没有

原子性:一组操作要么全部执行,要么全不执行。

临界区:一个更新共享资源的代码段,一次只能允许一个线程执行该代码段

竞争条件:多个进程/线程尝试更新同一个共享资源时,结果可能是无法预测的,则存在竞争条件。

数据依赖(data dependence):两个内存操作的序,为了保证结果的正确性,必须保持这个序。

同步(synchronization) :在时间上强制使执各行进程/线程在某一点等待,确保各进程/线程的正常顺 序和对共享可写数据的正确访问。

互斥:任何时刻都只有一个线程在执行
互斥量:互斥锁的简称,用来限制每次只有一个线程能进入临界区。保证了一个线程独享临界区。
障碍:阻碍线程继续执行,在此程序点等待,直到所有参与线程都达到障碍点才能继续执行

并行算法性能分析(加速比 效率 可扩展性 阿姆达尔定律)

串行:时间复杂度

加速比。

谁比谁‼️ 串行比并行

![image-20230220215838708](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220215838708.png)

选最优(没有最优的话选择普遍使用的)

例子:n个数相加

串行 O(n)

并行 树形结构 深度为logn 包括加法时间 数据传输时间=启动传输时间+传输过程时间 Tp=O(3logn)

![image-20230220220921233](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220220921233.png)

例子

串行起泡排序150s 串行快速排序30s 并行起泡排序40

S=30/40=0.75

p为核数

  • 一般S<=p
  • S=p 称该并行算法有线性加速比
  • S>p 超线性加速比 (了解即可

阿姆达尔定律

可并行化比例有限

![image-20230220223405214](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220223405214.png)

只和a和p有关系,和时间没关系

例子

![image-20230220223151683](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220223151683.png)

S<10

阿姆达尔定律:通过并行化产生的加速比受限

效率

![image-20230220223729564](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230220223729564.png)

例子

串行排序算法例子🌟

可扩展性

强可扩展。 问题规模不变。 很难达到

弱可扩展 问题规模增大

SIMD

适合应用的特点

  • 连续存储的
  • 短数据类型 8、16、32位
  • 流式数据处理 时间局部性 数据流重用

选择

应用

SSE AVX CUDA GPU 协处理器Xeon Phi 没有占压倒优势 科学计算

向量长度=寄存器宽度/类型大小

C/C++:内置函数、 intrinsics

SIMD编程的问题(打包解包、对其开销、控制流开销)

打包解包开销

打包 拷贝到连续内存区域

解包 拷贝回内存

对齐开销

未对齐的数据可能产生不正确的结果a

控制流 所有语句必须执行

分支语句

存在控制流问题时,SIMD不是一个好的编程模型

SIMD编程 W6L1

X86 32位

X64 64位

SSE 8个128位的向量寄存器

AVX 16个256位的向量寄存器

MMX 8个64位

支持数据类型 128位=16字节

整数 16字节、8short

数据类型 名字 字节 能放几个
dqword 16 1
short 2 8
int 4 4
long 8 2
float 单精度浮点数 4 4
double 双精度浮点数 8 2
char 2

SSE指令

  • 数据移动指令 将数据移入/出向量寄存器
  • 算术指令 多个数据(2doubles,4floats上的算术指令)
  • 逻辑指令 多个数据上的逻辑运算
  • 比较指令 多个数据上的比较运算
  • 洗牌指令 在SIMD寄存器内移动数据

SSE版本向量乘法

![image-20230221152105512](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230221152105512.png)

![image-20230221152048150](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230221152048150.png)

Pthread

并行程序设计的复杂性

Pthread一些基础API

同步相关概念

![image-20230221200946496](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230221200946496.png)

忙等待 互斥量 信号量 障碍

负载均衡 任务划分

![image-20230224185347606](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230224185347606.png)

MPI

![image-20230224194958501](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230224194958501.png)

隔离了独立地址空间

不会有数据竞争 但是可能有通信错误

暴露了执行模型,迫使程序员思考局部性,两点对性能都有好处

代码复杂

无共享变量 通信、同步都需要调用函数完成

提供以下类别的函数

通信

点对点通信 消息从特定的发送进程到特定的接受进程

多处理器参与的组通信

同步

障碍

无锁 没有共享变量需要保护

查询

允许接受的量比指定少,接收到更多数据就是错误

强数据类型传输

消息中的数据用三元组(地址、个数、类型)描述

send receive完成了数据传输 同步

编程模型

![image-20230224215719598](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230224215719598.png)

混合编程

![image-20230224221353584](/Users/zhangxiaoni/Library/Application Support/typora-user-images/image-20230224221353584.png)

所有MPI实现均支持MPI_THREAD_SINGLE

绪论

推动并行计算的原因

频率已经不是处理器发展的主角

功耗/散热的限制

性能上升放缓

多核、众核成为之后CPU的发展趋势

超算发展

Top 1 Frontier:性能最强,能效最高

我国Top1:神威·太湖之光 自研的 2016

2020年,Summit,获得戈登贝尔奖的是中美合 作的团队 夺冠,“基于机器学习将分子动力学 计算精度极限推广到1亿个原子”


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