自定义分配器可以提高列表的缓存局部性吗?

问题描述 投票:0回答:2

这是一个相当假设的问题。

我对 cpu 缓存如何工作的了解有限。

我知道CPU会将后续字节加载到缓存中。

由于列表使用指针/间接指向内存中的随机位置,因此与

vector
或数组相比,它的局部性相对较差。

我的问题是:如果我编写一个分配器,其中所有节点的数据彼此相邻(通过线性分配器),这会改善缓存加载吗?间接仍然存在,但不同节点的数据位于相似的位置。

c++ linked-list cache-locality
2个回答
4
投票

是和否,但主要倾向于否,至少如果你以一种可以让你从中得到任何东西的方式使用该列表的话。

链表的优点是能够在恒定时间内在列表中间插入和删除元素(前提是您已经知道要插入/删除的点)。

如果您线性分配对象并将它们线性插入列表并线性访问它们,是的,您将获得局部性的改进。问题是,如果您要以这种方式使用数据,您不妨将其放入向量中并完成它。

如果在列表中的任意位置进行插入和删除,即使您最初按线性顺序分配节点,很快就会发现列表的顺序不再与分配的顺序匹配。在这种情况下,自定义分配器可能仍然有一点好处。至少列表中的节点不会与其他数据混合,因此您可以至少稍微提高引用的局部性。但差异可能相当小。

所以,是的,在某些情况下你可以获得良好的局部性——但这些情况基本上是你从未利用过列表的特性,而这些特性使其一开始就有用。


0
投票

如果我编写一个分配器,其中所有节点的数据彼此相邻(通过线性分配器),这会改善缓存加载吗?

是的,如果您以从中受益的方式访问对象。 IE。如果您访问序列中的元素。

© www.soinside.com 2019 - 2024. All rights reserved.