分享

CPU 单核性能为什么难以提升?

 金刚光 2023-07-18 发布于辽宁
木头龙
中央处理器 (CPU)等 3 个话题下的优秀答主

0202年的今天,提升单核性能真的很难


单说x86的话,从第一代的8086发布以来,提升单核性能的方法几乎都用过了,但除了提高频率以外,其它方法都有其适用范围和限制。


先说提高频率的难度。提高频率会碰到功耗问题。CPU是无数晶体管构成的,每个晶体管的可以视为电容,整个CPU功耗是  。其中α是工作晶体管的比例,特定的CPU运行特定的代码,这个比例是固定的;C是整个CPU所有晶体管等效电容之和,对于特定的CPU,也是固定的;f是CPU工作频率;U是CPU的工作电压。


有超频经验的都知道,CPU频率高了会不稳定,需要提高电压。这是因为电容充放电速度跟不上频率,要充放电更快就要更高的电压。打个比方,你要更快放满一桶水,就要把水龙头开更大。因此f越高,U也越高。上面的公式可以改为  ,其中β为电压~频率系数。所以,提高频率,功耗会以频率三次方的比例提高。半导体工艺的提升,可以有降低电容C,降低β的值。结果就是同样架构,新制程的CPU同频率下功耗可以更低,或者同样的功耗频率可以更高——但每一代新工艺的研发、投产都需要解决一系列的问题,以及大量的资金投入。最近几代CPU厂家的架构优化,主要是让不参与运算的晶体管关闭或者低速运行,降低α的值,但现在基本上已经降得差不多了,再优化也不会有太大的效果。事实上Intel在十五年前已经有可以运行在3.8GHz的奔腾4,而十五年后的今天,经过多次制程提升后,单核睿频最高频率不过5.0GHz。


在频率无法继续大幅提高提升的现在,要提升CPU单核性能,也不是没有其它手段。以IPC(Instructions Per Cycle/Clock,每时钟周期指令数,衡量CPU在相同频率下性能的一个重要指标)来说,CPU历史上出现过的比较有效的提升IPC方法有:

1、减少执行单个指令需要的时钟周期限制是很多常用指令本身就只需要一个时钟周期,不可能再少了。即使是还需要多个时钟周期执行的指令,最常用的传统指令经过这么多年来的优化,也基本没有优化空间了。


2、指令流水线现代工厂流水线生产可以提高效率,CPU也一样。指令数据从内存加载到正式执行,要经过一系列的处理如解码、指令分解、指令合并、数据准备等。用类似工厂流水线方式来处理,可以有效提高指令执行效率。限制是如果出现跳转指令(汇编里面的各种JMP、高级语言里的if/循环等),需要清空流水线重新加载指令。流水线级数越多,效率越高,但清空流水线导致的性能损失越大。为了降低这个问题的影响,现代CPU通常有分支预测机制。但分支预测既然是预测,总有预测错误的时候,并不能完全消除性能损失。


3、指令并发。使用多个相同或者不同的运算单元,可以同时运行,使得单个时钟周期可以执行更多指令。限制则是很多应用中,指令之间是有前后顺序的,执行后面的指令需要等待前面指令的运算结果。说句题外话,这是超线程技术工作的前提之一:应用不能有效利用上多个运算单元,闲置的运算单元可以用来处理另外一个线程的代码。


4、增加新指令,这个具体分两种情况:

SIMD(Single Instruction Multi Data,单指令多数据),x86的SSE、AVX指令都是这类指令。最新的AVX512指令,一条指令对8个64位浮点数进行相同的处理,相当于性能提升了8倍。限制在于一是应用要对这样的指令进行优化且优化后的代码无法在之前的CPU上执行;二是仅适用于一批数据都进行相同处理的场景,即使是海量数据处理的应用,这样的代码占比也很少很高。例如H265视频编码应用x265,数据量足够海量了,但从AVX512得益很小。此外,大部分可以对AVX512优化的计算,用GPU处理能获得更好的性能。


新增等效于某种常见指令组合的指令。原来多个指令执行需要多个时钟周期,合并后的单条指令可以在一个时钟周期执行完成。例如FMA指令,就是一条指令计算A×B+C,而无需分两个时钟周期计算。这种指令一般来说现有程序直接就能用上,无需优化。限制在于只对特定代码有效,还是以FMA为例,更普遍的普通加法、乘法运算都不能从中获益。


5、减少等待时间。CPU比内存速度快得多,经常需要等待来自内存的指令或者数据,这个时间通常高达数十上百个时钟周期。提高内存性能是根本方法,但一方面内存容量越来越大,需要更多时钟周期进行寻址;另一方面内存性能总无法和CPU比。现在CPU采用了几个方法来降低指令/数据的等待时间:

多级CPU内部缓存。在数据使用前加载到CPU内更快的缓存中,最快的一级缓存等待时间是1~3个时钟周期。限制在于对于不在缓存中的数据,还是要等待数十上百个周期——按50周期算的话,不考虑并发和指令执行时间,缓存命中率达到98%,才能发挥一半的理论性能。然而实际情况中,大部分应用都无法达到这个命中率。


乱序执行。就是某个指令需要的数据需要从内存加载的时候,一边加载数据,一边先执行后面的指令。限制和指令并发类似,很多后续指令是需要前面指令的执行结果才能正确执行的。


集成主存控制器。最早的CPU是没有单独的内存控制器的,随着CPU频率越来越高,低速的内存成为CPU提升频率的阻碍,因此CPU厂家使用了前端总线,CPU通过高速的前端总线和主板的北桥芯片连接,北桥上有内存控制器用来访问内存。但北桥本身会带来更高的延迟。从AMD K8开始,CPU集成内存控制器,有效降低了访问内存的延迟。


上述这些技术,除了指令优化外,每个首次应用的时候都能给CPU性能带来大幅提升,然而这些基本上都是二十年前已经出现了,也就集成内存控制器稍微晚点,也有十七八年了。换句话说,近十多二十年来,并没有新的可以大幅提升CPU单核性能的技术出现。不管是AMD还是Intel,都只能是对这些技术做小幅优化。尤其是最常见的传统代码,几乎是已经没有优化空间了,Intel最新的Icelake架构,虽然说是综合IPC提高18%,但事实上,对于传统x86/x87指令,提升幅度很小不到10%,甚至某些应用中反而是有轻微下降。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多