【问题标题】:Is there a way to keep the front of an empty boost circular buffer hot in cache?有没有办法让空的提升循环缓冲区的前端在缓存中保持热状态?
【发布时间】:2018-01-08 15:46:18
【问题描述】:

有一个特定的循环缓冲区我希望在缓存中保持热状态,但是它可能会在很长一段时间内不使用。这会导致缓存未命中。

我有一个空闲循环,可以负责保持该位置的热度,但我看不到仅使用公共接口而不实际插入/删除项目的方法。

是否有任何动作,使用公共接口,当循环缓冲区为空时,将保持插入点在缓存中的热?

【问题讨论】:

  • 您可以编写一个分配器,将 char* 指针公开到底层内存(即两个底层数组);假设数据适合单个缓存行,然后您可以执行 char* 指针的读取(这不会违反别名规则)

标签: c++ boost circular-buffer boost-circularbuffer


【解决方案1】:

您可能希望通过完整执行它并尽可能短地停止提交它的效果来定期预热您的完整快速路径

如果您可以获取指向容器前端的指针,则可以在其上使用__builtin_prefetch 将其放入缓存中。或者,pushpop 一个元素。

【讨论】:

    【解决方案2】:

    您可能想研究使用 CAT(缓存分配技术)。目前我不确定它在哪里,但请参阅https://lwn.net/Articles/694800/ 了解 2016 年 7 月 Linux 的位置。

    CAT 是 Intel 的一项功能,用于分离缓存片段并将它们专用于不同的用途。分配了一块缓存的线程不能驱逐属于其他块的数据,尽管我相信它们仍然可以利用读取它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2023-03-08
      • 2017-10-13
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多