与字节寻址相比,从字寻址存储器中获取 4 字节字是否更容易?

Is it easier to fetch a 4 byte word from a word addressable memory compared to byte addressable?

所以我确实在 stackvoerflow 中找到了一些与此相关的答案,但没有一个明确回答这个问题

所以如果我们的内存是字节可寻址的并且字大小是例如 4 字节,那么为什么不使内存字节可寻址呢?

如果我没记错的话 CPU 会用文字对吗?所以当 cpu 试图从内存中获取一个字时,从字节可寻址内存中获取 4 字节字与从字可寻址内存中获取字有什么区别?

内存正常byte-addressable。但是 whole-word 负载是可能的,同时获得 4 倍的数据。

基本上没有什么区别,如果load这个词是自然对齐的;地址的低位为零而不是不存在。

if i'm not mistaking CPU will work with words right?

这取决于CPU实现的Instruction Set Architecture(ISA)。例如,x86 支持大小从单个 8 位字节到多达 64 字节(在最近的 CPU 中)的操作数。尽管现代 x86 CPUs 中的字长仅为 8 或 4 个字节。字大小通常定义为等于 general-purpose 寄存器的大小。但是,访问内存或寄存器的粒度不一定限于字长。从程序员的角度和 CPU 实现的角度来看,这是非常方便的,我将在下面讨论。

so when the cpu tries to get a word from the memory what's the difference between getting a 4 byte word from a byte addressable memory vs getting a word from word addressable memory?

虽然 ISA 可能支持字节寻址能力,但实现 ISA 的 CPU 可能不一定一次从内存中获取一个字节的数据。 Spatial locality of reference 是大多数实际程序中非常常见的内存访问模式。如果 CPU 沿着内存层次结构发出 single-byte 请求,它会不必要地消耗大量能量并显着影响性能来处理 single-byte 请求和移动 one-byte 数据层次结构。因此,通常情况下,当 CPU 对某个地址的某个大小的数据发出内存请求时,整个内存块(称为缓存行,通常大小为 64 字节,64 字节对齐)被带到L1缓存。对同一缓存行的所有请求都可以有效地合并为一个请求。因此,存储器层次结构不同级别之间的地址总线不必包括用于构成高速缓存线内偏移量的位的连线。在那种情况下,实现将真正以 64 字节粒度寻址内存。

但是,在实现中支持字节寻址能力可能很有用。例如,如果缓存行只有一个字节发生变化,并且缓存行必须写回主内存,而不是将所有 64 个字节发送到内存,只发送缓存行将花费更少的能量、带宽和时间改变的字节(或几个字节)。字节寻址能力有用的另一种情况是首先支持 critical-word 的想法。这远不止于此,但为了让答案简单明了,我就到此为止了。

DDR SDRAM 是当今大多数计算机系统中普遍使用的 class 主内存接口。数据总线宽度大小为 8 字节,协议仅支持将带有字节使能信号(称为数据掩码)的对齐 8 字节块传输到 select 要写入的字节。因此,主存储器通常是 8 字节可寻址的。正是 CPU 提供了字节可寻址的错觉。