文章目录
个人主页:丷从心·
系列专栏:并行计算
2.1|背景知识
冯·诺依曼结构
- 主存和 C P U CPU CPU之间的分离称为冯·诺依曼瓶颈
2.2|对冯·诺依曼模型的改进
指令级并行
多发射
- 多发射处理器通过复制功能单元来同时执行程序中的不同指令
- 如果功能单元是在编译时调度的,则称该多发射系统使用静态多发射,如果是在运行时间调度的,则称该多发射系统使用动态多发射
- 一个支持动态多发射的处理器称为超标量
硬件多线程
同步多线程
- 同步多线程是细粒度多线程的变种,通过允许多个线程同时使用多个功能单元来利用超标量处理器的性能
- 通过指定优先线程能够在一定程度上减轻线程减速的问题,优先线程是指有多条指令就绪的线程
2.3|并行硬件
SIMD系统
- 典型的冯·诺依曼系统是单指令流单数据流系统
向量加法
- 有两个数组 x x x和 y y y,每个都有 n n n个元素,把 y y y中的元素加到 x x x中
c
for (i = 0;i < n;i++)
x[i] += y[i]
- 假如 S I M D SIMD SIMD系统中有 n n n个 A L U ALU ALU,能够将
x[i]
和y[i]
加载到第 i i i个 A L U ALU ALU中,然后让第 i i i个 A L U ALU ALU将x[i]
和y[i]
相加,最后将结果存储在x[i]
中 - 在经典的 S I M D SIMD SIMD系统中, A L U ALU ALU必须同步操作,即在下一条指令开始执行之前,每个 A L U ALU ALU必须等待广播
向量处理器
向量寄存器
- 向量寄存器是能够存储由多个操作数组成的向量,并且能够同时对其内容进行操作的寄存器,向量的长度由系统决定
向量指令
- 只需要一次加载、一次加法和一次存储操作就能完成对长度为
vector_length
的数据块的操作
交叉存储器
- 内存系统由多个内存"体"组成,每个内存体能够独立访问
- 在访问完一个内存体之后,再次访问它之前需要有一个时间延迟,如果向量中的各个元素分布在不同的内存体中,那么在装入 / / /存储连续数据时能够几乎无延迟地访问
步长存储器访问和硬件散射/聚集
- 程序能够访问向量中固定间隔的元素
- 散射 / / /聚集是对无规律间隔的数据进行读(聚集)和写(散射)
向量编译器
- 向量编译器擅长于识别向量化的代码
- 能识别出不能向量化的循环而且能提供循环为什么不能向量化的原因
可扩展性
- 向量处理器不能处理不规则的数据结构和其他的并行结构,这对可扩展性是个限制
图形处理单元(GPU)
- 通过在每个 G P U GPU GPU处理核中引入大量的 A L U ALU ALU来使用 S I M D SIMD SIMD并行
- 为了避免内存访问带来的延迟, G P U GPU GPU严重依赖硬件多线程
MIMD系统
- M I M D MIMD MIMD系统通常是异步的,没有全局时钟
共享内存系统
- 在拥有多个多核处理器的共享内存系统中,互联网络可以将所有的处理器直接连到主存,称为一致内存访问 U M A UMA UMA系统,或者也可以将每个处理器直接连到一块内存,通过处理器中内置的特殊硬件使得各个处理器可以访问内存块中的其他块,称为非一致内存访问 N U M A NUMA NUMA系统
分布式内存系统
- 网格提供一种基础架构,使地理上分布的计算机大型网络转换成一个分布式内存系统
Cache一致性
- 在多核系统中,各个核的 C a c h e Cache Cache存储相同变量的副本,当一个处理器更新 C a c h e Cache Cache中该变量的副本时,其他处理器中 C a c h e Cache Cache的副本也应该更新
监听Cache一致性协议
- 监听协议的想法来自于基于总线的系统,当多个核共享总线时,总线上传递的信号都能被连接到总线的所有核"看"到
- 广播会通知其他核包含该变量的整个 C a c h e Cache Cache行已经更新
- 监听 C a c h e Cache Cache一致性协议是不可扩展的,对于大型系统,它会导致性能的下降
基于目录的Cache一致性协议
- 目录存储每个内存行的状态,这个数据结构是分布式的,每个核 / / /内存对负责存储一部分的目录
- 目录表示局部内存对应高速缓存行的状态
- 当一个高速缓存行被读入时,与这个高速缓存行相对应的目录项就会更新
- 当一个变量需要更新时,就会查询目录,并将所有包含该变量高速缓存行置为非法
伪共享
- C P U C a c h e CPU \ Cache CPU Cache是由硬件来实现的,硬件是对高速缓存行进行操作的,而不是对单独的变量进行操作
- 伪共享不会引发错误结果,但是它能引起过多不必要的访存,降低程序的性能
2.5|输入和输出
- 当多个进程能够访问
stdout
、stderr
或stdin
时,输入的分布和输出的顺序是非确定的
假设与规则
- 当并行程序需要输入 / / /输出时,做一些假设并遵循一些规则
- 在分布式内存程序中,只有进程 0 0 0能够访问
stdin
,在共享内存程序中,只有主线程或者线程 0 0 0能够访问stdin
- 在分布式内存和共享内存系统中,所有进程 / / /线程都能够访问
stdout
和stderr
- 只有一个进程 / / /线程会尝试访问一个除
stdin
、stdout
或者stderr
外的文件