第6章 并行处理器:从客户端到云
创建并行处理程序的难点
编写快速的并行程序是困难的。必须在多处理器上运行并行处理程序才能获得更好的性能或更高的能效(而传统上,单处理器已经使用超标量和乱序执行等技术实现了指令级的并行,且不需要程序员的参与)。
任务的分配(分配成计算消耗差不多的部分),额外引入的通信开销。
比例缩放:
强比例缩放:在保持问题规模不变时测量的加速比
弱比例缩放:问题规模与处理器数量成比例增长时测量的加速比
存储器层次结构可能会干扰传统上认为弱比例缩放比强比例缩放的观念。
SISD, MIMD, SIMD, SPMD 和向量机
SPMD:单程序多数据流,不同的处理器通过条件语句执行不同的代码段。
向量指令的优点:单个向量指令指定了大量工作,大大减少了取指和译码带宽。编译器或程序员通过向量指令显示地通知硬件,这些向量中的结果时相互独立的,硬件无需再检查数据冒险。同理也减少了循环带来的控制冒险。在功耗和能效方面更具有优势。
向量指令相比于多媒体扩展:向量指令的数据源数量与操作码无关而是存放在单独的寄存器中,所以无需像多媒体扩展一样当向量长度发生变化时添加一组新的指令操作码,只需改变该寄存器的内容即可,这保证了二进制代码的兼容性;向量数据的传输不要求是连续的,支持步长访问和索引访问。
向量体系结构没有在除高性能计算之外的领域流行:主要原因是担心向量寄存器的巨大状态会增加上下文切换的时间,以及加大处理向量加载和存储中的页错误的难度。
硬件多线程
硬件多线程允许多个线程以重叠的方式共享单个处理器的功能单元,从而有效利用硬件资源。
处理器必须复制每个线程的独立状态以支持这种共享。
线程切换需要比进程切换更加有效,线程切换是瞬时的,而进程切换需要数百到数千个处理器周期。
两种实现方式:细粒度多线程在每条指令执行后进行线程切换,通常以轮转的方式执行,并且跳过在该周期停顿的线程,优点是隐藏停顿引起的性能损失,缺点是减慢单个线程的执行速度。粗粒度多线程仅在高开销的停顿上切换线程,比如末级 cache 失效,几乎不会减慢单线程的执行速度,但缺点是降低吞吐量损失的能力有限,尤其是关于短停顿的(其主要原因是,流水线的启动开销)
同时多线程 SMT是硬件多线程的一种变体,它使用多发射、动态调度流水线的处理器资源来挖掘线程级并行和指令级并行。SMT 始终执行来自多个线程的指令,将资源分配交给硬件来完成。
多核及其它共享内存多处理器
共享内存处理器 SMP 为所有处理器提供统一物理地址空间——对多核芯片几乎总是如此,更准确的术语是共享地址多处理器。基于访问延迟分为统一内存访问 UMA 和非统一内存访问 NUMA 两种,后者的编程难度更高但同时也更容易扩展到更大规模。
统一地址空间支持共享,必须提供一套同步机制。
GPU 简介
GPU 是 CPU 的补充,不需要执行 CPU 上的所有任务,对于某些任务执行效果很差甚至完全不能执行是允许的。
GPU 不依赖多级 cache 来消除内存的长延迟,而是依靠硬件多线程来隐藏内存延迟。GPU 存储器面向带宽而不是延迟。
集群、仓储级计算机和其他消息传递多处理器
为每个处理器都提供私有物理地址空间,多处理器必须通过显式消息传递进行通信。
今天的多数超级计算机使用了自定义网络,比局域网的通信性能更好但昂贵得多。
将用户存储器分开存储,这是并行编程的弱点,但同时也是系统可靠性的优点。