AltiVec

редактировать

AltiVec - это одинарная точность с плавающей запятой и целое число SIMD набор команд разработан и принадлежит Apple, IBM и Freescale Semiconductor (ранее Motorola 'Semiconductor Products Sector) - альянс AIM. Он реализован на версиях архитектуры процессора PowerPC, включая процессоры Motorola G4, IBM G5 и POWER6, а также P.A. Полу PWRficient PA6T. AltiVec является товарным знаком , принадлежащим исключительно Freescale, поэтому система также упоминается Apple как Velocity Engine и VMX (Vector Multimedia Extension ) IBM и PA Полу.

Хотя AltiVec относится к набору команд, реализации в процессорах IBM и Motorola отличаются друг от друга с точки зрения логической схемы. На сегодняшний день ни одно ядро ​​IBM не включает логическую конструкцию AltiVec, лицензированную Motorola или наоборот.

AltiVec является стандартной частью спецификации Power ISA v.2.03. Он никогда не был формально частью архитектуры PowerPC до этой спецификации, хотя он использовал форматы команд и синтаксис PowerPC и занимал пространство кода операции, специально выделенное для таких целей.

Содержание
  • 1 Сравнение с x86-64 SSE
  • 2 История разработки
    • 2.1 VMX128
    • 2.2 VSX (Vector Scalar Extension)
  • 3 проблемы
  • 4 Реализации
    • 4.1 Motorola /Freescale
    • 4.2 IBM
    • 4.3 PA Semi
  • 5 Ссылки
  • 6 Внешние ссылки
Сравнение с x86-64 SSE

И VMX / AltiVec, и SSE имеют 128-битные векторные регистры, которые могут представлять шестнадцать 8 -битные символы со знаком или без знака, восемь 16-битных знаковых или беззнаковых коротких замыканий, четыре 32-битных целых числа или четыре 32-битных переменных с плавающей запятой. Оба предоставляют команды управления кешем, предназначенные для минимизации загрязнения кеша при работе с потоками данных.

Они также имеют важные отличия. В отличие от SSE2, VMX / AltiVec поддерживает специальный тип данных RGB «pixel », но не работает с 64-битными числами с плавающей запятой двойной точности, а также нет возможности перемещать данные напрямую между скалярными и векторными регистрами. В соответствии с моделью «загрузка / сохранение» конструкции PowerPC RISC векторные регистры, как и скалярные регистры, могут быть загружены и сохранены только в памяти. Однако VMX / AltiVec предоставляет гораздо более полный набор «горизонтальных» операций, которые работают со всеми элементами вектора; допустимые комбинации типа данных и операций намного полнее. Предусмотрено тридцать два 128-битных векторных регистра по сравнению с восемью для SSE и SSE2 (расширено до 16 в x86-64 ), и большинство инструкций VMX / AltiVec используют три регистровых операнда по сравнению только с двумя регистрами /. регистр или операнды регистр / память на IA-32.

VMX / AltiVec также уникальны тем, что поддерживают гибкий вектор, в котором каждый байт результирующего значения вектора может быть взят из любого байта любого из двух других векторы, параметризованные еще одним вектором. Это позволяет выполнять сложные манипуляции в одной инструкции.

Последние версии GNU Compiler Collection (GCC), компилятор IBM VisualAge и другие компиляторы предоставляют встроенные функции для прямого доступа к инструкциям VMX / AltiVec из программ C и C ++. Начиная с версии 4, GCC также включает возможности автоматической векторизации, которые пытаются интеллектуально создавать ускоренные двоичные файлы VMX / Altivec без необходимости для программиста напрямую использовать встроенные функции. Ключевое слово типа «вектор» вводится для объявления собственных векторных типов, например, «vector unsigned char foo;» объявляет 128-битную векторную переменную с именем «foo», содержащую шестнадцать 8-битных беззнаковых символов.. Полный набор арифметических и бинарных операторов определен для векторных типов, поэтому для управления векторными переменными можно использовать обычный язык выражений C. Также существуют перегруженные встроенные функции, такие как «vec_add», которые генерируют соответствующий операционный код в зависимости от типа элементов в векторе, и применяется очень строгая проверка типов. Напротив, определенные Intel типы данных для регистров SIMD IA-32 декларируют только размер векторного регистра (128 или 64 бита), а в случае 128-битного регистра - содержит ли он целые числа или значения с плавающей запятой. Программист должен выбрать соответствующую встроенную функцию для используемых типов данных, например, «_mm_add_epi16 (x, y)» для добавления двух векторов, содержащих восемь 16-битных целых чисел.

История разработки

Расширение Power Vector Media Extension (VMX) было разработано в период с 1996 по 1998 год в рамках совместного проекта Apple, IBM и Motorola. Apple была основным заказчиком Power Vector Media Extension (VMX) до тех пор, пока 6 июня 2005 г. Apple не перешла на процессоры на базе x86 производства Intel. Они использовали его для ускорения мультимедийных приложений, таких как QuickTime, iTunes и ключевые части Apple Mac OS X, в том числе в графическом композиторе Quartz. Другие компании, такие как Adobe, использовали AltiVec для оптимизации своих программ обработки изображений, таких как Adobe Photoshop. Motorola первой начала поставлять процессоры с поддержкой AltiVec, начиная с линейки G4. AltiVec также использовался в некоторых встроенных системах для высокопроизводительной цифровой обработки сигналов.

IBM последовательно исключила VMX из своих более ранних микропроцессоров POWER, которые предназначались для серверных приложений, где это было не очень полезно. Микропроцессор POWER6, представленный в 2007 году, реализует AltiVec. Последний настольный микропроцессор от IBM, PowerPC 970 (названный Apple "G5"), также реализовал AltiVec с аппаратным обеспечением, аналогичным аппаратному обеспечению PowerPC 7400.

AltiVec является торговой маркой Freescale. (ранее Motorola) для стандартной части Category: Vector спецификации Power ISA v.2.03. Эта категория также известна как VMX (используется IBM) и «Velocity Engine» (торговая марка, ранее использовавшаяся Apple).

Cell Broadband Engine, используемый (среди прочего) в PlayStation 3, также поддерживает Power Vector Media Extension (VMX) в своем PPU с SPU ISA улучшается, но архитектурно похожа.

Freescale представляет улучшенную версию AltiVec для процессоров e6500 на базе QorIQ.

VMX128

IBM улучшила VMX для использования в Xenon (Xbox 360) и назвала это улучшение VMX128. Усовершенствования включают новые процедуры, ориентированные на игры (ускорение 3D-графики и физики игр), и в общей сложности 128 регистров. VMX128 не полностью совместим с VMX / Altivec, так как ряд целочисленных операций был удален, чтобы освободить место для большего файла регистров и дополнительных операций, специфичных для приложения.

VSX (Vector Scalar Extension)

Power ISA v2.06 представила векторно-скалярные инструкции VSX, которые расширяют обработку SIMD для Power ISA и поддерживают до 64 регистров с поддержкой обычного выполнения с плавающей запятой, десятичной с плавающей запятой и векторного выполнения. POWER7 - первый процессор Power ISA, реализующий Power ISA v2.06.

Новые инструкции представлены IBM в категории Vector Media Extension для целочисленных операций как часть расширения VSX в Power ISA 2.07.

Новые целочисленные векторные инструкции были введены IBM после кодирования VMX как часть расширения VSX в Power ISA v3.0. Должен быть представлен с процессорами POWER9.

Проблемы

В C ++ стандартный способ доступа к поддержке AltiVec является взаимоисключающим с использованием вектора стандартной библиотеки шаблонов <>шаблон класса из-за обработки слова "вектор" как зарезервированного слова, когда компилятор не реализует версию вектора с контекстно-зависимым ключевым словом. Однако их можно комбинировать, используя обходные пути, специфичные для компилятора; например, в GCC можно выполнить #undef vector, чтобы удалить ключевое слово vector, а затем использовать вместо него ключевое слово __vector, специфичное для GCC.

В AltiVec до Power ISA 2.06 с VSX отсутствует загрузка из памяти с использованием естественного выравнивания типа. Например, приведенный ниже код требует специальной обработки для Power6 и ниже, когда эффективный адрес не выровнен по 16 байтам. Специальная обработка добавляет 3 дополнительные инструкции к операции загрузки, когда VSX недоступен.

1 #include 2 typedef __vector unsigned char uint8x16_p; 3 typedef __vector unsigned int uint32x4_p; 4... 5 int main (int argc, char * argv) 6 {7 / * Естественное выравнивание vals равно 4; а не 16, как требуется * / 8 unsigned int vals [4] = {1, 2, 3, 4}; 9 uint32x4_p vec; 10 11 #if defined (__ VSX__) || определено (_ARCH_PWR8) 12 vec = vec_xl (0, vals); 13 #else 14 const uint8x16_p perm = vec_lvsl (0, vals); 15 const uint8x16_p low = vec_ld (0, vals); 16 const uint8x16_p high = vec_ld (15, vals); 17 vec = (uint32x4_p) vec_perm (низкий, высокий, допустимый); 18 #endif 19 20}

AltiVec до Power ISA 2.06 с VMX не поддерживает 64-битные целые числа. Разработчики, которые хотят работать с 64-битными данными, будут разрабатывать процедуры из 32-битных компонентов. Например, ниже приведены примеры 64-битных сложенияи вычитанияв C с использованием вектора с четырьмя 32-битными словами на машине big-endian. Перестановки перемещают биты переноса и заимствования из столбцов 1 и 3 в столбцы 0 и 2, как в школьной математике. Для машины с прямым порядком байтов потребуется другая маска.

1 #include 2 typedef __vector unsigned char uint8x16_p; 3 typedef __vector unsigned int uint32x4_p; 4... 5 6 / * Выполняет a + b, как если бы вектор содержал два 64-битных двойных слова * / 7 uint32x4_p add64 (const uint32x4_p a, const uint32x4_p b) 8 {9 const uint8x16_p cmask = {4,5,6, 7, 16,16,16,16, 12,13,14,15, 16,16,16,16}; 10 const uint32x4_p ноль = {0, 0, 0, 0}; 11 12 uint32x4_p cy = vec_addc (vec1, vec2); 13 cy = vec_perm (cy, ноль, cmask); 14 вернуть vec_add (vec_add (vec1, vec2), cy); 15} 16 17 / * Выполняет ab, как если бы вектор содержал два 64-битных двойных слова * / 18 uint32x4_p sub64 (const uint32x4_p a, const uint32x4_p b) 19 {20 const uint8x16_p bmask = {4,5,6,7, 16, 16,16,16, 12,13,14,15, 16,16,16,16}; 21 const uint32x4_p amask = {1, 1, 1, 1}; 22 const uint32x4_p ноль = {0, 0, 0, 0}; 23 24 uint32x4_p bw = vec_subc (vec1, vec2); 25 чб = vec_andc (amask, чб); 26 чб = vec_perm (чб, ноль, маска); 27 вернуть vec_sub (vec_sub (vec1, vec2), bw); 28}

Power ISA 2.07, используемый в Power8, наконец, предоставил 64-битные двойные слова. Разработчику, работающему с Power8, достаточно выполнить следующее.

1 #include 2 typedef __vector unsigned long long uint64x2_p; 3... 4 5 / * Выполняет a + b с использованием собственных векторных 64-битных двойных слов * / 6 uint64x2_p add64 (const uint64x2_p a, const uint64x2_p b) 7 {8 return vec_add (a, b); 9} 10 11 / * Выполняет a-b с использованием собственных векторных 64-битных двойных слов * / 12 uint64x2_p sub64 (const uint64x2_p a, const uint64x2_p b) 13 {14 return vec_sub (a, b); 15}
Реализации

В следующие процессоры включены AltiVec, VMX или VMX128

Motorola / Freescale

Последняя правка сделана 2021-06-11 02:56:12
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте