x86 根本就 是面向单词的架构。指令是可变长度的,没有对齐。
“字大小”在 x86 上不是一个有意义的术语;有些人可能会用它来指代寄存器宽度,但取指令/解码与整数寄存器无关。
在大多数现代 x86 CPU 的实践中,从 L1 指令缓存中提取指令发生在对齐的 16 字节或 32 字节提取块中。后面的流水线阶段找到指令边界并并行解码多达 5 条指令(例如 Skylake)。请参阅David Kanter's write-up of Haswell 的前端框图,显示从 L1i 缓存中获取 16 字节指令。
但请注意,现代 x86 CPU 也使用解码的 uop 缓存,因此它们不必处理难以解码的 x86 机器代码以处理非常频繁运行的代码(例如在循环内,甚至是大循环内) )。处理可变长度未对齐指令是旧 CPU 的一个重大瓶颈。
请参阅Can modern x86 hardware not store a single byte to memory?,了解有关缓存如何将存储吸收到正常内存区域(MTRR 和/或 PAT 设置为 WB = 回写内存类型)的更多信息。
在现代 Intel CPU 上,将存储从存储缓冲区提交到 L1 数据缓存的逻辑可以处理任何宽度的存储,只要它完全包含在一个 64 字节缓存行中即可。
更面向字的非 x86 CPU(如 ARM)通常使用缓存 字(4 或 8 字节)的读取-修改-写入来处理窄存储。请参阅Are there any modern CPUs where a cached byte store is actually slower than a word store? 但是现代 x86 CPU 确实花费晶体管来使缓存字节存储或未对齐的更广泛的存储与对齐的 8 字节存储到缓存中一样有效。
假设数据总线宽度是 64 位宽
现代 x86 具有内置于 CPU 的内存控制器。 DDR[1234] SDRAM 总线有 64 条数据线,但单个读取或写入命令会启动 8 次传输突发,传输 64 个字节数据。 (并非巧合,64 字节是所有现有 x86 CPU 的高速缓存行大小。)
对于不可缓存的内存区域的存储(即,如果 CPU 配置为将该地址视为不可缓存,即使它由 DRAM 支持),可以使用告诉 DRAM 的the DQM byte-mask signals 进行单字节或其他窄存储从这个突发传输中实际存储 8 个字节中的哪一个。
(或者如果不支持(which may be the case),内存控制器可能必须读取旧内容并合并,然后存储整行。无论哪种方式,4 字节或 8 字节块 不 em> 这里的重要单位。DDR 突发传输可以缩短,但只能从 64 减少到 32 字节。我不认为 8 字节对齐写入实际上在 DRAM 级别非常特殊。它保证是“ atomic”在 x86 ISA 中,即使在不可缓存的 MMIO 区域上也是如此。)
存储到不可缓存的 MMIO 区域将产生适当大小的 PCIe 事务,最多 64 字节。
在 CPU 内核内部,数据缓存和执行单元之间的总线可以是 32 或 64 字节宽。 (或当前 AMD 上的 16 个字节)。 L1d 和 L2 缓存之间的缓存线传输也在 Haswell 及更高版本上通过 64 字节宽的总线完成。