具有隔离键/值的C ++缓存友好哈希映射

时间:2015-09-06 15:45:48

标签: c++ hashmap cpu-cache

在这个CppCon视频中,Mike Acton谈到了带有隔离键/值的哈希映射:

https://www.youtube.com/watch?v=rX0ItVEVjHc

然而,他很少解释他的意思。

我试图找到有关该主题的更多信息,但我找到了任何内容。

有没有人可以向我解释他究竟意味着什么?

2 个答案:

答案 0 :(得分:2)

我不记得他的演讲中的哈希映射部分,但它必须是关于缓存未命中。

他说,至少从前一年开始,我的想法;我们在学校学到的理论信息(例如在二进制地图中搜索logN,哈希常数......)很好,但我们正在使用机器,我们无法忽略它们的工作方式。例如,他给出了关于延迟的例子。他提供了关于l1,l2缓存未命中的不同示例。并且显示只是更改数据的内存布局(他将一些数据循环并将其传送到另一个结构,这有助于CPU将所有数据调整到64位寄存器)他可以使相同的代码运行速度提高10倍。我对他的数据引用印象深刻 "我们必须了解数据,不同的数据意味着不同的算法"

答案 1 :(得分:1)

您还没有意识到您发现的内容令人困惑,所以我将从最全面的概述开始 - 如果您有更具体的问题,请询问。

我还没看过你的视频,但是从其他提到的他的作品中我得出的结论是,它有时候会更加高效地将密钥保存在一个记忆区域中,与映射到值。这与存储std::unordered_map值的std::pair<const key_type, mapped_type>形成对比 - 显然在内存中并排键入值和值。将密钥放在一起意味着更少的缓存未命中,特别是对于count之类的操作,它们甚至不需要查看值,但可能需要导航经过碰撞的密钥或三个。