AltiVec — это набор инструкций SIMD с плавающей точкой одинарной точности и целыми числами, разработанный и принадлежащий Apple , IBM и Freescale Semiconductor (ранее Motorola 's Semiconductor Products Sector) — альянсу AIM . Он реализован на версиях архитектуры процессора PowerPC , включая G4 от Motorola , G5 и POWER6 от IBM , а также PWRficient PA6T от PA Semi . 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 и занимал пространство опкода, специально выделенное для таких целей.
И VMX/AltiVec, и SSE имеют 128-битные векторные регистры, которые могут представлять шестнадцать 8-битных знаковых или беззнаковых символов, восемь 16-битных знаковых или беззнаковых коротких символов, четыре 32-битных целых числа или четыре 32-битных переменных с плавающей точкой. Оба предоставляют инструкции управления кэшем , предназначенные для минимизации загрязнения кэша при работе с потоками данных.
Они также демонстрируют важные различия. В отличие от SSE2 , VMX/AltiVec поддерживает специальный тип данных RGB " pixel ", но он не работает с 64-битными числами с плавающей точкой двойной точности, и нет способа перемещать данные напрямую между скалярными и векторными регистрами. В соответствии с моделью "load/store" конструкции RISC PowerPC , векторные регистры, как и скалярные регистры, могут быть загружены только из памяти и сохранены в ней. Однако VMX/AltiVec предоставляет гораздо более полный набор "горизонтальных" операций, которые работают со всеми элементами вектора; допустимые комбинации типа данных и операций гораздо более полны. Предусмотрено тридцать два 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), пока Apple не перешла на процессоры Intel на базе x86 6 июня 2005 года. Они использовали его для ускорения мультимедийных приложений, таких как 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) для стандартной части Category:Vector спецификации 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 для процессоров QorIQ на базе e6500 .
IBM улучшила VMX для использования в Xenon (Xbox 360) и назвала это улучшение VMX128. Улучшения включают новые процедуры, нацеленные на игры (ускорение 3D-графики и игровой физики) [2] и в общей сложности 128 регистров. VMX128 не полностью совместим с VMX/Altivec, поскольку ряд целочисленных операций был удален, чтобы освободить место для большего файла регистров и дополнительных операций, специфичных для приложения. [3] [4]
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<>
шаблона класса Standard Template Library из-за обработки "vector" как зарезервированного слова, когда компилятор не реализует версию контекстно-зависимого ключевого слова 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 беззнаковое целое uint32x4_p ; ...int main ( int argc , char * argv ) { /* Естественное выравнивание валеров — 4, а не 16, как требуется */ беззнаковые целые значения [ 4 ] = { 1 , 2 , 3 , 4 }; uint32x4_p vec ; #если определено(__VSX__) || определено(_ARCH_PWR8) vec = vec_xl ( 0 , vals ); #еще 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 ( низкий , высокий , допустимый ); #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 беззнаковое целое 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 , zero , cmask ); return 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 , 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 ; .../* Выполняет 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 ) { return vec_sub ( a , b ); }
В состав следующих процессоров входят AltiVec, VMX или VMX128
Известно, что следующие программные приложения используют аппаратное ускорение AltiVec или VMX.
{{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка ){{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )