冯诺依曼瓶颈和 CPU 缓存
为什么速度快的CPU要等待内存?
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
无论CPU计算的速度有多快,如果要计算的指令和数据没有到达,它就什么也做不了。 CPU和内存之间的传输速度限制整体性能的现象称为冯诺依曼瓶颈。
CPU等待内存
在冯·诺依曼架构中,指令和数据使用相同的内存和总线。
CPU请求指令
↓
从内存中检索指令
↓
CPU请求所需数据
↓
从内存中获取数据
↓
CPU计算
与CPU的计算速度相比,主存访问速度较慢。 此外,如果命令和数据通过单个通道一起移动,则可能会出现彼此等待的情况。
缓存减少了这种等待
现代 CPU 将常用指令和数据预加载到 CPU 附近的高速缓存中。 L1缓存很小但速度很快,当它走向L2和L3时,它逐渐变慢而不是变大。
CPU → L1 Cache → L2 Cache → L3 Cache → Main Memory
又快又小又慢又大
缓存使用局部性,这意味着程序重复使用附近的数据。
- 时间局部性:您刚刚使用的值很可能很快会再次使用。
- 空间局部性:如果您使用一个地址,那么附近的地址很可能也会被使用。
从前面顺序读取数组的代码比跳转读取数组的代码对缓存更有利,这是因为空间局部性。
//由于连续的存储器是按顺序读取的,所以缓存很容易利用。
for (int i = 0; i < count; ++i)
{
sum += values[i];
}
指令缓存和数据缓存
现代CPU将指令和数据一起保存在主存中,但在L1高速缓存中将指令高速缓存和数据高速缓存分开。 因此,获取下一条指令和访问当前数据可以稍微同时执行。
这就是为什么它被称为改良哈佛结构。 它在必要的层中混合了哈佛结构和冯诺依曼结构的优点。
最终,计算机性能不仅仅由 CPU 执行的计算数量决定。 您还应该查看数据放置的连续程度、缓存命中率是多少以及 CPU 等待内存的时间。