Перетасовка AVX с типами, отличными от байтовых

API для перетасовки поддерживает только byte и sbyte.

 //
 // Summary:
 //     __m256i _mm256_shuffle_epi8 (__m256i a, __m256i b)
 //
 //     VPSHUFB ymm, ymm, ymm/m256
 //
 // Parameters:
 //   value:
 //
 //   mask:
 public static Vector256<sbyte> Shuffle(Vector256<sbyte> value, Vector256<sbyte> mask);
 //
 // Summary:
 //     __m256i _mm256_shuffle_epi8 (__m256i a, __m256i b)
 //
 //     VPSHUFB ymm, ymm, ymm/m256
 //
 // Parameters:
 //   value:
 //
 //   mask:
 public static Vector256<byte> Shuffle(Vector256<byte> value, Vector256<byte> mask);

Как бы вы сделали перетасовку других типов? Например, скажем, у меня есть Vector256<short> и я хочу перемешаться с маской типа [0, 1, 7, 7, 3, 3, 2, 0]?

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Для вектора (u)short обычно да (но это сложнее), если только вы не можете использовать AVX512 (для VPERMW) или индексы выстроены в пары, чтобы вы могли перетасовать его как вектор (u)int.

Для вектора (u)int есть PermuteVar8x32, что в любом случае более удобно.

Кстати, у Vector256.Shuffle есть перегрузка для перетасовки вектора шорт, но, по крайней мере, в моих тестах она просто вызывает какой-то запасной метод, так что вы, вероятно, не захотите на него полагаться.

В общем, перетасовка вектора шорт с помощью AVX2 представляет собой немного большую загадку, чем просто перетасовка вектора байтов - перетасовка вектора байтов в целом сложнее, чем вызов Avx2.Shuffle, что действительно является проблемой. Avx2.Shuffle является частью решения, но VPSHUFB не перемещает байты между двумя 128-битными половинами 256-битного вектора. Существуют различные решения в зависимости от того, как выглядят ваши индексы, но в целом идея состоит в том, чтобы в основном полагаться на перетасовку байтов и обработку перемещения между двумя 128-битными частями отдельно.

Например, вы можете создать 256-битный вектор, содержащий две копии нижней половины данных, другой 256-битный вектор, содержащий две копии верхней половины данных, перетасовать каждую из них, а затем смешать в зависимости от того, есть ли вам нужен байт из нижней или верхней части. В общем, с его помощью вы можете выполнить любое перетасовывание 32 байтов и построить на его основе перетасовку слов.

Я предполагаю, что пример, который вы привели в конце, будет довольно дорогим? дороже, чем перетасовка байтов? также вы имели в виду смешивание с BlendVariable?

Vastar 20.07.2024 20:43

@Vastar да, и обычно да, если только ваши индексы не постоянны (для постоянных индексов вы также можете найти лучшую последовательность операций, которая обрабатывает эти конкретные индексы)

user555045 20.07.2024 20:46

Создание копий — это комбинация GetLower и GetHigher с BroadcastVector128ToVector256? Хотя похоже, что GetLower и GetHigher не сильно ускоряются.

Vastar 20.07.2024 21:07

@Vastar Permute2x128 тоже вариант

user555045 20.07.2024 21:15

Другие вопросы по теме