Что такое СВЭ
Набор инструкций NEON является стандартной реализацией данных с несколькими инструкциями (SIMD) для архитектуры ARM64. SVE (Scalable Vector Extension) – это новый набор векторных инструкций, разработанный для высокопроизводительных вычислений (HPC) и машинного обучения. Это реализация набора инструкций SIMD нового поколения, а не простое расширение набора инструкций NEON. В наборе инструкций SVE есть много понятий, похожих на набор инструкций NEON, таких как векторы, каналы, элементы данных и т. д. Набор инструкций SVE также предлагает новую концепцию:Модель программирования переменной длины вектора(VectorLength Agnostic, VLA).
Традиционный набор инструкций SIMD использует векторный регистр фиксированного размера, например, набор инструкций NEON использует векторный регистр фиксированной 128-битной длины. Набор инструкций SVE, который поддерживает модель программирования VLA, поддерживает векторные регистры переменной длины. Это позволяет разработчику микросхемы выбирать соответствующую длину вектора в зависимости от нагрузки и стоимости. Длина векторного регистра набора инструкций SVE поддерживает минимум 128 бит и максимум 2048 бит с шагом 128 бит. Дизайн SVE гарантирует, что одно и то же приложение может работать на машинах с инструкциями SVE, которые поддерживают разные длины векторов, без перекомпиляции кода, что является сутью модели программирования VLA.
Набор инструкций SVE — это новый набор наборов инструкций, основанный на наборе инструкций A64, тогда как SVE2 выпущен на архитектуре ARMv9, которая является надмножеством и расширением набора инструкций SVE.
Набор инструкций SVE содержит сотни инструкций, которые можно разделить на следующие категории.
Ø Инструкции по загрузке и хранению, а также инструкции по предварительной выборке
Ø Инструкция векторного перемещения
Ø Целочисленные инструкции по эксплуатации
Ø Инструкции по работе с битами
Ø Инструкции по работе с числами с плавающей запятой
Ø Упреждающие инструкции по эксплуатации
Ø Инструкции по работе с элементами данных
Набор инструкций SVE2 дополнительно расширен и улучшен на основе набора инструкций SVE, и были добавлены некоторые новые инструкции и расширения. В этом разделе не дается подробное введение в каждую инструкцию.Заинтересованные читатели могут прочитать документ набора инструкций ARMv9: «Arm A64 Instruction SetArchitecture, Armv9, for Armv9-A Architectureprofile».
Что такое векторные вычисления?
SIMD, полное название Single Instruction Multiple Data, обрабатывает несколько данных с помощью одной инструкции, обеспечивая возможности параллельной обработки небольших данных. ARM добавила расширение набора инструкций NEON, начиная с архитектуры ARMv7, и векторизованные параллельные вычисления для обработки изображений, обработки аудио и видео, кодирования и декодирования видео и других сценариев.
SISD (Single Instruction Single Data) относится к одиночным данным с одной инструкцией. Большинство инструкций ARM64 представляют собой одиночные данные с одной инструкцией (SISD). Каждая инструкция выполняет указанную операцию с одним источником данных, поэтому для обработки нескольких элементов данных требуется несколько инструкций. Например, для выполнения 4 операций сложения требуется 4 инструкции для сложения из 4 регистров.
ADD w0, w0, w5
ADD w1, w1, w6
ADD w2, w2, w7
ADD w3, w3, w8
Если элементы данных небольшие, например, при добавлении 8-битных значений, каждое 8-битное значение необходимо загрузить в отдельный 64-битный регистр. Поскольку процессоры, регистры и пути данных предназначены для 64-разрядных вычислений, выполнение большого количества отдельных операций с небольшими объемами данных неэффективно использует ресурсы компьютера.
SIMD относится к множественному потоку данных с одной инструкцией, который одновременно выполняет одну и ту же операцию над несколькими элементами данных. Эти элементы данных упакованы в отдельные дорожки (дорожки) в большом регистре. Например, инструкция ADD складывает вместе 32-битные элементы данных. Значения упаковываются отдельными дорожками в две пары 128-битных регистров (V8 и V9 соответственно). Затем каждый канал в первом исходном регистре добавляется к соответствующему каналу во втором исходном регистре, который затем сохраняется в том же канале в целевом регистре (V10).
ADD V0.4S, V1.4S, V2.4S
Как показано на рисунке 1, инструкция ADD будет выполнять 4 операции сложения параллельно, они расположены в 4 вычислительных каналах внутри процессора и не зависят друг от друга, любое переполнение или перенос в каком-либо канале не повлияет на другие каналы.
V0.4S[0] = V1.4S[0]+ V2.4S[0]
V0.4S[1] = V1.4S[1]+ V2.4S[1]
V0.4S[2] = V1.4S[2]+ V2.4S[2]
V0.4S[3]= V1.4S[3] + V2.4S[3]
На рисунке 1 128-битный векторный регистр Vn может одновременно хранить четыре 32-битных данных Sn, а также два 64-битных данных Dn, восемь 16-битных данных Hn или 16 8-битных данных Bn.
SIMD отлично подходит для сценариев обработки изображений. Обычно используемыми типами данных изображения являются форматы RGB565, RGBA8888, YUV422 и др. Характеристики данных этих форматов заключаются в том, что один компонент (компоненты A, R, G и B) пикселя представлен 8-битными данными. Если вы используете традиционный процессор для выполнения вычислений, несмотря на то, что регистры процессора являются 32-битными или 64-битными, вы можете использовать только младшие 8 бит регистра для обработки этих данных, что является пустой тратой времени. Если 64-битный регистр разбить на 8 8-битных каналов данных, то одновременно может выполняться 8 операций, а вычислительная эффективность увеличивается в 8 раз.
Таким образом, разница между SISD и SIMD показана на рисунке 2.
Векторы и каналы
Форматы векторных данных (Vectorformats) часто используются в инструкциях SIMD. Вектор делится на несколько дорожек, каждая из которых содержит элемент вектора. Как показано на рисунке 3, векторный регистр Vn можно разделить на 8 16-битных данных, таких как канал 0, канал 1 и так далее.
Канал может состоять из множества различных типов данных, например, 128-битный тип данных представлен Vn, 64-битный тип данных представлен Dn, 32-битный тип данных представлен Sn, 16-битный тип данных представлен by Hn Указывает, что 8-битный тип данных представлен Bn, как показано на рисунке 4.
В наборе векторных инструкций (NEON/SVE) инструкции обычно можно разделить на две категории: одна представляет собой векторные (векторные) рабочие инструкции, а другая — скалярные (скалярные) рабочие инструкции. Векторная операция относится к одновременной работе с данными всех каналов в векторном регистре, а скалярная операция относится к работе только с данными одного канала в векторном регистре.
Набор регистров SVE
Набор инструкций SVE предоставляет совершенно новый набор регистров.
Ø 32 новых векторных регистра переменной длины Z0~ Z31.
Ø 16 регистров предсказания (предикатный регистр) P0 ~ P15.
Ø Регистр предиката первой неисправности (FFR)
Ø Регистр управления SVE ZCR_Elx
(1) Векторный регистр переменной длины Z
Регистр Z является регистром данных, и его длина может быть переменной. Его длина кратна 128, вплоть до 2048 бит. Данные в регистре Z можно использовать для хранения 8-битных, 16-битных, 32-битных, 64-битных или 128-битных элементов данных, как показано на рисунке 5. Младшие 128 бит каждого регистра Z мультиплексируются с соответствующим регистром NEON.
(2) Регистр предсказания P
Регистр P резервирует один бит для каждого байта в регистре Z, то есть регистр P всегда составляет 1/8 размера регистра Z. Инструкции предиката используют регистр P, чтобы определить, какие элементы вектора (данные дорожки) следует обрабатывать. Каждый бит в регистре P определяет, активен или неактивен соответствующий байт в регистре Z.
Когда элемент данных имеет ширину 8 бит (Bn), регистр P может использовать 1 бит для указания своего активного состояния.Этот бит равен 1 для активного и 0 для неактивного. По аналогии, когда элемент данных имеет ширину 128 бит (Vn), регистр P резервирует 8 бит для указания активного состояния соответствующего элемента данных в регистре Z, но только младший 1 бит используется для указания его активного состояния. , остальные биты зарезервированы.
Предполагая, что длина векторного регистра составляет 256 бит, векторный регистр разделен на 8 каналов, и каждый канал хранит 32-битные данные. Если вы хотите одновременно обрабатывать данные этих 8 каналов в инструкции SVE, вам нужно использовать регистр P для представления состояния этих 8 каналов данных. Как показано на рисунке 6, регистр Pn также разделен на 8 групп, каждая группа состоит из 4 бит, и каждая группа использует только младший бит для указания активного состояния соответствующего канала данных (шириной 32 бита) в регистре Zn. . Например, бит [3:0] регистра Pn представляет канал 0 регистра Zn, бит [7:4] регистра Pn представляет канал 1 регистра Zn и так далее.
(3) Регистр FFR
Размер регистра FFR такой же, как у регистра формата и предсказания P. Регистр FFR используется для инструкции PredicteLoad First Fault, такой как инструкция LDRFF. При использовании первого отвода аномальной прогнозируемой загрузки для загрузки элементов вектора регистр FFR своевременно обновляет статус загрузки каждого элемента данных, независимо от того, успешно он или нет.
(4) Регистр ECR_ELx
Системное программное обеспечение может установить длину векторного регистра через поле LEN в регистре ECR_ELx. Однако установленная длина не может превышать длину, реализованную аппаратно.
Синтаксис инструкции SVE
Синтаксис инструкции SVE сильно отличается от инструкции NEON. Формат инструкций SVE состоит из кодов операций, целевых регистров, регистров P и операторов ввода. Несколько примеров приведены ниже.
【пример 1】
Ниже приведен формат инструкции LD1D.
LD1D { <Zt>.D },<Pg>/Z, [<Xn|SP>, <Xm>, LSL #3]
в:
Ø Zt представляет векторный регистр, можно использовать Z0~Z31.
Ø D представляет тип данных канала в векторном регистре.
Ø Pg представляет операнд предиката, можно использовать P0~P15.
Ø Z в /Z означает обнуление предсказания.
Ø Xn/SP: указывает базовый адрес исходного операнда, Xn — регистр общего назначения, а SP — регистр указателя стека.
Ø Xm: Указывает регистр второго исходного операнда.
【Пример 2】
Ниже приведен формат инструкции ADD.
ADD <Zdn>.<T>,<Pg>/M, <Zdn>.<T>, <Zm>.<T>
в:
Ø Zdn представляет первый исходный векторный регистр или целевой векторный регистр.
Ø Pg означает регистр предсказания, можно использовать P0~P15.
Ø M in /M означает прогнозирование слияния.
Ø Zm представляет второй регистр исходного вектора.
Ø T представляет тип данных канала в векторном регистре.