When I do a writemasked AVX-512 store, like so:
vmovdqu8 [rsi] {k1}, zmm0
Will the instruction fault if some portion of the memory accessed at [rsi, rsi + 63] is not mapped but the writemask is zero for all those locations (i.e., the data is not actually modified due to the mask).
Another way of asking it is if these AVX-512 masked stores have a similar fault suppression ability to vmaskmov introduced in AVX.
No fault is raised if masked out elements touch invalid memory.

Here's some Windows test code to prove that masking does indeed suppress memory faults.
#include <immintrin.h>
#include <iostream>
#include <Windows.h>
using namespace std;
int main(){
const size_t PAGE = 4096;
// Map 2 pages.
char* ptr = (char*)VirtualAlloc(
nullptr, 2*PAGE,
MEM_COMMIT,
PAGE_READWRITE
);
// Store 64 bytes across page boundary.
cout << "Store across page boundary." << endl;
_mm512_storeu_si512(ptr + PAGE - 32, _mm512_set1_epi8(-1));
// Unmap top page.
cout << "Unmap top page." << endl;
VirtualFree(ptr + PAGE, PAGE, MEM_DECOMMIT);
// Write on boundary masking out the part that touches the top (unmapped page).
// Does not crash because bad accesses are masked out.
cout << "Store across page boundary, but mask out bytes that are on unmapped page." << endl;
_mm512_mask_storeu_epi8(ptr + PAGE - 32, 0x00000000ffffffff, _mm512_set1_epi8(-1));
// Store 64 bytes across page boundary.
// Crashes because of bad access.
cout << "Store across page boundary." << endl;
_mm512_storeu_si512(ptr + PAGE - 32, _mm512_set1_epi8(-1));
cout << "Release bottom page." << endl;
VirtualFree(ptr, 0, MEM_RELEASE);
system("pause");
}
Output:
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**
This test works as follows:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With