Vektor-Verarbeiter

Ein Vektor-Verarbeiter oder Reihe-Verarbeiter, ist eine in einer Prozession gehende Haupteinheit (CPU), die einen Befehlssatz durchführt, der Instruktionen enthält, die auf der eindimensionalen Reihe von Daten genannt Vektoren funktionieren. Das ist im Gegensatz zu einem Skalarverarbeiter, dessen Instruktionen auf einzelnen Datensachen funktionieren. Obwohl Verarbeiter von Intel und ihre Klone am Anfang als Skalar entworfen wurden, enthalten neue Modelle eine steigende Zahl von Spezialvektor-Instruktionen wie diejenigen, die durch den Fortgeschrittenen Vektor-Erweiterungssatz geliefert sind.

Vektor-Verarbeiter sind zuerst in den 1970er Jahren erschienen, und haben die Basis von den meisten Supercomputern im Laufe der 1980er Jahre und in die 1990er Jahre gebildet. Verbesserungen in Skalarverarbeitern, besonders Mikroprozessoren, sind auf den Niedergang von traditionellen Vektor-Verarbeitern in Supercomputern und das Äußere von Vektor-Verarbeitungstechniken in Massenmarktzentraleinheiten um den Anfang der 1990er Jahre hinausgelaufen. Heute führen die meisten Warenzentraleinheiten Architekturen durch, die Instruktionen für einen Vektoren zeigen, der auf vielfachen (vectorized) Dateien, normalerweise bekannt als SIMD (Einzelne Instruktion, Vielfache Daten) in einer Prozession geht. Allgemeine Beispiele schließen KRAFT, MMX, SSE und AltiVec ein. Vektor-Verarbeitungstechniken werden auch in der Videospiel-Konsole-Hardware und den Grafikgaspedalen gefunden. 2000 haben IBM, Toshiba und Sony zusammengearbeitet, um den Zellverarbeiter zu schaffen, aus einem Skalarverarbeiter und acht Vektor-Verarbeitern bestehend, die Gebrauch in Sony PlayStation 3 unter anderen Anwendungen gefunden haben.

Andere Zentraleinheitsdesigns können einige vielfache Instruktionen für den Vektoren einschließen, der auf vielfachen (vectorised) Dateien, normalerweise bekannt als MIMD (Vielfache Instruktion, Vielfache Daten) in einer Prozession geht. Solche Designs werden gewöhnlich einer besonderen Anwendung gewidmet und nicht allgemein für den allgemeinen Zweck auf den Markt gebracht zu rechnen.

Geschichte

Vektor-Verarbeitungsentwicklung hat am Anfang der 1960er Jahre an Westinghouse in ihrem Projekt von Solomon begonnen. Die Absicht von Solomon war, Matheleistung durch das Verwenden einer Vielzahl von einfachen Mathecoprozessoren unter der Kontrolle einer einzelnen Master-Zentraleinheit drastisch zu vergrößern. Die Zentraleinheit hat eine einzelne allgemeine Instruktion zu allen arithmetischen Logikeinheiten (ALUs), ein pro "Zyklus", aber mit einem verschiedenen Datenpunkt für jeden gefüttert, um daran zu arbeiten. Das hat der Maschine von Solomon erlaubt, einen einzelnen Algorithmus auf eine große Datei anzuwenden, die in der Form einer Reihe gefüttert ist. 1962 hat Westinghouse das Projekt annulliert, aber die Anstrengung wurde an der Universität Illinois als der ILLIAC IV wiederangefangen. Ihre Version des Designs hat ursprünglich nach einer 1 GFLOPS Maschine mit 256 ALUs verlangt, aber, als es schließlich 1972 geliefert wurde, hatte es nur 64 ALUs und konnte nur 100 bis 150 MFLOPS erreichen. Dennoch hat es gezeigt, dass das grundlegende Konzept, und, wenn verwendet, auf datenintensiven Anwendungen wie rechenbetonte flüssige Dynamik gesund war, war der "erfolglose" ILLIAC die schnellste Maschine in der Welt. Die ILLIAC Annäherung, getrennten ALUs für jedes Datenelement zu verwenden, ist für spätere Designs nicht üblich, und wird häufig auf unter einer getrennten Kategorie, massiv paralleler Computerwissenschaft verwiesen.

Ein Computer für Operationen mit Funktionen wurde präsentiert und von Kartsev 1967 entwickelt.

Die erste erfolgreiche Durchführung der Vektor-Verarbeitung scheint, der STERN von Control Data Corporation 100 und die Instrumente von Texas Advanced Scientific Computer (ASC) zu sein. Der grundlegende ASC (d. h., "eine Pfeife") ALU hat eine Rohrleitungsarchitektur verwendet, die sowohl Skalar als auch Vektor-Berechnung mit der Maximalleistung unterstützt hat, die etwa 20 MFLOPS sogleich erreicht, die erreicht sind, wenn sie lange Vektoren bearbeiten. Ausgebreitete ALU Konfigurationen haben "zwei Pfeifen" oder "vier Pfeifen" mit einem Entsprechen 2X oder 4X Leistungszunahme unterstützt. Speicherbandbreite war genügend, um diese ausgebreiteten Weisen zu unterstützen. Der STERN war sonst langsamer, als die eigenen Supercomputer von CDC wie der CDC 7600, aber an Daten Aufgaben verbunden haben, die sie aufrechterhalten konnten viel kleiner und weniger teuer seiend. Jedoch hat die Maschine auch beträchtliche Zeit genommen, die Vektor-Instruktionen decodierend und sich bereitmachend, um den Prozess zu führen, so hat es verlangt, dass sehr spezifische Dateien daran gearbeitet haben, bevor es wirklich irgendetwas beschleunigt hat.

Die Vektor-Technik wurde zuerst 1976 vom berühmten Cray-1 völlig ausgenutzt. Anstatt die Daten im Gedächtnis wie der STERN und ASC zu verlassen, hatte das Design von Cray acht "Vektor-Register," der vierundsechzig 64-Bit-Wörter jeden gehalten hat. Die Vektor-Instruktionen wurden zwischen Registern angewandt, der viel schneller ist als Unterhaltung zum Hauptgedächtnis. Das Design von Cray hat Rohrleitungsparallelismus verwendet, um Vektor-Instruktionen aber nicht vielfachen ALUs durchzuführen.

Außerdem hatte das Design völlig getrennte Rohrleitungen für verschiedene Instruktionen zum Beispiel, Hinzufügung/Subtraktion wurde in der verschiedenen Hardware durchgeführt als Multiplikation. Das hat einer Gruppe von Vektor-Instruktionen selbst erlaubt, pipelined, eine Technik zu sein, die sie das Vektor-Anketten genannt haben. Der Cray-1 hatte normalerweise eine Leistung von ungefähr 80 MFLOPS, aber mit bis zu drei Ketten, die es führen, konnte an 240 MFLOPS - eine anständige Zahl gerade als 2002 kulminieren.

Andere Beispiele sind gefolgt. Control Data Corporation hat versucht, in den Markt des hohen Endes wieder mit seiner voraussichtlichen Ankunftszeit 10 Maschine wiedereinzugehen, aber es hat schlecht verkauft, und sie haben das als eine Gelegenheit genommen, das Superrechenfeld völlig zu verlassen. Im frühen und den japanischen Gesellschaften der Mitte der 1980er Jahre (Fujitsu, Hitachi and Nippon Electric Corporation (NEC) hat Register-basierte Vektor-Maschinen eingeführt, die dem Cray-1 ähnlich sind, normalerweise ein bisschen schneller und viel kleiner seiend. Oregoner Floating Point Systems (FPS) haben Erweiterungsreihe-Verarbeiter für Minicomputer gebaut, später ihren eigenen minisupercomputers bauend. Jedoch hat Cray fortgesetzt, der Leistungsführer zu sein, ständig die Konkurrenz mit einer Reihe von Maschinen schlagend, die zum Cray-2, X-Abgeordnetem von Cray und Y-Abgeordnetem von Cray geführt haben. Seitdem hat sich der Supercomputermarkt viel mehr auf die massiv parallele Verarbeitung aber nicht besseren Durchführungen von Vektor-Verarbeitern konzentriert. Jedoch die Vorteile der Vektor-Verarbeitung erkennend, hat IBM Virtuelle Vektor-Architektur für den Gebrauch in der Supercomputerkopplung mehrere Skalarverarbeiter entwickelt, um als ein Vektor-Verarbeiter zu handeln.

Vektor-Verarbeitungstechniken sind zu fast allen modernen Zentraleinheitsdesigns seitdem hinzugefügt worden, obwohl sie normalerweise SIMD genannt werden. In diesen Durchführungen läuft die Vektor-Einheit neben der Hauptskalarzentraleinheit, und ist gefütterte Daten aus der Vektor-Instruktion bewusste Programme.

Beschreibung

Allgemein sind Zentraleinheiten im Stande, ein oder zwei Stücke von Daten auf einmal zu manipulieren. Zum Beispiel haben die meisten Zentraleinheiten eine Instruktion, die im Wesentlichen sagt, "fügen Sie zu B hinzu und stellen Sie das Ergebnis in C". Die Daten für A, B und C konnten - in der Theorie am am wenigsten verschlüsselten direkt in die Instruktion sein. Jedoch, in effizienten Durchführungsdingen sind selten so einfach. Die Daten werden in der rohen Form selten gesandt, und werden stattdessen auf" durch den Übergang in einer Adresse zu einer Speicherposition "angespitzt, die die Daten hält. Die Entzifferung dieser Adresse und das Bekommen der Daten aus dem Gedächtnis nehmen Zeit in Anspruch. Da Zentraleinheitsgeschwindigkeiten zugenommen haben, ist diese Speicherlatenz ein großes Hindernis zur Leistung historisch geworden; sieh Speicherwand.

Um die Zeitdauer zu reduzieren, die das nimmt, verwenden modernste Zentraleinheiten eine Technik, die als Instruktion pipelining bekannt ist, in dem die Instruktionen mehrere Subeinheiten der Reihe nach durchführen. Die erste Subeinheit liest die Adresse und decodiert sie, die folgenden "Abrufe" die Werte an jenen Adressen, und das folgende tut die Mathematik selbst. Mit pipelining soll der "Trick" anfangen, die folgende Instruktion sogar zu decodieren, bevor das erste die Zentraleinheit nach der Mode eines Montagebandes verlassen hat, so ist das Adressregister ständig im Gebrauch. Jede besondere Instruktion nimmt dieselbe Zeitdauer, um, eine als die Latenz bekannte Zeit zu vollenden, aber die Zentraleinheit kann eine komplette Gruppe von Operationen viel schneller bearbeiten, als wenn es also einer nach dem anderen getan hat.

Vektor-Verarbeiter nehmen dieses Konzept ein Schritt weiter. Statt pipelining gerade die Instruktionen, sie auch Rohrleitung die Daten selbst. Sie sind gefütterte Instruktionen, die nicht nur sagen, zu B beizutragen, aber alle Zahlen "von hier zu hier" zu allen Zahlen "von dort zu dort" hinzuzufügen. Anstatt ständig Instruktionen decodieren und dann die Daten herbeiholen zu müssen, musste sie vollenden, es liest eine einzelne Instruktion auswendig und "weiß", dass die folgende Adresse ein größerer sein wird als das letzte. Das berücksichtigt bedeutende Ersparnisse in der Entzifferung der Zeit.

Um zu illustrieren, was einen Unterschied das machen kann, denken Sie die einfache Aufgabe, zwei Gruppen von 10 Zahlen zusammen hinzuzufügen. Auf einer normalen Programmiersprache würden Sie eine "Schleife" schreiben, die jedes der Paare von Zahlen der Reihe nach aufgenommen hat, und sie dann hinzugefügt hat. Zur Zentraleinheit würde das etwas wie das schauen:

führen Sie diese Schleife 10mal durch

lesen Sie die folgende Instruktion und decodieren Sie sie

holen Sie diese Zahl herbei

holen Sie diese Zahl herbei

fügen Sie sie hinzu

stellen Sie das Ergebnis hier

Endschleife

Aber zu einem Vektor-Verarbeiter sieht diese Aufgabe beträchtlich verschieden aus:

Lesebefehl und decodiert es

holen Sie diese 10 Zahlen herbei

holen Sie jene 10 Zahlen herbei

fügen Sie sie hinzu

stellen Sie die Ergebnisse hier

Es gibt mehrere dieser Annäherung innewohnende Ersparnisse. Für ein sind nur zwei Adressumrechnungen erforderlich. Abhängig von der Architektur kann das bedeutende Ersparnisse allein vertreten. Ein anderes Sparen holt herbei und decodiert die Instruktion selbst, die nur ein Mal statt zehn getan werden muss. Der Code selbst ist auch kleiner, der zu effizienterem Speichergebrauch führen kann.

Aber mehr als das kann ein Vektor-Verarbeiter vielfache funktionelle Einheiten haben, die jene Zahlen in der Parallele hinzufügen. Die Überprüfung von Abhängigkeiten zwischen jenen Zahlen ist nicht erforderlich, weil eine Vektor-Instruktion vielfache unabhängige Operationen angibt. Das vereinfacht die Kontrolllogik erforderlich, und kann Leistung durch das Vermeiden von Marktbuden verbessern.

Wie erwähnt, früher haben die Durchführungen von Cray das ein Schritt weiter genommen, mehreren verschiedenen Typen von Operationen erlaubend, zur gleichen Zeit ausgeführt zu werden. Denken Sie Code, der zwei Zahlen hinzufügt und dann um ein Drittel multipliziert; im Cray würden diese alle sofort herbeigeholt, und beide haben beigetragen und haben in einer einzelnen Operation multipliziert. Mit dem Pseudocode oben hat der Cray getan:

Lesebefehl und decodiert es holen Sie diese 10 Zahlen herbei holen Sie jene 10 Zahlen herbei

holen Sie weitere 10 Zahlen herbei

fügen Sie hinzu und multiplizieren Sie sie

stellen Sie die Ergebnisse hier

Die Matheoperationen haben so viel schneller gesamt, der Begrenzungsfaktor vollendet, der die Zeit ist, die erforderlich ist, die Daten auswendig herbeizuholen.

Nicht alle Probleme können mit dieser Sorte der Lösung angegriffen werden. Das Hinzufügen dieser Sorten von Instruktionen fügt notwendigerweise Kompliziertheit zur Kernzentraleinheit hinzu. Diese Kompliziertheit lässt normalerweise andere Instruktionen langsamer laufen - d. h., wann auch immer es viele Zahlen hintereinander nicht zusammenzählt. Die komplizierteren Instruktionen tragen auch zur Kompliziertheit der Decoder bei, die die Entzifferung der allgemeineren Instruktionen wie das normale Hinzufügen verlangsamen könnten.

Tatsächlich arbeiten Vektor-Verarbeiter am besten nur, wenn es große Datenmengen gibt, die darauf zu arbeiten sind. Deshalb wurden diese Sorten von Zentraleinheiten in erster Linie in Supercomputern gefunden, wie die Supercomputer selbst im Allgemeinen in Plätzen wie Wettervorhersagezentren und Physik-Laboratorien gefunden wurden, wo riesige Datenmengen "zerkaut" werden.

Echtes Weltbeispiel: Vektor-Instruktionsgebrauch mit der x86 Architektur

Gezeigt unten ist ein wirkliches x86 Architektur-Beispiel für den Vektor-Instruktionsgebrauch mit dem SSE Befehlssatz. Das Beispiel multipliziert zwei Reihe der einfachen Präzision, die Punkt-Zahlen schwimmen lässt. Es wird in der c Sprache mit Reihenzusammenbau-Codeteilen für die Kompilation mit GCC (32 Bit) geschrieben.

//SSE simd fungieren für die vectorized Multiplikation von 2 Reihe mit der einfachen Präzision floatingpoint Zahlen

//1. param Zeigestock auf der Reihe der Quelle/Bestimmungsortes, 2. param 2. Quellreihe, 3. param Zahl von Hin- und Herbewegungen pro Reihe

Leere mul_asm (float*, float* in, nicht unterzeichnete interne Nummer leng)

{nicht unterzeichnete int Zählung, Rest;

//rechnen Sie, wenn Reihe für die Vektor-Operation groß genug

ist

ruhen Sie sich = (leng*4) %16 aus;

zählen Sie = (leng*4) - Rest;

//Vectorized-Teil; 4 Hin- und Herbewegungen pro Schleife-Wiederholung

wenn (Zählung> 0) {\

__ asm __ flüchtig __ (".intel_syntax noprefix\n\t"

"Schleife: \n\t"

"movups xmm0, [ebx+ecx]; Lasten 4 Hin- und Herbewegungen im ersten Register (xmm0) \n\t"

"movups xmm1, [eax+ecx]; Lasten 4 Hin- und Herbewegungen im zweiten Register (xmm1) \n\t"

"mulps xmm0, xmm1; multipliziert beiden Vektoren registers\n\t"

"movups [eax+ecx], xmm0; schreiben Sie das Ergebnis memory\n\t" zurück

"U-Boot ecx, 16; Zunahme-Adresszeiger durch 4 floats\n\t"

"Jnz-Schleife \n\t"

".att_syntax-Präfix \n\t"

:: "a", "b" (in), "c" (Zählung), "d" (Rest): "xmm0", "xmm1");

}\

//Skalarteil; 1 Hin- und Herbewegung pro Schleife-Wiederholung

wenn (Rest! =0)

{\

__ asm __ flüchtig __ (".intel_syntax noprefix\n\t"

"fügen Sie eax, ecx \n\t" hinzu

"fügen Sie ebx, ecx \n\t" hinzu

"Rest: \n\t"

"movss xmm0, [ebx+edx]; laden Sie 1 Hin- und Herbewegung im ersten Register (xmm0) \n\t"

"movss xmm1, [eax+edx]; laden Sie 1 Hin- und Herbewegung im zweiten Register (xmm1) \n\t"

"mulss xmm0, xmm1; multipliziert beide Skalarteile von registers\n\t"

"movss [eax+edx], xmm0; schreiben Sie der result\n\t" zurück

"U-Boot edx, 4 \n\t"

"jnz lassen \n\t" ausruhen

".att_syntax-Präfix \n\t" :: "a", "b" (in), "c" (Zählung), "d" (Rest): "xmm0", "xmm1"); }\

kehren Sie zurück;

}\

</Quelle>

Die Programmierung heterogener Rechenarchitekturen

Verschiedene Maschinen wurden entworfen, um sowohl traditionelle Verarbeiter als auch Vektor-Verarbeiter, wie der Fujitsu AP1000 und AP3000 einzuschließen. Die Programmierung solcher heterogenen Maschinen kann seit sich entwickelnden Programmen schwierig sein, die besten Gebrauch von Eigenschaften von verschiedenen Verarbeiter-Zunahmen die Last des Programmierers machen. Es vergrößert Codekompliziertheit und vermindert Beweglichkeit des Codes, indem es Hardware spezifischer Code verlangt wird, überall im Anwendungscode durchgeschossen zu werden. Das Ausgleichen des Anwendungsarbeitspensums über Verarbeiter kann besonders problematisch sein vorausgesetzt, dass sie normalerweise verschiedene Leistungseigenschaften haben. Es gibt verschiedene Begriffsmodelle, um sich mit dem Problem, zum Beispiel mit einer Koordinationssprache und Programm-Bausteinen zu befassen (Bibliotheken und/oder höhere Ordnungsfunktionen programmierend). Jeder Block kann eine verschiedene heimische Durchführung für jeden Verarbeiter-Typ haben. Benutzer einfach Programm mit diesen Abstraktionen und einem intelligenten Bearbeiter wählen die beste auf dem Zusammenhang gestützte Durchführung.

Siehe auch

  • Strom, der in einer Prozession geht
  • SIMD
  • Vectorization
  • Das Anketten (Vektor-Verarbeitung)
  • Computer für Operationen mit Funktionen

Außenverbindungen


Baal / Baalbek
Impressum & Datenschutz