【发布时间】:2015-06-18 13:25:10
【问题描述】:
结构:我有 8 个 64 位整数(512 位 = 64 字节,假定的缓存行宽度),我想依次与另一个 64 位整数进行比较,没有缓存未命中。不幸的是,数据集绝对不灵活——它已经尽可能小了。
访问模式: 每个 uint64_t 实际上是一个 4x4x4 位的数组,每个位代表一个体素的存在或不存在。这意味着有时我会使用一个块的一半和另一个块的一半,甚至是 8 个不同的 64 位块的角......我猜这意味着很有可能缺乏对齐。
我怎样才能尽可能快地做到这一点,即不破坏缓存?
附:这个想法是,这段代码最终将在至少 64B 缓存线宽度的相当广泛的体系结构上运行,所以我希望这绝对是尽可能快的。这也意味着我不能依赖 MOVNTDQA,尽管将第 9 个元素直接加载到 CPU,但它本身可能会导致性能下降。
附言我对这方面的知识相当有限,所以请放轻松。但是请放过我过早的优化cmets;确保这是该应用程序中真正重要的 3%。
【问题讨论】:
-
数据集通常描述整体大小 - 看起来您有 64B 个对象,但您预计其中有多少?
-
@Leeor 我总共有 9x uint64_t = 68B。出于概念目的,我考虑将另外一个与其他八个进行比较。嗯,只是考虑内存布局......见编辑。
-
这取决于你的目标架构。