При использовании регистра маски с загрузкой и запоминанием AVX-512 возникает ли ошибка при неправильном доступе к замаскированным элементам? - PullRequest
0 голосов
/ 02 февраля 2019

Когда я делаю хранилище AVX-512 с маской записи, например, так:

vmovdqu8 [rsi] {k1}, zmm0

Произойдет ли ошибка инструкции, если какая-то часть памяти, к которой обращаются в [rsi, rsi + 63], не сопоставлена ​​, но маска записиноль для всех этих местоположений (т. е. данные фактически не изменяются из-за маски).

Еще один способ задать вопрос, есть ли у этих хранилищ с масками AVX-512 аналогичная способность подавления сбоев для vmaskmov введено в AVX.

1 Ответ

0 голосов
/ 05 февраля 2019

Ошибка не возникает, если замаскированные элементы касаются недействительной памяти.

enter image description here


Вот несколько тестовых кодов 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**

Этот тест работает следующим образом:

  1. Карта 2 смежных страниц.
  2. Создайте хранилище AVX512 за границей страницы, чтобы доказать, что обе страницы сопоставлены.
  3. Отменить отображение верхней страницы.
  4. Сделать то же хранилище AVX512, но замаскировать байтыкоторые находятся на верхней странице.Не вылетает.
  5. Повторите 1-й магазин AVX512 (без маскировки).Он аварийно завершает работу, подтверждая, что верхняя страница не отображалась, а маскирование подавляло аварийное завершение.
...