X86 当使用带有AVX-512加载和存储的掩码寄存器时,是否会因对屏蔽元素的无效访问而引发故障?

X86 当使用带有AVX-512加载和存储的掩码寄存器时,是否会因对屏蔽元素的无效访问而引发故障?,x86,avx,avx512,X86,Avx,Avx512,当我执行写掩码AVX-512存储时,如下所示: vmovdqu8 [rsi] {k1}, zmm0 如果在[rsi,rsi+63]处访问的内存的某些部分未映射,但所有这些位置的writemask均为零(即,由于掩码,数据未实际修改),则指令将出现故障 另一种询问方式是,这些AVX-512掩蔽存储是否具有与AVX中引入的vmaskmov类似的故障抑制能力。如果掩蔽的元素接触无效内存,则不会引发故障 这里有一些Windows测试代码来证明屏蔽确实抑制了内存故障 #包括 #包括 #包括 使用名称

当我执行写掩码AVX-512存储时,如下所示:

vmovdqu8 [rsi] {k1}, zmm0
如果在
[rsi,rsi+63]
处访问的内存的某些部分未映射,但所有这些位置的writemask均为零(即,由于掩码,数据未实际修改),则指令将出现故障


另一种询问方式是,这些AVX-512掩蔽存储是否具有与AVX中引入的
vmaskmov
类似的故障抑制能力。

如果掩蔽的元素接触无效内存,则不会引发故障


这里有一些Windows测试代码来证明屏蔽确实抑制了内存故障

#包括
#包括
#包括
使用名称空间std;
int main(){
const size\u t PAGE=4096;
//地图2页。
char*ptr=(char*)VirtualAlloc(
空PTR,2*页,
请记住,
页面\读写
);
//跨页面边界存储64个字节。

是的,现在查阅第2卷手册参考。EVEX编码指令的2.7异常分类。它没有明确区分存储和加载,但我认为他们会说,如果存储没有像
vmaskmovps
那样抑制故障。他们使用术语“内存故障抑制”。(以及FPU故障抑制).他们确实明确地将NT存储列为不抑制故障(我猜即使所有掩码位都已清除)。我95%确信屏蔽元素不会出现故障。我见过英特尔编译器皮尔循环这种方式,我自己也做过很多次,从来没有遇到过任何问题。但我承认我自己从来没有用mmap之类的东西实际测试过。OTOH,我确实从某个地方读过(我忘了在哪里读过)对屏蔽元素的无效访问仍然会带来缓存未命中+TLB未命中的性能损失。这样的幻灯片让我相信而不是实际测试它:@Mystical-是的,我在搜索中遇到了一个类似的幻灯片(可能是同一个事实)。有点奇怪,虽然Peter找到的东西非常接近,但我们在手册中找不到任何完全确定的东西。同一演示文稿的另一张幻灯片()提到,使用内存源操作数进行洗牌不会进行故障抑制(因为掩蔽是按dst位置进行的,而不是按src进行的)。但是这些幻灯片没有明确提到存储。无论如何,感谢您测试这一点以确认我们所有人的想法。值得一提的是,在相信此测试之前先看看程序集,因为编译器有足够的空间来击败它。虽然MSVC和英特尔编译器都不是这样,但编译器也有可能不是这样o优化掉一些死掉的存储,或者对屏蔽存储进行强度降低(因为上面的32字节都是非活动的)。
Store across page boundary.
Unmap top page.
Store across page boundary, but mask out bytes that are on unmapped page.
Store across page boundary.
**Access violation**