АлтиВек
POWER , PowerPC и Power ISA. Архитектуры |
---|
NXP (ранее Freescale и Motorola) |
ИБМ |
|
IBM/Нинтендо |
Другой |
Ссылки по теме |
Отменено выделено серым цветом , историческое — курсивом |
AltiVec одинарной точности с плавающей запятой и целочисленными значениями, SIMD — это набор инструкций разработанный и принадлежащий Apple , IBM и Freescale Semiconductor (ранее подразделение Motorola Semiconductor Products Sector) — альянсу AIM . Он реализован в версиях архитектуры PowerPC , включая процессоры Motorola G4 , IBM G5 процессорной и POWER6 , а также PA Semi PA6T от PWRficient . AltiVec — торговая марка, также называет систему Velocity Engine принадлежащая исключительно Freescale, поэтому 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 не перешла на процессоры Intel на базе x86. Они использовали его для ускорения мультимедийных приложений, таких как 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) для стандартной категории:Векторная часть Power ISA v.2.03. [1] спецификация. Эта категория также известна как VMX (используется IBM) и «Velocity Engine» (торговая марка, ранее использовавшаяся Apple).
Механизм Cell Broadband Engine, используемый (помимо прочего) в PlayStation 3 , также поддерживает расширение Power Vector Media Extension (VMX) в своем PPU, при этом SPU ISA улучшен, но архитектурно аналогичен.
Freescale представляет улучшенную версию AltiVec для e6500 на базе QorIQ процессоров .
ВМХ128
[ редактировать ]IBM усовершенствовала VMX для использования в Xenon (Xbox 360) и назвала это улучшение VMX128. Усовершенствования включают новые процедуры, предназначенные для игр (ускорение 3D-графики и игровой физики). [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
ключевое слово, а затем используйте специфичное для GCC __vector
ключевое слово на своем месте.
В 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)
{
/* Natural alignment of vals is 4; and not 16 as required */
unsigned int vals[4] = { 1, 2, 3, 4 };
uint32x4_p vec;
#if defined(__VSX__) || defined(_ARCH_PWR8)
vec = vec_xl(0, vals);
#else
const uint8x16_p perm = 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(low, high, perm);
#endif
}
В AltiVec до Power ISA 2.06 с VMX отсутствует поддержка 64-битных целых чисел. Разработчики, желающие работать с 64-битными данными, будут разрабатывать процедуры из 32-битных компонентов. Например, ниже приведены примеры 64-битной версии. add
и subtract
в C с использованием вектора с четырьмя 32-битными словами на машине с прямым порядком байтов . Перестановки перемещают биты переноса и заимствования из столбцов 1 и 3 в столбцы 0 и 2, как в школьном учебнике по математике. Для машины с прямым порядком байтов потребуется другая маска.
#include <altivec.h>
typedef __vector unsigned char uint8x16_p;
typedef __vector unsigned int uint32x4_p;
...
/* Performs a+b as if the vector held two 64-bit double words */
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 zero = {0, 0, 0, 0};
uint32x4_p cy = vec_addc(vec1, vec2);
cy = vec_perm(cy, zero, cmask);
return vec_add(vec_add(vec1, vec2), cy);
}
/* Performs a-b as if the vector held two 64-bit double words */
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 zero = {0, 0, 0, 0};
uint32x4_p bw = vec_subc(vec1, vec2);
bw = vec_andc(amask, bw);
bw = vec_perm(bw, zero, bmask);
return vec_sub(vec_sub(vec1, vec2), bw);
}
Power ISA 2.07, использованная в Power8, наконец, предоставила 64-битные двойные слова. Разработчику, работающему с Power8, достаточно выполнить следующее.
#include <altivec.h>
typedef __vector unsigned long long uint64x2_p;
...
/* Performs a+b using native vector 64-bit double words */
uint64x2_p add64(const uint64x2_p a, const uint64x2_p b)
{
return vec_add(a, b);
}
/* Performs a-b using native vector 64-bit double words */
uint64x2_p sub64(const uint64x2_p a, const uint64x2_p b)
{
return vec_sub(a, b);
}
Реализации
[ редактировать ]Следующие процессоры оснащены AltiVec, VMX или VMX128.
Моторола/Фрискейл
[ редактировать ]- MPC7400
- MPC7410
- MPC7450
- МПК7445/7455
- МПК7447/7447А/7457
- MPC7448
- MPC8641/8641D
- MPC8640/8640D
- MPC8610
- Т2081/Т2080
- Т4080/Т4160/Т4240
- Б4420/Б4860
ИБМ
[ редактировать ]- PowerPC 970
- PowerPC 970FX
- PowerPC 970MP
- Ксенон
- Ячейка БЭ
- PowerXCell 8i
- СИЛА6/СИЛА6+
- СИЛА7/СИЛА7+
- МОЩНОСТЬ8
- POWER9
- Мощность10
Семена ПА
[ редактировать ]Программные приложения
[ редактировать ]Известно, что следующие программные приложения используют аппаратное ускорение AltiVec или VMX.
- Helios имеет собственный порт POWER9/POWER10 с поддержкой VMX. [7]
Ссылки
[ редактировать ]- ^ Перейти обратно: а б «Power ISA v.2.03» (PDF) . Power.org. [ постоянная мертвая ссылка ]
- ^ «История процессора Microsoft Xbox 360» . ИБМ. Октябрь 2015 г. Архивировано из оригинала 20 января 2008 г.
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка ) - ^ Использование архитектуры SIMD с параллельными данными в видеоиграх и суперкомпьютерах IBM Research
- ^ Реализация архитектуры набора команд с несмежными спецификаторами регистровых файлов. Патент США 7 421 566.
- ^ «Ускорение рабочих нагрузок с помощью векторно-скалярной архитектуры IBM POWER» . ИБМ. 01.03.2016. Архивировано из оригинала 25 января 2022 г. Проверено 2 мая 2017 г.
- ^ «Питер Бергнер — [ИСПРАВЛЕНИЕ, ВЫПОЛНЕНО] Добавлена полная поддержка binutils Power ISA 3.0/POWER9» . Архивировано из оригинала 07 марта 2016 г. Проверено 24 декабря 2016 г.
- ^ «Часто задаваемые вопросы, Гелиос» . Гелиос . Проверено 9 июля 2021 г.
Внешние ссылки
[ редактировать ]- Развертывание AltiVec, часть 1: Представляем модуль PowerPC SIMD в IBM; Архивировано в Wayback Machine 10 сентября 2012 г.
- AltiVec Technologies в Freescale; Архивировано в Wayback Machine 4 февраля 2012 г.
- Использование архитектуры SIMD с параллельными данными в видеоиграх и суперкомпьютерах IBM; Архивировано в Wayback Machine 8 февраля 2012 г.
- Velocity Engine в Apple; Архивировано в Wayback Machine 28 ноября 2009 г.
- История SIMD и сравнение производительности