AVX512 вводит необязательную нулевую маскировку и маскировку слияния почти для всех инструкций.
Перед этим, чтобы выполнить условное добавление, замаскируйте один операнд (с vandps
или vandnps
для инверсии) перед добавлением (вместо vblendvps
в результате). Вот почему упакованные инструкции сравнения/внутренние элементы производят элементы со всеми нулями или со всеми единицами.
0.0
является аддитивным элементом идентификации, поэтому его добавление не имеет смысла. (За исключением семантики IEEE -0.0 и +0.0, я забыл, как именно это работает).
Маскирование константного ввода вместо смешивания результата позволяет избежать удлинения критического пути, например, при условном добавлении 1.0
.
Условное умножение более громоздко, потому что 0.0
не является мультипликативным тождеством. Вам нужно умножить на 1.0
, чтобы сохранить значение неизменным, и вы не можете легко получить это с помощью AND или ANDN с результатом сравнения. Вы можете смешивать входные данные или выполнять умножение и смешивать выходные данные.
Альтернативой blendv является как минимум 3 логических значения, таких как AND/ANDN/OR, но обычно это того не стоит. Хотя обратите внимание, что Haswell запускает vblendvps
и vpblendvb
как 2 мопов для порта 5, так что это потенциально узкое место по сравнению с использованием целочисленных логических значений, которые могут работать на любом порту. Skylake запускает их vblendvps
как 2 мопса для любого порта. Однако может иметь смысл что-то сделать, чтобы избежать появления blendv на критическом пути.
Маскирование входного операнда или смешивание результата — это обычно то, как вы выполняете условные операторы SIMD без ветвления.
BLENDV обычно составляет не менее 2 мопов, поэтому он медленнее, чем AND.
Немедленные смешивания намного эффективнее, но вы не можете их использовать, потому что управление imm8
смешиванием должно быть константой времени компиляции, встроенной в машинный код инструкции. Вот что означает немедленный в контексте языка ассемблера.
person
Peter Cordes
schedule
24.08.2017
imm8
. - person Serge Rogatch   schedule 23.08.2017