最快使用超过 64 字节的数据集?
Fastest use of a dataset of just over 64 bytes?
结构: 我有 8 个 64 位整数(512 位 = 64 字节,假定的缓存行宽度),我想将其与另一个 64 位整数进行比较整数,反过来,没有缓存未命中。不幸的是,数据集绝对不灵活——它已经尽可能小了。
访问模式:每个uint64_t实际上是一个4x4x4位的数组,每个位代表体素的存在与否。这意味着有时我会使用一个块的一半和另一个块的一半,甚至是 8 个不同的 64 位块的角……我想这意味着很可能缺乏对齐。
我怎样才能尽快做到这一点,即不破坏缓存?
P.S。这个想法是,这段代码最终将 运行 在至少 64B 缓存行宽度的相当广泛的体系结构上,所以我希望它尽可能快。这也意味着我不能依赖 MOVNTDQA,尽管将第 9 个元素直接加载到 CPU.
,但它本身可能会导致性能下降
P.P.S。我对这方面的知识相当有限,所以请放轻松。但是请原谅我过早的优化评论;确保这是真正重要的应用程序的 3%。
我不会担心的。如果你的数据集真的只有 9 个整数,那么其中的大部分可能都会存储在寄存器中。此外,如果不指定架构,实际上没有任何方法可以优化缓存使用,因为缓存结构 是 架构相关的。如果您可以列出几个目标架构,您可能会找到一些可以优化的共性,但如果不了解这些架构,我认为我们能为您做的不多。
最后,这似乎是一个过早优化的好例子。我建议您采取以下步骤:
- 确定您可接受的最长运行时间
- 用 C 完成你的程序
- 为所有目标架构编译
- 对于那些不符合您的速度规范的平台,手动优化中间汇编文件并重新编译,直到您满足您的规范。
您确定缓存未命中吗?
即使比较值不在寄存器中,我认为您的第一个 uint64 数组应该在一个缓存阶段(或者它被称为什么),而您的其他数据在另一个缓存阶段。
您的缓存肯定具有一些 n 向关联性,这可以防止仅通过访问您的比较值就将您的数据行从缓存中删除。
不要在微优化上浪费时间。改进你的算法和数据结构。
结构: 我有 8 个 64 位整数(512 位 = 64 字节,假定的缓存行宽度),我想将其与另一个 64 位整数进行比较整数,反过来,没有缓存未命中。不幸的是,数据集绝对不灵活——它已经尽可能小了。
访问模式:每个uint64_t实际上是一个4x4x4位的数组,每个位代表体素的存在与否。这意味着有时我会使用一个块的一半和另一个块的一半,甚至是 8 个不同的 64 位块的角……我想这意味着很可能缺乏对齐。
我怎样才能尽快做到这一点,即不破坏缓存?
P.S。这个想法是,这段代码最终将 运行 在至少 64B 缓存行宽度的相当广泛的体系结构上,所以我希望它尽可能快。这也意味着我不能依赖 MOVNTDQA,尽管将第 9 个元素直接加载到 CPU.
,但它本身可能会导致性能下降P.P.S。我对这方面的知识相当有限,所以请放轻松。但是请原谅我过早的优化评论;确保这是真正重要的应用程序的 3%。
我不会担心的。如果你的数据集真的只有 9 个整数,那么其中的大部分可能都会存储在寄存器中。此外,如果不指定架构,实际上没有任何方法可以优化缓存使用,因为缓存结构 是 架构相关的。如果您可以列出几个目标架构,您可能会找到一些可以优化的共性,但如果不了解这些架构,我认为我们能为您做的不多。
最后,这似乎是一个过早优化的好例子。我建议您采取以下步骤:
- 确定您可接受的最长运行时间
- 用 C 完成你的程序
- 为所有目标架构编译
- 对于那些不符合您的速度规范的平台,手动优化中间汇编文件并重新编译,直到您满足您的规范。
您确定缓存未命中吗? 即使比较值不在寄存器中,我认为您的第一个 uint64 数组应该在一个缓存阶段(或者它被称为什么),而您的其他数据在另一个缓存阶段。 您的缓存肯定具有一些 n 向关联性,这可以防止仅通过访问您的比较值就将您的数据行从缓存中删除。
不要在微优化上浪费时间。改进你的算法和数据结构。