好问题,或者至少有一个有趣的答案。该答案的一部分描述了一个世界,在这个世界中,CPU 可以有效地扩展宽度,而无需使用多个单独的内核。许可/价格模式将有所不同!
其余的解释了为什么他们不能。摘要:
- 多核的成本接近线性增长
- 扩大1个核的超标量流水线规模的成本大约 是四分之一,这是可行的,只要有足够的蛮力就可以了。单线程性能对于交互使用非常重要(端到端延迟很重要,而不仅仅是吞吐量),因此当前的大核高端CPU会为此付出代价。例如Skylake(4宽),Ryzen(5或6宽)和Apple的A12(大型核7宽,小型节能核3宽)
- IPC的收益严重减少,只是将管道扩展到超过3或4宽度,即使执行顺序混乱以找到ILP。分支未命中和缓存未命中很难,并且仍然使整个管道停滞不前。
您没有提到频率,只是IPC,但缩放频率也很困难。更高的频率需要更高的电压,因此功率与频率成正比:^1
直接来自频率,也^2
来自电压。(电容器存储的能量随V ^ 2缩放,除泄漏电流外的大多数动态功率来自将电荷泵入FET栅极+导线的电容性负载。)
性能=频率乘以IPC。(在相同的体系结构中。较宽的SIMD可使您用较少的指令完成相同的工作,并且某些ISA比其他的ISA密集,例如,与x86或AArch64相比,MIPS经常需要更多的指令来完成相同的工作。)
成本以模具面积(制造成本)和/或功率(由于冷却困难而间接限制频率)表示。而且,降低每瓦的功率和性能本身就是一个目标,特别是对于移动(电池)和服务器(功率密度/冷却成本/电成本)而言。
在每个插槽都使用多核之前,您确实有针对高端用例的多插槽系统,在这些系统中,您想要的吞吐量要比可以制造的单个CPU所能达到的要高,因此,这是唯一的SMP系统。(服务器,高端工作站)。
如果单个内核可以按您希望的那样高效地扩展,我们将为每个插槽配备1个物理内核的系统以及SMT(例如HyperThreading)使它们充当多个逻辑内核。 典型的台式机/笔记本电脑只有1个物理核心,因此我们不会费力地将无法线性扩展的事物与更多核心并行化。例如make -j4
,利用多路服务器,和/或隐藏台式机上的I / O延迟。(或者,如果可以轻松地扩展管道宽度,但IPC不能轻松地扩展管道宽度,那么我们仍然会尝试并行化很多东西,因此我们不得不使用更多的SMT线程。)您的OS内核仍然需要跨所有逻辑内核运行,除非采用CPU方式。目前SMT与OS的区别很大,因此仍然需要并行调度算法和锁定。
唐纳德·克努斯(Donald Knuth)在2008年的一次采访中说
对于当前的多核体系结构趋势,我也可能会对自己的不满情绪有些不满。在我看来,这似乎或多或少地像是硬件设计师的想法已经用尽,他们正试图通过让我们的机器仅在少数几个机器上运行得更快,就将摩尔定律的未来消亡归咎于软件作者。关键基准!
是的,如果我们可以拥有奇迹般的单核CPU,其吞吐量是真实程序的 8倍,那么我们可能仍会使用它们。仅当需要为更大的吞吐量付出更多的代价(而不是单线程性能)时才使用双插槽系统。
当多个程序正在运行时,多个CPU可以减少上下文切换的成本(通过让它们真正地并行运行而不是在它们之间快速切换来实现);先发制人的多任务处理中断了CPU所需的大量乱序机器,其危害可能比现在更大。
从物理上讲,它将是单核(对于一个简单的缓存层次结构,在核之间没有互连),但是支持SMT(例如,英特尔的HyperThreading),因此软件可以将其用作8个逻辑核,以动态竞争吞吐量资源。或者,当只有1个线程正在运行/没有停止时,它将获得全部好处。
因此,您可以在实际上更容易/自然的情况下使用多个线程(例如,同时运行单独的进程),或者针对容易并行化的依赖链问题,这些问题会阻止最大限度地利用此线程的IPC。
但是,不幸的是,在Knuth方面,一厢情愿的想法是,多核CPU将永远不再成为现实。
单线程性能扩展
我认为,如果他们使1核等效于8核CPU,那么一个核的IPC将增加800%,因此您将获得所有程序的全部性能,而不仅仅是针对多个核进行了优化的程序。
是的,这是真的。 如果有可能完全构建这样的CPU,那将是非常惊人的。但是我认为,在相同的半导体制造工艺(即相同的晶体管质量/效率)下,这实际上是不可能的。即使您节省了将内核粘合在一起的逻辑,并且不需要为每个内核的专用缓存占用那么多的空间,但与8核CPU拥有相同的功率预算和裸片面积肯定是不可能的。
即使您允许增加频率(因为真正的标准是每秒工作,而不是每个时钟工作),所以使CPU速度提高两倍甚至是一个巨大的挑战。
如果有可能在接近相同功率和裸片面积预算(因此制造成本)的任何地方构建这样的CPU,那么CPU供应商将已经以这种方式构建它们。
具体来说是更多核心还是更广泛核心?部分,以了解了解此答案的必要背景;首先从有序流水线CPU的工作方式开始,然后是超标量(每个时钟多条指令)。然后说明了我们是如何在P4时代左右达到壁垒的,从而导致了简单的频率缩放的结束,只剩下了IPC,并且即使使用更小的晶体管,每个指令(例如SIMD)也将做更多的工作。
使流水线变宽(每个时钟最大指令数)通常会按宽度平方来缩放成本。该成本以裸片面积和/或功耗为单位进行度量,以进行更广泛的并行依赖检查(危险检测),以及更广泛的无序调度程序来查找准备运行的指令。如果您要运行的指令以外的话,寄存器文件和缓存上还有更多的读写端口nop
。特别是如果您有FMA或带进位的3输入指令(2个寄存器+标志)。
IPC回报的减少也使得CPU的宽度增加 ; 大多数工作负载具有供CPU使用的小规模/短程ILP(指令级并行)功能,因此,如果IPC已被限制为小于IPC的宽度,则扩大内核不会增加IPC(每个时钟的指令)。核心依存关系链,分支未命中,缓存未命中或其他停顿。当然,在某些具有独立迭代的展开循环中,可以加快速度,但这并不是大多数代码花费大量时间进行的工作。比较/分支指令占“典型”代码IIRC中指令混合的20%。(我认为我阅读了各种数据集的数字从15%到25%。)
同样,缓存失误使所有相关指令停顿(一旦达到ROB容量,则停顿所有一切),对于更宽的CPU而言,成本更高。(使更多执行单元闲置的机会成本;还有更多未完成的潜在工作。)或者分支未命中同样会引起泡沫。
为了获得8倍的IPC,我们至少需要将分支预测准确性和缓存命中率提高8倍。但是,对于大多数工作负载,缓存命中率不能随着缓存容量超过特定点而很好地扩展。硬件预取很聪明,但不能那么聪明。在IPC为8倍的情况下,分支预测器需要每个周期产生8倍的预测,并使它们更准确。
构建乱序执行CPU的当前技术只能在短范围内找到ILP。例如,Skylake的ROB大小为224个融合域uops,未执行的uops的调度程序为97个非融合域。如果调度程序大小是从两个长指令链中提取ILP的限制因素(如果它们太长)的情况下,则增加长度,请参阅了解带效应对具有两个长依赖性链的循环的影响。和/或查看此更一般和入门的答案)。
因此,使用硬件无法在两个独立的长循环之间找到ILP。在某些情况下,可以进行用于循环融合的动态二进制重新编译,但是除非CPU遵循Transmeta Crusoe路线,否则它们很难而且不是CPU真正可以做的。(在另一个内部ISA之上的x86仿真层;在这种情况下为VLIW)。但是,对于大多数代码而言,具有uop缓存和强大的解码器的标准现代x86设计并不容易。
在x86之外,仍在使用的所有ISA都相对容易解码,因此,除了长距离优化之外,没有动力进行动态重新编译。 TL:DR:希望能够将更多ILP暴露给硬件的魔术编译器不适用于Itanium IA-64,并且不太可能适用于具有串行执行模型的任何现有ISA的超宽CPU。
如果您确实有一个超宽CPU,那么您肯定希望它支持SMT,这样您就可以通过运行多个低ILP线程来使其承担工作量。
由于Skylake当前的宽度为4 oups(并且实现了每个时钟2到3 uops的实际IPC,或者在高吞吐量代码中甚至达到了接近4的IPC),因此,假设的8倍宽CPU将是32宽!
能够将其划分为8个或16个动态共享这些执行资源的逻辑CPU,将是一件很了不起的事:非停滞的线程将获得所有前端带宽和后端吞吐量。
但是有8个独立的内核,当线程停止运行时,没有其他东西可以保持执行单元的运行状态。其他线程无益。
执行通常是突发性的:它等待缓存未命中加载而停顿,然后一旦到达,许多并行指令可以使用该结果。使用超宽CPU,该突发速度可以更快,并且实际上可以帮助进行SMT。
但是我们不能拥有神奇的超宽CPU
因此,要获得吞吐量,我们必须以线程级并行性的形式向硬件公开并行性。通常,除了简单的情况(例如很大的循环)外,编译器都不擅长于何时/如何使用线程。(OpenMP或gcc的-ftree-parallelize-loops
)。返工代码仍然需要人的聪明才能有效地并行完成有用的工作,因为线程间的通信非常昂贵,线程启动也很昂贵。
TLP是粗粒度的并行机制,与硬件可以利用的单个执行线程中的细粒度ILP不同。
面向交互式工作负载的CPU(例如Intel / AMD x86和Apple / ARM AArch64高端内核)无疑确实推动了IPC扩展的收益递减,因为当延迟很重要时,单线程性能仍然非常有价值,而不仅仅是吞吐量的提高。大规模并行问题。
能够以15fps的速度并行运行8个游戏副本的价值远远低于能够以45fps的速度运行一个副本的价值。CPU供应商知道这一点,这就是为什么现代CPU确实会使用乱序执行的原因,即使它会消耗大量的电源和芯片面积。(但GPU并非如此,因为它们的工作量已经非常并行了)。
英特尔的多核至强融核硬件(骑士的着陆点/骑士的磨坊)是一个有趣的中途点:非常有限的乱序执行和SMT保持2个宽核都被AVX512 SIMD指令填充以处理数字。内核基于英特尔的低功耗Silvermont架构。(高管混乱,但重新排序的窗口较小,比核心Sandybridge系列要小得多。而且管道更窄。)
顺便说一句,所有这些都与SIMD正交。如果有可能,按照说明完成更多的工作总是有帮助的。
定价模式
软件定价模型基于当前的硬件格局。
随着多核CPU的出现,每核许可模式变得更加广泛(甚至与单插槽台式机相关)。在此之前,它仅与服务器和大型工作站有关。
如果软件不需要多个内核来以最高速度运行,那么实际上就没有办法将其便宜地卖给没有从中获得太多收益的人,因为他们在较弱的CPU上运行软件。除非软件/硬件生态系统在“ SMT通道”上发展了控件,否则您可以为在该逻辑内核上运行的代码配置最大执行宽度。(再次设想一个世界,CPU在管道宽度而不是多个单独的核中扩展。)