AltiVec - AltiVec

AltiVec одинарная точность плавающая точка и целое число SIMD Набор инструкций разработан и принадлежит яблоко, IBM, и Freescale Semiconductor (ранее Motorola Сектор полупроводниковой продукции) - AIM альянс. Реализовано на версиях PowerPC архитектура процессора, включая Motorola G4, IBM с G5 и МОЩНОСТЬ6 процессоры и П.А. Полу с PWRficient PA6T. AltiVec - это товарный знак принадлежит исключительно Freescale, поэтому система также называется Скорость двигателя Apple и VMX (Векторное мультимедийное расширение) IBM и P.A. Полу.

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

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

Сравнение с x86-64 SSE

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

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

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

Последние версии[когда? ] из Коллекция компиляторов GNU (GCC), IBM VisualAge компилятор и другие компиляторы предоставляют внутренняя сущность для доступа к инструкциям VMX / AltiVec прямо из C и C ++ программы. Начиная с версии 4, GCC также включает автоматическая векторизация возможности, которые пытаются разумно создавать ускоренные двоичные файлы VMX / Altivec без необходимости для программиста напрямую использовать встроенные функции. Ключевое слово типа "вектор" вводится, чтобы разрешить объявление собственных векторных типов, например, "вектор без знака 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 в том числе в Кварцевый графический композитор. Другие компании, такие как Adobe, использовали AltiVec для оптимизации своих программ обработки изображений, таких как Adobe Photoshop. Motorola первой начала поставлять процессоры с поддержкой AltiVec, начиная с линейки G4. AltiVec также использовался в некоторых встроенных системах для высокопроизводительной цифровой обработки сигналов.

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

AltiVec - это торговая марка Freescale (ранее Motorola) для стандартных Категория: Вектор часть Power ISA v.2.03[1] Технические характеристики. Эта категория также известна как VMX (используется IBM) и «Velocity Engine» (торговая марка, ранее использовавшаяся Apple).

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

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

VMX128

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

VSX (векторное скалярное расширение)

Power ISA v2.06 представил векторно-скалярные инструкции VSX[5] которые расширяют обработку SIMD для Power ISA, поддерживая до 64 регистров, с поддержкой обычных операций с плавающей запятой, десятичных чисел с плавающей запятой и векторных операций. МОЩНОСТЬ7 является первым процессором Power ISA, реализующим Power ISA v2.06.

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

Новые целочисленные векторные инструкции были введены IBM после кодирования VMX как часть расширения VSX в Power ISA v3.0. Должен быть представлен с МОЩНОСТЬ9 процессоры.[6]

вопросы

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

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

 1#включают <altivec.h> 2typedef __вектор беззнаковый char uint8x16_p; 3typedef __вектор беззнаковый  int uint32x4_p; 4... 5int главный(int argc, char* argv) 6{ 7    / * Естественное выравнивание vals равно 4; а не 16, как требуется * / 8    беззнаковый int вальс[4] = { 1, 2, 3, 4 }; 9    uint32x4_p vec;1011#if defined (__ VSX__) || определено (_ARCH_PWR8)12    vec = vec_xl(0, вальс);13#еще14    const uint8x16_p пермь = vec_lvsl(0, вальс);15    const uint8x16_p низкий  = vec_ld(0, вальс);16    const uint8x16_p высоко = vec_ld(15, вальс);17    vec = (uint32x4_p)vec_perm(низкий, высоко, пермь);18#endif1920}

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

 1#включают <altivec.h> 2typedef __вектор беззнаковый char uint8x16_p; 3typedef __вектор беззнаковый  int uint32x4_p; 4... 5 6/ * Выполняет a + b, как если бы вектор содержал два 64-битных двойных слова * / 7uint32x4_p add64(const uint32x4_p а, const uint32x4_p б) 8{ 9    const uint8x16_p маска = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};10    const uint32x4_p нуль = {0, 0, 0, 0};1112    uint32x4_p Сай = vec_addc(vec1, vec2);13    Сай = vec_perm(Сай, нуль, маска);14    возвращаться vec_add(vec_add(vec1, vec2), Сай);15}1617/ * Выполняет a-b, как если бы вектор содержал два 64-битных двойных слова * /18uint32x4_p sub64(const uint32x4_p а, const uint32x4_p б)19{20    const uint8x16_p маска = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};21    const uint32x4_p маска = {1, 1, 1, 1};22    const uint32x4_p нуль = {0, 0, 0, 0};2324    uint32x4_p чб = vec_subc(vec1, vec2);25    чб = vec_andc(маска, чб);26    чб = vec_perm(чб, нуль, маска);27    возвращаться vec_sub(vec_sub(vec1, vec2), чб);28}

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

 1#включают <altivec.h> 2typedef __вектор беззнаковый длинный длинный uint64x2_p; 3... 4 5/ * Выполняет a + b с использованием собственных векторных 64-битных двойных слов * / 6uint64x2_p add64(const uint64x2_p а, const uint64x2_p б) 7{ 8    возвращаться vec_add(а, б); 9}1011/ * Выполняет a-b с использованием собственных векторных 64-битных двойных слов * /12uint64x2_p sub64(const uint64x2_p а, const uint64x2_p б)13{14    возвращаться vec_sub(а, б);15}

Реализации

Следующие процессоры включают AltiVec, VMX или VMX128.

Motorola / Freescale

IBM

П.А. Полу

Рекомендации

  1. ^ а б "Power ISA v.2.03" (PDF). Power.org.[постоянная мертвая ссылка ]
  2. ^ «История процессора Microsoft Xbox 360». IBM. Октябрь 2015. Архивировано 20 января 2008 года.CS1 maint: BOT: статус исходного URL-адреса неизвестен (связь)
  3. ^ Использование архитектуры SIMD с параллельными данными в видеоиграх и суперкомпьютерах IBM Research
  4. ^ Реализация архитектур набора команд с несмежными спецификаторами регистрового файла Патент США 7,421,566
  5. ^ «Ускорение рабочих нагрузок с векторно-скалярной архитектурой IBM POWER». IBM. 2016-03-01. Получено 2017-05-02.
  6. ^ "Peter Bergner - [PATCH, COMMITTED] Добавить полную поддержку Power ISA 3.0 / POWER9 binutils".

внешняя ссылка