Ошибка не возникает, если замаскированные элементы касаются недействительной памяти.
Вот несколько тестовых кодов Windows, чтобы доказать, что маскирование действительноподавление ошибок памяти.
#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");
}
Вывод:
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**
Этот тест работает следующим образом:
- Карта 2 смежных страниц.
- Создайте хранилище AVX512 за границей страницы, чтобы доказать, что обе страницы сопоставлены.
- Отменить отображение верхней страницы.
- Сделать то же хранилище AVX512, но замаскировать байтыкоторые находятся на верхней странице.Не вылетает.
- Повторите 1-й магазин AVX512 (без маскировки).Он аварийно завершает работу, подтверждая, что верхняя страница не отображалась, а маскирование подавляло аварийное завершение.