-
Gebiet der vorliegenden Offenbarung
-
Die
vorliegende Offenbarung betrifft allgemein Techniken und Systeme
zur Verbesserung des Betriebs elektronischer Geräte, die
eine zentrale Recheneinheit aufweisen, die häufige Datenarrayzugriffe
vornimmt.
-
Beschreibung des Stands der
Technik
-
Die
ständige Weiterentwicklung auf dem Gebiet der Halbleiterproduktion
führte zur Herstellung schneller und leistungsfähiger
integrierter Schaltungen, die Millionen einzelner Transistorelemente
enthalten. Folglich wurden sehr komplexe Digitalschaltungen entwickelt
und diese werden für die Gestaltung und die Herstellung
aufwendiger zentraler Recheneinheiten (CPU) verwendet, wobei eine
höhere Packungsdichte in Verbindung mit einer geringeren Leistungsaufnahme
und einer großen internen Speicherkapazität eine
Vielzahl von Entwicklungen vorangebracht haben, um komplexe CPUs
in eine Vielzahl elektronischer Geräte zu integrieren.
-
Typischerweise
wird eine CPU auf der Grundlage einer speziellen Bytekodierung oder
Maschinenkodierung betrieben, die zu einer entsprechenden Änderung
von Zuständen der Gerätekomponenten, etwa von
Registern, I/O-(Eingabe/Ausgabe)-Anschlüssen und dergleichen
gemäß der Sequenz aus Maschinenkodierungsbefehlen
führt. Somit wird aus der tiefsten Ebene einer Kommunikation zwischen
einer Anwendung und dem Gerätesystem, das die CPU oder
andere Daten- und Befehlverarbeitungseinheiten aufweist, die entsprechende
Sequenz aus Bytekodierungsbefehlen von der CPU ausgeführt,
wodurch das gewünschte Ergebnis in Form von Registerinhalten
und dergleichen erzeugt wird. Durch die ständigen Fortschritte
in der Prozesstechnologie, die typischerweise zur Herstellung komplexer
integrierter Schaltungen, etwa von CPUs, eingesetzt werden, wurde
das Leistungsverhalten digitaler Schaltungen deutlich verbessert,
wodurch enorme Rechenressourcen für das Ausführen
diverser Aufgaben bereitgestellt werden. Beispielsweise werden sehr
komplexe Bildverarbeitungsanwendungen, wissenschaftliche Berechnungen
einschließlich der Modellierung komplexer Situationen und
dergleichen, auf der Grundlage gut etablierter Computersysteme, die
moderne Mikroprozessoren aufweisen, ausgeführt. Ein wichtiger
Aspekt bei der Verbesserung des Leistungsverhaltens von Mikroprozessoren
und derglei chen wurde darin gesehen, die Taktsignalfrequenz ständig
zu erhöhen, d. h. die Geschwindigkeit der Verarbeitung
einer Sequenz eines Maschinenkodierungsbefehls nach dem anderen.
Dies wird typischerweise bewerkstelligt, indem die Strukturgrößen einzelner
Transistorelemente verringert werden, wodurch auch der Widerstand
kritischer Signalwege und dergleichen reduziert wird. Aufgrund der
kleineren Abmessungen können zugehörige Gerätemodule in
einem einzelnen Halbleiterchip bei einer hohen Packungsdichte angeordnet
werden, wodurch ebenfalls zu einer höheren Arbeitsgeschwindigkeit
beigetragen wird. Auch kann ein deutlicher Grad an Parallelität
in Mikroprozessorbauelemente integriert werden, indem mehrere Submodule,
beispielsweise welche, die die Ausführung einer Vielzahl
von Befehlen in einer mehr oder minder parallelen Weise ermöglichen,
vorgesehen werden und/oder indem auf Datenarrays in einer parallelen
Weise zugegriffen wird.
-
Es
zeigt sich jedoch, dass die technologischen Fortschritte in den
Mikroprozessorarchitekturen und den Fertigungstechniken sich nicht
direkt in einer entsprechenden Verbesserung des Leistungsverhaltens
von Speicherbauelementen in gleicher Weise ausdrücken.
Beispielsweise werden sehr hohe Bitdichten auf der Grundlage gewisser
Speicherarchitekturen erreicht, etwa dynamische RAM-Bauelemente
(Speicher mit wahlfreiem Zugriff), die beispielsweise einen einzelnen
Speichertransistor in Verbindung mit einem Ladungsspeicherelement, etwa
einem Kondensator, aufweisen. Andererseits ist typischerweise die
hohe Bitdichte mit einer moderat langen Zeit zum Zugreifen auf die
einzelnen Speicherstellen verknüpft, beispielsweise aufgrund
der Signalausbreitungsverzögerung, die durch das Laden
und Entladen der Speicherelemente hervorgerufen wird, aufgrund der
entsprechenden Leitungen, die die einzelnen Speicherstellen miteinander
verbinden, und dergleichen. Trotz der komplexen Hardwareumgebungen
werden somit die Vorteile, die durch die sehr hohe Arbeitsgeschwindigkeit
der zentralen Recheneinheit erreicht werden, gegebenenfalls durch
die erhöhten Verarbeitungszeiten aufgehoben, die durch
die komplexen Speichereinrichtungen hervorgerufen werden. Andererseits
liefern schnelle Speicherbauelemente, etwa Register und dergleichen,
sehr kurze Zugriffszeiten, jedoch besitzen diese einen hohen Grad
an Komplexität, beispielsweise im Hinblick auf die Anzahl
der Transistoren, wodurch eine große Fläche auf
dem Halbleiterchip eingenommen wird, wenn moderat große Speicherbereiche
in den Halbleiterchip zu integrieren sind. Aus diesem Grunde wird
typischerweise ein geeigneter Speicherbereich in unmittelbarer Nähe
der Verarbeitungsmodule eines Prozessors vorgesehen, jedoch mit
einer sehr beschränkten Speicherkapazität, während
andere Speicherbauelemente, etwa dynamische RAM-Bauelemente und
dergleichen in peripheren Bereichen des Halbleiterchips vorgesehen werden
oder typischerweise als externe Bauelemente bereitgestellt werden,
die mit der zentralen Recheneinheit über ein geeignetes
Bussystem verbunden sind.
-
Durch
das Einrichten geeigneter Hardware- und Softwarekomponenten kann
somit die Verarbeitungszeit, die durch eine hohe Speicherdichte
hervorgerufen wird, deutlich verringert werden, indem schnelle Pufferspeicher
verwendet werden, die auch als Cache-Speicher bezeichnet werden,
in denen Speicherstellen des Hauptspeichersystems, auf die häufig
zugegriffen wird, kopiert werden und damit für die zentrale
Recheneinheit ohne wesentliche Verzögerungen verfügbar
sind. Beispielsweise ist in sehr schnellen Cache-Speichern die Arbeitsgeschwindigkeit
durch die gleiche Taktfrequenz festgelegt, wie sie in dem CPU-Kern
verwendet wird. Um einen Cache-Speicher in einer effizienten Weise
zu verwenden, wird vorteilhaft die Tatsache ausgenutzt, dass in einer
komplexen Sequenz aus Befehlen, die eine beliebige Art an Anwendung
repräsentieren, gewisse Befehle häufig zwei- oder
mehrere Male ausgeführt werden, wobei lediglich einige
andere Befehle dazwischen liegen, so dass ein entsprechender Block
aus Befehlen innerhalb eines Cache-Speichers für Zugriff durch
die CPU bewahrt werden kann und dynamisch gemäß dem
Voranschreiten des Programms aktualisiert wird. In ähnlicher
Weise wird in vielen Arten von Programmsequenzen die gleiche Speicherstelle mehrere
Male innerhalb der sehr begrenzten Sequenz aus Programmkodierung
abgerufen, so dass der entsprechende Inhalt in einem Cache-Speicher abgelegt
wird und auf diesen effizient von der zentralen Recheneinheit bei
hoher Geschwindigkeit zugegriffen werden kann. Aufgrund der sehr
begrenzten Speicherkapazität des Cache-Speichers kann jedoch nur
ein kleiner Teil des Hauptspeichers während einer gewissen
Zeit im Cache-Speicher gehalten werden.
-
Folglich
wurden geeignete Hardware- und Softwarestrategien entwickelt, um
eine hohe Rate an ”Cache-Treffern” zu erhalten,
die als Speicheroperationen betrachtet werden, die an Speicherstellen
ausgeführt werden, von denen eine Kopie noch in dem schnellen
Cache-Speicher enthalten ist, so dass Speicheroperationen unter
Anwendung des Cache-Speichers ausgeführt werden können.
In anderen Fällen müssen große Datenarrays
in dem Hauptspeicher gehalten werden, beispielsweise wenn digitale
Bilder und dergleichen gespeichert werden, wobei für gewöhnlich
die Daten ein zusammenhängendes Teilarray bzw. Teilfeld
des Speichers einnehmen. In vielen Arten von Programmen sind sehr
viele Datenzugriffe erforderlich, um auf Datenarrays zu operieren,
wobei das Zugreifen auf einen Arraypunkt mit dem Zugreifen auf einen
weiteren Arraypunkt verknüpft ist, der in der ”Nachbarschaft” der
Speicherstelle angeordnet ist, auf die zuvor zugegriffen wurde. Durch
Kopie ren eines Bereichs der Nachbarschaft der Speicherstelle, auf
die aktuell von der zentralen Recheneinheit zugegriffen wird, in
den Cache-Speicher gibt es daher eine hohe Wahrscheinlichkeit, dass
ein oder mehrere nachfolgende Speicherzugriffe zu Cache-Treffer
führen. Auf diese Weise kann die bestehende Lücke
zwischen dem Leistungsverhalten des Mikroprozessors und dem Leistungsverhalten
eines Hauptspeichersystems, etwa von D-RAM-Einrichtungen, verringert
werden, indem geeignete Techniken verwendet werden, die dazu gestaltet sind,
die Verzögerung der Hauptspeicherzugriffe auf der Grundlage
von Strategien, wie sie zuvor beschrieben sind, zu reduzieren oder
zu ”verstecken”.
-
Obwohl
diese Strategien in Verbindung mit geeignet gestalteten Cache-Speicherhierarchien,
d. h. Cache-Speicher mit unterschiedlichen Ebenen des Leistungsverhaltens,
sehr effizient sind beim Verringern der Bearbeitungszeiten für
Daten, auf die am häufigsten zugegriffen wird, ist dennoch
in vielen Anwendungen die Laufzeit im Wesentlichen durch Wartezeiten
der zentralen Recheneinheit aufgrund der häufigen Speicherzugriffe
auf das Hauptspeichersystem bestimmt. Beispielsweise enthalten eine
Vielzahl von wissenschaftlichen Berechnungen, von Bildverarbeitungsanwendungen
und dergleichen, große Datenarrays, auf die häufig
zugegriffen wird. In dieser Situation kann das Leistungsverhalten
eines Computersystems durch weitere Strategien verbessert werden,
etwa das Optimieren der Quellenkodierung der betrachteten Anwendungen
und dergleichen, wobei prozessorspezifische Eigenschaften Berücksichtigung
finden, um damit die verfügbaren Ressourcen der interessierenden
Plattform zu optimieren. Beispielsweise ist ein sehr effizientes
Hilfsmittel zum Optimieren einer Anwendung die sogenannte Vorabholtechnik,
in der Befehle und/oder Daten aus dem Hauptspeichersystem vor dem
eigentlichen Ausführen oder Verarbeiten der Befehle und
Daten in der zentralen Recheneinheit abgeholt werden. Das heißt, im
Falle der Datenvorabholung wird auf das Hauptspeichersystem zugegriffen,
um einen Teil eines Datenarrays in Cache-Speicher zu kopieren, wobei
von dem Bereich angenommen wird, dass er in dem Programm später
abgerufen wird. Eine Datenvorabholungstechnik kann in zwei Kategorien
unterteilt werden, d. h. in eine softwareinitiierte Vorabholung
und in eine hardwareinitiierte Vorabholung. Die softwareinitiierte
Datenvorabholung kann als eine Technik betrachtet werden, in der
zusätzliche Befehle in die anfängliche Programmkodierung
eingefügt werden, was typischerweise auf der Grundlage
von Compiler-Modulen bewerkstelligt wird, die einen anfänglichen
Befehlssatz, der typischerweise als Quellenkodierung bereitgestellt
wird, die in einer Hochsprache erstellt wird, etwa C++, Java, Fortran
und dergleichen, in einem Maschinenkodierungsbefehlssatz übersetzt,
der von einer speziellen Mikroprozessorplattform ausführbar
ist. Zu diesem Zweck unterstützt typischerweise die Platt form
eine Art an Vorabholbefehl, der zu einem Speicherzugriff führt,
um damit eine Speicherstelle typischerweise in Verbindung mit der
entsprechenden Nachbarschaft in den Cache-Speicher zu kopieren,
während eine zentrale Recheneinheit weiterhin Befehle ausführt,
die aktuell nicht den Inhalt der Speicherstelle benötigen,
die aktuell im voraus abgeholt wird. Um eine hohe Effizienz der
Datenvorabholtechnik zu erreichen, müssen zwei Kriterien
berücksichtigt werden. Erstens, die im voraus abzuholenden
Daten sollten vorzugsweise Daten repräsentieren, die zu
einem ”Cach-Fehltreffer” zu dem Zeitpunkt führen
würden, wenn der entsprechende Befehl, der die betrachtete
Speicherstelle anspricht, ausgeführt wird. Beispielsweise
führen Vorabholoperationen, die für Daten ausgegeben
werden, die bereits in dem Cache-Speicher sind, zu einem zusätzlichen
Aufwand und würden zu einer höheren Komplexität
und damit zu einer größeren Laufzeit führen.
Zweitens, das Ausgeben der Vorabholoperation während der
Laufzeit muss in geeigneter Weise disponiert werden, so dass die
interessierenden Daten im Cache-Speicher sind, wenn ein entsprechender
Speicherzugriff für diese Daten von der zentralen Recheneinheit
ausgeführt wird. Folglich erfordert eine geeignete Einfügung
von Vorabholbefehlen in eine bestehende Programmkodierung eine entsprechende
Analyse der Programmsequenz, wobei auch Vorteile und mögliche
Nachteile, die durch die zusätzlichen Befehle hervorgerufen
werden, im Hinblick aufeinander abgewogen werden müssen,
um damit eine deutliche Leistungssteigerung während der
Laufzeit des Programms zu erreichen.
-
Vielversprechende
Kandidaten zur Steigerung der Leistungsfähigkeit durch
Datenvorabholung durch das Einfügen zusätzlicher
Vorabholbefehle während der Kompile-Zeit sind Programmschleifen, in
denen eine Sequenz aus Befehlen häufig wiederholt wird.
Wenn beispielsweise auf ein Datenarray auf der Grundlage einer oder
mehrerer Schleifen operiert wird, die auch verschachtelte Schleifen,
abhängig von der Dimension des betrachteten Datenarrays
sein können, hängen die Speicherzugriffe von der
Schleifenvariable, d. h. dem Schleifenzähler, in einer
sehr vorhersagbaren Weise ab, so dass entsprechende Speicheradressen
durch Datenvorabholoperationen zu einer geeigneten Zeit ermittelt
werden können, d. h. eine geeignete Anzahl von Operationen
der Schleife im voraus, so dass entsprechende Daten verfügbar
sind, wenn auf diese in einem späteren Durchlauf der Schleife
zugegriffen wird. Effiziente Datenvorabholstrategien während
der Kompilation der Quellenkodierung wurden im Zusammenhang mit
der Optimierung von Schleifenverarbeitungen entwickelt, indem ein
gewisser Grad an Parallelität während des Programms
angewendet wird. Beispielsweise erlauben gewisse Arten von Schleifen zumindest
in Bereichen davon, eine parallele Verarbeitung, beispielsweise
durch Operieren auf Datenarrays in paralleler Weise, auf die in
der Quellenkodierung ursprünglich durch einen einzelnen
Befehl zugegriffen wurde.
-
1 zeigt
schematisch eine Tabelle, die eine durch einen Schleifenzähler
oder eine Schleifenvariable i definierte Schleife enthält,
die die Anzahl an Durchläufen der Schleife bestimmt. In
dem gezeigten Beispiel variiert der Schleifenzähler i zwischen
1 und 1000 mit einer Schrittweite von 1. Ferner sind die Schleifen-Speicherzugriffe
auf der Grundlage von Datenarrays a, b und c auszuführen.
Somit sind in dem in der Schleife enthaltenen Befehl auf die Datenarrays
a, b, c in jedem Durchlauf zuzugreifen. Durch Bereitstellen geeigneter
Ressourcen in einem Mikroprozessor kann somit die Schleife der 1 vektorisiert
werden, indem mehrere Speicherzugriffe parallel ausgeführt
werden. Wenn beispielsweise vier Datenpunkte parallel verarbeitet
werden, erfordert die Schleife lediglich ein Viertel der anfänglichen
Iterationen, wodurch deutlich das gesamte Leistungsverhalten verbessert
wird. Aus diesem Grunde sind in vielen Prozessorarchitekturen geeignete
Ressourcen eingerichtet, etwa SIMD-(einzelner Befehl, mehrere Daten)
Befehle, die sehr effizient sind, um die gesamte Verarbeitungsgeschwindigkeit
zu erhöhen, wobei diese noch weiter gesteigert werden kann
durch Datenvorabholtechniken, um sicherzustellen, dass die durch
die parallele Verarbeitung erforderlichen Daten in Cache-Speicher
zum geeigneten Zeitpunkt verfügbar sind. Folglich ist in
Kompiler-Systemen ein Mechanismus zum Erkennen geeigneter Kandidaten
für die Datenvorabholung und für das Einfügen
der entsprechenden Vorabholbefehle in eine Sequenz aus Befehlen
für gewöhnlich eng mit einer Vektorisierungsphase
während der Kompilation verknüpft.
-
Jedoch
sind auch andere wichtige Vorabholgelegenheiten in Schleifen vorhanden,
die nicht für die Vektorisierung ausgewählt werden,
wenn entsprechende Voraussetzungen für den Vektorisierungsmechanismus
nicht erfüllt sind. Derartige Schleifen werden im Weiteren
als skalare Schleifen bezeichnet. Skalare Schleifen besitzen häufig
Schleifenkörper mit mehreren Basisblöcken oder
Schleifen, die während separater Phasen im Kompilierungsvorgang ”sequenziell
abgewickelt” werden. Aus diesem Grund kann die Vorabholimplementierung,
die in einer Vektorisierungsphase für vektorisierbare Schleifen
integriert ist, nicht in einfacher Weise erweitert werden, um skalare
Schleifen zu behandeln.
-
Aus
diesem Grunde wurden in vielen wissenschaftlichen Aktivitäten
mathematische Modelle entwickelt, um zu ermitteln und zusammenzufassen,
wie Speicherstellen eines Arrays durch diverse Schleifenverschachtelungen
und Programmkonstrukte komplexer Anwendungen abgerufen werden können. Die
Implementierung entsprechender Module erfordert einen wesentlichen
Aufwand und kann auch zu längeren Kompilationszeiten beitragen,
wobei jedoch die Wirksamkeit aufgrund der Komplexizität
in einem Speichersuchsystem und den komplexen Wechselwirkungen zwischen
Software und den Hardwarekomponenten schwer vorhersagbar ist.
-
Beispielsweise
ist in V. Santhanam, E. Garnisch, W. Hsu "Datenvorabholung
auf dem HPPA-8000", Schriften des Internationalen Symposiums
der Computerarchitektur (ISCA), Seiten 264 bis 273, 1997 ein
Kompiler-Datenvorabholkonzept offenbart, das auf Arrayelementzugriffe
abzielt, wobei eine komplexe Prozessstrategie erforderlich ist. Heanne Ferrante,
Vivek Sarkar, W. Thrasch offenbaren in "Abschätzung
und Verbesserung der Cache-Effektivität", gesammelte
Schriften von Sprachen und Kompiler für die Parallel-Computerabarbeitung",
4. Internationaler Workshop, Seiten 328 bis 343, August 1991 und S.
Ghosh, M. Martomosi, S. Milik in "Cache-Fehlgleichungen
mit einem Kompilerkonzept zum Analysieren und Verbessern des Speicherverhaltens",
ACM Transaktionen für Programmiersprachen und Systeme (TOPLAS),
Band 21, Ausgabe 4, Seiten 703 bis 746, 1999 zwei entsprechende
Module, um Speicherzugriffmuster in Programmen zu ermitteln und
darzustellen, um damit unterschiedliche Speicheroptimierungen aufzuzeigen,
die die Vorabholung enthalten. Ferner offenbaren C. Luk,
T. Mowry, "Kompiler-basierte Vorabholung für rekursive
Datenstrukturen", ACM SIGOPS Betriebssystemüberblick,
Band 30, Ausgabe 5, Seiten 222 bis 233, 1996 eine wissenschaftliche
Arbeit zum Erzeugen von Vorabholungen für rekursive Datenstrukturen,
auf die durch Zeigerreferenzen zugegriffen wird, ohne dass jedoch
der Arrayzugriff oder indirekte Zugriffe über indizierte
Arrays beschrieben ist.
-
Angesichts
der zuvor beschriebenen Situation betrifft die vorliegende Offenbarung
effiziente Vorabholtechniken auf der Grundlage von Vorabholbefehlen,
während ein oder mehrere der oben erkannten Probleme vermieden
oder zumindest reduziert werden.
-
Überblick über
die Offenbarung
-
Im
Allgemeinen stellt die vorliegende Offenbarung Techniken und Systeme
bereit, in denen die Datenvorabholung in einer effizienten Weise
bewerkstelligt wird, indem ein wirksamer Satz an heuristischen Konzepten
zum Bewerten von Schleifen in einer Sequenz aus Befehlen, d. h.
in einer Programmkodierung, insbesondere für nicht-vektorisierbare Schleifen,
bereitgestellt wird. Zu diesem Zweck werden die Induktionstabellen,
die mit jeder der Schleifen verknüpft sind, als eine Basis
zum Bestimmen geeigneter Kandidaten für die Datenvorabholung
und zum Eliminieren von Kandidaten, die zu einer redundanten Cache-Zeilenab holung
führen würden, verwendet. Die Induktionstabellen
der diversen Schleifen werden typischerweise während der
Kompile-Zeit des Quellencodes erstellt, um gewisse Optimierungen
auszuführen, etwa das Aufrollen der Schleifen und dergleichen.
Folglich kann die Implementierung einer Datenvorabholung für
beliebige Arten von Schleifen, etwa skalare Schleifen, auf der Grundlage verfügbarer
Datenstrukturen, d. h. der Induktionstabellen, bewerkstelligt werden,
wodurch der zusätzliche Aufwand im Vergleich zu konventionellen
Strategien reduziert wird, wobei auch für eine zusätzliche Flexibilität
im Vergleich zu Vorabholalgorithmen gesorgt ist, die in der Vektorisierungsphase
eingerichtet werden, da die hierin offenbarte Vorabholtechnik während
einer beliebigen geeigneten Phase während der Kompilierzeit
angewendet werden kann, sobald die Induktionstabellen verfügbar
sind. Ferner kann in einigen anschaulichen, hierin offenbarten Aspekten,
die Datenvorabholtechnik effizient auf Speicherzugriffe angewendet
werden, die durch andere Speicherzugriffe in skalaren Schleifen
adressiert sind. Somit kann auf der Grundlage linearer Ausdrücke
der Induktionsvariablen eine sehr effiziente und flexible Vorabholtechnik
erreicht werden, ohne dass aufwendige Aufwandsmodelle erforderlich
sind, um Speicherzugriffe in dem Programm zu analysieren und zu
erkennen, wie dies typischerweise in konventionellen Strategien
der Fall ist.
-
Ein
anschauliches, hierin offenbartes Verfahren betrifft die Erzeugung
von Datenvorabholbefehlen für eine Verarbeitungseinheit,
die Cache-Speicher aufweist. Das Verfahren umfasst das Erhalten einer
Induktionstabelle für eine Schleife aus Befehlen, die in
einem Zwischensatz aus Befehlen enthalten ist, der mit einem anfänglichen
Satz aus Befehlen in Form einer Programmkodierung verknüpft
ist. Das Verfahren umfasst ferner das Bestimmen eines möglichen
Vorabholkandidaten aus jedem von mehreren Einträgen der
Induktionstabelle, wobei die möglichen Vorabholkandidaten
Induktionsvariable repräsentieren, die für einen
Datenvorabholvorgang verwendbar sind. Das Verfahren umfasst ferner
das Eliminieren eines oder mehrerer der potenziellen Vorabholkandidaten
auf der Cache-Speicher-spezifischer Kriterien. Des Weiteren wird
ein Vorabholbefehl für alle nicht eliminierten Vorabholkandidaten
in der Schleife erzeugt. Ferner umfasst das Verfahren das Erzeugen einer
Maschinenkodierung des Zwischensatzes, wobei die Maschinenkodierung
einen Satz aus Maschinenbefehlen repräsentiert, der von
der Verarbeitungseinheit ausführbar ist.
-
Eine
anschauliche, hierin offenbarte Vorrichtung umfasst eine Prozessoreinheit
und einen Speicher, der mit der Prozessoreinheit verbunden ist.
Des Weiteren umfasst die Vorrich tung ein Kompilermodul, das in dem
Speicher angeordnet und ausgebildet ist, einen Vorabholbefehl in
eine Schleife aus Befehlen einzufügen, indem mögliche
Vorabholkandidaten von Induktionsvariablen der Schleife auf der
Grundlage einer Induktionstabelle bestimmt werden und indem zugehörige
Vorabholabstände bestimmt werden.
-
Ein
anschauliches, hierin offenbartes Speichermedium umfasst einen Satz
aus Befehlen, die ein Computersystem beim Ausführen der
Gruppe aus Befehlen veranlassen, die folgenden Aktivitäten auszuführen:
Erhalten einer Induktionstabelle für eine Schleife aus
Befehlen, die in einer Gruppe aus vorläufigen Befehlen
enthalten sind, die einer Quellenprogrammkodierung entspricht; Bestimmen
möglicher Vorabholkandidaten für jeden von mehreren Einträgen
der Induktionstabelle, wobei die möglichen Vorabholkandidaten
Induktionsvariablen repräsentieren, die zum Ausführen
einer Datenvorabholoperation verwendbar sind; Eliminieren eines
oder mehrerer der möglichen Vorabholkandidaten auf der
Grundlage Cache-Speicher-spezifischer Kriterien eines Cache-Speichers,
der in Verbindung mit einer speziellen Datenverarbeitungseinheit
zu verwenden ist; Erzeugen eines Vorabholbefehls für alle
nicht eliminierten Vorabholkandidaten in der Schleife; und Erzeugen
einer Maschinenkodierung der vorläufigen Gruppe aus Befehlen,
wobei die Maschinenkodierung eine Gruppe aus Maschinenbefehlen repräsentiert,
die von der speziellen Verarbeitungseinheit ausführbar
sind.
-
Kurze Beschreibung der Zeichnungen
-
Weitere
Ausführungsformen der vorliegenden Offenbarung sind in
den angefügten Patent ansprüchen definiert und
gehen deutlicher aus der folgenden detaillierten Beschreibung hervor,
wenn diese mit Bezug zu den begleitenden Zeichnungen studiert wird,
in denen:
-
1 eine
Tabelle darstellt, die eine einfache Schleife aus Befehlen repräsentiert;
-
2a schematisch
ein Verarbeitungssystem, etwa einen Mikroprozessor in Verbindung
mit einem Speichersystem darstellt, der auf der Grundlage einer
Vorabholtechnik, basierend auf linearen Ausdrücken von
Induktionsvariablen, gemäß anschaulicher Ausführungsformen
betrieben wird;
-
2b schematisch
ein Kompilermodul mit einer Vorabholoptimierungseinheit für
skalare Schleifen gemäß anschaulicher Ausführungsformen
zeigt;
-
2c schematisch
verschachtelte Schleifen zeigt, die auf der Grundlage von Vorabholtechniken
optimiert werden können;
-
2d schematisch
Induktionstabellen zeigt, die zum Bestimmen möglicher Kandidaten
für Vorabholoperationen gemäß anschaulicher
Ausführungsformen verwendet werden;
-
2e schematisch
ein Modul zum Einfügen von Vorabholbefehlen während
der Kompilierphase gemäß anschaulicher Ausführungsformen zeigt;
-
2f schematisch
ein Flussdiagramm zum Auswählen möglicher Kandidaten
für die Datenvorabholung auf der Grundlage vordefinierter
Kriterien gemäß anschaulicher Ausführungsformen
zeigt;
-
2g schematisch
ein Flussdiagramm zum Ermitteln von Vorabholadressen mit Indizes
für indirekt angesprochene Datenarrays gemäß anschaulicher
Ausführungsformen zeigt;
-
2h schematisch
ein Flussdiagramm zum Bestimmen eines Vorabholabstands gemäß anschaulicher
Ausführungsformen zeigt;
-
2i schematisch
diverse Unterteilungen möglicher Kandidaten gemäß anschaulicher
Ausführungsformen zeigt;
-
2j schematisch
ein Flussdiagramm zum Eliminieren potenzieller Kandidaten zeigt,
um redundante Vorabholoperationen zu vermeiden, die die gleiche
Cache-Zeile gemäß anschaulicher Ausführungsformen
betreffen;
-
2k schematisch
das Erzeugen eines Vorabholbefehls zeigt; und
-
2l schematisch
ein Computersystem zeigt, das ein Speichersystem mit einem Kompilermodul
gemäß den hierin offenbarten Prinzipien enthält.
-
Detaillierte Beschreibung
-
Obwohl
die vorliegende Offenbarung mit Bezug zu den Ausführungsformen
beschrieben ist, wie sie in der folgenden detaillierten Beschreibung
sowie in den Zeichnungen dargestellt sind, sollte beachtet werden,
dass die folgende detaillierte Beschreibung sowie die Zeichnungen
nicht beabsichtigen, die vorliegende Offenbarung auf die speziellen
anschaulichen offenbarten Ausführungsformen einzuschränken,
sondern die beschriebenen anschaulichen Ausführungsformen
stellen lediglich beispielhaft die diversen Aspekte der vorliegenden
Offenbarung dar, deren Schutzbereich durch die angefügten
Patentansprüche definiert ist.
-
Im
Allgemeinen stellt die vorliegende Offenbarung Systeme, Techniken
und Speichermedien bereit, die Datenvorabholtechniken betreffen,
in denen lineare Ausdrücke von Induktionsvariablen als
eine Basis zum Erkennen möglicher Kandidaten für
den Vorabholvorgang verwendet werden, wobei zugehörige
Vorabholabstände bzw. Distanzen bestimmt werden, um redundante
Vorabholoperationen zu verhindern. Da die hierin offenbarten Techniken
auf Daten beruhen, die Induktionsvariable der diversen Schleifen
repräsentieren, können aufwendige Strategien zum
Abschätzen der Schleifenkörper des Programms vermieden
werden, wodurch zu einer besseren Effizienz und Flexibilität
für das Einbauen der Datenvorabholtechnik in Kompilermodule
beigetragen wird, ohne dass eine Beschränkung auf spezielle Kompilerphasen
erfolgt. Im Gegensatz zu vielen konventionellen Vorgehensweisen
ist folglich ein moderat geringer Aufwand für die Implementierung
ausreichend und die gesamte Kompilierzeit kann verringert werden.
Ferner können indirekte Speicherzugriffe auf der Grundlage
der hierin offenbarten Prinzipien im voraus abgeholt werden.
-
Mit
Bezug zu den 2a bis 2n werden
nunmehr weitere anschauliche Ausführungsformen detaillierter
beschrieben.
-
2a zeigt
schematisch ein Verarbeitungssystem 200, das eine Verarbeitungseinheit 210,
etwa eine CPU, oder eine andere Digitalschaltung aufweist, die arithmetische
Berechnungen und dergleichen ausführen kann, wie dies typischerweise
für das Ausführen komplexer Anwendungen erforderlich
ist. Die Verarbeitungseinheit 210 umfasst eine arithmetische
logische Einheit 212 in Verbindung mit einem Cache-Speicher 211,
beispielsweise einem Daten-Cache-Speicher, der einen geeigneten
Aufbau im Hinblick auf Größe und Arbeitsgeschwindigkeit
besitzt, wie dies auch zuvor erläutert ist. Beispielsweise umfasst
der Cache-Speicher 211 eine gewisse Anzahl an Cache-Zeilen,
wovon jede durch eine gewisse Anzahl an Bytes, etwa 64 Bytes, repräsentiert
ist. Es sollte jedoch beachtet werden, dass die hierin offenbarten
Prinzipien nicht als auf eine spezielle Konfiguration der Verarbeitungseinheit 210 und
insbesondere des Cache-Speichers 211 beschränkt
erachtet werden soll. Ferner ist ein Speichersystem 220 vorgesehen,
das einen beliebigen Speicher repräsentiert, etwa einen
DRAM, einen Flash-Speicher und dergleichen, der eine deutliche höhere
Verarbeitungszeit im Vergleich zu dem Cache-Speicher 211 aufweist,
wie dies auch zuvor erläutert ist. Zum Beispiel kann in
dem Speicher 220 ein Speicherbereich für ein Datenarray reserviert
sein, das als Array a bezeichnet wird, das Datenpunkte einer Anwendung
repräsentiert, die in dem System 200 ausgeführt
wird. Zum Beispiel wird eine Sequenz oder eine Gruppe aus Befehlen 213,
die eine Anwendung oder einen Teil davon repräsentieren,
in dem System 200 ausgeführt, indem beispielsweise
Befehle aus dem Speicher 220 abgerufen werden, zumindest
eine gewisse Anzahl an Befehlen in einem geeigneten Speicher innerhalb
der Verarbeitungseinheit 210 abgelegt werden und indem
die Befehle in der Einheit 212 ausgeführt werden.
Beispielsweise enthalten die Befehle 213 eine Schleife 213L,
die darin eingerichtet einen Vorabholbefehl aufweist, um damit in
geeigneter Weise einen Bereich des Datenarrays a in dem Cache-Speicher 211 zu
dem Zeitpunkt zu halten, wenn einer oder mehrere der entsprechenden
Datenpunkte von der Einheit 212 abgerufen werden. In einer
anschaulichen Ausführungsform repräsentiert die Schleife 213L eine
skalare Schleife, d. h. eine nicht-vektorisierbare Schleife, die
als eine Schleife betrachtet wird, die keine parallele Verarbeitung
erlaubt. Wie zuvor erläutert ist, kann die Sequenz oder Gruppe
aus Befehlen 213 als ein Satz aus Maschinenkodierungsbefehlen
bereitgestellt werden und ist speziell angepasst an die Eigenschaften
der Verarbeitungseinheit 210, was typischerweise durch
Umwandeln der Quellenkodierung einer Anwendung in eine Maschinenkodierung
bewerkstelligt wird, die von der Einheit 210 gelesen werden
kann. Aufgrund der Komplexität moderner Anwendungen wird
eine entsprechende Umwandlung in einer automatisierten Weise unter
Anwendung eines Kompilersystems ausgeführt.
-
2b zeigt
schematisch ein Kompilersystem 250 gemäß anschaulicher
Ausführungsformen, das mehrere Module 251, 252, 260 und 253 aufweist. Beispielsweise
repräsentiert das Modul 251 ein sogenanntes Eingangsmodul,
in welchem eine Quellenkodierung 213s empfangen und in
eine Kodierung aus Zwischenbefehlen umgewandelt wird, wobei mehrere
entsprechende Zwischenkodierungsformate im Stand der Technik gut
etabliert sind. Ferner ist das Modul 252 vorgesehen, das
die Sequenz aus Befehlen, die in einem Zwischenformat 251s bereitgestellt
werden, analysiert, um das Leistungsverhalten eines tatsächlichen
Satzes aus Maschinenkodierungsbefehlen, etwa der Gruppe 213 aus 2a,
zu verbessern, wenn diese in einer speziellen Prozessorplattform,
etwa dem System 200 aus 2a, ausgeführt
wird. Zu diesem Zweck sind eine Vielzahl bekannter Optimierungsstrategien
in dem Modul 252 eingerichtet. Zum Beispiel wird eine Schleifenoptimierung
auf der Grundlage von Induktionstabellen und dergleichen ausgeführt.
Das Kompilermodul 250 umfasst ferner ein Vorabholoptimierungsmodul 260, das
ausgebildet ist, eine Datenvorabholung für beliebige Arten
von Schleifen und insbesondere für skalare Schleifen, einzurichten.
Zu diesem Zweck umfasst das Modul 260 einen geeigneten
Mechanismus zum Operieren auf Datenstrukturen, etwa den Induktionstabellen,
ohne dass eine aufwendige Analyse von Schleifenkörpern
und dergleichen erforderlich ist, wie dies nachfolgend beschrieben
ist. Des Weiteren umfasst das Kompilermodul 250 ein Maschinenkodierungsmodul 253,
das ausgebildet ist, Maschinenkodierungsbefehle, etwa die Befehle 213 aus 2a, die
von dem System 200 ausführbar sind, zu erzeugen.
-
2c zeigt
schematisch in vereinfachter Form eine Schleife, wie sie typischerweise
in Quellenkodierungen vieler Arten von Anwendungen enthalten ist.
Der Einfachheit halber enthält eine erste oder äußere
Schleife, die als Schleife I bezeichnet ist, Befehle, die auf einem
Datenarray A auf der Grundlage einer Schleifenvariable I und einer
weiteren Variablen K operieren, die von der Schleifenvariablen I abhängt.
Ferner repräsentiert eine zweite Schleife, die als Schleife
J angegeben ist, eine innere Schleife und kann ebenfalls auf dem
Datenarray A operieren. Es sollte beachtet werden, dass die Darstellungen der
Schleifen I und J nicht der Darstellung einer etablierten Programmiersprache
entsprechen und lediglich anschauliche Zwecke erfüllen.
Wie zuvor erläutert ist. ergeben Datenzugriffe auf der
Grundlage von Schleifenvariablen und linearen Ausdrücken
davon einen sehr hohen Grad an Vorhersagbarkeit entsprechender Speicherzugriffe,
wodurch günstige Voraussetzungen zum Einrichten einer Datenvorabholstrategie
geschaffen werden. Beispielsweise repräsentieren in der äußeren
Schleife I Variablen VAR1 und VAR2 Operationen, um auf das Datenarray
A an unterschiedlichen Adressen zuzugreifen, die mit den Variablen
I und K verknüpft sind. In ähnlicher Weise repräsentiert
in der Schleife J eine Variable VAR3 eine Operation zum Zugreifen
auf das Datenarray A auf der Grundlage einer Adresse, die mit der
Schleifenvariablen J verknüpft ist.
-
Während
einer geeigneten Phase eines Kompilierungsvorganges wird jede Schleife,
die in der Anwendung definiert ist, im Hinblick auf Induktionsvariablen
analysiert, die Variablen repräsentieren, die erhöht
oder verringert werden, um einen festgelegten Betrag bei jedem Durchlauf
bzw. jeder Iteration einer Schleife. Ferner kann auch eine lineare Funktion
einer Induktionsvariable als eine Induktionsvariable betrachtet
werden. In dem in 2c gezeigten Beispiel sind die
Schleifenvariablen I und J, die bei jedem Durchlauf um einen konstanten
Betrag erhöht oder verringert werden, als Induktionsvariable zu
betrachten. Ferner ist auch die Variable K, die eine lineare Funktion
der Schleifenvariablen I ist, als eine Induktionsvariable zu betrachten.
Folglich enthält in dem gezeigten Beispiel die Schleife
I zwei Induktionsvariablen I und K, während die Schleife
J die Induktionsvariable J besitzt. Es soll te beachtet werden, dass
typischerweise eine beliebige Anzahl an Induktionsvariablen mit
einer speziellen Schleife, abhängig von der Komplexität
der Datenzugriffe verknüpft ist.
-
2d zeigt
schematisch Induktionstabellen, die mit den Schleifen I und J aus 2c verknüpft
sind. Wie gezeigt, repräsentiert die erste Induktionstabelle
die Schleife J und enthält entsprechende Einträge
für jede Induktionsvariable. In dem gezeigten Beispiel
enthält die Tabelle Einträge, die der Variablen
J und möglicherweise anderen Variablen entsprechen, die
der Einfachheit halber nicht gezeigt sind. In ähnlicher
Weise enthält eine zweite Induktionstabelle, die der Schleife
I entspricht, zumindest die Einträge I und K, während
auch andere Einträge, die weitere Variablen repräsentieren,
enthalten sein können. Jeder der Einträge enthält
Information und Attribute für jede Induktionsvariable.
Gemäß den hierin offenbarten Prinzipien können
diese Informationen bei Auswahl geeigneter Kandidaten für
eine Vorabholoperation verwendet werden. Beispielsweise ist ein
Attribut als LREF angegeben, das einen linearen Ausdruck für
die interessierende Induktionsvariable auf der Grundlage einer Basis-Iriduktionsvariablen
kennzeichnet. Ferner gibt BIV diejenige Basis-Induktionsvariable
an, von der die aktuelle Variable abgeleitet ist. Ferner gibt der
Begriff Is-LREF an, ob der Induktionsausdruck ein linearer Ausdruck
ist oder nicht. Ein linearer Ausdruck ist als ein Ausdruck in der
Form (a × BIV + b) zu verstehen, wobei a und b Konstanten
während der Kompilier-Zeit sind. Des Weiteren zeigt der
Punkt MEMOPS auf Speicheroperationen, in denen die Induktionsvariable
für die Adressenberechnung verwendet wird. Ferner kann ein
Attribut ”Vorabholadresse” der Ausdruck sein,
um die vorabzuholende Adresse auf der Grundlage dieser Induktionsvariable
bereitzustellen. Des Weiteren ist der Begriff Schrittweite ein weiterer
Punkt, der den Änderungsbetrag der Induktionsvariable bei
jedem Durchlauf der Schleife angibt. Die Schrittweite kann eine
Konstante oder eine Variable zur Kompile-Zeit sein. Die Schrittweite
kann negativ oder positiv sein.
-
Auf
der Grundlage der Induktionstabellen und der zuvor beschriebenen
entsprechenden Attribute können mögliche Kandidaten
für das Vorabholen in jeder Schleife aus der Induktionstabelle,
die mit einer interessierenden Schleife verknüpft ist,
ermittelt werden.
-
2e zeigt
schematisch mehrere Module zum Einfügen geeigneter Vorabholbefehle
in eine Sequenz aus Befehlen, was beispielsweise durch das Vorabholmodul 260,
wie es in 2b gezeigt ist, bewerkstelligt
werden kann. Das heißt, es wird ein Vorabholbefehl in eine
betrachtete Schleife so eingefügt, dass Arraydaten in den
Cache-Speicher zu jener Iteration der Schleife verfügbar
sind, in der die Daten tatsächlich abgerufen werden. Wie
gezeigt, wird im Modul 261 die Induktionstabelle für
jede interessierende Schleife abgeru fen. Im Modul 262 wird jeder
Eintrag der Induktionstabelle beispielsweise im Hinblick auf die
Attribute, die zuvor mit Bezug zu 2d erläutert
sind, geprüft. Im Modul 263 werden mögliche
Vorabholkandidaten auf der Grundlage der Induktionstabelle und der
jeweiligen Einträge ermittelt und im Modul 264 werden
mögliche Kandidaten eliminiert, um damit ineffiziente Vorabholoperationen zu
vermeiden, beispielsweise das Vorabholen von Arraydaten, die bereits
in dem Cache-Speicher vorhanden sind. Schließlich werden
im Modul 265 Vorabholbefehle für die verbleibenden
Kandidaten der betrachteten Schleife erzeugt.
-
2f zeigt
schematisch ein Flussdiagramm, zum Ermitteln potenzieller Kandidaten
für das Vorabholen. Im Schritt 261a wird der Punkt Is-LREF
verifiziert, d. h. es wird bestimmt, ob der Wert wahr oder falsch
ist. Wenn Is-LREF wahr ist, ist die zugehörige Induktionsvariable
ein linearer Ausdruck. In diesem Fall geht der Prozessablauf weiter zum
Schritt 261b, in welchem bestimmt wird, ob die Induktionsvariable
tatsächlich in der Schleife verwendet wird. Beispielsweise
werden die jeweiligen Speicheroperationen geprüft, um zu
bestimmen, ob die Induktionsvariable tatsächlich benötigt
wird oder nicht. Wenn die Verwendung der Induktionsvariable mit
einer Bedingung verknüpft ist, beispielsweise wenn die
Induktionsvariable zum Zugreifen auf das Datenarray auf der Grundlage
einer speziellen Bedingung verwendet wird, wird eine geeignete Regel eingerichtet,
um die Induktionsvariable als einen möglichen Kandidaten
oder nicht zu betrachten. Beispielsweise kann die Bedingung, die
den Arrayzugriff regelt, ignoriert werden und die Induktionsvariable kann
als eine ”unbedingte Variable” betrachtet werden.
In anderen Fällen wird eine dynamische profile Rückkopplungsinformation
verwendet, um zu entscheiden, ob eine Induktionsvariable einen möglichen
Kandidaten repräsentiert oder nicht. Wenn beispielsweise
die Datei zugehörige Information angibt, dass eine Bedingung
häufig erfüllt wird, kann die Variable als eine
nicht-bedingte Variable betrachtet werden. Wenn Schritt 261b wahr
ist, geht der Prozess zum Schritt 261c weiter, in welchem
verifiziert wird, ob der Schleifenkörper einen vorbestimmten Schwellwert übersteigt.
Es sollte beachtet werden, dass die Datenvorabholung gegebenenfalls
nicht effizient ist oder das Leistungsverhalten verringern kann,
wenn diese für Schleifen mit einem moderat kleinen Schleifenkörper
ausgeführt wird. Beispielsweise wird ein Schwellwert von
15 verwendet. Jedoch kann der Schwellwert von prozessorspezifischen
Kriterien und dergleichen abhängen. Die Schleifengröße
wird als die Anzahl interner Noten betrachtet, die mit der relativen
Ausführungshäufigkeit gewichtet sind. Wenn der
Schritt 261c durchlaufen ist, dann wird im Schritt 261d die
Schrittweite im Hinblick auf einen zulässigen Bereich hin überprüft.
Beispielsweise kann ein zulässiger Bereich 8 Bytes
sein, die um den betrachteten Speicherzugriff herum angeordnet sind.
In anderen Fällen ist ein un zulässiger Bereich
(–256B, 0B). Wenn die Verifizierung im Schritt 261d erfolgreich
durchlaufen ist, kann der Prozessablauf zum Schritt 261e weitergehen,
in welchem die entsprechende Induktionsvariable als ein möglicher
Kandidat für die Datenvorabholung markiert wird. Wenn keine
der Verifizierungen erfüllt wird, geht der Prozess zum
Schritt 261f weiter, in welchem die Induktionsvariable
nicht als eine mögliche Datenvorabholoperation Berücksichtigung
findet.
-
2g zeigt
schematisch ein Flussdiagramm zum Bestimmen einer Vorabholadresse
für einen möglichen Kandidaten, der im Schritt 261e ermittelt
wurde. Wie gezeigt, wird im Schritt 261f eine Vorabholadresse
auf der Grundlage des linearen Ausdrucks bestimmt, der mit der Induktionsvariable verknüpft
ist, die als möglicher Kandidat erkannt wurde, wobei auch
ein Vorabholabstand bzw. eine Vorabholdistanz in Bytes addiert wird.
-
Im
Schritt 261g wird bestimmt, ob der lineare Ausdruck der
Induktionsvariablen als ein Index für einen weiteren Speicherzugriff
verwendet wird. Beispielsweise besitzt ein entsprechender Speicherzugriff
die Form B[A[i]], so dass der Inhalt des Arrayelements A[i] die
Adresse eines Arrayelements des Arrays B repräsentiert.
Wenn die Induktionsvariable als ein Index verwendet wird, geht der
Prozessablauf zum Schritt 261h weiter, in welchem die Vorabholadresse
berechnet wird zu:
i + Schrittweite/Größe
von (Typ des Arrays A).
-
Das
heißt, die Vorabholadresse für den Speicherzugriff
im Array B ist durch das Arrayelement repräsentiert, das
durch den zuvor angegebenen Ausdruck bezeichnet ist. Daraufhin geht
der Prozessablauf zum Schritt 261i weiter, in welchem die
Vorabholadresse zu dem zugehörigen Induktionstabelleneintrag
hinzugefügt wird.
-
2h zeigt
schematisch einen Prozess zum Bestimmen des Vorabholabstands bzw.
der Vorabholdistanz. Im Schritt 266a wird bestimmt, ob
die Schrittweite gleich ist zu (–64B, 64B). Wenn dies der Fall
ist, geht der Prozessablauf zum Schritt 266b weiter, in
welchem der Vorabholabstand auf eine Länge von vier Cachezeilen
festgelegt wird. Im Schritt 266c wird bestimmt, ob die
Schrittweite größer als 1024 Bytes ist, in welchem
Falle im Schritt 266d der Vorabholabstand auf zweimal die
Schrittweite festgelegt wird. In jedem anderen Fall wird der Vorabholabstand auf
die Länge der Schrittweite im Schritt 266e festgelegt.
-
Es
sollte beachtet werden, dass die obengenannten Prozesse während
der Kompilierzeit ausgeführt werden können, wenn
die Schrittweite konstant ist. Im Falle einer variablen Schrittweite
wird ein geeigneter Ausdruck so eingefügt, dass die Schrittweite zur
Laufzeit berechnet wird, indem beispielsweise eine entsprechende
Variable definiert wird, die die Differenz der Schrittweite zwei
aufeinanderfolgender Durchläufe ”misst”,
und indem die Variable zum Ausführen der Prozessschritte,
die zuvor für eine konstante Schrittweite spezifiziert
sind, während der Laufzeit verwendet wird.
-
Nach
dem Identifizieren möglicher Kandidaten und dem Bestimmen
der entsprechenden Vorabholadressen werden ein oder mehrere der
möglichen Kandidaten eliminiert, um ungeeignete Vorabholoperationen
zu vermeiden.
-
2i zeigt
schematisch ein entsprechendes Schema zum Bestimmen von Kandidaten,
die für die Datenvorabholung zu verwerfen sind. Zu diesem Zweck
werden alle Vorabholkandidaten, die zuvor erkannt wurden, und die
durch einen Ausdruck a × BIV + b mit gleichem a und BIV
repräsentiert sind, in eine spezielle Unterteilung einsortiert.
Beispielsweise, wie in 2i gezeigt
ist, werden alle möglichen Kandidaten, d. h. Induktionsvariablen,
die durch einen entsprechenden linearen Ausdruck der Form a1 × BIV1, in die Unterteilung oder
Gruppe 1 eingestuft. In ähnlicher Weise werden Induktionsvariablen,
die durch a2 × BIV2 repräsentiert
sind, in die Gruppe 2 eingeteilt. Folglich unterscheiden sich alle
möglichen Kandidaten innerhalb einer speziellen Gruppe,
etwa der Gruppe 1 und 2, voneinander durch unterschiedliche Koeffizienten
b1, b2, b3 bzw. c1, c2. Es sollte beachtet werden, dass eine beliebige
Anzahl an Kandidaten in einer speziellen Gruppe abhängig
von der Anzahl an Variablen und ihren linearen Repräsentationen,
vorhanden sein kann.
-
In
einer anschaulichen Ausführungsform werden die Kandidaten
einer speziellen Gruppe in aufsteigender Reihenfolge der Koeffizienten
b sortiert, wie dies beispielsweise in 2i für
die Gruppe 1 gezeigt ist. In diesem Fall sei angenommen, dass die
folgende Reihenfolge erhalten wird: b3 < b1 < b2. Eine
entsprechende Sortierung kann für jede Gruppe ausgeführt
werden.
-
Auf
der Grundlage der diversen Gruppen werden geeignete Kandidaten in
der folgenden Weise ausgewählt. Der erste Kandidat wird
in jeder Gruppe beibehalten. Wenn der nächste Kandidat
in einer jeweiligen Gruppe einen Abstand bzw. Offsetwert b besitzt,
der kleiner ist als eine Cache-Zeile in Bezug auf den letzten verbleibenden
Kandidaten dieser Gruppe wird dieser nächste Kandidat entfernt.
Dieser Vorgang wird für die restlichen Kandidaten in der
betrachten Gruppe wiederholt.
-
2j zeigt
schematisch ein Flussdiagramm zum Eliminieren von Kandidaten für
die anschauliche Gruppe 1, die redundante Vorabholoperationen hervorrufen.
Es sollte beachtet werden, dass der Ablauf zum Eliminieren von Kandidaten
leicht auf die Anzahl an Kandidaten in jeder Gruppe angepasst werden kann,
wie dies zuvor beschrieben ist. Im Schritt 264a der Kandidat
der Gruppe 1 mit dem Koeffizienten b3 ausgewählt.
Im Schritt 264d wird die Gültigkeit des nächsten
Kandidaten, d. h. in dem gezeigten Beispiel, des Kandidaten mit
dem Koeffizienten b1, geprüft,
indem ein Abstand zu dem vorhergehenden Kandidaten bestimmt wird,
d. h. dem Kandidaten, der durch den Koeffizienten b3 repräsentiert
ist. Wenn der entsprechende Abstand kleiner ist als die Größe
einer Cachezeile, etwa 64B, geht der Prozessablauf zum Schritt 264g weiter,
in welchem dieser Kandidat entfernt wird, da dieser zu einer unnötigen
Vorabholoperation führen würde. Im Schritt 264h wird
der dem Abstand b2 entsprechende Kandidat
durch Vergleichen von b2 und b3 bewertet.
Wenn der Abstand b2 innerhalb der Cache-Zeile
liegt, wird der b2 entsprechende Kandidat
im Schritt 264i eliminiert. Wenn der Abstand b2 größer
oder gleich der Cache-Zeilengröße ist, wird der
dem Abstand b2 entsprechende Kandidat im
Schritt 264e als ein geeigneter Kandidat bewertet.
-
Wenn
im Schritt 264b der Abstand größer oder
gleich einer Cachezeile ist, geht der Prozessablauf zum Schritt 264c weiter,
in welchem ein durch den Koeffizienten b1 repräsentierter
Kandidat als ein geeigneter Kandidat ausgewählt wird. Dieser
Kandidat wird dann mit dem verbleibenden Kandidaten, der zum Abstand
b2 gehört, verglichen. Daher werden im Schritt 264d die
Abstände b1 und b2 mit der Cache-Zeilengröße
verglichen. Bei einem „Nein” im Schritt 264d wird
der dem Abstand b2 entsprechende Kandidat im Schritt 264e als
ein geeigneter Kandidat gewählt. Ansonsten wird dieser
Kandidat im Schritt 264f entfernt.
-
2k zeigt
schematisch ein Flussdiagramm gemäß einem Prozess
zum Einfügen einer geeigneten Vorabholoperation in eine
zugehörige Schleife. Im Schritt 265a wird ein
Vorabholbefehl für jeden Kandidaten erzeugt, der als ein
geeigneter Kandidat in der einen oder mehreren zuvor ermittelten
Gruppen erkannt wurde. Es sollte beachtet werden, dass geeignete
Vorabholbefehle typischerweise von der entsprechenden Prozessorplattform
unterstützt werden und damit effizient implementiert werden
können. Daraufhin werden im Schritt 265b die Vorabholbefehle
am Beginn der jeweiligen Schleife angeordnet.
-
2l zeigt
schematisch ein System 270 zum Erzeugen eines Maschinenkodierungsprogramms 213 mit
Vorabholbefehlen, wie dies zuvor erläutert ist. Die erzeugte
Kodierung kann dann in einer geeigneten Plattform verwendet werden,
d. h., in einem Prozessorsystem mit einem Cache-Speicher in Verbindung
mit einem Arbeitsspeicher, wobei aufgrund der eingefügten
Vorabholbefehle Daten vom Speicher in den Cache vor der eigentlichen
Verwendung der Daten im Prozessor eingeladen werden können.
Beispielsweise umfasst das System 270 eine Verarbeitungseinheit 271 und
ein Speichersystem 272, in welchem ein Kompilermodul zum
Verbessern der Datenvorabholung eingerichtet ist. Beispielsweise
ist das Modul 260, wie es zuvor beschrieben ist, in dem
Speichersystem 272 eingerichtet. Beim Ausführen
der diversen Submodule des Kompilermoduls 260 auf der Basis
einer Quellkodireung 213s erzeugt damit die CPU 271 eine
Gruppe aus Maschinenkodierungsbefehlen, etwa die Gruppe aus Befehlen 213 mit
einer Schleife, die einen Vorabholbefehl aufweisen, der auf der
Grundlage der zuvor beschriebenen Techniken eingefügt ist.
Die Gruppe aus Befehlen 213 kann zum Betreiben einer komplexen
Mikroprozessorplattform verwendet werden, etwa dem System 200,
wie es in 2a gezeigt ist, wodurch eine
deutliche Verbesserung erreicht wird, wenn direkte und/oder indirekte
Arrayzugriffe in einer oder mehreren Schleifen auszuführen
sind.
-
Es
gilt als: Die vorliegende Offenbarung stellt eine effiziente Vorabholstrategie
bereit, ohne dass aufwendige Abschätzmodelle erforderlich
sind, und ohne dass das Ermitteln und das Analysieren von Arrayzugriffen
für die betrachteten Programme erforderlich sind. In der
vorliegenden Offenbarung werden einfache heuristische Konzepte beim
Auswählen von Vorabholkandidaten und beim Bestimmen von
Vorabholdistanzen angewendet. Der entsprechende Schleifenkörper
muss nicht untersucht werden, um geeignete Vorabholkandidaten zu
ermitteln. Des Weiteren ist die Vorabholstrategie von der Vektorisierung,
dem Aufrollen von Schleifen und vielen anderen Optimierungsphasen
entkoppelt, die typischerweise in gut etablierten Kompilertechniken
eingesetzt werden. Dies ermöglicht eine effiziente Änderung
in der Reihenfolge der Kompilerphasen während der Kompilierung,
falls dies erforderlich ist, sofern die Induktionstabellen bereits
verfügbar sind. Folglich können skalare Schleifen
und Schleifenkörper mit mehreren Blöcken effizient
im Hinblick auf die Datenvorabholung gehandhabt werden. Des Weiteren
können indirekte Arrayzugriffe über indizierte
Arrays im voraus abgeholt werden.
-
Weitere
Modifizierungen und Variationen der vorliegenden Offenbarung werden
für den Fachmann angesichts dieser Beschreibung offenkundig.
Daher ist diese Beschreibung le diglich anschaulicher Natur und dient
dem Zweck, dem Fachmann die allgemeine Art und Weise des Ausführens
der hierin offenbarten Prinzipien zu vermitteln. Selbstverständlich
sind die hierin gezeigten und beschriebenen Formen als die gegenwärtig
bevorzugten Ausführungsformen zu betrachten.
-
ZITATE ENTHALTEN IN DER BESCHREIBUNG
-
Diese Liste
der vom Anmelder aufgeführten Dokumente wurde automatisiert
erzeugt und ist ausschließlich zur besseren Information
des Lesers aufgenommen. Die Liste ist nicht Bestandteil der deutschen
Patent- bzw. Gebrauchsmusteranmeldung. Das DPMA übernimmt
keinerlei Haftung für etwaige Fehler oder Auslassungen.
-
Zitierte Nicht-Patentliteratur
-
- - V. Santhanam,
E. Garnisch, W. Hsu ”Datenvorabholung auf dem HPPA-8000”,
Schriften des Internationalen Symposiums der Computerarchitektur
(ISCA), Seiten 264 bis 273, 1997 [0012]
- - Heanne Ferrante, Vivek Sarkar, W. Thrasch offenbaren in ”Abschätzung
und Verbesserung der Cache-Effektivität”, gesammelte
Schriften von Sprachen und Kompiler für die Parallel-Computerabarbeitung”,
4. Internationaler Workshop, Seiten 328 bis 343, August 1991 [0012]
- - S. Ghosh, M. Martomosi, S. Milik in ”Cache-Fehlgleichungen
mit einem Kompilerkonzept zum Analysieren und Verbessern des Speicherverhaltens”,
ACM Transaktionen für Programmiersprachen und Systeme (TOPLAS),
Band 21, Ausgabe 4, Seiten 703 bis 746, 1999 [0012]
- - C. Luk, T. Mowry, ”Kompiler-basierte Vorabholung
für rekursive Datenstrukturen”, ACM SIGOPS Betriebssystemüberblick,
Band 30, Ausgabe 5, Seiten 222 bis 233, 1996 [0012]