【问题标题】:Performance of AVX-512 masked memory accessesAVX-512 屏蔽内存访问的性能
【发布时间】:2022-08-18 19:04:14
【问题描述】:

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

看到被屏蔽的元素不会触发内存故障,人们会假设在这些情况下屏蔽有助于提高性能,但是,如果使用 0 掩码,以下情况会怎样:

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

这将是在当前英特尔处理器的背景下,但看看启用 AVX-512 的 AMD 处理器如何处理这个问题会很有趣。

  • 好问题,我自己也想知道。我怀疑屏蔽能否使拆分加载与非拆分加载一样快。它可能是并行处理的,而不是在地址生成之前检查掩码并根据大小进行检查。特别是对于 4k 分割。但是,对 L2 的请求不会发生当然是合理的。
  • Skylake 上的 AVX1/2 vmaskmovps 可能使用了类似的实现,并且跨入未映射页面的故障抑制很慢。或者不写入只读页面,这可能是由于操作系统的写时复制技巧而发生的,非常慢,微码辅助。 (SSE: does mask store affect the bytes that were masked out/What does MaskStore do behind the scenes?)。 Masked store 目前在 AMD 上速度很慢,所以我很好奇 Zen4 是如何实现 AVX-512 的那部分的。
  • 更正,我不确定穿越到带有 AVX vmaskmovps 的 Skylake 上未映射的页面很慢(有些有效,有些无效);我从测试结果中记得的是,全零掩码情况在不可写页面上速度很慢,因此如果没有完成替换,则可能对数组的条件更新不利。 (还有 TODO:在一个可写但干净的页面上进行测试,看看它是否保持干净,因此每次都需要帮助来更新页表位)。 IIRC,在英特尔的优化手册中提到了其中的一些内容,也包括:存储转发。

标签: performance x86 cpu-architecture avx512


【解决方案1】:

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

我不确定如何可靠地测试 L2 行为或重新排序,但对于其余部分,我采用 nanoBench 并运行 this script,产生 these results (CSV form)。

测试指令:

  • 加载
    • 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。

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 2017-12-23
    • 2018-01-31
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2019-06-27
    相关资源
    最近更新 更多