Инструкция по перестановке
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2021 г. ) |
Инструкции перестановки (и перемешивания), являющиеся частью манипуляций с битами , а также векторной обработки , копируют неизмененное содержимое из исходного массива в целевой массив, где индексы задаются вторым исходным массивом. [1] Размер (разрядность) исходных элементов не ограничен, но остается таким же, как размер назначения.
Существует два важных варианта перестановки, известные как сбор и рассеяние соответственно. Вариант сбора следующий:
for i = 0 to length-1
dest[i] = src[indices[i]]
где вариант разброса:
for i = 0 to length-1
dest[indices[i]] = src[i]
на основе памяти Обратите внимание, что в отличие от метода сбора-разброса все три dest
, src
, и indices
являются регистрами (или частями регистров в случае перестановки на уровне битов), а не ячейками памяти.
Вариант разброса можно рассматривать как «рассеивающий» исходные элементы по (в) пункту назначения, где вариант «сбора» собирает данные из индексированных исходных элементов.
Учитывая, что индексы могут повторяться в обоих вариантах, результирующий результат не является строгой математической перестановкой , поскольку в выходных данных могут встречаться дубликаты.
Особый случай перестановки также используется в « перестановке » графического процессора (опять же, не в строгом смысле перестановки), которая выполняет оперативное переупорядочение данных субвектора, чтобы выровнять или дублировать элементы с соответствующей полосой SIMD .
Появление инструкций перестановки
[ редактировать ]Инструкции по перестановке встречаются как в скалярных процессорах, так и в механизмах векторной обработки , а также в графических процессорах . В векторных наборах команд они обычно называются операциями «Register Gather/Scatter», например, в RISC-V . векторах [2] и возьмите векторы в качестве входных данных как для исходных элементов, так и для исходного массива, и выведите еще один вектор.
В наборах скалярных команд скалярные регистры разбиваются на более мелкие секции (распакованные, в стиле SIMD ), где фрагменты затем используются в качестве источников массива. (Небольшие, частичные) результаты затем объединяются (упаковываются) обратно в скалярный регистр в качестве результата.
Некоторые ISA, особенно для криптографических приложений, даже имеют операции перестановки на уровне битов , такие как
bdep
(bit deposit) in RISC-V bitmanip; [3] в Power ISA он известен как bpermd
и был включен в течение нескольких десятилетий и до сих пор входит в спецификацию Power ISA v.3.0 B. [4]
Также в некоторых невекторных ISA из-за того, что иногда в одном входном регистре источника недостаточно места для полного указания исходного массива перестановки (особенно если операция включает в себя перестановку на уровне битов), будут включать инструкции частичного переупорядочения. Примеры включают в себя VSHUFF32x4
от AVX-512 .
Операции перестановки в различных формах на удивление распространены и встречаются в AltiVec , Power ISA , PowerPC G4 , AVX-512 , SVE2 , [5] векторные процессоры и графические процессоры . Они настолько важны, что LLVM добавила shufflevector
[6] встроенный и GCC добавили __builtin_shuffle
внутренний. [7] Внутренняя функция GCC соответствует функциональности встроенной функции Shuffle OpenCL . [8] Обратите внимание, что все это математически не является перестановками, поскольку в выходных данных могут встречаться дубликаты.
См. также
[ редактировать ]- Кеплер (микроархитектура) § Инструкции в случайном порядке
- Серия GeForce 700 § Новые инструкции для перемешивания
Ссылки
[ редактировать ]- ^ Руководство для разработчика программного обеспечения для архитектур Intel® 64 и IA-32, объединенные тома: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D и 4 (PDF) . Интел. Июнь 2021. с. 5-356 Том. 2С.
- ^ «Векторное расширение RISC-V «V» – 16.4. Инструкции по сбору векторного регистра» . GitHub — riscv/riscv-v-spec . Проверено 10 июля 2021 г.
- ^ "riscv/riscv-bitmanip" . Гитхаб . Проверено 10 июля 2021 г.
- ^ «Power ISA версии 3.0 B» . Power.org. 27 марта 2017 г. Проверено 11 августа 2019 г.
- ^ ARM HPC, сводка расширений SVE2, стр. 32
- ^ «Документация LLVM 13: shufflevector» . Справочное руководство по языку LLVM . Проверено 10 июля 2021 г.
- ^ «Векторные расширения (с использованием коллекции компиляторов GNU (GCC))» . GCC, Коллекция компиляторов GNU — Проект GNU — Фонд свободного программного обеспечения (FSF) . Проверено 10 июля 2021 г.
- ^ «Спецификация OpenCL: shuffle, shuffle2» . Хронос Групп Инк . Проверено 10 июля 2021 г.