Введение

Расширение набора инструкций SIMD для PowerPC ISA

AltiVec — это набор инструкций SIMD для операций с числами с плавающей точкой одинарной точности и целыми числами, разработанный и принадлежащий компаниям Apple, IBM и Freescale Semiconductor (ранее подразделение полупроводниковых продуктов Motorola) — альянсу AIM. Он реализован в различных версиях архитектуры процессоров PowerPC, включая процессоры Motorola G4, IBM G5 и POWER6, а также PWRficient PA6T от P. A. Semi. AltiVec является товарным знаком, принадлежащим исключительно Freescale, поэтому система также известна как Velocity Engine (Apple) и VMX (Vector Multimedia Extension) (IBM и P. A. Semi). Хотя AltiVec относится к набору инструкций, реализации в процессорах, производимых IBM и Motorola, различаются с точки зрения логической организации. На сегодняшний день ни одно ядро IBM не включало логическую схему AltiVec, лицензированную у Motorola, и наоборот. AltiVec является стандартной частью спецификации Power ISA v.2.03. До этой спецификации он формально не входил в архитектуру 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 принимают три операнда-регистра по сравнению с двумя операндами типа регистр/регистр или регистр/память на IA-32. VMX/AltiVec также уникален в своей поддержке гибкой инструкции перестановки векторов, в которой каждый байт результирующего вектора может быть взят из любого байта любого из двух других векторов, параметризованных третьим вектором. Это позволяет выполнять сложные манипуляции в рамках одной инструкции. Последние версии GNU Compiler Collection (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) до перехода на процессоры Intel, основанные на архитектуре x86, 6 июня 2005 года. Он использовался для ускорения мультимедийных приложений, таких как QuickTime, iTunes и ключевых компонентов Mac OS X от Apple, включая графический композитор 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, включающей в себя в общей сложности 128 регистров. VMX128 не полностью совместим с VMX/AltiVec, поскольку для освобождения места под расширенный набор регистров и дополнительные специализированные операции некоторые целочисленные операции были исключены.

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

Power ISA v2.06 представила векторно-скалярные инструкции VSX, расширяющие SIMD-обработку для Power ISA и поддерживающие до 64 регистров, включая операции с числами с плавающей запятой обычной точности, десятичной плавающей запятой и векторное исполнение. POWER7 – первый процессор Power ISA, реализующий Power ISA v2.06. IBM представила новые инструкции для целочисленных операций в рамках расширения VSX в Power ISA 2.07. IBM добавила новые векторные инструкции для целых чисел, использующие кодировку VMX, как часть расширения VSX в Power ISA v3.0. Должны быть внедрены в процессорах POWER9.

Программные приложения

Следующие программные приложения, как известно, используют аппаратное ускорение AltiVec или VMX. Helios имеет нативный порт для POWER9 / POWER10 с поддержкой VMX.