从命名和此article开始,我认为答案是否定的,但我不明白为什么。瓶颈在于从内存中获取数据的速度。是否可以同时获取指令似乎无关紧要。您是否还不必等到数据到达?假设获取数据需要100个cpu周期,而执行指令需要1个周期,那么提前执行1个周期的能力似乎并没有很大的提高。我在这里想念什么?
上下文:我碰到了这个article,说由于推测性执行,Specter错误不会得到修复。我认为投机执行(例如分支预测)对哈佛体系结构也很有意义。我对吗?我了解投机执行对冯·诺依曼架构更有利,但是要多少钱呢?有人可以给个粗略的数字吗?在什么程度上我们可以说幽灵会因冯·诺依曼(von Neumann)建筑而留下?
答案 0 :(得分:2)
“冯·诺依曼瓶颈”一词并不是在谈论哈佛与冯·诺依曼的体系结构。谈论的是约翰·冯·诺伊曼(John von Neumann)发明的存储程序计算机的整个概念。
它同样适用于两种类型的存储程序计算机。甚至对于将数据保存在RAM中的固定功能(非存储程序)处理器,例如旧的GPU(没有可编程着色器)。
通常,在遍历大数组时最相关,因此代码适合指令高速缓存,并且无论如何在数据访问期间都无需提取代码。 (计算机太老了,甚至没有缓存,这简直就是慢速,而且我对争论即使在时间和/或空间位置上都存在慢速是否是冯·诺依曼瓶颈的语义学也不感兴趣。)
https://whatis.techtarget.com/definition/von-Neumann-bottleneck指出,缓存和预取是我们解决冯·诺依曼瓶颈的一部分,而更快/更宽的总线使瓶颈更宽。但是只有诸如处理器处理器/ https://en.wikipedia.org/wiki/Computational_RAM之类的东西才能真正解决此问题,因为ALU直接连接到存储单元,因此在计算和存储之间没有中央瓶颈,并且计算能力随存储大小而扩展。但是具有CPU和独立RAM的冯·诺依曼在大多数情况下都可以很好地工作,因此不会很快消失(考虑到大型缓存和智能硬件预取,以及无序执行和/或SMT来隐藏内存延迟)。 / p>
约翰·冯·诺伊曼(John von Neumann)是早期计算领域的先驱,毫不奇怪,他的名字附有两个不同的概念。
哈佛大学与冯·诺依曼(von Neumann)之争是关于程序存储器是否在单独的地址空间(和单独的总线)中;这是存储程序计算机的实现细节。
Spectre:是的,Spectre与数据访问有关。如果您首先可以在哈佛体系结构中对程序存储器进行Spectre攻击,那么它可以像在von Neumann上一样运行。
我知道投机执行对冯·诺依曼架构更有利,但要多少呢?
什么?不。这里根本没有联系。当然,所有高性能现代CPU都是冯·诺依曼(von Neumann)。 (使用分离的L1i / L1d缓存,但是程序和数据存储器不是分开的,共享相同的地址空间和物理存储。分离的L1缓存通常称为“修改的哈佛”,这在x86以外的ISA上是有意义的,而x86不是L1i)。 t与数据缓存保持一致,因此在执行新存储的字节作为代码之前,您需要特殊的刷新指令。x86具有一致的指令缓存,因此,这是一个非常详细的实现。)
某些嵌入式CPU是真正的哈佛大学,程序存储器连接到Flash,数据地址空间映射到RAM。但是通常这些CPU的性能很差。管道化但有序,并且仅对指令预取使用分支预测。
但是如果您 did 用完全独立的程序和数据存储器构建了一个非常高性能的CPU(因此从一个到另一个的复制将必须通过CPU),则基本上为零与现代高性能CPU不同。 L1i缓存丢失很少见,它是否与数据获取竞争根本不重要。
不过,我想您会一直将高速缓存拆分开;通常,现代CPU具有统一的L2和L3缓存,因此根据工作负载(是否有大代码量),L2和L3或多或少会最终保存代码。也许您仍然可以在标记中多加一点,以区分代码地址和数据地址。
答案 1 :(得分:1)
Harvard Architecture,分开的指令和数据存储器,是冯·诺依曼瓶颈的缓解。 Backus的原始definition of the bottleneck解决的问题比仅获取指令或数据要稍微多一些,并讨论了CPU /内存接口。在the money quote之前的段落中,Backus讨论了查看此总线上的实际流量,
具有讽刺意味的是,大部分流量不是有用的数据,而仅仅是 大部分由名称和操作组成的数据的名称 和仅用于计算此类名称的数据。
在具有独立I / D总线的哈佛体系结构中,这不会改变。它仍将主要由名称组成。
所以答案很难。哈佛架构减轻了冯·诺依曼的瓶颈,但并没有解决它。坦率地说,这是更快的冯·诺依曼瓶颈。