8 个长整型的数组能否适合 64 字节缓存行
本文关键字:字节 缓存 长整型 数组 | 更新日期: 2023-09-27 18:34:08
所以英特尔的 I7 处理器内存以 64 字节写入和读取。因此,如果我想填充缓存行,我可以使用 16 个长整型(每个 4 个字节(。
如果创建一个包含 16 个长整型的数组,它是否适合整个缓存行,或者数组是否有一些开销?
我担心的是,如果一个数组有任何开销,并且我使用 16 个长整型,则以字节为单位的总大小将溢出 64 个。
那么它更像是new long[63]
,还是new long[62]
等?
在 C# 中,long
数据类型(System.Int64
的别名(是 8 个字节,而不是 4 个字节。int
类型(又名 System.Int32
(是 4 个字节。因此,64 字节的 long
值是 8 个元素,而不是 16 个元素。
托管阵列的存储实际上是连续的,因此理论上是的,long[8]
完全适合 64 字节的缓存行。但请注意,只有在 64 的倍数地址上正确对齐时,它才会这样做。由于您无法控制分配位置,因此很难做到这一点。
因此,即使数组中没有开销,也无法保证单个 8 元素的 long
数组实际上完全适合 64 字节缓存行。
当然,比这更长的数组将具有对齐的子范围,因此可以完全缓存。但是,对于您可能拥有的几乎所有数据类型来说,情况都是如此。坦率地说,要担心的不是数据的大小或数组的长度,而是访问模式。有关如何以有助于确保有效使用缓存的方式访问数据的建议,请参阅"数据局部性"。