AVX-512掩码内存访问的性能表现

10

掩码技术是否可以提高AVX-512内存操作(load/store/gather/scatter和非洗牌load-ops)的性能?

由于被屏蔽的元素不会触发内存故障,因此人们会认为在这些情况下使用掩码有助于性能提升,但是,如果使用了0掩码会怎么样呢:

  • 跨越缓存行边界的load/store - 是否可以抑制缓存行交叉惩罚?
    • 如果两个或两个以上的缓存行不在L1缓存中,是否可以抑制从L2高速缓存(或更远的位置)中加载数据?
    • 被屏蔽的load操作是否会影响内存重排序?
  • gather/scatter的吞吐量似乎受到CPU的load-store单元的限制,但是屏蔽元素能减轻这种影响吗?

这是针对当前英特尔处理器的情况,但也很有趣看看启用AVX-512的AMD处理器如何处理。


3
好问题,我自己也想过这个问题。我怀疑掩码操作可能不如非分离式操作快,因为它很可能是并行处理的,在地址生成之前不检查掩码,在检查大小时进行。特别是对于4k分离情况。但请求L2缓存被拒绝的可能性是很大的。 - Peter Cordes
2
AVX1/2在Skylake上的vmaskmovps可能使用类似的实现方式,而越过未映射页面的故障抑制会变慢。或者不写入只读页面,这可能是由于操作系统的写时复制技巧导致的,需要微码辅助。(SSE:掩码存储是否影响被屏蔽的字节/MaskStore在幕后做了什么?)。AMD上的掩码存储目前很慢,因此我很好奇Zen4如何实现AVX-512的这一部分。 - Peter Cordes
1
更正一下,我不确定在Skylake上使用AVX vmaskmovps(一些有效的和一些无效的)穿越到未映射页面是否会变慢;我记得从我的测试结果中,全零掩码情况在一个不可写页面上会变慢,因此如果没有替换操作完成,则可能对数组的条件更新产生不良影响。 (另外TODO:在一个可写但干净的页面上进行测试,以查看它是否保持干净,因此每次更新页面表位都必须进行协助)。如果我没记错,在英特尔的优化手册中也提到了这方面的一些内容,还有关于存储转发的内容。 - Peter Cordes
1个回答

1
我在启用了AVX-512的Intel 12700K上运行了一些测试。这是我第一次尝试,如果出现问题也不意外。
我不确定如何可靠地测试L2行为或重新排序,但对于其他方面,我使用nanoBench并运行this script,得出了这些结果CSV格式)。
测试的指令:
  • 加载
    • VMOVDQU8/64
    • VPADDB/Q(load-op)
    • VPEXPANDB/Q
    • VPMOVZXBD
  • 存储
    • VMOVDQU8/64
    • VPCOMPRESSB/Q
    • VPMOVQW
  • VPGATHERDD和VPSCATTERDD

我无法看出基于掩码值(0或-1测试)的负载之间的任何区别,但是存储可能会有轻微差异。 我不完全确定CORE_CYCLES的含义,但是与-1掩码相比,0掩码少了一个周期。
这种行为在测试的存储指令中似乎是一致的,但是VMOVDQU64的负载+存储测试是个例外(差异约为5个周期)。 我不知道为什么,但结果是可重复的。 跨缓存线似乎也不是差异的原因 - 测试像1、2和128这样的掩码似乎表明只有使用0掩码才能实现较低的CORE_CYCLES

“Gather/scatter”无论掩码或指令命中的缓存行数,都给我提供了相同的结果。
我认为可以合理地假设掩码值通常不会影响掩码内存访问(除了可能抑制故障)。也许它对存储有轻微影响,但我对此不太清楚,这可能取决于微架构。

2
感谢您进行一些测试。如果描述了nanoBench正在测试什么,例如您的“始终相同”是否仅适用于对齐的64字节访问,或者这也测试了缓存行拆分和页面拆分。以及这些测试是吞吐量和/或延迟。 (以及被测试的事物的数字实际上是什么,例如1 / clock 64字节存储吞吐量?)有一个提到测试vmovdqu64的高速缓存线路交叉,但不清楚您是否通常进行了测试。 - Peter Cordes
好问题,可惜我没有答案。它回答了我在问题中想知道的内容,但如果有人愿意提供更详细的分析,那当然是受欢迎的。 - zinga
1
我建议的一些改进只是将脚本中使用的信息包含在问题本身中,而不仅仅是链接到gist。此外,还应该包括一些测试中实际的数字,以便我们可以看到对齐与未对齐的惩罚有多大,而不仅仅是你的总结“有或没有掩码是相同的”。看到这些数字有助于更好地理解正在进行的测试,考虑到现有的CPU性能知识。 - Peter Cordes
感谢您的建议和解释,但分析不是我的强项,我不知道什么是相关的或不相关的,因此我包含了所有内容,以便读者可以决定。如有需要,请随时添加澄清,或者如果您认为更合适,我可以删除此答案。如果您需要来自此硬件的更多信息并且有完整的脚本,我可以运行它并发布其输出,以帮助您获取所需的任何信息。 - zinga
这就是问题所在,你的回答中并没有包含所有内容,大部分只是一些可能会失效的外部链接。实际回答中只有最简短的摘要,因此最好包含一些代表性数字,例如如果其他情况类似,则从一个加载和一个存储案例中获取数据会更好。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接