Из Википедии, бесплатной энциклопедии
  (Перенаправлено с Altivec )
Перейти к навигации Перейти к поиску

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

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

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

Последние версии [ когда? ] из коллекции компиляторов GNU (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 и ключевые компоненты Mac OS от Apple. 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) для стандартной категории: Вектор часть v.2.03 питания ISA [1] спецификации. Эта категория также известна как VMX (используется IBM) и «Velocity Engine» (торговая марка, ранее использовавшаяся Apple).

Cell Broadband Engine, используемый в (помимо прочего) PlayStation 3 , а также поддерживает питания Вектор Медиа Extension (VMX) в его ППУ с СПУ ISA укрепляются , но архитектурно похожи.

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

VMX128 [ править ]

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

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

Power ISA v2.06 представила векторно-скалярные инструкции VSX [5], которые расширяют обработку 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 . [6]

Проблемы [ править ]

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

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

#include  <altivec.h>typedef  __vector  unsigned  char  uint8x16_p ;typedef  __vector  unsigned  int  uint32x4_p ;...int  main ( int  argc ,  char *  argv ){ / * Естественное выравнивание vals равно 4; а не 16, как требуется * / беззнаковое  int  vals [ 4 ]  =  {  1 ,  2 ,  3 ,  4  }; uint32x4_p  vec ;#if defined (__ VSX__) || определено (_ARCH_PWR8) vec  =  vec_xl ( 0 ,  валс );#еще Const  uint8x16_p  завивка  =  vec_lvsl ( 0 ,  Vals ); const  uint8x16_p  low  =  vec_ld ( 0 ,  vals ); const  uint8x16_p  high  =  vec_ld ( 15 ,  vals ); vec  =  ( uint32x4_p ) vec_perm ( низкий ,  высокий ,  пермь );#endif}

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

#include  <altivec.h>typedef  __vector  unsigned  char  uint8x16_p ;typedef  __vector  unsigned  int  uint32x4_p ;.../ * Выполняет a + b, как если бы вектор содержал два 64-битных двойных слова * /uint32x4_p  add64 ( const  uint32x4_p  a ,  const  uint32x4_p  b ){ const  uint8x16_p  cmask  =  { 4 , 5 , 6 , 7 ,  16 , 16 , 16 , 16 ,  12 , 13 , 14 , 15 ,  16 , 16 , 16 , 16 }; const  uint32x4_p  ноль  =  { 0 ,  0 ,  0 ,  0 }; uint32x4_p  cy  =  vec_addc ( vec1 ,  vec2 ); cy  =  vec_perm ( cy ,  ноль ,  cmask ); вернуть  vec_add ( vec_add ( vec1 ,  vec2 ),  cy );}/ * Выполняет ab, как если бы вектор содержал два 64-битных двойных слова * /uint32x4_p  sub64 ( const  uint32x4_p  a ,  const  uint32x4_p  b ){ const  uint8x16_p  bmask  =  { 4 , 5 , 6 , 7 ,  16 , 16 , 16 , 16 ,  12 , 13 , 14 , 15 ,  16 , 16 , 16 , 16 }; const  uint32x4_p  amask  =  { 1 ,  1 ,  1 ,  1 }; const  uint32x4_p  ноль  =  { 0 ,  0 ,  0 ,  0 }; uint32x4_p  bw  =  vec_subc ( vec1 ,  vec2 ); bw  =  vec_andc ( amask ,  bw ); bw  =  vec_perm ( bw ,  ноль ,  bmask ); вернуть  vec_sub ( vec_sub ( vec1 ,  vec2 ),  bw );}

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

#include  <altivec.h>typedef  __vector  unsigned  long  long  uint64x2_p ;.../ * Выполняет a + b с использованием собственных векторных 64-битных двойных слов * /uint64x2_p  add64 ( const  uint64x2_p  a ,  const  uint64x2_p  b ){ вернуть  vec_add ( a ,  b );}/ * Выполняет ab с использованием собственных векторных 64-битных двойных слов * /uint64x2_p  sub64 ( const  uint64x2_p  a ,  const  uint64x2_p  b ){ вернуть  vec_sub ( a ,  b );}

Реализации [ править ]

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

Motorola / Freescale [ править ]

  • MPC7400
  • MPC7410
  • MPC7450
  • MPC7445 / 7455
  • MPC7447 / 7447A / 7457
  • MPC7448
  • MPC8641 / 8641D
  • MPC8640 / 8640D
  • MPC8610
  • T2081 / T2080
  • T4080 / T4160 / T4240
  • B4420 / B4860

IBM [ править ]

  • PowerPC 970
  • PowerPC 970FX
  • PowerPC 970MP
  • Ксенон
  • Ячейка BE
  • PowerXCell 8i
  • МОЩНОСТЬ6 / МОЩНОСТЬ6 +
  • POWER7 / POWER7 +
  • МОЩНОСТЬ8
  • МОЩНОСТЬ9
  • МОЩНОСТЬ10

PA Semi [ править ]

  • PA6T

Ссылки [ править ]

  1. ^ a b "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 . Проверено 2 мая 2017 .
  6. ^ "Питер Бергнер - [ПАТЧ, ЗАВЕРШЕН] Добавить полную поддержку Power ISA 3.0 / POWER9 binutils" .

Внешние ссылки [ править ]

  • Представляем блок SIMD PowerPC
  • Страница AltiVec от Freescale
  • Использование параллельной обработки данных SIMD-архитектуры в видеоиграх и суперкомпьютерах
  • Страница Apple Velocity Engine (через archive.org)
  • История SIMD и сравнение производительности