“冯诺依曼瓶颈”一词不仅仅是在谈论哈佛与冯诺依曼架构。它谈论的是约翰·冯·诺依曼发明的存储程序计算机的整个想法。
(根据上下文,有些人可能会用它来表示代码获取和数据访问之间的竞争;这确实会加剧没有拆分缓存的整体内存瓶颈。或者我可能混淆了术语和更普遍的处理器内存瓶颈我在这个答案的其余部分讨论不应该被称为冯诺依曼瓶颈,尽管它是一个真实的东西。请参阅Modern Microprocessors A 90-Minute Guide中的内存墙部分! )
冯诺依曼瓶颈同样适用于两种存储程序计算机。甚至对于将数据保存在 RAM 中的固定功能(非存储程序)处理器也是如此。(没有可编程着色器的旧 GPU 基本上是固定功能的,但在访问数据时仍然存在内存瓶颈)。
通常它在循环大数组或基于指针的数据结构(如链表)时最相关,因此代码适合指令缓存,并且无论如何都不必在数据访问期间获取。(甚至连缓存都太旧的计算机速度太慢了,我不想争论即使存在时间和/或空间局部性的缓慢是否是冯诺依曼瓶颈的语义。)
https://whatis.techtarget.com/definition/von-Neumann-bottleneck指出缓存和预取是我们解决冯诺依曼瓶颈的一部分,更快/更宽的总线使瓶颈更宽。但是只有像 Processor-in-Memory / https://en.wikipedia.org/wiki/Computational_RAM这样的东西才能真正解决它,其中 ALU 直接连接到内存单元,因此计算和存储之间没有中心瓶颈,计算容量与存储大小成比例。但是 von Neumann 的 CPU 和单独的 RAM 足以应付大多数不会很快消失的事情(考虑到大型缓存和智能硬件预取,以及乱序执行和/或 SMT 以隐藏内存延迟。)
John von Neumann 是早期计算领域的先驱,他的名字与两个不同的概念有关也就不足为奇了。
哈佛 vs. 冯诺依曼是关于程序内存是否在单独的地址空间(和单独的总线);这是存储程序计算机的实现细节。
Spectre:是的,Spectre 只是关于数据访问和分支预测,而不是将代码作为数据访问,反之亦然。如果您首先可以在哈佛架构中对程序内存进行 Spectre 攻击(例如,通过运行进行系统调用的普通程序),那么它可以像在冯诺依曼上一样运行。
我知道投机执行对冯诺依曼架构更有利,但有多少呢?
什么?不,这里根本没有联系。当然,所有高性能的现代 CPU 都是冯诺依曼。(使用拆分 L1i / L1d 缓存,但程序和数据内存不是分开的,共享相同的地址空间和物理存储。拆分 L1 缓存通常称为“修改后的哈佛”,这在 x86 以外的 L1i 之外的 ISA 上是有意义的t 与数据缓存一致,因此您需要特殊的刷新指令才能将新存储的字节作为代码执行。x86 具有一致的指令缓存,因此它是一个非常详细的实现细节。)
一些嵌入式 CPU 是真正的哈佛,程序存储器连接到闪存,数据地址空间映射到 RAM。但通常这些 CPU 的性能非常低。流水线但有序,并且仅使用分支预测进行指令预取。
但是,如果您确实构建了具有完全独立的程序和数据存储器的高性能 CPU(因此从一个复制到另一个必须通过 CPU),那么与现代高性能 CPU 的差异基本上为零。 L1i 缓存未命中很少见,它们是否与数据访问竞争并不是很重要。
不过,我想您会一直拆分缓存;通常现代 CPU 具有统一的 L2 和 L3 缓存,因此根据工作负载(代码大小与否),或多或少的 L2 和 L3 最终会保留代码。也许您仍然会使用标签中带有一个额外位的统一缓存来区分代码地址和数据地址,从而允许您的大型外部缓存在两个地址空间之间竞争共享。