stringtranslate.com

AltiVec

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 и занимал пространство опкода, специально выделенное для таких целей.

Сравнение с x86-64 SSE

И 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 .

VMX128

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<>шаблона класса 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.

Ссылки

  1. ^ ab "Power ISA v.2.03" (PDF) . Power.org. Архивировано из оригинала 2011-07-27 . Получено 2024-08-09 .{{cite web}}: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )
  2. ^ "История процессора Microsoft Xbox 360". IBM. Октябрь 2015. Архивировано из оригинала 2008-01-20.{{cite web}}: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )
  3. ^ Использование архитектуры SIMD с параллельными данными в видеоиграх и суперкомпьютерах IBM Research
  4. ^ Реализация архитектур набора инструкций с помощью спецификаторов несмежных регистровых файлов. Патент США 7,421,566
  5. ^ "Ускорение рабочей нагрузки с векторно-скалярной архитектурой IBM POWER". IBM. 2016-03-01. Архивировано из оригинала 2022-01-25 . Получено 2017-05-02 .
  6. ^ "Питер Бергнер - [ИСПРАВЛЕНИЕ, ЗАФИКСИРОВАНО] Добавить полную поддержку Power ISA 3.0 / POWER9 binutils". Архивировано из оригинала 2016-03-07 . Получено 2016-12-24 .
  7. ^ "FAQ, Helios". Helios . Получено 2021-07-09 .

Внешние ссылки