《高性能科学与工程计算》——1.5 多线程处理器

1.5 多线程处理器

所有现代的处理器都以高度流水线化来提高性能(如果可以使用流水线)。前面提到,一些因素会影响流水线的高效利用:相关性、存储延迟、不确定的循环长度、指令混合以及分支判断错误等(参考2.32节)将导致流水线频繁等待,很大一部分执行资源处于空闲状态(见图1-19)。不幸的是,这种情况是规则而不是意外。为了提高时钟频率而尽可能设计长流水线会增加算法的复杂性,结果导致没有获得成比例的性能提升,处理器也会有更多的功耗。

正是由于这个原因,到很多现代的处理器设计中加入了线程,也叫做超线程技术(Hyper Threading)[V108,V109]或者实时多线程(Simultaneous Multithreading,SMT)。这种设计的特点是CPU核的结构状态多次复现在不同的线程中,结构状态包括数据、状态和控制寄存器,还有栈和指令指针,但诸如算术运算器、cache、内存接口等执行资源没有重复。由于多个结构状态的存在,CPU看起来像是包含了一组核(有时也叫逻辑处理器),可以并行执行多个指令流或者线程,而不用理会它们是否属于同一个程序。硬件必须记录指令属于哪个结构状态。所有线程共享这些执行资源,所以由流水线阻塞而产生的气泡可以用另外一个线程的指令来填充。如果存在并行运行的多个流水线(参见1.2.4节),一个线程搁置了或者多个流水线正处于空闲状态,则另一个线程就可以使用它们,参见图1-20。

https://yqfile.alicdn.com/7c07989f503f91eadb27bb9a234669e836d9d8f0.png
" >

SMT可以通过多种不同的方式实现。这些方式的一个不同点是在流水线上线程如何实现切换。理想的情况切换按周期发生,但是很多实现方式需要将流水线全部清空来支持另外一个线程,这会带来非常大的延迟。
如果多个线程的代码既可以发射在同一流水线内也可以发射在不同的流水线上,则SMT可以提高指令的吞吐量。如果不同的线程使用不同的执行资源,比如浮点运算和整数运算,就很容易提高吞吐量。一般以浮点操作为主的科学计算,经过很好的优化后,并不能从SMT中获益太多,但是也有例外:在一些架构上,内存引用表的数量与现线程数量一致时,同时运行足够多的线程就能够充分利用主存带宽。
如果对于拥有SMT的线程资源有限,单个指令流的性能不会提高,甚至会有小小地下降。并且,多个线程共享很多资源尤其是cache时,如果代码对cache容量敏感就很可能增加cache容量冲突(由高速缓存容量较小引起的容量冲突)。最后,SMT会严重增加同步操作的开销:如果同一物理核执行的几个线程都通过执行紧凑的自旋等待循环等待某些事件,它们将竞争共享的执行单元,这将导致很大的同步延迟。[132,133,M41]
如果系统上有多个物理核,并且操作系统和程序员了解SMT机制,那么在不同物理核上默认运行不同程序的线程和进程是一个不错的想法,但只有在确保安全时才使用SMT来提高总体性能。SMT的出现,仿射机制将比在多核芯片上更重要(参考1.4节和附录A)。对于手头的应用程序,需要彻底测试才能确定SMT机制是否能提高性能。如果不能在一个物理核上通过合适仿射应该只保留一个逻辑核,并且如果可能的话SMT应该被一起关掉。

时间: 2024-09-09 00:47:11

《高性能科学与工程计算》——1.5 多线程处理器的相关文章

《高性能科学与工程计算》——1.2 基于高速缓存的通用微处理器体系结构

1.2 基于高速缓存的通用微处理器体系结构 微处理器可能是人类发明的最复杂的机器.然而,就像前面章节中描述的那样,它们都基于存储程序数字计算机的概念.对于科学家而言,理解CPU所有内部工作细节是不可能的,也是不必要的,尽管把握其高级特性对于了解潜在的性能瓶颈是有帮助的.图1-2展示了现代基于高速缓存的通用微处理器的简图.对于一个运行的程序,真正执行计算的部分是仅占芯片一小部分的浮点型(FP)和整型(INT)计算单元.其他逻辑控制单元用来向计算单元提供操作数.一般将CPU寄存器区分为浮点数和整数两

《高性能科学与工程计算》——2.5 C++优化

2.5 C++优化 目前,有大量关于如何编写高效C++代码的文献[C92,C93, C94, C95].我们的目标不是取代它们.所以我们特意忽略了引用计数.写时复制.智能指针等关键技术.本节以循环代码为例,根据我们的经验指出C++编程中经常存在的性能错误和误解. C++编程存在着一个根深蒂固的假象:编译器应该能够识别高级C++程序包含的所有抽象和代码混淆.首先,C++是一门支持复杂管理的高级编程语言,且自身特征明显(如运算符重载.面向对象.自动构建/销毁等).然而,这些特征绝大多数都不适合编写高

《高性能科学与工程计算》——1.6 向量处理器

1.6 向量处理器 从Cray 1超级计算机开始,直到基于RISC的高度并行计算机出现之前,向量机一直占据着科学计算的主要领域.在写这本书时,只有两家公司还在制造和销售向量机.但因为对内存带宽和运行时间有高度需求,向量机还是有着一个充满商机的市场. 根据设计,对于合适的可向量化的代码,向量处理器相较于标准的微处理器可以达到一个较好的实际性能.这种设计遵循单指令多数据(SIMD)的范例,即一条简单的机器指令被自动地应用于很多类型相同的参数.许多现代的基于cache的微处理器以扩展SISD指令集的形

《高性能科学与工程计算》——第1章 当代处理器1.1 存储程序的计算机体系结构

第1章 当代处理器 在1975-1995年的"旧时代"的科学计算时期,先进的高性能系统是专门为HPC市场设计的,主要的厂商有Cray.CDC.NEC.Fujitsu和Thinking Machines等.在性能和价格方面,这些系统远远超越了标准的"商品"电脑.20世纪70年代初发明的单芯片通用微处理器,是20世纪80年代末唯一足够成熟.可以打入HPC市场的技术.直到20世纪90年代末,标准的工作站集群甚至基于PC的硬件至少在理论峰值性能上才具备相应的竞争力.如今,情

《高性能科学与工程计算》——1.3 存储层次

1.3 存储层次 数据以不同的方式存储在计算机系统中.前面章节提到,CPU有一组可以不延时访问的寄存器.另外,有一个或几个容量小但存取速度快的cache,用以保存最近被访问过的数据项副本.主存要慢得多,但是容量比cache大很多.最后,数据能够存放在磁盘上,在需要的时候再复制到主存中.这是一个复杂的层次结构,为了搞清楚它的性能瓶颈,理解数据在不同层次之间的传递原则是至关重要的.下面我们将集中描述从CPU到主存的各个层次(见图1-3).1.3.1 高速缓存 高速缓存是低容量.高速度的存储器,通常集

《高性能科学与工程计算》——2.4 编译器作用

2.4 编译器作用 通过利用编译器自动优化,高性能计算程序可以获得不同程度的性能改进.几乎每个现代编译器都可以在命令行上设置编译选项,以便对编译器优化目标程序进行细粒度控制.有些情况下可以简单地通过更换一个编译器来检查程序是否还存在性能提升空间.编译器需要进行复杂的工作以将高级代码编写成的源程序编译为机器代码,同时要顾及到处理器内部资源.本章和下一章讨论的一些优化方法可以在某些简单情况下被编译器实现,但是涉及复杂的情况时就无法用编译器自动完成优化工作.始终要注意的一点是编译器可能足够聪明但是又可

《高性能科学与工程计算》——2.2 优化常识

2.2 优化常识 简单的代码修改经常会带来性能的显著提升.下面的章节总结了避免性能缺陷的几个最重要的"优化常识".这些方法看似微不足道,但许多科学应用程序在应用这些方法后,性能都有了显著提升.2.2.1 少做工作 重新组织代码以减少代码工作量,在很多情况下可显著提升性能.最常见的例子是循环检测一组对象是否具有特定属性,任一对象具备该属性即可: 如果complex_func()函数没有其他作用,FLAG是唯一和循环外部通信的变量.这种情况下,FLAG值一经改变,就立即退出循环可明显减少计

《高性能科学与工程计算》——1.4 多核处理器

1.4 多核处理器 近年来并且至少在接下来的十年,虽然摩尔定律依然成立,但标准的微处理器开始遇到散热问题:数百万个晶体管芯片的开关和漏电功耗如此之大,使散热成为一个工程和商业主要关注的问题.另一方面,由于硬件架构方面的改进和cache尺寸的增加,促进了时钟频率不断提高,但已不足以获得符合摩尔定律1比1的性能提升.处理器厂商们正在寻找一种突破这种能耗性能瓶颈的新方法--多核设计. 对于半导体处理技术,CPU的功耗和时钟频率fc的三次方成比例(实际上是fc和电源电压Vcc的二次方的乘积,但是fc与V

《高性能科学与工程计算》——第3章 数据访存优化3.1 平衡分析与lightspeed评估

第3章 数据访存优化 在高性能计算中,访存是最重要的性能限制因素.如前所述,微处理器的理论峰值性能和访存带宽存在固有的"不平衡性".因为很多科学和工程应用程序由需要大量数据传输的基于循环的代码构成,所以相对较低的内存(甚至是硬盘)访存带宽,就会导致片上资源的低效利用和程序性能的降低.图3-1综合显示了现代并行计算机系统的数据通路构成,以及在不同层次上的带宽和延迟范围.执行计算任务的功能部件位于该层次结构的顶部.在这些不同层次的数据通路中,访存带宽最大有3-4个数量级的差异,访存延迟最高