我有一个评估套件,它实现了 ARM Cortex-A8 内核。处理器数据表指出,它有一个
ARM Cortex A8™ 内核,运行速度高达 800MHz,DDR2 RAM 高达 200MHz。
我能从这个系统中得到什么?我是否正确地假设内存访问将成为瓶颈,因为它仅以 200MHz 运行?
需要有关如何解释这一点的更多信息。
处理器与一个内部缓存(实际上是多个)一起工作,它可以“全速”访问。缓存很小(通常为 8 到 32 KB),并由来自外部 RAM 的块(“缓存行”)填充(缓存行将是几十个连续字节)。当代码需要一些当前不在缓存中的数据时,处理器将不得不从主 RAM 中获取该行;这称为缓存未命中。
从主 RAM 获得高速缓存行的速度由两个参数描述,称为延迟和带宽. 延迟是从处理器发出请求到接收到第一个高速缓存行字节之间的时间量。典型的延迟约为 30ns。在 800 MHz 时,30ns 意味着 24 个时钟周期。带宽描述了每纳秒可以在总线上发送多少字节。“200 MHz DDR2”表示总线时钟将以 200 MHz 运行。DDR2 RAM 每个周期可以发送两个数据元素(因此每秒可以发送 4 亿个元素)。然后,带宽取决于 CPU 和 RAM 之间有多少条线路:使用 64 位总线和 200 MHz DDR2 RAM,在理想条件下您可能希望达到 3.2 GBytes/s。因此,虽然第一个字节需要相当长的时间才能获得(就 CPU 可以做的事情而言,延迟很高),但缓存线的其余部分被读取得非常快。
在另一个方向:CPU 将一些数据写入其缓存,并且一些电路会在空闲时将修改传播到主 RAM。
上面的描述过于简单化了;缓存和缓存管理是一个复杂的领域。底线如下:如果您的代码使用内存中的大数据表并以看似随机的方式访问它们,那么应用程序将会很慢,因为大多数时候处理器只会等待来自主内存的数据。另一方面,如果你的代码可以在很少的 RAM 上运行,不到几十 KB,那么它很可能大部分时间都会在最里面的缓存上运行,而外部 RAM 的速度将不重要。以与缓存一起运行良好的方式进行内存访问的能力称为引用局部性。
有关缓存问题的介绍和指针,请参见缓存的Wikipedia 页面。
(在 80 年代,大型预计算表是一种常见的优化技巧,因为当时处理器并不比 RAM 快,并且一个周期的内存访问是规则。这就是为什么 8 MHz 摩托罗拉 68000 CPU 没有缓存的原因。但是这些天早已不复存在。)
是的,内存很可能是一个瓶颈,但你不太可能运行一个除了读写内存之外什么都不做的应用程序。
在 CPU 内部,内存瓶颈不会产生影响。