展开的链接列表的最佳块大小

时间:2016-07-14 17:37:23

标签: caching data-structures linked-list unroll

我正在学习基本数据结构,到目前为止还要展开链接列表。我曾经说过,如果我将每个块中的元素数量最多调整为一个缓存行的大小,我将从改进的内存位置获得更好的缓存性能。我有两个问题。

首先,最好是使其完全符合缓存行的大小,还是任何不可分割的小尺寸?

其次,我在this帖子中发现L1 / 2/3缓存的行大小为64字节。我只是想确保这适用于所有型号的i7?我有一个2014年中期的MBP,并试图创建一个最适合我的系统的展开链表。是否有任何终端命令来检查缓存行大小?

1 个答案:

答案 0 :(得分:3)

展开的链表中节点中的元素都可以非常快速地访问 1
缓存行中的字节都可以非常快速地访问。

我们可以在这里看到类比,展开的链接列表可以将项目压缩到连续的内存区域,以便它们更加缓存友好。

要了解为什么节点大小大于缓存行可能有问题,请考虑具有缓存(任何关联性)的架构,其中只有一行大小 S
还要考虑一个节点大小为 2S 的展开链表 最后,让我们分析算法的缓存未命中

For each node N
  Let avg = ArithmeticMean(N.items)
  For i = 0 To N.numerOfItems - 1
     N.items[i] = avg

将节点中每个项目(假设一个完整节点)的值设置为节点的算术平均值。

要计算平均值,必须对所有元素求和,访问第一个元素会触发缓存加载(+1)。在前半部分中,元素从刚刚加载的缓存行中读取 一旦访问了后半部分中的第一个元素,就需要另一个缓存加载并刷新旧行(+2)。在节点结束之前,第二个负载满足所有未来的访问 一旦我们得到了平均值,就会再次使用后续缓存加载(+3)访问前半部分,将后半部分再次重新加载,然后很快再次加载(+4)。

该算法触发节点的4个缓存加载。 如果我们确定节点 S 的大小并重复分析,我们将看到只需要缓存加载。

使节点小于缓存行也会这样做,一些节点可能最终共享相同的行,但一般情况下它不会受到伤害。 但是,这将使用更多行与列表中元素的总数,因为每个行都在其自己的地址,并且它们不一定靠近在一起。 在 S = 1 的限制中,我们有一个普通的链表。

到目前为止,所有不太老的Intel CPU都有64字节的缓存线 但这可以很好地改变。

要查看您的CPU缓存信息,您可以参考以下问题:finding L2 cache size in Linux 2

归结为使用sudo dmidecode -t cache

1 感谢数组用于存储元素,允许随机访问。

2 适用于所有缓存级别。

相关问题