缓存行大小会影响内存访问延迟吗?
Does cacheline size affect memory access latency?
Intel架构早就有64字节缓存了。我很好奇,如果处理器有 32 字节或 16 字节缓存行而不是 64 字节缓存行,这会改善 RAM 到寄存器的数据传输延迟吗?如果有,多少钱?如果不是,为什么?
谢谢。
传输大量数据当然会增加通信时间。但由于内存的组织方式,增加的幅度很小,而且不会影响内存到寄存器的延迟。
内存访问操作分三步完成:
- 位线预充电:行地址发送,内存内部总线预充电(持续时间tRP)
- 行访问:读取内存的内部行并将其写入内部锁存器。在此期间,发送列地址(持续时间 tRCD)
- 列访问:所选列在行锁存器中读取并开始发送到处理器(持续时间 tCL)
行访问是一个很长的操作。
内存是单元格元素的矩阵。为了增加内存容量,必须使单元格尽可能小。当读取一行单元格时,必须驱动沿着存储器列的电容性非常大的大总线。电压摆幅非常低,并且有检测放大器放大器来检测小的电压变化。
一旦这个操作完成,一个完整的行被存储在锁存器中并且读取它们可以很快并且通常以突发模式发送。
考虑一个典型的 DDR4 内存,具有 1GHz IO 周期时间,我们通常有 tRP/tRCD/tCL=12-15cy/12-15cy/10-12cy,完整时间约为 40 个内存周期(如果处理器频率为 4GHz,这是 ~160 个处理器周期)。然后每个周期以突发模式发送两次数据,每个周期发送 2x64 位。因此,数据传输为 64 字节增加 4 个周期,而为 32 字节仅增加 2 个周期。
因此将缓存行从 64B 减少到 32B 会将传输时间减少 ~2/40=5%
如果行地址不变,则不需要预充电和读取内存行,访问时间为~15 个内存周期。在那种情况下,传输 64B 与 32B 的时间相对增加更大但仍然有限:~2/15~15%。
两种评估都没有考虑处理内存层次结构中的未命中所需的额外时间,实际百分比会更小。
内存可以发送数据"critical word first"。如果处理器需要一个给定的字,这个字的地址被发送到内存。一旦行被读取,内存首先发送这个字,然后是缓存行中的其他字。因此,无论缓存行是什么,只要接收到第一个字,缓存就可以满足处理器请求,并且减少行宽不会影响缓存延迟。因此,如果使用此功能,内存到寄存器时间不会改变。
在最近的处理器中,不同缓存级别之间的交换是基于缓存行宽度的,先发送关键字不会带来任何好处。
除此之外,由于空间局部性,较大的行大小会减少强制性未命中,并且减小行大小会对缓存未命中率产生负面影响。
最后,使用更大的缓存行可以提高缓存和内存之间的数据传输速率。
大缓存行的唯一不利方面(除了传输时间的小幅增加外)是缓存中的行数减少并且冲突未命中可能会增加。但是随着现代缓存的大关联性,这种效果是有限的。
Intel架构早就有64字节缓存了。我很好奇,如果处理器有 32 字节或 16 字节缓存行而不是 64 字节缓存行,这会改善 RAM 到寄存器的数据传输延迟吗?如果有,多少钱?如果不是,为什么?
谢谢。
传输大量数据当然会增加通信时间。但由于内存的组织方式,增加的幅度很小,而且不会影响内存到寄存器的延迟。
内存访问操作分三步完成:
- 位线预充电:行地址发送,内存内部总线预充电(持续时间tRP)
- 行访问:读取内存的内部行并将其写入内部锁存器。在此期间,发送列地址(持续时间 tRCD)
- 列访问:所选列在行锁存器中读取并开始发送到处理器(持续时间 tCL)
行访问是一个很长的操作。 内存是单元格元素的矩阵。为了增加内存容量,必须使单元格尽可能小。当读取一行单元格时,必须驱动沿着存储器列的电容性非常大的大总线。电压摆幅非常低,并且有检测放大器放大器来检测小的电压变化。
一旦这个操作完成,一个完整的行被存储在锁存器中并且读取它们可以很快并且通常以突发模式发送。
考虑一个典型的 DDR4 内存,具有 1GHz IO 周期时间,我们通常有 tRP/tRCD/tCL=12-15cy/12-15cy/10-12cy,完整时间约为 40 个内存周期(如果处理器频率为 4GHz,这是 ~160 个处理器周期)。然后每个周期以突发模式发送两次数据,每个周期发送 2x64 位。因此,数据传输为 64 字节增加 4 个周期,而为 32 字节仅增加 2 个周期。
因此将缓存行从 64B 减少到 32B 会将传输时间减少 ~2/40=5%
如果行地址不变,则不需要预充电和读取内存行,访问时间为~15 个内存周期。在那种情况下,传输 64B 与 32B 的时间相对增加更大但仍然有限:~2/15~15%。
两种评估都没有考虑处理内存层次结构中的未命中所需的额外时间,实际百分比会更小。
内存可以发送数据"critical word first"。如果处理器需要一个给定的字,这个字的地址被发送到内存。一旦行被读取,内存首先发送这个字,然后是缓存行中的其他字。因此,无论缓存行是什么,只要接收到第一个字,缓存就可以满足处理器请求,并且减少行宽不会影响缓存延迟。因此,如果使用此功能,内存到寄存器时间不会改变。
在最近的处理器中,不同缓存级别之间的交换是基于缓存行宽度的,先发送关键字不会带来任何好处。
除此之外,由于空间局部性,较大的行大小会减少强制性未命中,并且减小行大小会对缓存未命中率产生负面影响。
最后,使用更大的缓存行可以提高缓存和内存之间的数据传输速率。
大缓存行的唯一不利方面(除了传输时间的小幅增加外)是缓存中的行数减少并且冲突未命中可能会增加。但是随着现代缓存的大关联性,这种效果是有限的。