AltiVec - AltiVec

AltiVec ist ein Gleitkomma- und Integer- SID- Befehlssatz mit einfacher Genauigkeit, der von Apple , IBM und Freescale Semiconductor (ehemals Semiconductor Products Sector von Motorola ) – der AIM-Allianz – entwickelt wurde und von ihnen gehört wird . Es basiert auf Versionen der implementierten PowerPC - Prozessor - Architektur, einschließlich Motorola G4 , IBM 's G5 und POWER6 - Prozessoren und PA Semi ' s PWRficient PA6T. AltiVec ist eine Marke, die ausschließlich Freescale gehört, daher wird das System von Apple auch als Velocity Engine und von IBM und PA Semi als VMX ( Vector Multimedia Extension ) bezeichnet.

Während AltiVec sich auf einen Befehlssatz bezieht, sind die Implementierungen in CPUs von IBM und Motorola in Bezug auf das Logikdesign getrennt. Bis heute enthält kein IBM-Kern ein von Motorola lizenziertes AltiVec-Logikdesign oder umgekehrt.

AltiVec ist ein Standardbestandteil der Power ISA v.2.03- Spezifikation. Es war bis zu dieser Spezifikation nie formell ein Teil der PowerPC-Architektur, obwohl es PowerPC-Befehlsformate und -Syntax verwendete und den für solche Zwecke ausdrücklich zugewiesenen Opcode-Platz einnahm.

Vergleich zu x86-64 SSE

Sowohl VMX/AltiVec als auch SSE verfügen über 128-Bit-Vektorregister, die sechzehn 8-Bit-Zeichen mit oder ohne Vorzeichen, acht 16-Bit-Shorts mit oder ohne Vorzeichen, vier 32-Bit-Ints oder vier 32-Bit- Gleitkommavariablen darstellen können. Beide stellen Cache- Steuerungsbefehle bereit, die die Cache-Verschmutzung minimieren sollen, wenn an Datenströmen gearbeitet wird.

Sie weisen auch wichtige Unterschiede auf. Im Gegensatz zu SSE2 unterstützt VMX/AltiVec einen speziellen RGB- " Pixel "-Datentyp, aber er arbeitet nicht mit 64-Bit-Floats mit doppelter Genauigkeit, und es gibt keine Möglichkeit, Daten direkt zwischen Skalar- und Vektorregistern zu verschieben . In Übereinstimmung mit dem "Load/Store"-Modell des RISC- Designs von PowerPC können die Vektorregister wie die Skalarregister nur aus dem Speicher geladen und dort gespeichert werden. VMX/AltiVec bietet jedoch einen viel umfassenderen Satz "horizontaler" Operationen, die über alle Elemente eines Vektors hinweg funktionieren; die zulässigen Kombinationen von Datentyp und Operationen sind viel vollständiger. 32 128-Bit-Vektorregister werden bereitgestellt, verglichen mit acht für SSE und SSE2 (erweitert auf 16 in x86-64 ), und die meisten VMX/AltiVec-Befehle benötigen drei Registeroperanden im Vergleich zu nur zwei Register-/Register- oder Register-/Speicheroperanden auf IA-32 .

VMX/AltiVec ist auch einzigartig in seiner Unterstützung für einen flexiblen Vektorpermutierungsbefehl , bei dem jedes Byte eines resultierenden Vektorwertes von jedem Byte von einem von zwei anderen Vektoren genommen werden kann, parametrisiert durch noch einen anderen Vektor. Dies ermöglicht anspruchsvolle Manipulationen in einer einzigen Anweisung.

Neuere Versionen der GNU Compiler Collection (GCC), des IBM VisualAge- Compilers und anderer Compiler bieten intrinsische Funktionen für den direkten Zugriff auf VMX/AltiVec-Anweisungen aus C- und C++- Programmen. Ab Version 4 enthält der GCC auch Auto-Vektorisierungsfunktionen , die versuchen, VMX/Altivec-beschleunigte Binärdateien intelligent zu erstellen, ohne dass der Programmierer intrinsische Komponenten direkt verwenden muss. Das Typschlüsselwort "vector" wird eingeführt, um die Deklaration von nativen Vektortypen zu ermöglichen, zB " vector unsigned char foo;" deklariert eine 128-Bit-Vektorvariable namens "foo", die sechzehn 8-Bit-Zeichen ohne Vorzeichen enthält. Das vollständige Komplement der arithmetischen und binären Operatoren ist für Vektortypen definiert, sodass die normale C-Ausdruckssprache verwendet werden kann, um Vektorvariablen zu manipulieren. Es gibt auch überladene intrinsische Funktionen wie " vec_add", die den entsprechenden Opcode basierend auf dem Typ der Elemente innerhalb des Vektors ausgeben , und eine sehr starke Typprüfung wird erzwungen. Im Gegensatz dazu deklarieren die von Intel definierten Datentypen für IA-32 SIMD-Register nur die Größe des Vektorregisters (128 oder 64 Bit) und im Fall eines 128-Bit-Registers, ob es Ganzzahlen oder Gleitkommawerte enthält. Der Programmierer muss für die verwendeten Datentypen das geeignete Intrinsic auswählen, zB " _mm_add_epi16(x,y)" zum Addieren von zwei Vektoren, die acht 16-Bit-Ganzzahlen enthalten.

Entwicklungsgeschichte

Die Power Vector Media Extension (VMX) wurde zwischen 1996 und 1998 in einem Gemeinschaftsprojekt von Apple, IBM und Motorola entwickelt. Apple war der Hauptkunde von Power Vector Media Extension (VMX), bis Apple am 6. Juni 2005 auf x86-basierte CPUs von Intel umstieg. Sie nutzten es, um Multimedia- Anwendungen wie QuickTime , iTunes und wichtige Teile von Apples Mac OS zu beschleunigen X inklusive im Quartz Graphics Compositor . Andere Firmen wie Adobe nutzten AltiVec, um ihre Bildbearbeitungsprogramme wie Adobe Photoshop zu optimieren . Motorola war der erste Anbieter von AltiVec-fähigen Prozessoren, beginnend mit der G4-Reihe. AltiVec wurde auch in einigen eingebetteten Systemen für die hochleistungsfähige digitale Signalverarbeitung verwendet.

IBM hat VMX konsequent aus seinen früheren POWER-Mikroprozessoren herausgenommen , die für Serveranwendungen gedacht waren, bei denen es nicht sehr nützlich war. Der 2007 eingeführte Mikroprozessor POWER6 implementiert AltiVec. Der letzte Desktop-Mikroprozessor von IBM, der PowerPC 970 (von Apple "G5" genannt) implementierte AltiVec ebenfalls mit Hardware ähnlich der des PowerPC 7400 .

AltiVec ist ein von Freescale (vormals Motorola) geschützter Markenname für die Standardkategorie Kategorie: Vektor der Power ISA v.2.03- Spezifikation. Diese Kategorie ist auch als VMX (von IBM verwendet) und "Velocity Engine" (ein früher von Apple verwendeter Markenname) bekannt.

Die Cell Broadband Engine, die (unter anderem) in der PlayStation 3 verwendet wird , unterstützt auch die Power Vector Media Extension (VMX) in ihrer PPU, wobei die SPU ISA verbessert wurde, aber architektonisch ähnlich ist.

Freescale bringt eine verbesserte Version von AltiVec für e6500- basierte QorIQ- Prozessoren.

VMX128

IBM hat VMX für die Verwendung in Xenon (Xbox 360) erweitert und diese Erweiterung VMX128 genannt. Die Verbesserungen umfassen neue Routinen für Spiele (Beschleunigung von 3D-Grafik und Spielphysik) und insgesamt 128 Registern. VMX128 ist nicht vollständig mit VMX/Altivec kompatibel, da einige Integer-Operationen entfernt wurden, um Platz für die größere Registerdatei und zusätzliche anwendungsspezifische Operationen zu schaffen.

VSX (Vektorskalare Erweiterung)

Power ISA v2.06 führte VSX-Vektorskalarbefehle ein, die die SIMD-Verarbeitung für die Power ISA auf bis zu 64 Register erweitern, mit Unterstützung für reguläre Gleitkomma-, Dezimal-Gleitkomma- und Vektorausführung. POWER7 ist der erste Power ISA-Prozessor, der Power ISA v2.06 implementiert.

Neue Anweisungen werden von IBM unter der Kategorie Vector Media Extension für Integer-Operationen als Teil der VSX-Erweiterung in Power ISA 2.07 eingeführt.

Neue Integer-Vektorbefehle wurden von IBM nach den VMX-Codierungen als Teil der VSX-Erweiterung in Power ISA v3.0 eingeführt. Soll mit POWER9- Prozessoren eingeführt werden.

Themen

In C++ schließt sich die Standardmethode für den Zugriff auf die AltiVec-Unterstützung mit der Verwendung der vector<>Klassenvorlage der Standardvorlagenbibliothek gegenseitig aus, da "vector" als reserviertes Wort behandelt wird, wenn der Compiler die kontextsensitive Schlüsselwortversion von vector nicht implementiert. Es kann jedoch möglich sein, sie mit Compiler-spezifischen Problemumgehungen zu kombinieren; in GCC kann man beispielsweise #undef vectordas vectorSchlüsselwort entfernen und dann das GCC-spezifische __vectorSchlüsselwort an seiner Stelle verwenden.

AltiVec vor Power ISA 2.06 mit VSX fehlt das Laden aus dem Speicher unter Verwendung der natürlichen Ausrichtung eines Typs. Der folgende Code erfordert beispielsweise eine spezielle Behandlung für Power6 und darunter, wenn die effektive Adresse nicht auf 16 Byte ausgerichtet ist. Die Sonderbehandlung fügt einer Ladeoperation 3 zusätzliche Anweisungen hinzu, wenn VSX nicht verfügbar ist.

#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 vor Power ISA 2.06 mit VMX fehlt die 64-Bit-Integer-Unterstützung. Entwickler, die mit 64-Bit-Daten arbeiten möchten, entwickeln Routinen aus 32-Bit-Komponenten. Im Folgenden finden Sie beispielsweise Beispiele für 64-Bit addund subtractin C, die einen Vektor mit vier 32-Bit-Wörtern auf einer Big-Endian-Maschine verwenden . Die Permuten verschieben die Übertrags- und Ausleihbits von den Spalten 1 und 3 in die Spalten 0 und 2 wie in der Schulbuchmathematik. Eine Little-Endian-Maschine würde eine andere Maske benötigen.

#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);
}

Die in Power8 verwendete Power ISA 2.07 lieferte schließlich die 64-Bit-Doppelwörter. Ein Entwickler, der mit Power8 arbeitet, muss nur Folgendes ausführen.

#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);
}

Implementierungen

Die folgenden Prozessoren haben AltiVec, VMX oder VMX128 enthalten

Motorola/Freescale

IBM

PA Semi

Softwareanwendungen

Von den folgenden Softwareanwendungen ist bekannt, dass sie AltiVec- oder VMX-Hardwarebeschleunigung nutzen.

  • Helios verfügt über einen nativen POWER9 / POWER10-Port mit Unterstützung für VMX.

Verweise

Externe Links