Melden Sie sich hier an, um auf Kommentare und die Whitepaper-Datenbank zugreifen zu können.

Kein Log-In? Dann jetzt kostenlos registrieren.

Falls Sie Ihr Passwort vergessen haben, können Sie es hier per E-Mail anfordern.

Der Zugang zur Reseller Only!-Community ist registrierten Fachhändlern, Systemhäusern und Dienstleistern vorbehalten.

Registrieren Sie sich hier, um Zugang zu diesem Bereich zu beantragen. Die Freigabe Ihres Zugangs erfolgt nach Prüfung Ihrer Anmeldung durch die Redaktion.

17.04.1987 - 

Hardware, Software und Instruktionssatz müssen aufeinander abgestimmt sein:

Die Komposition gibt den Ausschlag

Die Leistungsfähigkeit moderner Superrechner ist vom Zusammenspiel mehrerer Komponenten abhängig. Hardware-Instruktionssatz, Architektur und programmtechnische Nutzung der Ressourcen sind die Komponenten, die für die Geschwindigkeit und damit den Gebrauchsnutzen einer derartigen Maschine die zentrale Rolle spielen.

Die Anforderungen an Computersysteme, die rechenzeitintensive Simulationsprogramme aus der Aerodynamik, Seismologie und Meteorologie sowie der Plasma- und Kernphysik verarbeiten, haben die Entwicklung von Hochleistungsrechnern, speziell von Vektorrechnern, stark beeinflußt. Neben den sogenannten Skalarrechnern mit Verarbeitungsleistungen in der Größenordnung von 20 Millionen arithmetischen Operationen je Sekunde (Megaflops) sind jetzt am Markt auch Vektorrechner verfügbar, die mehr als 1 Gigaflop je Prozessor ausführen können (zum Beispiel Siemens VP400 mit 1,142 Gigaflops). Die außerordentliche Leistung dieser Vektorrechner beruht auf Fortschritten in den Bereichen Hardware, Architektur und Software.

Untersucht man Programme aus der technisch-wissenschaftlichen Welt, so stellt man fest, daß die Verarbeitung von Vektoren einen wesentlichen Bestandteil ausmacht. Will man also im Vergleich zu einem Skalarrechner eine Leistungssteigerung erhalten, so bietet sich als eine Möglichkeit die Beschleunigung der Vektorverarbeitung an.

Betrachtet man zum Beispiel die Addition zweier Vektoren genauer, so ist zu erkennen, daß ein und dieselbe Operation hier n-mal auf skalaren Operandenpaaren ausgeführt wird; das heißt, diese Operation muß n-mal aus dem Hauptspeicher geholt, entschlüsselt und ausgeführt werden. In modernen Skalarrechnern überlappen sich diese drei Phasen durch Pipelining: Während der Ausführung eines Operation kann schon die nachfolgende Instruktion entschlüsselt werden.

Der wesentliche Unterschied zwischen einem Skalar- und einem Vektorrechner besteht nun darin, daß zum einen beim Vektorrechner der Hardware-Instruktionssatz durch Vektorinstruktionen erweitert wird, deren Operanden Vektoren sind - es muß somit für einen Vektor der Länge n nur noch eine Operation aus dem Hauptspeicher geholt und entschlüsselt werden. Zum anderen wird die Pipeline-Technik beim Vektorrechner nicht nur auf die oben beschriebene Aufbereitungs-, sondern auch auf die Ausführungsphase einer Hardware-Instruktion angewandt. Dies ermöglicht ein quasiparalleles Verarbeiten der skalaren Elemente eines Vektors.

Bei der Anwendung der Pipeline-Technik auf eine Addition wird diese in einzelne Teilsegmente (Operationsschritte) zerlegt, wobei jedes Segment genau definierte Operationen auf den Operanden ausführt. Am Ende eines Maschinenzyklus liefert jedes Segment das Resultat seiner Ausführung an das nächste Segment ab und nimmt das Teilresultat des vorangegangenen Segments entgegen. Beim Vektorrechner wird nach eine Einschwingphase, die der Zahl der Segmente in der Pipeline entspricht, vom Addierer pro Zyklus eine Addition produziert, solange ein neues Paar von Operanden dem ersten Segment übertragen wird. Im eingeschwungenen Zustand bearbeitet also die Pipeline so viele Operanden quasiparallel, wie sie Segmente enthält.

Im Siemens-VP-System, das hier als Beispiel dienen soll, wurden zusätzlich zu den schon vorhandenen Skalarinstruktionen für die Verarbeitung von Vektoren 83 Vektorinstruktionen implementiert. Die arithmetisch-logischen Vektorinstruktionen arbeiten dabei nicht direkt auf dem Hauptspeicher, sondern auf einem zwischengeschalteten schnellen Puffer, den Vektorregistern. Der Vorteil dieser Arbeitsweise kommt dann zum Tragen, wenn die Elemente eines Vektors im Hauptspeicher nicht kontinuierlich abgespeichert sind oder wenn Operanden oder Zwischenresultate mehrmals benötigt werden, so daß ein direkter Zugriff auf den im Vergleich zu den Vektorregistern langsameren Hauptspeicher vermieden werden kann. Im VP-System beträgt zum Beispiel die "Chip-Access-Time" für den Hauptspeicher 55 Nanosekunden (ns) und für die Vektorregister 5,5 ns.

Zusätzlich zu den Vektorregistern gibt es einen Maskenregistersatz, dessen Bedeutung bei der Verarbeitung von bedingten Anweisungen in Anwenderprogrammen zum Tragen kommt. Mit Hilfe dieser Maskenregister kann die Ausführung spezieller Vektorinstruktionen beeinflußt werden.

Die Leistung PFlop einer Vektorinstruktion (wobei als Leistung die Anzahl der Operationen, dividiert durch die Zeit, definiert wird) berechnet sich im wesentlichen aus drei Einflußgrößen: nämlich erstens der relativen Zeitspanne (zum Beispiel in Maschinenzyklen), die verstreicht, bis das erste Resultat einer HW-Instruktion das Fließband verlassen hat (entspricht der Anzahl a der Segmente), zweitens der Zeitdauer Tcycle(Maschinenzyklus) die innerhalb eines Segments gebraucht wird; und schließlich der Anzahl n der Elemente eines Vektors.

Damit ergibt sich

PFlop=n/(a+(n-1))Tcycle=n/((a-1)+n)Tcycle.

(a-1) wird als Startup-Zeit einer Vektorinstruktion bezeichnet.

Die Leistungsangaben aller Hersteller von Vektorrechnern für ihre Vektorinstruktionen werden vereinfacht durch 3,14Flop= 1/Tcycle berechnet (des heißt, es wird a-1=0 angenommen, siehe Bild 2).

Entsprechend der Aufgabenstellung lassen sich die Vektorinstruktionen in unterschiedliche funktionelle Bereiche aufteilen.

- "Lade-Speichere"-Instruktionen: transferieren Vektoren und Masken zwischen Hauptspeicher und Vektor- beziehungsweise Maskenregistern und umgekehrt.

- Arithmetische Instruktionen: führen Addition, Multiplikation und Division zwischen Vektoren und Skalaren aus.

- Vergleichsinstruktionen: Vektoren werden aufgrund einer Bedingung ( <, =, > ) verglichen, und das Resultat wird in ein Maskenregister geschrieben.

- Logische Instruktionen: Vektoren werden mit Hilfe logischer Bedingungen (AND, OR) verknüpft.

- Makro-Instruktionen: Jede dieser Instruktionen ist in der Lage, mehrere Einzelschritte auf Vektoren auszuführen.

- Editions-Instruktionen: Vektoren werden unter Zuhilfenahme eines Maskenregisters komprimiert und expandiert.

- Konvertierungsinstruktionen: Umwandlung von Zahlendarstellungen (Real nach Integer und umgekehrt).

- Kontrollinstruktionen: Setzen des Vektorlängenregisters und Instruktionen zur Sequentialisierung.

Um die Leistungsfähigkeit und Flexibilität des Vektorinstruktionssatzes, vor allem der Makroinstruktionen, zu demonstrieren, sollen im folgenden zwei beispielhafte Vektorbefehle beschrieben werden.

- Vector indirect load (siehe Bild 3): Die im Hauptspeicher zufällig verteilten Daten werden in die Vektorregister transferiert. Der indirekte Zugriff auf die Elemente eines Feldes a im Hauptspeicher und der Transfer dieser Elemente in ein Vektorregister Va wird über ein Vektorregister Vl realisiert. Dabei enthält Vl die Indizes L1, ..., Ln, welche die Elemente von a adressieren.

- Vector find maximum long (siehe Bild 4): Unter den Elementen in einem Vektorregister VR wird das maximale Element und der entsprechende Index gesucht und ins Gleitpunktregister FPR beziehungsweise das Indexregister GR geschrieben.

Die maximale Leistung eines Vektorrechners hängt nun sehr stark davon ab, welchen Grad an Parallelität die Architektur zuläßt. Hierbei sind zwei Arten von Parallelitäten möglich, die beide im Siemens-VP-System realisiert sind, nämlich die parallele Verarbeitung von skalaren und vektoriellen Instruktionen und die parallele Verarbeitung von unterschiedlichen Vektorinstruktionen.

Das Siemens-VP-System besteht im wesentlichen aus vier Teilen (siehe Bild 5). Skalareinheit und Vektoreinheit wurden logisch voneinander getrennt, um Parallelverarbeitung zwischen Skalar- und Vektorinstruktionen zu ermöglichen. Alle Instruktionen (sowohl skalare als auch vektorielle) werden zuerst in die Skalareinheit transferiert, dort decodiert und dann im Fall einer Vektorinstruktion in die Vektoreinheit zur Ausführung weitergeleitet. Skalarinstruktionen können dagegen sofort in der Skalareinheit ausgeführt werden.

Eine Besonderheit des VP-Systems stellt die dynamische Konfigurierbarkeit des Vektorregistersatzes dar, das heißt, die Größe ist mit 64 KB (VP200) vorgegeben. Es läßt sich jedoch die Anzahl und damit die Länge der Vektorregister verändern (siehe Bild 6). Somit kann sich die Architektur der Vektoreinheit dynamisch an die Anforderungen eines Programms anpassen. Werden zum Beispiel in einem arithmetischen Ausdruck viele Vektoren verarbeitet, so wird der Vektorregistersatz in entsprechend viele Vektorregister (maximal 256) unterteilt, um Ladeoperationen zwischen Hauptspeicher und Vektorregister einzusparen. Werden hingegen wenig Vektoren verarbeitet, so kann die Anzahl der Vektorregister auf minimal 8 reduziert und die Länge eines Vektorregisters auf 1024 erhöht werden. Konsequenz: Die Start-up-Zeit einer Vektorinstruktion spielt nur noch eine untergeordnete Rolle .

Die 83 Hardware-Instruktionen werden auf sechs logische Funktionseinheiten (Pipelines) abgebildet. Fünf dieser sechs Pipelines können parallel arbeiten (zwei Lade-Speichere-, die Masken-Pipeline und zwei von drei arithmetischen Pipelines). Verknüpfungen innerhalb des Maskenregistersatzes werden über die Maskenpipeline vorgenommen. Alle Pipelines sind in der eingangs beschriebenen Fließbandtechnik implementiert.

Im folgenden wird die parallele Verarbeitung von Vektorinstruktionen genauer beschrieben, da sie für das Verständnis von Vektorrechnern wichtig ist und die maximale Leistung eines Vektorrechners wesentlich mitbestimmt.

Da bei einer Vektorinstruktion in jedem Maschinenzyklus ein Resultat berechnet wird, gibt die Länge eines Vektors an, für wie viele Zyklen die entsprechende Pipeline reserviert ist. Zwei oder mehr Vektorinstruktionen können zur selben Zeit nur auf verschiedenen Pipeline-Einheiten parallel abgearbeitet werden. In den folgenden Beispielen können deshalb die beiden Instruktionen "Addieren" und "Multiplizieren" parallel ablaufen:

Besondere Beachtung verdient dabei das letzte Beispiel, bei dem das Ergebnisregister einer Pipeline sofort als Operandenregister einer zweiten, von der ersten verschiedenen Pipeline verwendet wird. Die pro Maschinenzyklus von der Additionspipeline erzeugten Resultatelemente eines Vektors können hier sofort als Operanden in die Multiplikations-Pipeline einfließen, unabhängig davon, wie viele Additionen noch auf den restlichen Vektorelementen ausgeführt werden müssen.

Benützen zwei Vektorinstruktionen ein und dieselbe Pipeline, so kann im VP-System die Endbehandlung der ersten Vektorinstruktion mit dem Start der zweiten Vektorinstruktion überlappt werden. Für das Zeitdiagramm zweier aufeinanderfolgender Additionen ergibt sich:

Va=Vb+Vc, Vd=Ve x Vf (verschiedene Register und verschiedene Pipelines);

Va=Vb+Vc, Vd=Vb x Vf (gleiche Register und verschiedene Pipelines);

Vb=Vc+Vd, Ve=Vb x Vf (Verkettung von Operationen/Chaining).

Somit läßt sich die zweite Vektorinstruktion ohne Verzögerung an die erste anschließen, und die Startup-Zeit kommt nur einmal zum Tragen.

Diese Technik kann vor allem bei Algorithmen aus der linearen Algebra mit Erfolg verwendet werden. Durch diese optimale Auslastung der Funktionseinheiten lassen sich zum Beispiel für die Matrix-Vektormultiplikation MXV mit den Dimensionen 512 x 512 im VP200 (maximale Leistung 571 Megaflops) gemessene 564 Megaflops und im VP400 (maximale Leistung 1142 Megaflops) entsprechend 1126 Megaflops erzielen. Es sei noch darauf hingewiesen, daß die Programmierung von MXV ausschließlich in Fortran und nicht in Vektor-Assembler durchgeführt wurde.

Obwohl sehr schelle Vektorinstruktionen und ein hoher Grad an Parallelität die wesentlichen Voraussetzungen für die Leistung eines Vektorrechners sind, darf die Software unter keinen Umständen vernachlässigt werden. Es ist eine bekannte Tatsache, daß die reale Leistung - nicht etwa die maximale Hardwareleistung! - eines Vektorrechners für ein gegebenes Programm stark vom Programmierstil des Anwenders abhängt. In einem Vektorrechner können nur die vektorisierbaren Teile eines Programms in extrem schnellen Vektorinstruktionen verarbeitet werden und damit eine - im Vergleich zu einem Skalarrechner - reduzierte Ausführungszeit bewirken. Der Compiler sollte nun die vektorisierbaren Teile weitgehend automatisch erkennen, um den Programmierer von manuellem Vektorisieren zu entlasten.

Somit ergeben sich für einen vektorisierenden Compiler im Vergleich zu einem skalaren Compiler eine Reihe neuer Aufgaben, von denen drei erwähnt werden sollen:

- Vektorisierung der indirekten Adressierung,

- Umsetzung komplexer Fortran-Sequenzen in Vektor-Makroinstruktionen,

- optimierte Vektorcode-Generierung, so daß die im System vorhandenen Möglichkeiten der Parallelverarbeitung effizient ausgenutzt werden.

Zusätzlich zu diesen drei Beispielen enthält der vektorisierende Fortran-77-Compiler für die Siemens-VP-Systeme eine Vielzahl von neuen Vektorisierungstechniken.

Es zeigt sich immer mehr, daß effiziente Vektorverarbeitung nur durch eine harmonische Kombination von Hardware mit schnellen Vektorinstruktionen, Architektur und Software in Form von intelligenten Compilern realisiert werden kann.

*Dr. Horst Gietl ist Leiter des Vektorprozessor-Produktzentrums der Siemens AG in München.