Intel64及IA-32架构优化指南第8章多核与超线程技术——8.1 性能与使用模型

本章描述了为多线程应用的软件优化技术,这些多线程应用运行在使用多处理器(MP)系统或是带有基于硬件多线程支持的处理器环境中。多处理器系统是具有两个或多个插槽的系统,每个插槽都配有一块物理处理器包。提供了硬件多线程支持的Intel 64与IA-32处理器包括双核处理器、四核处理器以及支持HT技术的处理器[注:在Intel 64与IA-32处理器中硬件多线程支持的存在性可以通过检查CPUID.01H:EDX[28]特征标志来检测。位28的返回值指示了至少有一种硬件多线程的形式在物理处理器包内存在。在每个包中所存在的逻辑处理器的个数也可以从CPUID来获取。应用程序必须通过适当的操作系统调用来检查有多少逻辑处理器被允许并且对应用程序可用。]。

在一个多线程环境中的计算吞吐能够增加,由于添加了更多硬件资源来利用线程级或任务级的并行。硬件资源可以以多种形式添加,物理处理器、每个包的处理器核心、以及/或每个核心的逻辑处理器。因此,多线程优化具有应用跨MP、多核、以及HT技术的一些方面。还有一些特定的架构上的资源可以在不同的硬件多线程配置中被不同地实现(比如:执行资源不会跨不同核心来共享,但在同一个核心中的两个逻辑处理器可共享,若允许HT技术的话)。本章覆盖了应用这些情景的准则。

本章涵盖了

●  性能特征和使用模型

●  对多线程应用的编程模型

●  在五个特定领域的软件优化技术


8.1 性能和使用模型


使用多个处理器、多核处理器或HT技术的性能增益极大地受使用模型以及工作负载的控制流中的并行度的影响。两个通常的使用模型是:

●  多线程应用

●  使用单线程应用的多任务


8.1.1 多线程


当一个应用引入多线程来挖掘一个工作负载的任务级并行时,多线程软件的控制流可以被划分为两个部分:并行任务和顺序任务。

Amdahl定律描述了一个应用在把它与控制流中的并行度相联系时的性能增益。对于选择代码模块、函数或指令序列,它是一个有用的指南,而我们最可能意识到将这些从顺序任务以及控制流转换为并行代码以利用多线程的硬件支持来获得大部分的利益。

图8-1描述了根据Amdahl定律,性能增益如何能为工作负载而被认识到。图8-1中的条表示了一个独立的任务单元或整个应用的所有的工作负载。

通常来说,在带有N个物理处理器的一个MP系统上运行多个线程的提速,相比于单个线程的执行,可以被表达为:

这里,P是负载中能被并行的部分,而O表示多线程的负荷[译者注:包括线程的创建、切换、同步、通信、销毁等],它在不同的操作系统中会有所不同。在这种情况下,性能增益是相对响应的倒数[译者注:即并行部分运行的时间占用越多,增益越大]。

当在一个多线程环境中优化应用性能时,控制流并行相对于物理处理器的个数以及每个物理处理器的逻辑处理器的个数可能会对性能缩放比具有最大影响。

如果一个多线程应用的控制流包含一个工作负载,在此负载中只有50%可以被并行执行,那么使用两个物理处理器的最大性能增益相比于使用单个处理器只有33%。使用四个处理器只能给予相对于一单个处理器最多60%的提速。因此,最大化控制流可利用的并行部分是十分重要的。对线程同步的不恰当的实现可能严重地增加串行控制流的比重,并从而降低了应用的性能增量。

除了最大化控制流的并行度之外,在线程之间以线程同步形式的交互以及任务调度的不平衡也对整个处理器的性能度量产生巨大影响。

过度的Cache失败是导致差强人意的性能增长的一个因素。在一个多线程执行环境中,它们会由以下情况发生:

●  在同一进程中被不同线程的混淆的栈访问[译者注:一个进程中的每个线程具有独立的栈空间,因此在多个不同线程被并行执行时,对栈的访问可能会对它们所共享的Cache造成影响。]

●  线程竞争导致Cache行逐出

●  在不同的处理器之间对Cache行的错误共享

针对这些情况(以及许多其它领域)的技术在本章的各小节中描述。


8.1.2 多任务环境


在Intel 64以及IA-32处理器中的硬件多线程特性,在一个工作负载由若干单线程应用所组成时,并且这些应用在一个有MP能力的操作系统下被调度并发运行时,就可利用任务级并行了。在此环境下,硬件多线程特性可以给予工作负载更高的吞吐,尽管一个单任务(就相对于同一个任务在一个单线程环境下所完成的时间而言)的相对性能,根据有多少共享的执行资源和存储器可利用而有所不同。

为了开发目的,几个主流的操作系统包含了管理任务调度以及在每个物理处理器内的共享执行资源平衡的OS内核代码,来最大化吞吐。

因为应用在一个多任务环境中独立地运行,所以线程同步问题不太可能限制吞吐增减。这是因为工作负载的控制流可能是100%并行的[注:试图测量一个多任务工作负载的一款软件工具可能会引入非并行的控制流。线程同步问题必须作为其性能测量方法的一个构成所需要的部分来被考虑。](如果没有发生处理器间的通信并且没有系统总线的限制)。

然而,伴随一个多任务工作负载,总线活动和Cache访问模式可能会影响吞吐的增减。运行同一个应用程序的两个拷贝或以一个锁步运行同一套应用程序会暴露一个人工性能测量方法。这是因为对第一级数据Cache的访问模式会导致过多的Cache失败从而产生斜交的(非对称的)性能结果。通过以下方法来修正此问题:

●  在一个应用的起始处包含一个每个实例的偏移

●  通过使用应用的每个实例的不同数据集来引入工作负载的异构性。

●  当运行同一套应用的多个拷贝时,随机化应用的启动顺序

当两个应用作为一个多任务的工作负载而被使用时,在这两个进程之间只有很少的同步负荷。确保每个应用在其内部具有最少的同步负荷也是很重要的。

一个为进程内同步而使用冗长的旋锁循环的应用,在一个多任务负载中不太能从HT技术获利。这是因为临界资源将被长长的旋锁循环而耗费。

posted @ 2013-05-03 14:11  zenny_chen  Views(589)  Comments(0Edit  收藏  举报