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