【发布时间】: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