Дополнительно
Сравнение и извлечение с использованием SSE
Каков наилучший способ попарного сравнения двух целочисленных регистров и извлечения одинаковых элементов с помощью инструкций SSE? Например, если a = [6 4 7 2]
и b = [2 4 9 2]
(каждый регистр содержит четыре 32-битных целых числа), то результатом должно быть [4 2 x x]
. Альтернативная форма этого вопроса - как получить двоичную маску из одинаковых элементов (..0101b
), которая может быть использована для перестановки или как индекс для поиска параметра инструкции перестановки в предварительно вычисленной таблице.
3
2
Невозможно извлечь и переместить равные элементы одной инструкцией. Но маска равных элементов может быть легко получена с помощью
pcmpeqd
:Редактирование: Если вам нужен некоторый индекс для таблицы поиска с перетасованными константами, вам нужны дополнительные операции. Например,
Возможно, существуют лучшие алгоритмы, чем использование таблицы поиска для вычисления шаффла, возможно, вычисление шаффла напрямую с помощью мультипликации De Bruijn. Кроме того, если у вас есть более 4 интов для сравнения, дополнительные 4 инта будут стоить только одного дополнительного
фадд
.Я бы, вероятно, использовал вариант того, что предлагает
drhirsch
:Это даст вам тот же индекс, который можно использовать для поиска маски шаффла, используя только две операции.