【问题标题】:Caching a linked list - is it possible?缓存链表 - 有可能吗?
【发布时间】:2013-03-08 10:37:59
【问题描述】:

我知道数组可以通过适应高速缓存行以及它们的顺序性来充分利用 x86_64 架构上的高速缓存机制。链表是一系列通过指针链接在一起的结构/对象,是否可以利用这种结构的缓存系统?链表的对象可以分配在内存中的任何位置

【问题讨论】:

  • 如果您使用数组实现链表,则可以:)
  • @Nick 您的意思是将指针存储到数组中?
  • 不,通过将所有内容存储在数组中。但我不确定它是否会很有帮助......
  • 是的 - 只需重写链表的新运算符。
  • 您要解决的问题是什么?

标签: c++ c caching memory-management memory-alignment


【解决方案1】:

确实,链表条目可以在任何地方,但它们必须“就在任何地方”。例如,您可以将它们分配到“区域”之外。一次分配一堆连续的条目,将它们串在一起形成一个“连续的空闲条目”列表,然后将它们打包出来。根据需要分配另一个 zone-full。通过一些不太干净的技巧,您最终可以重新线性化释放的条目,等等。

不过,大多数时候实际上并不值得付出所有这些努力。

【讨论】:

  • +1 最后一行!特别是如果链表中访问频率最高的元素均匀分布在链表中。
  • @Nick:是的——如果这种棘手的东西获得了很大的收益,那么数据结构的改变会获得更多的收益。 :-)
  • 我同意你们两个的观点,但我为所有花时间回答我问题的人 +1。谢谢你们!
【解决方案2】:

每个链表元素可以有多个条目,即每个元素中有一个小的条目数组。这允许缓存一些条目,同时仍保持列表的动态特性。

这是一个unrolled list,可以为您提供所需的内容。

【讨论】:

    【解决方案3】:

    您可能有一个链表元素包含多个数据条目。 例如考虑下面的结构。

    struct myll{
        int data[16];
        char valid[16/8];
        struct myll* next;
    }
    

    这样,您将粒度设置为每个节点 16 个条目。但是,您仍然可以选择使用另一个节点添加超过 16 个条目并使用“有效”标志删除。实施起来有点痛苦,但取决于您的要求。

    我猜,有点类似机制用于某些文件系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 2013-09-07
      • 2014-04-09
      • 1970-01-01
      相关资源
      最近更新 更多