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 предоставляет гораздо более полный набор «горизонтальных» операций, которые работают со всеми элементами вектора; допустимые комбинации типа данных и операций намного полнее. Предусмотрено 32 128-битных векторных регистра по сравнению с восемью для SSE и SSE2 (расширено до 16 в x86-64 ), и большинство инструкций VMX / AltiVec принимают три операнда регистров по сравнению только с двумя операндами регистр / регистр или регистр / память. на ИА-32 .
VMX / AltiVec также уникален в своей поддержке гибкой команды перестановки векторов , в которой каждый байт результирующего значения вектора может быть взят из любого байта любого из двух других векторов, параметризованных еще одним вектором. Это позволяет выполнять сложные манипуляции в одной инструкции.
Последние версии [ когда? ] из коллекции компиляторов GNU (GCC), компилятор IBM VisualAge и другие компиляторы предоставляют встроенные средства для доступа к инструкциям VMX / AltiVec непосредственно из программ C и C ++ . Начиная с версии 4, GCC также включает возможности автоматической векторизации , которые пытаются разумно создавать ускоренные двоичные файлы VMX / Altivec без необходимости для программиста напрямую использовать встроенные функции. Ключевое слово типа "vector" вводится, чтобы разрешить объявление собственных векторных типов, например, " 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 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 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 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
Рекомендации
- ^ a b "Power ISA v.2.03" (PDF) . Power.org.[ постоянная мертвая ссылка ]
- ^ «История процессора Microsoft Xbox 360» . IBM. Октябрь 2015. Архивировано 20 января 2008 года.CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
- ^ Использование параллельной обработки данных SIMD-архитектуры в видеоиграх и суперкомпьютерах IBM Research
- ^ Реализация архитектур набора команд с несмежными спецификаторами регистрового файла Патент США 7,421,566.
- ^ «Ускорение рабочих нагрузок с векторно-скалярной архитектурой IBM POWER» . IBM. 2016-03-01 . Проверено 2 мая 2017 .
- ^ "Peter Bergner - [PATCH, COMMITTED] Добавить полную поддержку binutils Power ISA 3.0 / POWER9" .
Внешние ссылки
- Представляем блок SIMD PowerPC
- Страница AltiVec от Freescale
- Использование параллельной обработки данных SIMD-архитектуры в видеоиграх и суперкомпьютерах
- Страница Apple Velocity Engine (через archive.org)
- История SIMD и сравнение производительности