AVX-512 屏蔽内存访问的性能

zin*_*nga 10 performance x86 cpu-architecture avx512

屏蔽能否提高 AVX-512 内存操作(加载/存储/聚集/分散和非洗牌加载操作)的性能?

鉴于屏蔽元素不会触发内存错误,人们会认为屏蔽在这些情况下有助于提高性能,但是,如果使用 0 屏蔽,则以下情况会怎样:

  • 跨越缓存线边界的加载/存储 - 这会抑制缓存线交叉惩罚吗?
    • 如果其中一个或两个缓存行不在 L1 中,则抑制来自 L2 缓存(或更远的地方)的负载?
    • 屏蔽负载会影响内存重新排序吗?
  • 收集/分散吞吐量似乎受到 CPU 加载存储单元的限制,但是屏蔽元素会减轻这种影响吗?

目前,这将是在当前英特尔处理器的背景下,但了解支持 AVX-512 的 AMD 处理器如何处理此问题将会很有趣。

zin*_*nga 1

我尝试在支持 AVX-512 的 Intel 12700K 上运行一些测试。我以前没有这样做过,所以如果我搞砸了一些事情,我也不会感到惊讶。

我不确定如何测试 L2 行为或可靠地重新排序,但对于其余的,我使用nanoBench并运行此脚本,产生这些结果CSV 形式)。

已测试指令:

  • 加载
    • VMOVDQU8/64
    • VPADDB/Q(加载操作)
    • VPEXPANDB/Q
    • VPMOVZXBD
  • 店铺
    • VMOVDQU8/64
    • VPCOMPRESSB/Q
    • VPMOVQW
  • VPGATHERDD 和 VPSCATTERDD

根据负载的掩码值(测试为 0 或 -1),我看不到任何差异,但是商店可能会略有不同。不完全确定这CORE_CYCLES意味着什么,但与 -1 掩码相比,0 掩码少了一个周期。
这种行为在测试的存储指令中似乎是一致的,加载+存储测试是VMOVDQU64奇怪的异常(大约 5 个周期的差异)。我不知道为什么,但结果是可重复的。高速缓存线交叉似乎也不是差异背后的原因 - 测试掩码(例如 1、2 和 128)似乎表明CORE_CYCLES只有使用 0 掩码才能实现更低的性能。

无论指令将命中的掩码或缓存行数量如何,聚集/分散都会给我相同的结果。

我认为可以公平地假设掩码值通常不会影响掩码内存访问(除了可能抑制错误之外)。也许它对商店有轻微的影响,但我对此并不清楚,并且可能依赖于 uArch。

  • 感谢您进行一些测试。如果它描述了 nanoBench 正在测试的内容,例如您的“始终相同”是否仅适用于对齐的 64 字节访问,或者这是否也测试了缓存行拆分和页面,那么这个答案将更加有用和独立。分裂。以及这些测试是否是吞吐量和/或延迟。(被测试的东西的实际数字是多少,比如 1/时钟 64 字节存储吞吐量?)有一次提到测试“vmovdqu64”的缓存行交叉,但不清楚您是否总体上测试了这一点。 (2认同)