使用结构/类来增加缓存空间局部性?

时间:2012-04-29 01:09:31

标签: java c++ performance caching

如果有人说1000行计算机代码而不是独立声明的变量,它们被组合在一起(显然这取决于所使用的变量大小)到类和结构中,这会直接增加缓存空间局部性(因此降低缓存未命中率)?

我认为通过将类/结构中的变量关联起来,他们会被分配连续的内存地址?

3 个答案:

答案 0 :(得分:2)

如果不做出一些非常不合理的假设,就不可能回答这个问题。空间局部性与算法和数据结构一样多,因此根据您使用的算法将逻辑相关的数据元素组合在一起可能无关紧要或甚至更糟。

例如,考虑在3D空间中表示100个点。你可以将它们放在三个独立的数组中,或者创建一个3元组的结构/类,然后创建一个这样的数组。

如果您的算法必须在每一步上一次获得每个点的所有三个坐标,则元组表示获胜。但是,想想如果你想构建一个独立运行在每个维度上的算法,并在三个独立的线程中三维地对其进行并行化,会发生什么。在这种情况下,三个独立的阵列将赢得落手,因为该布局将避免错误共享,并且就一次一维算法而言,改善空间局部性。

这个例子表明没有“一刀切”的解决方案。应始终在特定算法的上下文中考虑空间局部性;在一个案例中,一个好的解决方案可能会在其他看似相似的情况下变坏。

答案 1 :(得分:2)

如果你在谈论方法局部变量,它们已经在堆栈上连续,或者严格地说在激活记录中,这些记录几乎总是存在于堆栈中。如果您正在讨论对Java对象的引用,或者指向动态分配的C ++对象的指针,那么将它们放入包含的类中将不会产生任何不同的另一个原因:相关对象仍将位于堆中的任意位置。

答案 2 :(得分:2)

如果您询问是否将局部变量分组为明确定义的结构,则不会有任何优势。局部变量以activation records实现,对于任何具有这两种语言的语言,它们通常与类结构的实现密切相关。

因此,局部变量应该已经具有良好的空间局部性,除非语言实现做了一些奇怪的事情来搞砸它。

通过将递归期间未使用的大块本地状态隔离到单独的非递归函数中,可以改善局部性。这将是一个微优化,因此您需要首先检查机器代码,以确保它不浪费时间。无论如何,这与将本地人移动到class无关。