kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 user1128016
user1128016
Вопрос

Сравнение и извлечение с использованием SSE

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

3 2012-05-12T13:48:29+00:00 2
 user1128016
user1128016
Редактировал вопрос 13-го мая 2012 в 7:25
Программирование
c++
c
simd
sse
Gunther Piez
Gunther Piez
12-го мая 2012 в 2:16
2012-05-12T14:16:29+00:00
Дополнительно
Источник
Редактировать
#16171271

Невозможно извлечь и переместить равные элементы одной инструкцией. Но маска равных элементов может быть легко получена с помощью pcmpeqd:

__m128i zero = _mm_set1_epi32(0);
__m128i a = _mm_set_epi32(6, 4, 7, 2);
__m128i b = _mm_set_epi32(2, 4, 9, 2);

__m128i mask = _mm_cmp_epi32(a, b);     // mask is now 0, -1, 0, -1
mask = _mm_sub_epi32(zero, mask);       // mask is now 0,  1, 0,  1

Редактирование: Если вам нужен некоторый индекс для таблицы поиска с перетасованными константами, вам нужны дополнительные операции. Например,

static const __m128i zero = _mm_set1_epi32(0);
static const __m128i bits = _mm_set_epi32(1,2,4,8);

__m128i a = _mm_set_epi32(6, 4, 7, 2);
__m128i b = _mm_set_epi32(2, 4, 9, 2);

__m128i bitvector = _mm_and_si128(bits, _mm_cmp_epi32(a, b));
bitvector = _mm_hadd_epi32(bitvector, bitvector);
bitvector = _mm_hadd_epi32(bitvector, bitvector);
// now a index from 0...15 is the the low 32 bit of bitvector

Возможно, существуют лучшие алгоритмы, чем использование таблицы поиска для вычисления шаффла, возможно, вычисление шаффла напрямую с помощью мультипликации De Bruijn. Кроме того, если у вас есть более 4 интов для сравнения, дополнительные 4 инта будут стоить только одного дополнительного фадд.

Gunther Piez
Gunther Piez
Редактировал ответ 13-го мая 2012 в 10:16
3
0
Решение / Ответ
Stephen Canon
Stephen Canon
13-го мая 2012 в 12:54
2012-05-13T12:54:56+00:00
Дополнительно
Источник
Редактировать
#16171272

Я бы, вероятно, использовал вариант того, что предлагает drhirsch:

int index = _mm_movemask_ps((__m128)_mm_cmp_epi32(a, b));

Это даст вам тот же индекс, который можно использовать для поиска маски шаффла, используя только две операции.

2
0
Похожие сообщества 9
pro.cxx
pro.cxx
5 960 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
4 991 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 393 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 205 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2023, 11–12 мая · Online Оффлайн — 23–24 мая · Москва Билеты: https://tinyurl.com/CPPRussia2023 Саппорт: @JUGConfSupport_bot
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
790 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
564 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 16 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией