如果 CPU 频率不增加,那么 CPU 对于非并行代码如何更快?

jok*_*oon 1 parallel-processing cpu performance cpu-architecture

CPU 仍在“改进”,但在过去 10 年里它们的频率并没有提高很多。

我可以理解晶体管数量随着晶体管越来越小而增加,但我不明白如果频率降低,非并行程序(我认为大多数程序都是非并行的?)如何在新 CPU 上执行得更快不增加。

我可以理解为什么 GPU 使用更多晶体管可以更快,因为它们是并行处理器(这个术语正确吗?)并且它们只执行并行代码。

但大多数软件都是非并行的,所以对我来说,新的 CPU 似乎不会比以前的 CPU 快很多,除非大多数程序可以并行化,但事实并非如此(我不确定,但是可以并行化的典型算法是什么?不并行吗?)。

更大的 L1/L2/L3 缓存大小是否可以让新 CPU 更快?或者还有其他东西,例如新指令或分支东西?

我缺少什么?

Pet*_*des 8

越来越多的程序使用线程来处理可以合理并行化的事情。但是您询问的是单线程(或每个核心)的性能,这完全没问题且有趣。

您缺少指令级并行性 (ILP)并增加 IPC(每周期指令数)。

此外,SIMD(x86 的 SSE、AVX、AVX-512 或 ARM NEON、SVE)可以让每条指令完成更多工作,以这种方式(可能很小)循环中利用数据并行性,而不是线程或与线程一起使用。但这对于许多应用程序来说并不是一个重要因素。

每个时钟的工作量是指令/周期 x 工作/insn x 线程。(threads如果您的程序在多个内核上运行,则基本上是一次滴答的时钟数)。即使线程为 1,其他两个因素也可以增加。

大量数据并行性的问题(例如对数组求和,或向每个元素加 1)可以通过三种方式向 CPU 公开并行性:SIMD、指令级并行性(例如,如果存在像这样的依赖链,则使用多个累加器展开) sum)和线程级并行性。

这些都是正交的。其中一些适用于非数据并行的问题,只是复杂程序的不同步骤。IPC始终适用。有了足够好的分支预测,CPU 就可以在指令流中看到很远的地方,并找到要做的并行工作(尤其是内存级并行性),只要代码不执行类似遍历下一个加载地址所依赖的链表之类的操作关于当前负载结果。然后,您将在加载延迟上遇到瓶颈,并且没有内存级并行性(除了您在每个节点上执行的任何工作之外)。


一些主要因素

  • 更大的缓存可以提高命中率和有效带宽,从而减少停顿。这提高了平均 IPC。(还有更智能的缓存替换算法,例如 Ivy Bridge 中的 L3 自适应替换。)

    实际 DRAM 带宽的增加也有帮助(特别是在良好的硬件预取的情况下),但 DRAM B/W 在内核之间共享。L1/L2 缓存在现代 CPU 中是私有的,L3 带宽也可以很好地扩展,不同的内核访问它的不同部分。尽管如此,DRAM 仍然经常发挥作用,尤其是在没有针对缓存阻塞进行仔细调整的代码中。DRAM 延迟几乎恒定(以绝对纳秒为单位,因此核心时钟周期变得“更糟”),但内存时钟在过去十年中一直在显着攀升。

  • 更大的重新排序缓冲区 (ROB) 和调度程序 (RS) 允许 CPU在更大的窗口上找到ILP。类似地,更大的加载和存储缓冲区允许更多的内存级并行性,例如并行跟踪更多正在进行的高速缓存未命中加载。如果缓存中的存储未命中,则在必须停止之前拥有更大的缓冲区。

  • 如果 CPU 发现它猜测了较早分支的错误路径,则更好的分支预测会减少丢弃推测工作的频率。

  • 更宽的管道允许更高的峰值 IPC。最好的情况是,在高吞吐量代码中(没有很多停顿,并且有很多 ILP),这种情况可以持续下去。

    否则,它至少有助于更快地到达下一个摊位,完成大量工作。当缓存未命中加载最终到达时,清除 ROB 中等待的指令,为新工作腾出空间,以便稍后可能看到一些独立工作。如果循环条件的执行可以远远超出循环中的实际工作,则可能会在后端耗尽工作要做之前解决循环退出分支的错误预测。因此,高于循环稳态瓶颈的最大 IPC 对于非无限循环很有用。

也可以看看