Intel AVX-512: как установить бит EVEX.z - PullRequest
2 голосов
/ 20 марта 2020

Бит EVEX.z используется в AVX-512 вместе с регистрами k для управления маскированием. Если бит z равен 0, это маскировка слияния, а если бит z равен 1, нулевые элементы в регистре k обнуляются на выходе.

Синтаксис выглядит следующим образом:

VPSUBQ zmm0{k2}{z},zmm1,zmm2

, где {z} представляет бит z.

Но как установить или протестировать бит EVEX.z? Я искал каждый ресурс, который я могу найти, но я не нашел ответа.

1 Ответ

5 голосов
/ 20 марта 2020

Как я понимаю, они имеют в виду, что VPSUBQ zmm0{k2}{z},zmm1,zmm2 и
VPSUBQ zmm0{k2},zmm1,zmm2 - это две разные инструкции, кодировка которых отличается одним битом, называемым "бит z". (Это определенно часть префикса EVEX к инструкции. Документы Википедии все поля)

Таким образом, вы "устанавливаете бит z", указав {z} в исходном коде ассемблера, сообщив ассемблер для генерации инструкции с соответствующим установленным битом. Это задокументировано во многих местах, например, в руководстве по набору инструкций Intel vol.2, и в некоторой степени в руководстве Intel по встроенным функциям с версиями mask (слияния-маски) и maskz (нуля-маскирования) большинства встроенных функций)

Это , а не физический бит в состоянии ЦП, такой как флаг направления или что-то подобное, который будет сохраняться от одной инструкции к следующей. Не имеет смысла «проверять» его.


Чтобы проиллюстрировать, вот что я получаю, собирая обе версии:

00000000  62F1F5CAFBC2      vpsubq zmm0{k2}{z},zmm1,zmm2
00000006  62F1F54AFBC2      vpsubq zmm0{k2},zmm1,zmm2

Обратите внимание, что кодировки отличаются старшим битом четвертого байта. Это ваш «бит z».


Может быть, вы думали, что можете «установить» или «очистить» бит z во время выполнения, таким образом, изменив эффект маскирования последующих инструкций? Так как это часть кодирования каждой инструкции, а не состояние процессора, этот способ мышления работает только в том случае, если вы выполняете команды JIT на лету или используете самоизменяющийся код.

В «нормальном» режиме впереди код, вам придется писать код в обеих версиях, один раз с инструкциями {z} и один раз без. Используйте условный переход, чтобы решить, какую версию выполнить.

...