芯片多处理器架构与编程模型解析

1. 芯片多处理器架构概述

芯片多处理器(CMP)在现代计算机系统中扮演着至关重要的角色。以Power 7处理器架构为例,每个核心都配备了分离的私有一级指令/数据缓存(I/D L1 cache)和统一的私有二级缓存(L2 cache),同时,芯片上还集成了一个容量高达32MB的共享三级缓存(L3 cache),该三级缓存采用嵌入式DRAM技术,将DRAM与随机逻辑和SRAM逻辑集成在同一芯片上。

CMP中所有核心所需的累积带宽,使得与片外资源的高带宽接口成为必需。因此,CMP是将系统组件集成到芯片上的关键驱动力。通过将点对点互连接口(如英特尔的快速路径互连QPI和AMD的超传输HT)集成到芯片上,多个芯片之间可以实现高带宽、低延迟的通信。此外,当前的CMP还将内存控制器集成到芯片上,以提供高内存带宽。例如,英特尔的Core i7通过其片上内存控制器支持高速DDR3内存,为所有核心共享的内存提供约21GB/s的带宽。然而,将系统组件集成到芯片上也存在缺点,即处理器会受到特定接口标准的限制。

1.1 异构核心的CMP

CMP在系统集成能力方面具有广泛的多样性,同时也提供了多种核心设计选择。从核心复杂度来看,CMP的一端可能由许多简单的按序核心组成,这些核心可以同时运行多个线程以提高吞吐量性能;另一端则可能只有少数几个大型、强大的乱序核心。大量的小核心适用于处理具有高并行线程数的工作负载,如商业或数据库工作负载;而少量的大核心则更适合提高单线程性能或处理线程并行性有限的工作负载。

在许多使用场景中,运行在CMP上的应用程序是异构的,会对系统的各个组件造成压力。如果CMP中的核心数量增加,而功率预算固定,那么每个核心的功率预算必须超线性下降。这是因为片上互连网络(如点对点网络)的功耗会随着核心数量的增加而超线性增长,从而导致每个核心可用的总功率减少。因此,依赖大型乱序核心的单线程性能在具有许多简单核心的CMP上会显著下降。大多数并行应用程序(除了一些科学代码外)都包含大量的顺序代码和并行代码,要在串行和并行代码上都实现良好的性能是一项具有挑战性的任务。

为了解决单线程和多线程应用程序需求之间的冲突,异构CMP是一种理想的解决方案。在异构CMP中,每个核心在性能或功能能力方面可以有所不同。实现性能不对称的方法有多种:
| 方法 | EPI范围 | 改变EPI的时间 |
| — | — | — |
| DVFS | 1:2 到 1:4 | 100 µs,斜坡Vcc |
| 可变资源 | 1:1 到 1:2 | 1 µs,填充L1 |
| 推测控制 | 1:1 到 1:1.4 | 10 ns,流水线刷新 |
| 混合核心 | 1:6 到 1:11 | 10 µs,迁移L2 |

  • 动态电压和频率缩放(DVFS) :根据应用程序的并行性程度动态调整核心的电压和时钟速率,从而改变每条指令消耗的能量(EPI)。
  • 动态改变核心可用资源 :根据应用程序的需求,动态调整核心可用的资源,如缓存的大小或关联性。当运行工作集较小的应用程序时,可以关闭一些缓存组,从而减少电容和动态功耗。
  • 推测控制 :通过限制飞行中指令的数量来改变EPI。当分支预测器的准确率较低时,这种方法可以避免因错误预测指令而浪费大量能量。
  • 混合不同类型的核心 :将简单的按序核心和复杂的乱序核心混合在一个处理器中,以实现最宽的EPI范围。

除了性能差异外,CMP中的核心还可以在功能上异构。例如,一个核心可以提供专门的加密支持,而另一个核心则只运行图形密集型代码。在性能异构的CMP中,工作负载可以在不同核心之间移动,最终用户只会注意到执行时间的差异;而在功能异构的CMP中,由于一个核心可能不支持另一个核心上运行的代码所需的功能,工作负载可能无法在核心之间移动。为了利用功能异构性,需要有明确的机制来在核心之间转移工作。

1.2 异构CMP示例

  • IBM Cell :结合了一个PowerPC处理元素(PPE)和八个协同处理元素(SPE)。PPE是一个能够处理复杂操作的双向SMT核心,而SPE是一个双发射按序处理器,每个周期最多可以发出两条SIMD指令。通过基于SIMD的SPE,Cell CMP的向量处理能力得到了显著增强。然而,SPE和PPE之间没有提供硬件内存一致性支持,需要程序员来确保一致性。
  • 英特尔Core i7 :通过电压/频率缩放(DVFS)来调节EPI,实现了一种更简单的异构性。其“Turbo Boost”技术可以根据工作负载和CPU利用率的变化动态调整核心的运行频率。当只有四个核心中的一个处于活动状态,并且芯片温度、功率和电流供应在额定范围内时,单个工作核心的时钟速率可以小幅度提高。

1.3 连体核心

在具有连体核心的CMP中,核心之间共享资源的粒度比共享缓存时更细。连体核心可以共享诸如算术逻辑单元(ALU)等资源。核心连体的动机是单个核心内资源利用率存在显著的时间多样性。例如,浮点功能单元等复杂资源占用了大量的芯片面积,但在大多数工作负载中利用率较低。连体核心通过高速互连将芯片内的核心和共享资源连接起来,实现了资源的精细共享。

为了实现高效的资源共享,CMP上核心的布局需要考虑核心对共享资源的访问模式。例如,如果一个浮点单元(FPU)在多个核心之间共享,那么每个核心的执行阶段在芯片布局中必须与FPU等距,以确保所有核心对该单元的访问延迟相同。此外,资源共享还需要仲裁机制来防止竞争核心在同一周期访问资源。

例如,Sun的SPARC T1处理器是一个连体核心CMP的典型例子。T1芯片上有八个核心,它们共享一个FPU以减少面积开销。每个核心都是细粒度多线程的,当执行过程中遇到浮点运算时,会将核心ID、操作码和输入操作数发送到共享资源,FPU计算结果后将其返回给请求核心,请求核心则会暂停等待浮点运算完成的线程的指令处理,转而从其他运行线程中获取指令。

2. 编程模型

芯片多线程技术使得在无需系统干预的情况下实现快速上下文切换成为可能,CMP的低延迟片上互连网络和共享末级缓存促进了核心间的通信。这些硬件特性使得应用程序开发人员能够生成更短的线程,并以更细的粒度进行通信。

2.1 独立进程

运行多个独立进程是充分利用多个线程上下文的一种简单方法。例如,桌面用户通常会同时运行多个应用程序,如网页浏览器、流媒体视频和文档编辑器等,这些应用程序相互独立,不共享任何数据或指令。将每个应用程序作为独立进程运行在单独的核心或线程上下文中,可以轻松利用多核芯片,无需用户或应用程序开发人员付出额外努力。

然而,这种方法的并行性受到用户活动的限制,并且独立进程无法利用CMP的共享资源,也无法利用线程间更短的通信延迟。例如,由于进程之间的干扰,每个进程的缺失率会增加,对片外内存的总线请求率升高会导致总线拥塞和更长的缺失惩罚,从而失去了共享L2缓存的优势。

2.2 显式线程并行化

多处理依赖于单个用户的多任务能力,并且在一台机器被多个用户共享时也很有用。虽然多处理可以提高CMP中的资源利用率,但单个用户任务的执行时间可能保持不变,甚至由于资源共享的负面影响而变差。到目前为止,单线程性能的提升主要通过指令级并行性(ILP)的开发和周期时间的减少来实现。随着在典型应用程序中提取ILP变得越来越困难,线程级并行性(TLP)成为提高应用程序性能的另一种方法。

应用程序程序员通过仔细理解应用程序的语义,识别可以并行执行的代码片段,将单个应用程序划分为多个线程,这些线程可以在多个线程上下文中并发运行,并相互紧密交互以交换数据。提取TLP对于CMP来说至关重要,否则通用架构将无法充分利用摩尔定律。然而,软件并行化是一项昂贵的工作,一些遗留软件可能由于用户的不情愿而无法进行并行化,而且许多关键软件(如编译器)也很难进行并行化。

为了帮助程序员管理并行线程的执行,存在一些软件库,如Pthreads和OpenMP。Pthreads为程序员提供了一个并行化API,程序员可以使用该库创建并发执行的线程、以互斥方式访问共享数据并调用同步函数。

OpenMP应用程序编程API以编译指示(pragma)的形式提供编译器指令,帮助应用程序开发人员识别哪些代码片段适合并行化。例如,通过在循环开始处插入OpenMP pragma,程序员可以指定该循环是可并行化的。OpenMP编译器和运行时会将这些pragma转换为尽可能多的并行线程,并为每个线程上下文分配一组循环迭代。例如:

#pragma OpenMP parallel for
(int i = 0; i < n; ++i){a[i] = b[i] × c[i]}
CPU# 运行在两个线程上下文 运行在四个线程上下文
1 i = 0 到 (n/2 - 1) i = 0 到 (n/4 - 1)
2 i = n/2 到 n i = n/4 到 (n/2 - 1)
3 - i = n/2 到 (3n/4 - 1)
4 - i = 3n/4 到 n

当底层硬件支持两个线程上下文时,OpenMP运行时可能会生成两个线程,每个线程并发运行总循环迭代数的一半;当有四个线程上下文时,运行时会自动生成四个线程,每个线程并发运行总循环迭代数的四分之一。在循环结束时,OpenMP运行时环境会自动插入一个屏障同步原语,确保每个线程等待所有线程完成其循环迭代。之后,运行时环境会暂停所有线程,只允许一个线程按顺序执行循环之后的代码。

下面是OpenMP库和运行时协同工作以实现并行执行和线程同步的简单流程:

graph LR
    A[并行循环pragma] --> B[转换为OpenMP库函数调用]
    B --> C[运行时探测可用线程上下文数量]
    C --> D[创建与硬件线程上下文数量相同的线程]
    D --> E[确定每个线程的循环开始和结束索引]
    E --> F[线程执行循环]
    F --> G[循环结束,插入屏障同步原语]
    G --> H[暂停所有线程,单线程执行后续代码]

综上所述,CMP的架构设计和编程模型为提高计算机系统的性能提供了多种途径,但也面临着一些挑战。在实际应用中,需要根据具体的工作负载和需求选择合适的架构和编程模型,以充分发挥CMP的优势。

2.3 线程通信开销对线程粒度的影响

线程通信开销会对线程粒度产生显著影响。下面通过一个简单的例子来说明这一点。

假设一个应用程序开发者需要决定一个循环的两个连续迭代(Iteration1 和 Iteration2)是否可以在两个不同的线程上下文中并行执行。假设 Iteration1 需要 T ns 完成,并在 T / 2 时刻产生 Iteration2 使用的值。Iteration2 运行 T / 2 ns,然后必须等待来自 Iteration1 的数据才能继续。

我们考虑三种情况:对称多处理机(SMP)、芯片多处理器(CMP)和多线程核心。在 SMP 中,值的通信需要 100 ns;在 CMP 中,核心之间的通信时间为 10 ns;在多线程核心中,通信时间为 0 ns。

2.3.1 SMP 情况

在 SMP 中,Iteration2 需要 T / 2 + 100 + T / 2 ns 完成。由于 Iteration1 和 Iteration2 并行执行,SMP 上的总执行时间为 T + 100 ns。如果这两个迭代在单个核心上顺序运行,假设 Iteration1 可以通过寄存器将数据无成本地传递给 Iteration2,总执行时间将为 2T ns。为了使 SMP 上的并行执行有益,必须满足 2T > T + 100,即 T > 100 ns。

2.3.2 CMP 情况

在 CMP 上运行相同的迭代时,并行执行有益的条件是 2T > T + 10,即 T > 10 ns。因此,为了利用 CMP 上的并行化,每个线程的大小只需要是 SMP 上线程大小的十分之一。

2.3.3 多线程核心情况

当两个线程在同一核心上运行时,从通信角度来看,并行化总是有益的。

这个例子表明,线程通信延迟越低,线程粒度可以越小,从而更有效地利用并行化。

3. 不同编程模型的比较与选择

3.1 不同编程模型的特点总结

编程模型 优点 缺点 适用场景
独立进程 无需额外编程努力,易于实现 并行性受用户活动限制,无法利用共享资源和低通信延迟 个人计算机和工作站的通用应用
显式线程并行化 可以提高应用程序性能,充分利用硬件资源 软件并行化成本高,部分软件难以并行化 需要提高单用户任务性能的场景

3.2 选择编程模型的考虑因素

在选择编程模型时,需要考虑以下因素:
1. 工作负载特性 :如果工作负载具有高并行线程数,如商业或数据库工作负载,大量小核心的 CMP 结合显式线程并行化可能更合适;如果是单线程性能要求高或线程并行性有限的工作负载,少量大核心的 CMP 可能更适合。
2. 硬件资源 :考虑硬件的核心数量、缓存大小、内存带宽等资源,以及硬件是否支持特定的并行化技术,如 DVFS 等。
3. 开发成本 :显式线程并行化需要投入更多的开发精力,需要评估开发团队的技术能力和时间成本。

3.3 决策流程

graph LR
    A[确定工作负载特性] --> B{高并行线程数?}
    B -- 是 --> C{硬件支持多核心并行?}
    C -- 是 --> D[选择显式线程并行化]
    C -- 否 --> E[考虑升级硬件或优化现有架构]
    B -- 否 --> F{单线程性能要求高?}
    F -- 是 --> G[选择少量大核心的 CMP]
    F -- 否 --> H[可考虑独立进程或其他合适模型]

4. 未来趋势与展望

4.1 技术发展趋势

  • 核心异构性增强 :未来的 CMP 可能会提供更多种类的异构核心,以更好地适应不同类型的工作负载。例如,可能会出现专门针对人工智能、机器学习等新兴领域的核心。
  • 集成度提高 :更多的系统组件将被集成到芯片上,进一步提高芯片的性能和效率。例如,可能会将网络接口、存储控制器等集成到 CMP 中。
  • 编程模型简化 :随着硬件技术的发展,编程模型可能会更加简化,降低软件并行化的难度。例如,可能会出现更智能的编译器和运行时环境,自动实现代码的并行化。

4.2 挑战与应对

  • 功耗管理 :随着核心数量的增加,功耗管理将成为一个关键挑战。需要采用更先进的功耗管理技术,如动态电压和频率缩放、电源门控等,以降低功耗。
  • 软件兼容性 :新的硬件架构和编程模型可能会导致软件兼容性问题。需要开发人员和硬件厂商共同努力,确保软件能够在不同的硬件平台上正常运行。

4.3 对行业的影响

CMP 技术的发展将对计算机行业产生深远影响。在数据中心领域,CMP 可以提高服务器的性能和效率,降低运营成本;在消费电子领域,CMP 可以提供更强大的计算能力,支持更复杂的应用程序。

总之,芯片多处理器架构和编程模型的发展为计算机系统的性能提升带来了新的机遇,但也面临着诸多挑战。我们需要不断探索和创新,以充分发挥 CMP 的潜力,推动计算机技术的不断进步。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐