【发布时间】:2021-10-25 07:41:32
【问题描述】:
假设内存是字节可寻址的并且缓存块大小是 4 字节。因此,在一次缓存访问中,访问了 1 个块。这是否意味着计算机体系结构是 32 位的。我的问题是,如果您知道缓存块大小,您可以对计算机体系结构做出什么推导
【问题讨论】:
标签: caching cpu-architecture cpu-cache
假设内存是字节可寻址的并且缓存块大小是 4 字节。因此,在一次缓存访问中,访问了 1 个块。这是否意味着计算机体系结构是 32 位的。我的问题是,如果您知道缓存块大小,您可以对计算机体系结构做出什么推导
【问题讨论】:
标签: caching cpu-architecture cpu-cache
不,通常缓存块大小大于寄存器宽度,以利用附近全寄存器宽度加载/存储之间的空间局部性,这是典型的。与实际数据所需的存储量相比,将缓存设置为细粒度的 4 字节块会花费大量开销(标签等)。例如20 个标签位,加上每个 32 位缓存行的“脏”和其他 MESI 状态,可能意味着 32 kiB(可用空间)缓存需要更多类似 56 kiB 的原始 SRAM 存储,而这还没有考虑 ECC 或奇偶校验。
如果 CPU 有浮点单元,它通常可以进行 64 位加载/存储,即使整数寄存器宽度只有 32 位。 (或者更广泛的 SIMD 或加载对/存储对指令。)
现实世界中的典型缓存大小在现代系统上为 64字节,而以前在 Pentium III 等早期 CPU 上为 32 字节。 64 字节是 DDR SDRAM 突发大小,因此它是片外存储器访问大小的不错选择。 (不过,最近带有 AVX-512 SIMD 的英特尔系统可以通过一条指令加载/存储整个 64 字节(512 位)缓存线。SIMD 向量宽度已经赶上了缓存线大小。但整数访问仍然最多8 字节宽。)
缓存块大小和架构位数之间没有关系。您肯定希望块大小至少与正常加载/存储一样宽,但是可以构建具有 32 位缓存块的 64 位机器。这意味着 64 位加载需要两次缓存访问才能完成,所以这将是一个非常糟糕的主意,除非您通常的工作负载包括在寄存器中使用 64 位地址来访问分散的 32 位值,并且您想要优化不关心其他任何事情的效率。
大多数 64 位 ISA 可以同样高效地处理 32 位或 64 位数据。有些,尤其是 x86-64,甚至没有你所谓的“字长”。在 x86-64 上没有一种最有效的本机访问大小,并且指令是未对齐的字节流,不像 RISC-V 或 AArch64 等具有对齐的 32 位指令字的 ISA。
因此,如果您知道缓存块大小为 32 位,那么 很好的猜测 寄存器宽度最多为 32 位,但也可能是 8 位或 16 位。 (或者 4 位甚至可能是 6 位或其他什么?对于小于 32 位的大小,对于历史 CPU,它通常会成为一个问题,即位意味着什么:ALU、寄存器、总线、固定宽度指令?请注意在答案的前面部分,我只讨论了寄存器宽度,而不是“32 位 CPU”。)
如果这是一个真正的商业设计而不是计算机科学示例,那么最有可能的是 8 位机器;普通的 32 位机器会使用更大的缓存块,但您可以合理地想象在一次只能加载 1 个字节的机器上更精细的粒度。 (当然,作为 8 位机器并不意味着这种限制;您可以有一个加载对指令,或者允许 32 位或 64 位加载/存储的 FP 寄存器。)
【讨论】: