4

我对微调缓存意识数据结构(例如参见Michael Spiegel 的论文或 Herlihy 等人的hopscotch hashing中的无锁跳过树)以及防止错误共享(例如在并发数组处理期间)感兴趣。我已经知道如何通过“sun.arch.data.model”属性找到 JVM 指针大小,但是我还没有找到一种方法来确定 L1 缓存中缓存行的大小。

请注意,此信息并不重要,因为我可以继续对 L1 行大小使用保守估计(微调缓存意识数据结构时为 64 字节,或防止错误共享时为 256 字节);但是,如果很容易获得 L1 缓存属性,那么我不妨利用它。

4

1 回答 1

0

你可以做的是一个简单的循环,它以给定的步幅从内存中读取单个字节。如果步幅为 1(字节),则每次迭代都必须支付一次取行惩罚。如果你加倍跳过,你可以期待一半的性能,因为你现在每相同数量的迭代获取一行两次。

一旦您的步幅达到缓存线大小,您应该会看到性能下降停止,因为您将达到每次迭代获取一行的级别,并且再次将步幅加倍不会改变它,您只需跳过行. 这样做的一个问题是,您可能会在 CPU 中触发硬件流预取器,并在某个较低的缓存级别提前让线路等待您,所以我希望看到斜率减小,但不会完全变直。以两倍于缓存行大小的步幅,这可能会消失,因为您可以通过比它们更快的速度来摆脱某些流预取器(仍然可能有步幅预取器“帮助”您进一步,但影响应该会小得多)。

还要记住,您的代码应该在比最后一级缓存更大的数据集(例如数组)上运行,几 MB 就足够了。

于 2013-09-10T11:54:30.877 回答