芯片多处理器技术全解析
在当今的计算领域,芯片多处理器(CMP)正逐渐成为主流。本文将深入探讨芯片多处理器的相关技术,包括其背后的原理、核心多线程技术等内容。
1. 芯片多处理器的兴起
芯片多处理器架构的发展主要源于技术需求。自2000年以来,进一步提升单核微处理器的性能变得徒劳无功,而芯片上集成的晶体管数量却在不断增加。多处理器架构能够利用这一趋势,若能解决并行编程问题,CMP将为构建大规模计算机系统提供机会。
1.1 技术趋势
随着硅技术的发展,单芯片上可集成数十亿个晶体管,芯片多处理器时代已然来临。从双核处理器开始,由于摩尔定律,芯片上的CPU核心数量预计将呈指数级增长。
在CMP时代之前,晶体管数量的增加主要用于提升单线程性能,主要通过利用指令级并行性(ILP)实现。例如,增加流水线中的飞行指令数量、加深流水线深度以及采用激进的推测技术等。然而,这些改进也带来了一些问题,如微架构结构面积的二次增长、分支预测错误惩罚的增加等。
此外,过去硅工艺技术的进步伴随着电源电压的降低,从而降低了芯片功耗。但近年来,电源电压降低的速度显著放缓,使得降低芯片功耗变得更加困难。芯片行业意识到,通过增加功耗来提升ILP的方式是不可持续的,因此开始转向线程级并行性(TLP)。
| 处理器型号 | 飞行指令数量 | 单周期调度指令数量 |
|---|---|---|
| Pentium Pro(1995年) | 20 | 1 |
| Pentium 4(2000年) | 128 | 4 |
1.2 机遇
CMP的出现为构建大规模多处理器系统提供了新机遇。与传统的共享内存多处理器(SMP)系统相比,CMP的多个核心紧密集成在单个芯片上,不仅实现了高效的主内存共享,还能共享物理资源,如缓存或协处理器。这种紧密集成显著降低了核心间的通信延迟,从SMP系统中的数百个周期降至数十个周期。
CMP已实现大规模量产,将并行计算的概念引入到各个领域,包括PC和移动设备。在这些设备中,独立进程的多任务处理也存在大量的并行性。核心多线程技术进一步挖掘了并行性,通过时间复用核心资源,提高了处理器资源的利用率。
2. 核心多线程技术
核心多线程技术允许在单个核心内并发执行多个线程,其主要目的是在面对长延迟事件时最大化硬件利用率和吞吐量。这一概念可以追溯到早期的商用计算机。
2.1 软件支持的多线程
在早期的计算时代,计算系统资源被认为是宝贵且昂贵的。I/O设备的速度远低于电子设备,因此分时操作系统通过多个进程并发运行来共享或时间复用计算资源,以最大化硬件资源的利用率。
在分时系统中,活动进程被分配内存资源,当处理器资源可用时即可运行。当运行的进程因长延迟操作(如磁盘文件读取、页面错误等)受阻时,操作系统会进行上下文切换,将受阻进程从就绪列表中移除,放入等待列表,并调度另一个就绪进程执行。
上下文切换需要以下步骤:
1. 捕获正在运行的进程并刷新流水线。
2. 操作系统内核运行,将当前进程的架构状态保存到进程控制块中,并启动与陷阱关联的处理程序。
3. 内核恢复另一个就绪进程的架构状态并运行该进程。
软件多线程几乎不需要硬件支持,通常完全在软件中实现,如Windows和Linux内核。其优点是灵活性高,操作系统可以选择性地保存和恢复真正可见的架构状态。
mermaid
graph TD;
A[运行进程] –> B[长延迟操作];
B –> C[操作系统捕获进程];
C –> D[刷新流水线];
D –> E[保存架构状态];
E –> F[选择就绪进程];
F –> G[恢复架构状态];
G –> H[运行新进程];
2.2 硬件支持的多线程
随着处理器和内存速度差距的扩大,处理器因等待内存事件而闲置的情况越来越多。尽管乱序执行、推测执行和内存预取等技术在一定程度上隐藏了内存延迟,但缓存缺失事件导致的处理器资源利用率低下问题在20世纪90年代变得尤为突出。
因此,在发生相对较短的延迟事件(如线程同步失败、一级或二级缓存缺失、TLB缺失等)时,暂时挂起线程的执行变得更加高效。这种硬件支持的核心多线程技术使得多个线程动态共享核心资源。
每个线程在核心中运行在一个硬件线程上下文中,操作系统几乎不需要进行更改来支持核心多线程,因为内核将各个线程上下文视为单线程核心一样的处理资源。
我们采用以下术语:
- 活动线程:分配了内存资源(如页表)的线程或进程,可能处于阻塞或就绪状态。
- 阻塞线程:等待操作系统事件(如I/O完成或信号量释放)的活动线程。
- 运行线程:分配到线程上下文且未因长延迟事件暂时挂起的就绪线程。
例如,在单线程的五级流水线中,核心在缓存缺失时会冻结。假设每20个周期发生一次缓存缺失,L1缓存缺失在L2中找到数据需要20个周期,L2也缺失则需要200个周期,L2缓存缺失每200个计算周期发生一次。在无缓存缺失时CPI为1,即L1的每条指令缺失数(MPI)为0.05,L2的MPI为0.005。考虑缓存缺失延迟后,实际的CPI是多少呢?这一问题有助于我们理解缓存缺失对流水线性能的影响。
3. 核心多线程的具体实现方式
根据从多个就绪线程中提取指令的方式和时间,核心多线程有三种实现方式,分别为块多线程、交错多线程和同时多线程。
3.1 块多线程
块多线程是指在一个线程遇到长延迟事件(如缓存缺失)时,核心会完全切换到另一个线程执行,直到该线程也遇到长延迟事件或执行完毕。这种方式的优点是实现相对简单,硬件改动较小。但缺点是在切换线程时会有一定的开销,并且在一个线程执行期间,其他线程的资源处于闲置状态,资源利用率不够高。
3.2 交错多线程
交错多线程以固定的时间间隔在多个线程之间切换执行。例如,每个线程执行一个或几个指令周期后就切换到下一个线程。这种方式可以更均匀地分配核心资源,提高资源利用率。但频繁的线程切换会带来一定的开销,并且可能会影响某些线程的执行效率。
3.3 同时多线程
同时多线程允许在一个时钟周期内从多个线程中提取多条指令同时执行。它通过增加硬件资源(如多个指令提取单元、多个寄存器组等)来实现多线程的并行执行。这种方式可以最大程度地提高核心的资源利用率和吞吐量,但需要更复杂的硬件设计和调度算法。
| 多线程方式 | 优点 | 缺点 |
|---|---|---|
| 块多线程 | 实现简单,硬件改动小 | 切换开销大,资源利用率低 |
| 交错多线程 | 资源分配均匀 | 切换开销大,可能影响线程效率 |
| 同时多线程 | 资源利用率和吞吐量高 | 硬件设计和调度算法复杂 |
4. 芯片多处理器的架构类型
芯片多处理器可以分为同质和异质两种架构类型。
4.1 同质芯片多处理器(CMP)
当一个CMP上的所有核心都相同时,称为同质CMP。这种架构的优点是设计和编程相对简单,因为所有核心具有相同的功能和性能。开发人员可以更容易地编写并行程序,并且可以利用现有的软件工具和库。例如,在一些服务器和桌面计算机中,经常使用同质CMP来提高系统的整体性能。
4.2 异质芯片多处理器(CMP)
异质CMP的核心在功能和性能上有所不同。例如,一些核心可能专门用于处理计算密集型任务,而另一些核心则用于处理I/O密集型任务。这种架构可以根据不同的应用需求灵活分配资源,提高系统的效率。但异质CMP的设计和编程复杂度较高,需要开发人员根据核心的特点进行优化。
5. 并行编程模型
随着CMP的普及,并行编程变得至关重要。以下介绍几种常见的并行编程模型。
5.1 共享内存编程
在共享内存编程模型中,多个线程可以访问相同的物理内存。这种模型在传统的共享内存多处理器(SMP)系统中已经得到广泛应用。在CMP中,由于核心之间的紧密集成,共享内存的效率更高。但共享内存编程需要处理线程同步和数据一致性问题,以避免数据竞争和错误。
5.2 事务性内存(TM)
事务性内存是一种新的并行编程模型,它可以减轻选择最佳锁粒度的负担。TM允许程序员将一组大量的指令组合成一个单一的事务,以粗粒度的方式处理线程交互。当事务执行失败时,硬件可以协助进行事务回滚和重新执行。例如,在数据库应用中,事务性内存可以提高并发操作的效率。
事务性内存编程模型的实现需要对硬件进行一些修改,以支持事务提交和事务回滚。具体步骤如下:
1. 定义事务:程序员将一组指令标记为一个事务。
2. 事务执行:硬件开始执行事务,同时监控事务的执行状态。
3. 事务提交:如果事务执行成功,硬件将事务的结果提交到内存。
4. 事务回滚:如果事务执行失败,硬件将恢复事务执行前的状态,并重新执行事务。
mermaid
graph TD;
A[定义事务] –> B[事务执行];
B –> C{执行成功?};
C – 是 –> D[事务提交];
C – 否 –> E[事务回滚];
E –> B;
5.3 线程级推测(TLS)
线程级推测是一种硬件辅助的并行化方法,它可以从顺序程序中生成并行线程。推测并行化需要额外的硬件来在推测失败时回滚架构状态。例如,在循环并行化中,TLS可以通过推测执行来提高循环的执行效率。但TLS也需要额外的硬件来检测内存和寄存器危险,以确保推测执行的正确性。
6. 其他编程范式
除了上述并行编程模型外,还有一些其他的编程范式可以利用CMP中的大量线程。
6.1 辅助线程
辅助线程可以用于加速不可并行化代码的执行。例如,在某些程序中,存在一些代码段无法进行并行化,但可以通过辅助线程来提前处理一些数据或执行一些预处理任务,从而提高整体程序的执行效率。
6.2 冗余线程
冗余线程可以用于增强系统的可靠性。通过在系统中运行多个相同的线程,当一个线程出现错误时,可以使用其他线程的结果来保证系统的正常运行。例如,在航空航天和医疗设备等对可靠性要求较高的领域,冗余线程可以提高系统的容错能力。
综上所述,芯片多处理器技术为计算机系统的性能提升带来了新的机遇。通过核心多线程技术、不同的架构类型和并行编程模型,我们可以充分挖掘CMP的潜力,构建更加高效、可靠的计算机系统。但同时,我们也需要面对并行编程带来的挑战,如线程同步、数据一致性和硬件设计的复杂度等问题。未来,随着技术的不断发展,芯片多处理器技术将在更多领域得到应用和发展。
超级会员免费看

被折叠的 条评论
为什么被折叠?



