-
GEBIET DER ERFINDUNG
-
Die
vorliegende Erfindung betrifft im Allgemeinen den Betrieb von Prozessoren
und betrifft insbesondere Pipeline-Mikroprozessoren und Verfahren,
die für
derartige Mikroprozessoren verwendbar sind, um Software-Pipeline-Schleifen
auszuführen.
-
HINTERGRUND DER ERFINDUNG
-
Ein
Mikroprozessor ist eine Schaltung, die die Befehlsbearbeitung sowie
arithmetische und logische Operationen eines Computers in einem
einzigen Chip kombiniert. Ein digitaler Signalprozessor (DSP) ist
ein Mikroprozessor, der optimiert ist, um große Datenvolumina effizient
zu bearbeiten. Derartige Prozessoren sind für den Betrieb vieler heutiger
elektronischer Produkte, wie z. B. Hochgeschwindigkeits-Modems,
Plattenlaufwerke mit hoher Dichte, digitale Zellulartelephone und
komplexe Kraftfahrzeugsysteme, zentral, wobei sie eine breite Vielfalt
anderer digitaler Systeme in der Zukunft ermöglichen werden. Die den DSPs
in diesen Umgebungen auferlegten Anforderungen wachsen fortgesetzt,
da die Verbraucher eine vergrößerte Leistung
von ihren digitalen Produkten verlangen.
-
Die
Entwickler waren bei der Erhöhung
der Leistung von DSPs im Allgemeinen durch Erhöhung der Taktfrequenzen, durch
das Entfernen von architektonischen Engpässen bei der DSP-Schaltungskonstruktion, durch
das Aufnehmen mehrerer Ausführungseinheiten
in eine einzige Prozessorschaltung und durch das Entwickeln von
Optimierungskompilierern, die die durch den Prozessor auszuführenden
Operationen in einer effizienten Weise planen, erfolgreich. Da weitere
Vergrößerungen
der Taktfrequenz schwieriger zu erreichen sind, haben die Entwickler
den Prozessor, der mehrere Ausführungseinheiten
enthält,
als ein Mittel erfasst, um eine verbesserte DSP-Leistung zu erreichen. 1 zeigt
z. B. einen Blockschaltplan einer DSP-Ausführungseinheits- und Registerstruktur
mit acht Ausführungseinheiten
L1, S1, M1, D1, L2, S2, M2 und D2. Diese Ausführungseinheiten arbeiten parallel,
um mehrere Operationen, wie z. B. Addition, Multiplikation, Adressierung, Logikfunktionen
und Datenspeicherung und -wiedergewinnung, gleichzeitig auszuführen.
-
Theoretisch
ist die Leistung eines Prozessors, der mehrere Ausführungseinheiten
enthält,
proportional zur Anzahl der verfügbaren
Ausführungseinheiten.
Die Verwendung dieser Leistungsvorteile hängt jedoch von der effektiven
Planung der Operationen ab, so dass die meisten der Ausführungseinheiten
eine Aufgabe besitzen, die während
jedes Taktzyklus auszuführen
ist. Die effiziente Planung ist für Schleifenbefehle besonders wichtig,
weil in einer typischen Laufzeitanwendung der Prozessor die Mehrzahl
seiner Zeit bei der Schleifenausführung verbringt. Eine effiziente
Art, in der Schleifenbefehle angeordnet werden können, um mehrere Ausführungseinheiten
auszunutzen, besteht in einer Software-Pipeline-Schleife. In einer
herkömmlichen
skalaren Schleife werden alle Befehle für eine einzige Iteration ausgeführt, bevor
irgendwelche Befehle für
die folgenden Iterationen ausgeführt
werden. In einer Software-Pipeline-Schleife wird die Reihenfolge
der Operationen neu geplant, so dass eine oder mehrere Iterationen
in der ursprünglichen
Schleife die Ausführung
beginnen, bevor die vorhergehende Iteration abgeschlossen worden
ist. In 2a ist eine einfache Schleife
gezeigt, die 7 Iterationen der Operationen A, B und C enthält. 2b stellt
einen alternativen Ausführungsplan
für die Schleife
nach 2a dar, wobei in jedem Taktzyklus eine neue Iteration
der ursprünglichen
Schleife begonnen wird. Für
die Taktzyklen I3–I7 wird
in diesem Plan in jedem Taktzyklus der gleiche Befehl (An, Bn-1, Cn-2) ausgeführt; falls mehrere Ausführungseinheiten
verfügbar
sind, um diese Operationen parallel auszuführen, kann der Code umstrukturiert
werden, um diesen wiederholten Befehl in einer Schleife auszuführen. Das
sich wiederholende Muster von A, B, C (zusammen mit den Schleifensteuerungsoperationen)
bildet folglich den Schleifen-Kern einer neuen Software-Pipeline-Schleife,
die die Befehle in den Taktzyklen I3–I7 in 5 Schleifen ausführt. 2c stellt
eine derartige Schleife dar. Die in den Taktzyklen I1 und
I2 nach 2b ausgeführten Befehle
müssen
immer noch zuerst ausgeführt
werden, um die Software-Pipeline-Schleife richtig zu "füllen"; diese Befehle werden als der Schleifen-Prolog
bezeichnet. Desgleichen müssen
die bei den Taktzyklen I8 und I9 nach 2b ausgeführten Befehle
immer noch ausgeführt
werden, um die Software-Pipeline richtig zu "leeren"; diese Befehle werden als der Schleifen-Epilog
bezeichnet (es wird angegeben, dass in vielen Situationen der Schleifenepilog
durch eine Technik gelöscht
werden kann, die als spekulative Ausführung bekannt ist).
-
Das
einfache Beispiel nach den 2a–2c veranschaulicht
die Grundprinzipien der Software-Pipeline, andere Überlegungen,
wie z. B. Abhängigkeiten
und Konflikte, können
aber eine spezielle Planungslösung
erzwingen. Für
eine ausführlichere
Erklärung
der Software-Pipeline siehe Vicki H, Allen, Software Pipelining,
27 ACM Computing Surveys, 367, (1995).
-
Der
Aufsatz 'Code Generation
Schema for Moduln Scheduled Loops' von Rau Schlansker und Tirumalai vom
25th Annual International Symposium an Microarchitecture, veröffentlicht
in MICRO 25, SIGMICRO Newsletter, Dezember 1992, offenbart die Software-Pipeline
als eine wichtige Befehlsplanungstechnik, um aufeinanderfolgende
Iterationen von Schleifen effektiv zu überlappen und sie parallel
auszuführen.
Die Moduln-Planung ist ein Zugang zum Erzeugen derartiger Pläne. Der
Aufsatz spricht ein Problem an, das vorher wenig Beachtung erfahren
hat, das aber in seiner Komplexität nichttrivial ist: die Aufgabe,
richtigen Hochleistungscode zu erzeugen, sobald der Moduln-Plan
erzeugt worden ist, wobei die Natur der Schleife und die Registerzuweisungsstrategie,
die verwendet wird, zu berücksichtigen
sind. Der Aufsatz untersucht dieses Problem sowohl innerhalb als
auch außerhalb
der Hardware-Merkmale, die spezifisch auf die Unterstützung der Modulo-Planung
gerichtet sind.
-
ZUSAMMENFASSUNG DER ERFINDUNG
-
Ein
Nachteil der Software-Pipeline ist der Bedarf an einem spezialisierten
Schleifenprolog für
jede Schleife. Der Schleifenprolog bringt explizit den Beginn der
ersten mehreren Iterationen einer Pipeline in eine Reihenfolge,
wobei er bei jedem Taktzyklus Befehle hinzufügt, bis in den stationären Zustand
des Schleifenkerns eingetreten werden kann (dies wird im Allgemeinen
als das "Füllen" der Pipeline bezeichnet).
Der stationäre
Zustand der Operation wird erreicht, sobald jeder Befehl im Schleifenkern
gültige
Operanden besitzt, falls der Kern ausgeführt wird. Als Faustregel kann
der Schleifenkern in einem stationären Zustand nach k = l – m Taktzyklen
ausgeführt
werden, wobei l die Anzahl der Taktzyklen repräsentiert, die erforderlich
ist, um eine Iteration der Pipeline-Schleife abzuschließen, während m
die Anzahl der in einer Iteration des Schleifenkerns ent haltenen
Taktzyklen repräsentiert
(diese Formel muss im Allgemeinen modifiziert werden, falls der
Kern entrollt ist).
-
Anhand
dieser Beziehung kann erkannt werden, dass, wenn die kumulative
Pipeline-Verzögerung,
die durch eine einzige Iteration einer Pipeline-Schleife erforderlich
ist, zunimmt, gewöhnlich
entsprechende Zunahmen der Schleifenprologlänge beobachtet werden. In einigen
Fällen
kann der zum Füllen
der Pipeline erforderliche Schleifenprologcode das Mehrfache der
Größe des Schleifenkerncodes
betragen. Da die Codegröße ein bestimmender
Faktor bei der Ausführungsgeschwindigkeit
sein kann (kürzere
Programme können
im Allgemeinen in größerem Umfang
als längere
Programme einen Programmspeicher innerhalb des Chips verwenden),
können
lange Schleifenprologe für
die Programmausführungsgeschwindigkeit
nachteilig sein.
-
Die
vorliegende Offenbarung versucht, die Verringerung der Codegröße durch
Verringerung oder Eliminierung wenigstens eines Teils des Schleifenprologs,
der durch die Software-Pipelines des Standes der Technik erforderlich
ist, zu lehren. Diese Offenbarung lehrt, dass dies durch die "Selbst-Vorbereitung" erreicht werden
kann, d. h., der Prozessor führt
den Schleifenkern für
zusätzliche
Iterationen aus, statt einen separaten Prologcode auszuführen. Selbstverständlich entfernt
die Verringerung oder Eliminierung der zum Füllen der Pipeline notwendigen
Befehle aus dem Prolog nicht die Notwendigkeit der Befehle selbst – es wird
jedoch hierin erkannt, dass diese Befehle im Schleifenkörper wiederholt
werden und dort ausgeführt
werden können.
-
Ein
Problem bei der Verwendung der Schleifenkörperbefehle, um die Schleife
vorzubereiten, besteht darin, dass viele Schleifenbefehle ungültige Operanden
besitzen, falls die Schleife ohne einen Prolog ausgeführt wird – folglich
beinhaltet die Erfindung, dass eine oder mehrere Schleifenoperationen
im stationären
Zustand vorzeitig ausgeführt
werden können,
d. h., bevor die Pipeline den stationären Zustand erreicht, während die
Schleife "sich selbst
vorbereitet". Für den Zweck
dieser Offenbarung wird eine Operation vorzeitig ausgeführt, falls
gültige
Daten, die notwendig sind, um die Operation im stationären Zustand
der Operation auszuführen,
durch die Pipeline noch nicht verfügbar sind. Weil vorzeitige
Operationen typischerweise sinnlose Ergebnisse erzeugen und potentiell
Ergebnisse erzeugen, die für
das endgültige
Schleifenergebnis schädlich sind,
lehrt die vorliegende Offenbarung mehrere Verfahren, um zu verhindern,
dass vorzeitige Schleifenoperationen das gewünschte Schleifenergebnis ändern. Besondere
Aspekte der Erfindung sind in den unabhängigen Ansprüchen dargelegt.
-
In
einem Aspekt schafft eine Ausführungsform
der vorliegenden Erfindung ein Verfahren zum Betreiben eines Prozessors
in einer Software-Pipeline-Schleife, das die Notwendigkeit für wenigstens
einen Teil eines Schleifenprologs verringert oder eliminiert. Im
Allgemeinen umfasst dieses Verfahren die Ablaufplanung des Prozessors
durch eine gewünschte
Anzahl von Iterationen des Software-Pipeline-Schleifenkerns. Dieses Verfahren
umfasst jedoch ferner die Ablaufplanung von wenigstens einer zusätzlichen
Iteration des Software-Pipeline-Schleifenkerns durch den Prozessor,
bevor die Pipeline den stationären
Zustand der Operation erreicht, während die Schleifenergebnisse
von den schädlichen
Wirkungen der zusätzlichen
Iteration isoliert werden. Die zusätzliche Iteration kann folglich
vorteilhaft verwendet werden, um einen Teil des Schleifenprologs zu
ersetzen, was typischerweise zu einer kürzeren Codegröße führt.
-
Es
werden mehrere allgemeine Verfahren zum Isolieren der Schleifenergebnisse
von den schädlichen Wirkungen
der zusätzlichen
Iterationen offenbart. Ein erstes Verfahren ist die Ausgangsfeld-Überzuweisung – ein Ausgangsfeld
wird mit zusätzlichen
benachbarten Speicherstellen aufgefüllt, so dass vorzeitige Speicheroperationen
eine (potentiell sinnlose) Ausgabe in gültige Speicherstellen schreiben.
Ein zweites Verfahren ist die Registervoreinstellung – ein durch
einen vorzeitig ausgeführten
Befehl verwendetes Register wird so voreingestellt, dass die vorzeitige
Ausführung
des Befehls ein für
die Schleifenergebnisse unschädliches
Ergebnis erzeugt. Ein drittes Verfahren ist die Befehlskonditionierung – ein Kernbefehl,
der andernfalls vorzeitig ausgeführt
werden würde,
wird in einem Zähler
konditioniert, der die Kerniterationen verfolgt, so dass die Ausführung des
Befehls während
der Schleifenvorbereitungs-Kerniterationen verhindert wird. Es können außerdem Kombinationen
dieser Verfahren verwendet werden.
-
In
einem verwandten Aspekt der Erfindung wird ein Verfahren zur Neuplanung
der Ausführung
einer Software-Pipeline-Schleife geschaffen. Dieses Verfahren umfasst
das Konstruieren eines Schleifenkerns, der einen Schleifenzähler besitzt;
das Einstellen des Anfangswertes des Schleifenzählers, so dass wenigstens eine
zusätzliche
Iteration der Schleife ausgeführt
wird; das Setzen des Schleifenkerns in eine Ausführungsreihenfolge, so dass
er die Ausführung
beginnt, bevor die Pipeline vollständig initialisiert ist; das
Bestimmen, welche Ausführungseinheiten
im Ergebnis Pipeline-Befehle empfangen, bevor sie gültige Pipeline-Daten
empfangen; und das Isolieren der Schleifenergebnisse von den schädlichen
Wirkungen derartiger Befehle.
-
KURZBESCHREIBUNG DER ZEICHNUNG
-
Die
Ausführungsformen
gemäß der Erfindung
werden nun lediglich beispielhaft und unter Bezugnahme auf die beigefügte Zeichnung
beschrieben, worin:
-
1 ein
Blockschaltplan ist, der die Ausführungseinheiten und Register
eines Prozessors, der mehrere Ausführungseinheiten enthält, darstellt;
-
2a eine
einfache skalare Schleife von Computerbefehlen darstellt;
-
2b und 2c einen
alternativen Ausführungsplan
für die
skalare Schleife nach 2a bzw. eine neue Software-Pipeline-Schleife
basierend auf diesem Ausführungsplan
darstellen; und
-
3a, 3b, 3c, 3d, 3e und 3f verschiedene
neugeplante Schleifen gemäß den Ausführungsformen
der vorliegenden Erfindung veranschaulichen.
-
AUSFÜHRLICHE BESCHREIBUNG DER BEVORZUGTEN
AUSFÜHRUNGSFORMEN
-
Hierin
sind mehrere veranschaulichende Ausführungsformen gemäß der vorliegenden
Erfindung beschrieben. Obwohl geglaubt wird, dass die vorliegenden
Lehren im Zusammenhang mit praktisch jedem Prozessor, der mehrere
Ausführungseinheiten
besitzt, verwendet werden können,
sind zum Zweck der Veranschaulichung die ausführlichen Ausführungsformen
unter Bezugnahme auf eine spezifische Prozessorfamilie, die Texas
Instruments TMS320C62xx, beschrieben. Die Durchschnittsfachleute
auf dem relevanten Gebiet sollten die folgende Beschreibung ausreichend
im Einzelnen verstehen, um ihnen zu ermöglichen, die Erfindung zu reproduzieren;
für spezifische
Daten, die mit der Prozessorarchitektur, dem Befehlssatz und dem
Betrieb in Beziehung stehen, wird der interessierte Leser auf Texas
Instruments TMS320C62xx CPU and Instruction Set Reference Guide
(1997) und Texas Instruments TMS320C62xx Programmer's Guide (1997) verwiesen,
die durch Literaturhinweis hierin eingefügt sind.
-
Unter
abermaliger Bezugnahme auf die Beispiele nach den 2a–2c werden
zuerst die Ausführungsformen
der Erfindung konzeptionell erklärt.
In einer ersten Ausführungsform,
die in 3a gezeigt ist, wird der Prolog
nach 2c vollständig
eliminiert, indem der Schleifenkern zweimal zusätzlich ausgeführt wird und
die Befehlsindizes entsprechend eingestellt werden. Es kann leicht
beobachtet werden, dass ein Prozessor, der die Schleife nach 3a ausführt, alle
Operationen der ursprünglichen
skalaren Schleife nach 2a ausführt. Es wird jedoch angegeben,
dass, wenn ein Prozessor die Schleife nach 3a ausführt, mehrere indexierte
Operationen ausgeführt
werden, die in der ursprünglichen
skalaren Schleife nach 2a nicht vorhanden sind, nämlich B0, C-1 und C0. Diese Ausführungsform nimmt an, dass die
Ausführung
derartiger Befehle unschädlich
ist. Falls z. B. der Befehl B eine mathematische Operation ausführt und
der Befehl C das Ergebnis von B in einem Feld a[1:7] speichert,
könnte
das Feld a statt dessen als a[–1:7]
zugeordnet sein (oder es könnte
ein äquivalentes
Indexierungsschema mit anderen Endpunkten verwendet werden). Obwohl
die durch die neue Schleife an den Stellen a[-1] und a[0] gespeicherten
Werte sinnlos sein würden,
weil für
diese Stellen niemals gültige
Operanden verwendet werden, würden
diese Werte für
das in a[1:7] gespeicherte gewünschte Ergebnis
unschädlich
sein.
-
Eine
zweite Ausführungsform
gemäß der Erfindung
ist in 3b gezeigt. Diese Ausführungsform nimmt
an, dass die vorzeitige Ausführung
der Befehle B und C unerwünscht
ist, dass aber der Prozessor die Befehle B und C ohne Geschwindigkeitsverlust
bedingt ausführen
kann. Folglich wird beim erstmaligen Durchgang durch die Schleife
nach 3b (i = 1) weder B noch C ausgeführt, während beim
zweiten Durchgang durch die Schleife (i = 2) C nicht ausgeführt wird.
-
Es
wird angegeben, dass die erste und die zweite Ausführungsform
außerdem
kombiniert werden können,
um eine noch weitere Ausführungsform
zu bilden. Wie in 3c gezeigt ist, ist die vorzeitige
Ausführung von
B erlaubt und wird C bedingt ausgeführt. Dies kann z. B. nützlich sein,
falls B ein unschädliches
Zwischenergebnis erzeugt und C in den Speicher schreibt.
-
In 3d ist
eine weitere Ausführungsform
gezeigt. In dieser Ausführungsform
ist die vorzeitige Ausführung
von B und C erlaubt, aber der Anfangswert ihrer Operanden ist so
eingestellt, um ein unschädliches Ergebnis
zu erzeugen. Ein Register R1 wird z. B.
vor der Schleifenausführung
auf einen konstanten Wert c gesetzt. Falls B R1 verwendet,
z. B. als einen Operanden in einer Multiplikationsoperation, und
C das Ergebnis von B akkumuliert, stellt das Setzen von R1 auf einen konstanten Wert von 0 sicher,
dass die vorzeitigen Operationen das akkumulierte Ergebnis nicht
beeinflussen. Obwohl dieses Verfahren einen oder mehrere Initialisierungsbefehle
erfordert, die durch den Zugang des Standes der Technik nicht benötigt werden,
führt es
in vielen Fällen
dennoch zu einer Codegröße, die
kleiner als der Prologzugang des Standes der Technik ist.
-
Zusätzlich zu
den Kombinationen der Verfahren der früheren Ausführungsformen erfordert eine
Ausführungsform
nicht notwendigerweise, dass ein herkömmlicher Prolog völlig eliminiert
wird. Es ist hierin erkannt worden, dass Prologe im Allgemeinen
bodenlastig sind, d. h., wie die Pipeline gefüllt wird, werden bei jedem
Taktzyklus mehr Prologbefehle ausgeführt. Folglich kann in einigen
Fällen
der maximale Vorteil erreicht werden, indem nur der letztere Teil
eines Prologs eliminiert wird. 3e stellt
eine Ausführungsform
dar, in der A1 in einem Prolog ausgeführt wird,
aber die Prologbefehle A1, B1 nach 2c eliminiert
sind. In dieser Schleife ist die einzige vorzeitige Operation, die
während
der Ausführung
auftritt, C0, wobei immer noch zwei Drittel
der Prologbefehle eliminiert worden sind.
-
Die
Ausführungsformen
der vorliegenden Erfindung können
außerdem
in Kombination mit der spekulativen Ausführung verwendet werden, um
die Codegröße weiter
zu verringern. Wie vorher erwähnt
worden ist, verringert die spekulative Ausführung die Codegröße durch
Elimination des Software-Pipeline-Schleifenepilogs. Die in 3f dargestellte
Software-Pipeline-Schleifenausführungsform
veranschaulicht diese Idee: die Schleife wird neunmal ausgeführt, so
dass der Befehl A bei den Iterationen 8 und 9 über den Iterationsbereich nach 2a hinaus
ausgeführt
wird, während
B bei der Iteration 9 über
diesen Bereich hinaus ausgeführt
wird. Ungeachtet der zusätzlichen
Iterationen besitzt diese Schleife die kleinste Codegröße und sollte
nicht mehr Taktzyklen als die Schleife nach 2c erfordern.
-
Nun
werden Ausführungsformen
gemäß der Erfindung
beschrieben, die in einem Prozessor mit acht Ausführungseinheiten
arbeiten, wie z. B. jenem, der in 1 dargestellt
ist, z. B. dem TMS320C6xx-Prozessor. Die Beispiele im Folgenden
implementieren ein Software-Pipeline-Skalarprodukt von zwei Feldern
a[i] und b[i] für
i = 600 (die Ausführungsformen
im Folgenden schließen
jedoch mehr als eine Iteration pro Schleife ab). Obwohl die Komplexität einer
Software-Pipeline-Schleife,
die von den Ausführungsformen
der vorliegenden Erfindung profitiert, viel größer als die Komplexität eines
Skalarprodukts sein kann, ist diese Funktion wegen ihrer Einfachheit
gewählt
worden, so dass die Aspekte der Erfindung in den Beispielen leicht
erkannt werden können.
-
Das
Vergleichscodebeispiel 1 im Folgenden veranschaulicht eine einfache
Software-Pipeline-Schleifenimplementierung des Skalarprodukts. Diese
Implementierung umfasst einen Prolog und einen Einbefehl-Schleifenkern,
der Operationen in allen acht Prozessoren ausführt (das ||-Symbol gibt Operationen
an, die mit einer unmittelbar vorhergehenden Operation parallel
ausgeführt
werden). Es wird angegeben, dass diese Implementierung die spekulative
Ausführung
verwendet und folglich keinen Schleifenepilog enthält. Weil
die Multiplikations(MPY- und MPYH-), die Verzweigungs-(B-) und die
Ladeoperationen (LDW-Operationen) in dieser Schleife alle mit Verzögerungsschlitzen
arbeiten, werden die Register mehrfach zugewiesen. Diese Implementierung
(und die folgenden Implementierungen) nehmen an, dass die zu multiplizierenden
Felder groß genug
sind, damit der Schleifenzähler
im Prolog selbst nicht überprüft werden
muss. Vergleichscodebeispiel
1
-
Das
obige Codebeispiel erfordert im Gegensatz zum folgenden Beispiel
1 gemäß den vorliegenden Lehren,
das nur 12 Prologbefehle und 8 Kernbefehle erfordert, 26 Prologbefehle
und 8 Kernbefehle. Obwohl mehr als die Hälfte der Prologbefehle im Beispiel
1 eliminiert worden ist, ist in dieser Ausführungsform immer noch ein 5-Zyklen-Prolog
erforderlich, in erster Linie infolge der 5-Zyklen- Verzweigungslatenz
und des Einzyklus-Schleifenkörpers – um zu
verhindern, dass die Ausführungsreihenfolge
aufgrund der Verzweigungslatenz durch die Schleife fällt, kann
in den Einzyklus-Schleifenkörper
nicht eingetreten werden, bis die erste Verzweigung nahe bevorsteht.
Wie im Beispiel 2 gezeigt wird, können längere Schleifenkörper erlauben,
dass einige oder alle dieser Verzweigungen in die Schleife selbst
aufgenommen werden. Es sollte ferner angegeben werden, dass der
Schleifenzähler
um sechs nach oben eingestellt worden ist, da alle Landevorgänge nun
innerhalb des Schleifenkörpers
auftreten. Beispiel
1
-
Das
Beispiel 1 veranschaulicht außerdem
ein Verfahren, um die schädlichen
Wirkungen der Elimination des Prologs zu vermeiden. Die Ausführungsform
enthält
Einstellungsbefehle, um die durch die Multiplikationsoperation (die
Register A2 und B2) und die Akkumulationsoperation (die Register
A6 und B6) der Skalarproduktschleife verwendeten Register auf null
zu setzen. Obwohl während
der ersten fünf
Schleifeniterationen keine gültigen
Daten aus dem Speicher geladen werden, ist die Ausführung der
Multiplikations- und Akkumulationsoperationen unschädlich, weil
ihre Operandenregister auf null gesetzt sind.
-
Das
Beispiel 2 zeigt eine alternative Ausführungsform für eine sich
selbst vorbereitende Skalarproduktschleife. Diese Schleife erfordert
im Gegensatz zu 12 Prologbefehlen für das Beispiel 1 nur 6 Prologbefehle,
aber der Schleifenkörper
ist von 8 auf 15 Befehle größer geworden
(die Gesamtzahl der Befehle beträgt 21,
nur einer mehr als die Gesamtsumme für das Beispiel 1). Der Grund
für die
Zunahme der Codegröße des Schleifenkörpers wird
in Kürze
offensichtlich. Beispiel
2
-
Das
Beispiel 2 unterscheidet sich vom Beispiel 1 insofern, als keine
Anstrengungen unternommen werden, um die Inhalte der Register voreinzustellen,
die vorzeitig verwendet werden. Stattdessen wird ein bedingtes Register
(A0) auf einen von null verschiedenen Countdown-Wert initialisiert,
wobei die Akkumulationsoperationen beim Register A0, das einen Wert
von null besitzt, konditioniert werden. Zum Schleifenkern wird ein
Befehl hinzugefügt,
um dieses Register zu dekrementieren, bis es einen Wert von null
erreicht. Folglich ist dieses Register ein "Pipeline-Aufwärts"-Zähler;
er zählt
die Iterationen durch die Schleife, bis sich die Schleife selbst
vorbereitet hat. In dieser speziellen Ausführungsform wird der Zähler bei
null eingefroren, sobald die Schleife vorbereitet ist, was die Akkumulationsoperation
für alle
weiteren Kerniterationen ermöglicht.
-
Das
Beispiel 2 besitzt mehrere Anforderungen, die bestimmen können, ob
es in einem gegebenen Fall eine effektive Alternative ist. Zuerst
erfordert dieser Zugang im Allgemeinen, dass ein Register für den "Pipeline-Aufwärts"-Zähler während der
Dauer der Schleifenausführung
reserviert ist. Falls der Registerdruck hoch ist, kann dies nicht
ausführbar
sein. Zweitens erfordert dieser Zugang im Allgemeinen, dass ein
Ausführungsschlitz
im Schleifenkörper
verfügbar
ist, um den Pipeline-Aufwärts-Zähler zu
dekrementieren. Falls sich alle Arithmetikeinheiten in Gebrauch
befinden, kann dieses Verfahren eine Erweiterung des Schleifenkörpers erfordern.
Dies ist im Beispiel 2 der Fall. Die Schleife ist entrollt worden,
um zweimal so viele Iterationen pro Schleife auszuführen, so
dass ein Ausführungsschlitz
verfügbar
geworden ist, um den Zähler
zu dekrementieren. Falls die Befehle in einem gegebenen Prozessor
auf einen von null verschiedenen Wert konditioniert werden können, könnte selbstverständlich der
Schleifenzähler
selbst verwendet werden, um bei Operationen "den Schalter umzudrehen", wie ihre Operanden
gültig
werden.
-
Wie
aus den obigen Beispielen erkannt werden kann, können durch die Verwendung der
vorliegenden Lehren signifikante Codegrößeneinsparungen verwirklicht
werden. Ausschließlich
jener Befehle, die für
die Initialisierung in jeder Skalarproduktimplementierung erforderlich
sind (d. h. die Schleifenzähler-
und Akkumulatorinitialisierung), erfordert das Vergleichscodebeispiel
1 31 Befehle, erfordert das Beispiel 1 17 Befehle und erfordert
das Beispiel 2 18 Befehle. Für
die Skalarproduktimplementierung des Vergleichscodebeispiels 1 verringern
die veranschaulichten Ausführungsformen
die für
die neu planbaren Operationen erforderliche Codegröße um 42
% bis 45 %. Der hauptsächliche
Preis für
diese Verringerung ist im Allgemeinen eine leichte Zunahme der Anzahl
der Taktzyklen, die für
die Schleifenausführung
erforderlich ist, obwohl dieser Preis minimal sein kann, falls die
Schleife eine signifikante Parameterinitialisierung erfordert, so
dass die Verzweigungen parallel mit der Parameterinitialisierung
früher
begonnen werden können.
Die Codegrößenverringerung
erlaubt, dass mehr Code in einem Speicher innerhalb des Chips gehalten
wird, so dass sogar die Eliminierung von einem Holvorgang für einen
Befehl von außerhalb
des Chips durch die vorliegende Erfindung die wenigen zusätzlichen
Taktzyklen kompensieren kann, die das Verfahren während der
Ausführung
erfordern kann.
-
In
Anbetracht der obigen Beschreibung sollten die Fachleute auf dem
Gebiet der Kompilierer leicht die vorliegenden Lehren in einen automatisierten
Kompilierer aufnehmen können.
Ein derartiger Kompilierer sollte vorzugsweise permanente und vorübergehende
Ergebnisse einer gewünschten
Schleife trennen und Schritte wie z. B. jene unternehmen können, die
hierin offenbart sind, um die permanenten Ergebnisse vor den Wirkungen
der vorzeitigen Ausführung
einiger Schleifenkörperbefehle
zu schützen.
Die Identifikation jener Befehle, die vorzeitig ausgeführt werden,
kann im Allgemeinen unter Verwendung der Logik des Standes der Technik ausgeführt werden,
die die Abhängigkeiten
identifiziert (z. B. zum Erzeugen eines herkömmlichen Prologcodes). Der
Kompilierer sollte vorzugsweise außerdem erkennen, dass ein Schleifenzähler eingestellt
werden muss, um die Selbstvorbereitungszyklen des Schleifenkerns
zu berücksichtigen,
und dann den Zähler
geeignet einstellen. Schließlich
sollte ein derartiger Kompilierer vorzugsweise den Schleifenkern
in eine Ausführungsreihenfolge
setzen, so dass er die Ausführung
an einem geeigneten Punkt beginnt, bevor die Pipeline vollständig initialisiert
ist.
-
Obwohl
die Ausführungsformen
der Erfindung hierin unter Bezugnahme auf einen spezifischen Prozessor
beschrieben worden sind, wird erkannt, dass ein Durchschnittsfachmann
die beschriebenen Ausführungsformen
leicht anpassen kann, damit sie in anderen Prozessoren, die mehrere
Ausführungseinheiten
enthalten, arbeiten. Ebenso ist die Verwendung des Skalarprodukts
veranschaulichend und nicht einschränkend – es wird erkannt, dass die
Lehren leicht mit Software-Pipeline-Schleifen im Allgemeinen praktiziert
werden können.
Und obwohl die bevorzugten Ausführungsformen
unter Bezugnahme auf mehrere spezifische Verfahren zum Schützen der
Schleifenergebnisse vor vorzeitigen Operationen beschrieben worden
sind, kann ein Durchschnittsfachmann auf dem Gebiet andere ähnliche
Verfahren leicht ersetzen, die auf einen spezifischen Mikroprozessor
in einer Ausführungsform
der Erfindung anwendbar sind. Andere offensichtliche Modifikationen
werden für
die Durchschnittsfachleute auf dem Gebiet beim Lesen dieser Offenbarung
offensichtlich sein; es ist vorgesehen, dass dieselben in den Umfang
der vorliegenden Erfindung fallen.
-
Der
Umfang der vorliegenden Offenbarung enthält jedes neuartige Merkmal
oder jede Kombination von Merkmalen, die hierin offenbart sind,
entweder explizit oder implizit, oder jede Verallgemeinerung von
ihnen, ungeachtet dessen, ob sie sich auf die beanspruchte Erfindung
beziehen oder irgendeines oder alle der durch die vorliegende Erfindung
angesprochenen Probleme lindern. Der Anmelder bringt hierdurch zur
Kenntnis, das während
der Verfolgung dieser Anmeldung oder von irgendeiner weiteren aus
ihr abgeleiteten Anmeldung für
derartige Merkmale neue Ansprüche
formuliert werden können.
Insbesondere können
unter Bezugnahme auf die beigefügten
Ansprüche
die Merkmale der abhängigen
Ansprüche
mit denjenigen der unabhängigen
Ansprüche
kombiniert werden und können
die Merkmale der entsprechenden unabhängigen Ansprüche in jeder
geeigneten Weise und nicht lediglich in den spezifischen Kombinationen,
die in den Ansprüchen
aufgezählt
sind, kombiniert werden.