-
Gebiet der Erfindung
-
Die
Erfindung betrifft ein Verarbeitungssystem.
-
Hintergrund der Erfindung
-
Mobilfunkstandards
der dritten Generation, wie UMTS-FDD, UMTS-TDD, IS2000 und TD-SCDMA,
arbeiten mit sehr hohen Frequenzen. Modems (Transceiver) für 3G-Mobilfunkstandards,
wie UMTS, machen eine ungefähr
100-fach höhere,
digitale Signalverarbeitungsleistung als GSM erforderlich. Für derartige
Standards besteht der Wunsch, einen Transceiver unter Verwendung
einer programmierbaren Architektur einzuführen, um mit unterschiedlichen
Standards umgehen und sie flexibel an neue Standards anpassen zu
können. Eine
bekannte Verfahrensweise zur Verbesserung der Leistung besteht darin,
mehrere Datenelemente (Skalare) in einer Zeile eines Speichers zu
speichern und mehr als ein Datenelement gleichzeitig zu verarbeiten. Solche
Systeme sind z. B. unter der Bezeichnung SIMD (single instruction,
multiple data [ein Befehl, mehrere Daten]) oder MIMD (multiple instruction,
multiple data [viele Befehle, viele Daten]) bekannt. Ein Beispiel
für einen
SIMD-Prozessor ist ein Vektorprozessor. In typischen Fällen besitzt
ein breiter Speicher einen Port, um den Lese- und Schreibzugriff
auf Einheiten mindestens einer Speicherzeile zu ermöglichen.
Bei dem Beispiel, in dem der Speicher eine Zeilenbreite zum Speichern
eines Vektors hat, können
ein Vektor oder mehrere Vektoren gleichzeitig gelesen oder geschrieben
werden. Es gibt keine besondere Vorkehrung, um auf kleinere Einheiten
als einen Vektor zugreifen zu können.
Um einen Speicher auf optimale Weise nutzen zu können, ist es wünschenswert,
auch auf noch kleinere Datenelemente als jene zugreifen zu können, die
auf effiziente Weise die volle Breite einer Speicherzeile einnehmen.
Normalerweise kann eine derartige kleinere Einheit in einer Zeile
des Speichers gespeichert werden, in der ein Teil der Zeile nicht
genutzt wird, wodurch die Speicherkosten steigen. Als Alternative
dazu können
kleinere Einheiten in einer Zeile in verketteter Form gespeichert
werden, wobei eine ganze Zeile gelesen oder geschrieben werden muss
und zusätzliche
Verarbeitungsanweisungen und -zyklen erforderlich sind, um eine
gewünschte
kleinere Einheit zu entnehmen oder einzufügen, die die gesamte Speicherzeile
bildet. Das senkt die Leistungsfähigkeit.
-
Diese
Probleme werden akuter, wenn die Breite des Speichers die Größe der kleineren
Einheit beträchtlich übersteigt.
Zum Beispiel sind Datenelemente, die Bestandteile eines Sprachelement
vektors für
die Spracherkennung speichern, typischerweise 8 bis 16 Bits breit.
Für den
Fern sprechverkehr sind die kodierten/modulierten Datenelemente
gewöhnlich
8 Bits groß (oder
2·8 Bits
für komplexe
Werte). Es besteht keine Notwendigkeit, diese Größe zu erhöhen. Für neuere Fernsprechsysteme
oder für
eine gesteigerte Spracherkennungsleistung ist es wünschenswert,
die Verarbeitungsgeschwindigkeit zu verbessern. Die Verwendung breiterer
Speicher zur Steigerung der Verarbeitungsgeschwindigkeit kann ohne
besondere Maßnahmen
die Größe des Speichers
erhöhen,
der zum Speichern der Daten benötigt
wird, oder sogar bestimmte Formen des oben beschriebenen Speicherzugriffs
verlangsamen.
-
Das
US-Patent Nr. 4.949.247 offenbart
einen Multiplexer, der durch eine Vektorsteuereinheit gesteuert wird,
um ausgewählte
Vektorelemente in den als Ausgangspunkt dienenden Zwischenregistern
(d. h. in jedem Register ausgewählte
Operanden mit einfacher Genauigkeit oder doppelter Genauigkeit von
den bis zu 16 Operanden) über
einen Bus an einen Gleitpunktprozessor zu koppeln. Es offenbart
außerdem,
dass während anschließender Taktintervalle
(d. h. sobald die vektorielle Rechenoperation beginnt) ein Element
des Vektors A und ein entsprechendes Element des Vektors B über den
Multiplexer an den Gleitpunktprozessor angelegt und verarbeitet
werden (z. B. zusammenaddiert) und das Ergebnis über den Multiplexer als ein
Element in das Zwischenspeicher-Zielregister geladen wird. Dort
werden die Ergebnisse aufeinander folgender Operationen gesammelt,
bis das Zwischenspeicher-Zielregister gefüllt ist (d. h. mit 8 Ergebnissen).
Die Ergebnisse werden dann im Vektor-RAM gespeichert.
-
Das
US-Patent Nr. 5.689.653 offenbart
eine Vektor-Vorabrufeinheit, die drei Vektorpuffer umfasst, zu denen
ein erster Ladevektorpuffer, ein zweiter Ladevektorpuffer und ein
Speichervektorpuffer gehören.
Die Vektorpuffer können
jeweils eine Mehrzahl von Datenelementen speichern. Die Daten werden
zwischen den Vektorpuffern und den Prozessorregistern übertragen.
Die Übertragungen
zwischen den Vektorpuffern und den Prozessorregistern erfolgen Element
für Element.
Ein Befehl gibt zwei Register an, in die die nächsten Elemente aus den La devektorpuffern
zu übertragen
sind, sowie ein Register, aus dem das nächste Element des Speichervektorpuffers übertragen
wird.
-
Zusammenfassung der Erfindung
-
Der
Zweck der Erfindung besteht darin, eine Prozessorarchitektur zu
schaffen, die auch für
kleinere Datenelemente einen schnellen Speicherzugriff auf einen
breiten Speicher gewährleisten
kann.
-
Um
diese Aufgabe in einem Verarbeitungssystem mit einem Prozessor und
einem reellen bzw. physischen Speicher mit einem Speicherport einer
einzigen Größe für den Zugriff
auf die im Speicher befindlichen Daten zu erfüllen, wird der Prozessor dafür eingerichtet,
Daten mindestens einer ersten Datenmenge und einer kleineren zweiten
Datenmenge zu bearbeiten, wobei die erste Datenmenge gleich oder
kleiner als die Größe des Speicherports
ist und zu dem Verarbeitungssystem mindestens ein Datenregister
der ersten mit dem Speicherport verbundenen Datenmenge und mindestens
ein Datenport der zweiten mit dem Datenregister verbundenen Datenmenge
sowie der Prozessor zur Aktivierung des Zugriffs auf die Datenelemente
der zweiten Menge gehören.
-
Auf
diese Weise kann ein konventioneller Speicher mit einer Wortlänge verwendet
werden. Das hält die
Kosten des Speichers niedrig. Typischerweise entspricht die Speicherwortlänge der
größten Wortlänge des Prozessors.
Um den Zugriff auf kleinere Datenelemente zu ermöglichen, wird ein Zwischenregister
verwendet. Ein zusätzlicher
Port wird hinzugefügt,
der den Zugriff auf ein kleineres Datenelement in dem Register aktiviert. Die
Verwendung des Zwischenregisters kann völlig transparent sein. Für den Prozessorkern
und den Programmierer sieht es so aus, als hätte der Speicher Ports mit
verschiedenen Größen. Auf
diese Weise kann ohne zusätzlichen
zeitlichen Befehlsaufwand schnell auf kleine Datenelemente zugegriffen
werden, wie z. B. die Auswahl und/oder Verschiebung von großen Datenelementen,
um auf ein kleineres Datenelement zugreifen zu können, das Teil des größeren Datenelements
ist.
-
Wie
im abhängigen
Patentanspruch 2 beschrieben, ist die Größe des Speicherports mindestens
zweimal so groß wie
die zweite Datenmenge. Auf diese Weise kann das Register mindestens
zwei kleine Datenelemente speichern. Besonders in dem Fall, in dem
sequentiell auf die kleinen Datenelemente zugegriffen wird, ermöglicht ein
Zugriff auf den reellen Speicher einen schnellen Zugriff auf mindestens
zwei sequentielle kleinere Datenelemente. Das reduziert die beim
Zugriff auf den reellen Speicher verlorene Zeit.
-
Wie
im abhängigen
Patentanspruch 3 beschrieben, wird für einen Lese-Datenport ein
Multiplexer verwendet, um ein Datenelement der zweiten Datenmenge
aus dem leseadressengesteuerten Datenregister auszuwählen und
herauszuziehen. Zum Beispiel kann der signifikanteste Teil der Leseadresse
benutzt werden, um zu überprüfen, ob
sich das Datenelement bereits im Register befindet (und falls nicht,
kann dieser Teil benutzt werden, um es aus dem reellen Speicher
abzurufen), während
der am wenigsten signifikante Teil benutzt werden kann, um das Datenelement
in dem Register auszuwählen.
-
Wie
im abhängigen
Patentanspruch 4 beschrieben, wird Wir einen Schreib-Datenport ein
Demultiplexer verwendet, um ein Datenelement der zweiten Datenmenge
an einer auswählbaren
Speicherstelle in das schreibadressengesteuerte Datenregister einzufügen. Die
Auswahl kann in ähnlicher
Weise erfolgen, wie sie für
den Leseport beschrieben wurde.
-
Wie
im abhängigen
Patentanspruch 5 beschrieben, kann das Verarbeitungssystem eine
Mehrzahl von mit dem Prozessor verbundenen Datenports der zweiten
Datenmenge sowie für
jeden der Datenports ein dazugehöriges
entsprechendes Datenregister enthalten, das mit dem jeweiligen Datenport
und einem Port des reellen Speichers verbunden ist. Auf diese Weise
kann die durchschnittliche Zeit für einen Zugriff auf Daten noch
weiter reduziert werden. Zum Beispiel kann, wenn ein Algorithmus
zwei sequentielle Datenströme
verarbeitet, jeder der Ströme
eines der Register und Datenports nutzen. Jeder Strom kann dann
auf mindestens zwei sequentielle Datenelemente zugreifen und dabei
nur einen Zugriff auf den reellen Speicher nutzen.
-
Wie
in dem abhängigen
Patentanspruch 6 beschrieben, wird eine Überprüfung auf mögliche Übereinstimmungskonflikte durchgeführt, die
durch die Register ausgelöst
werden, die eine 'Kopie' der Daten im Speicher
und/oder in mehr als einem Register enthalten. Das System ermöglicht es,
aktualisierte Daten im Register aufzubewahren, so dass die Aktualisierung
eines kleinen Datenelements nicht immer eine Schreiboperation in den
reellen Speichers auslöst.
Außerdem
wird dadurch auch ermöglicht,
das aktualisierte kleine Datenelement direkt aus dem Register abzurufen,
wodurch beim Speicherzugriff noch weitere Zeit eingespart wird.
Für Schreib-Datenports
(und folglich das dazugehörige
Register, das den Schreibzugriff ermöglicht) speichert der Prozessor
in einem zusätzlichen Übereinstimmungsregister
Informationen über
die Daten, die im Register gespeichert sind. Diese Daten werden
dafür verwendet,
um zu überprüfen, ob
die Daten, die abgerufen werden (aus dem reellen Speicher oder aus
einem der Register), auf Daten zugreifen, die verändert worden
sind (aber möglicherweise
noch nicht auf den neuesten Stand des Speichers oder der Leseregister
gebracht worden sind). Vorzugsweise ist die Kennzeichnungsinformation
eine physische Adresse, um auf ein Wort im reellen Speicher zugreifen
zu können,
in dem das Wort die Breite des Speicherports hat. Auf diese Weise
lässt es
sich leicht prüfen,
ob bei einem Konflikt mit den in den Registern gespeicherten Daten
ein direkter Zugriff auf den reellen Speicher möglich ist.
-
Wie
im abhängigen
Patentanspruch 8 beschrieben, enthält der Kohärenzprüfer einen Konfliktlöser, um als
Reaktion auf die Erkennung eines möglichen Übereinstimmungskonfliktes Korrekturmaßnahmen
zu treffen. Auf diese Weise wird der Programmierer davon befreit,
solche Maßnahmen
während
der Entwicklung des Programms treffen zu müssen. Eine Möglichkeit,
solche Korrekturmaßnahmen
zu treffen, wie sie im abhängigen Patentanspruch
9 beschrieben werden, besteht darin, das Datenregister für den Lesezugriff
als ungültig
zu kennzeichnen, was als Reaktion auf einen Lesezugriff das Datenregister
ein erneutes Laden des Inhalts des Datenregisters aus dem Speicher
auslöst.
-
Als
Alternative, wie im abhängigen
Patentanspruch 10 beschrieben, enthält der Kohärenzprüfer ein Kohärenzregister für jedes
entsprechende Datenregister zur Speicherung von Informationskennungsdaten, die
in dem entsprechenden Datenregister gespeichert sind, und den Korrektor,
der als Antwort auf den Schreibzugriff auf eines der Datenregister
und/oder auf den Schreibzugriff auf den reellen Speicher dafür eingerichtet ist,
Korrekturmaßnahmen
zu treffen, indem er den in das Datenregister oder in den Speicher
eingeschriebenen Inhalt in alle anderen Datenregister und/oder auf
einen Speicherplatz kopiert, der gemäß der Kennungsinformation die
gleichen Daten speichert. Bei dieser Ausführungsform werden aktualisierte
Daten in alle Register kopiert, die entsprechend den Kohärenzregistern
die gleichen Daten speichern sollten Wenn ein direkter Zugriff auf
den reellen Speicher gestattet wird, gehört dazu auch das Kopieren der
Daten in den reellen Speicher. Vorzugsweise erfolgt der direkte
Zugriff auf den reellen Speicher für die großen Datenelemente auch über ein Zwischenregister,
wobei das Einschreiben in ein Register nicht automatisch einen Schreibzugriff
auf den Speicher erforderlich macht.
-
Wie
im abhängigen
Patentanspruch 11 beschrieben, ist mindestens eines der Datenregister
(im Weiteren als „Leseregister” bezeichnet)
mit einem Lese-Datenport verbunden und ist mindestens eines der
Datenregister (im weiteren als „Schreibregister” bezeichnet)
mit einem Schreib-Datenport verbunden; und der Prozessor enthält einen
Umgehungsweg, um Daten aus dem Schreibregister dem Lese-Datenport
wählbar
zur Verfügung
zu stellen; wobei der Kohärenzprüfer für jedes
entsprechende Datenregister ein Kohärenzregister zur Speicherung
von Informationskennungsdaten enthält, die im zugehörigen Datenregister
gespeichert sind; und der Konfliktlöser dafür eingerichtet ist, Korrekturmaßnahmen
als Reaktion auf das Einschreiben von Daten in das Schreibregister
durch das Aktivieren des Umgehungsweges für einen sukzessiven Lesezugriff
auf das Leseregister zu treffen, falls das Leseregister entsprechend
der Kennungsinformation das gleiche Datenelement speichern sollte.
Durch die Nutzung eines Umgehungsweges braucht ein Leseregister
nicht erneut geladen zu werden, sobald ein Schreibregister mit dem
gleichen Inhalt aktualisiert worden ist. Stattdessen werden die
Daten dann direkt aus dem aktualisierten Schreibregister abgerufen.
Auf diese Weise wird der Zugriff auf den reellen Speicher gering
gehalten. Das kann manchmal eine Verzögerung beim Zugriff auf das
Schreibregister verursachen.
-
Vorzugsweise
stützt
sich der reelle Speicher auf ein SRAM mit einem einzigen Zugriffskanal,
der kostengünstig
ist. Um einen kostengünstigen,
breiten reellen Speicher zur Verfügung zu haben, so dass viele
kleine Datenelemente in einem Speicherwort gespeichert werden können, bevorzugt
man die Verwendung eines reellen Speichers, der durch eine Vielzahl
parallel angeordneter Bereiche eines RAM gebildet wird. Dabei ist die
Variante zu bevorzugen, bei der der Speicher in den Prozessor eingebaut
ist.
-
Die
beschriebene Architektur kann in vorteilhafter Weise in einem Skalar-/Vektorprozessor
verwendet werden, in dem das Vektorsegment Vektoren der ersten Datenmenge
und das Skalarsegment Skalare der zweiten Datenmenge bearbeitet,
wobei die erste Datenbreite mindestens zweimal so groß wie die
zweite Datenbreite ist. Bei solch einer Anordnung kann der gleiche
Speicher für
das Speichern von Vektoren und Skalaren verwendet werden. Das macht
es auch leicht, skalare Rechenoperationen an Elementen des Vektors durchzuführen.
-
Diese
und andere Aspekte der Erfindung gehen offensichtlich aus den im
Weiteren beschriebenen Ausführungsformen
hervor und werden unter Bezugnahme auf sie erläutert werden.
-
Kurze Beschreibung der Zeichnungen
-
Auf
den Zeichnungen:
-
Zeigt 1 eine
bevorzugte Konfiguration, in der der erfindungsgemäße Skalar-/Vektorprozessor
verwendet werden kann;
-
Zeigt 2 die
Hauptstruktur des erfindungsgemäßen Skalar-/Vektorprozessors;
-
Zeigt 3 unterstützte Datenbreiten
und Datentypen;
-
Zeigt 4 ein
Blockdiagramm der Vektorspeichereinheit; und
-
Veranschaulicht 5 die
Verwendung von Zwischenregistern und zwei Portgrößen.
-
Detaillierte Beschreibung der bevorzugten
Ausführungsform
-
Die
Address Generation Unit (AGU) und Speichereinheit werden vorzugsweise
in eifern Prozessor verwendet, der für die Signalverarbeitung optimiert
ist. Solch ein Prozessor kann ein DSP oder irgendein anderer geeigneter
Prozessor/Mikrokontroller sein. Im übrigen Teil der Beschreibung
wird die Verwendung der Einheiten in einem äußerst leistungsfähigen Skalar-/Vektorprozessor
beschrieben. Solch ein Prozessor kann selbstständig zum Einsatz kommen oder
in Kombination mit einem anderen Prozessor. 1 zeigt
eine bevorzugte Konfiguration, in der der Skalar-/Vektorprozessor
verwendet werden kann. Bei dieser Konfiguration sind drei Hauptbestandteile über einen
Datenbus 110 miteinander verbunden. Der Datenbus 110,
der diese drei Bestandteile miteinander verbindet, kann jeder geeignete
Bus sein, wie z. B. der AMBA Hochgeschwindigkeitsbus (AHB). Die
Hauptbestandteile sind:
- – der programmierbare Skalar-/Vektorprozessor 120,
der Funktionseinheiten und einen lokalen Datenspeicher umfasst (in 1 als
Vektorspeicher bezeichnet),
- – ein
Mikrokontroller oder DSP-Teilsystem 130, zu dem ein begrenztes
Programm auf einem Chip und ein Datenspeicher gehören;
- – ein
Schnittstellenblock 140.
-
Der
Skalar-/Vektorprozessor 120 wird hauptsächlich für die reguläre ?hochleistungsfähige? Verarbeitung
verwendet, insbesondere für
die Verarbeitung von inneren Schleifen. Der Skalar-/Vektorprozessor
besitzt die funktionelle Fähigkeit
zur Vektorverarbeitung. Als solcher gewährleistet er eine umfangreiche
Parallelverarbeitung für
den vektorisierbaren Teil des auszuführenden Codes. Der größte Teil
der gesamten Signalverarbeitung wird durch das Vektorsegment des
Skalar-/Vektorprozessors ausgeführt.
Mit einer Matrix von z. B. 32 identischen Verarbeitungselementen,
die den gleichen Befehl ausführen,
gewährleistet
es eine beachtliche Parallelverarbeitung. Kombiniert mit einer 32-Wort-breiten
Speicherschnittstelle ermöglicht
dies ein beispielloses programmierbares Leistungsniveau bei geringen
Kosten und moderatem Stromverbrauch. Es ist aber nicht immer machbar,
diese Möglichkeit
zur Parallelverarbeitung vollständig
auszunutzen, da viele Algorithmen keine ausreichende Fähigkeit
zur Daten-Parallelverarbeitung in der richtigen Form besitzen. Gemäß dem Amdahlschen
Gesetz wird nach der Vektorisierung des direkt vektorisierbaren
Teils des Codes die meiste Zeit mit dem restlichen Code verbracht.
Der restliche Code kann in vier Kategorien unterteilt werden:
- – adressenbezogene
Befehle (z. B. Inkrementierung eines Zeigers in einen Ringpuffer
unter Verwendung einer Moduloadressierung),
- – regelmäßige skalare
Rechenoperationen (d. h. eine skalare Rechenoperation, die der Hauptschleife
des Vektorprozessors entspricht),
- – Schleifendurchlauf,
- – unregelmäßige skalare
Rechenoperationen.
-
Die
Anteile des Codes für
jede dieser Kategorien hängen
in hohem Maße
vom ausgeführten
Algorithmus ab. Z. B. bedarf der Golay-Korrelator (genutzt für das P-SCH-Suchen)
einer großen
Menge adressenbezogener Befehle, aber bei anderen Algorithmen, wie
z. B. dem Rake, ist das nicht der Fall. Die Leistung adressenbezogener
Befehle und der Schleifendurchlauf können durch die Verwendung der
erfindungsgemäßen AGU/Speichereinheit
optimiert werden. Die Funktionsweise der regelmäßigen skalaren Rechenoperation
kann durch eine straff integrierende Skalar- und Vektorverarbeitung
in einem Prozessor optimiert werden. Eine Untersuchung aller für 3G-Modems
relevanten Algorithmen durch die Erfinder hat gezeigt, dass der
Anteil unregelmäßiger skalarer
Rechenoperationen sehr beschränkt
ist. Diese Eigenschaft ermöglicht
die Aufteilung der Aufgaben zwischen dem Skalar-/Vektorprozessor 120 und
dem Mikrokontroller oder DSP 130, wobei der separate Mikrokontroller
oder DSP 130 die unregelmäßigen Aufgaben erfüllt und
vorzugsweise auch den Skalar-/Vektorprozessor steuert. Bei dieser
bevorzugten Konfiguration fungiert der Skalar-/Vektorprozessor 120 als
programmierbarer Koprozessor (im restlichen Teil auch als CVP [Co-Vector-Processor]
bezeichnet). Die Schnittstelle zwischen dem Skalar-/Vektorprozessor 120 und
dem Mikrokontroller 130 befasst sich mit der Kommunikation
(z. B. durch einen gemeinsam genutzten Speicher) und Synchronisation
(z. B. durch einen gemeinsam genutzten Speicher und Zustandssignale).
Die Schnittstelle ist vorzugsweise speicherabbildgetreu.
-
Der
Schnittstellenblock 140 ermöglicht den Prozessoren das
Zusammenwirken mit dem restlichen Teil des Systems. Bei der bevorzugten
Ausführungsform
wird der Skalar-/Vektorprozessor
als Softwaremodem (Transceiver) für die Mobilfunknetze 2G/3G
genutzt. Für
solch eine Softwaremodem-Funktion kann der Schnittstellenblock 140 eine
spezielle Hardware als Eingangsteil enthalten, deren Hauptaufgabe
darin besteht, mittels Steuerung durch den Mikrokontroller 130 Steuerworte
und Datenworte zum Vektorspeicher (z. B. DMA) zu übermitteln.
Die Daten im Vektorspeicher werden dann durch den Skalar-/Vektorprozessor
verarbeitet.
-
Der
Skalar-/Vektorprozessor 120 kann dem Datenbus 110 untergeordnet
sein, während
der Mikrokontroller 130 und der Schnittstellenblock 140 (welcher
eine DMA-Einheit enthalten kann) übergeordnet fungieren können. Die
gesamte Kommunikation mit dem CVP, sei es Programm, Daten oder Steuerung,
erfolgt vorzugsweise speicherabbildgetreu. Der Speicher kann ein
DRAM sein, der sich nicht auf einem Chip befindet, und dieser DRAM
kann auch durch den Skalar-/Vektorprozessor als (Ent-)Verschachtelungsspeicher
genutzt werden.
-
In
der Beschreibung wird hauptsächlich
der Ausdruck „Address
Calculation Unit” bzw.
ACU verwendet. Für
den Zweck der Beschreibung ist dieser Ausdruck als gleichbedeutend
mit „Address
Generation Unit” bzw. AGU
anzusehen. Die Beschreibung konzentriert sich auf die Verwendung
solcher Einheiten für
das Berechnen von Datenadressen. Fachleute werden in der Lage sein,
die gleiche Funktionalität
auch für
das Berechnen von Befehlsadressen („Schleifensteuerung”) zu nutzen.
-
2 zeigt
die Hauptstruktur des Prozessors gemäß der Erfindung. Der Prozessor
enthält
einen gepipelineten Vektorverarbeitungsteil 210. Um die
Funktionsweise des Vektorsegments zu unterstützen, enthält der Skalar-/Vektorprozessor
einen Skalarverarbeitungsteil 220, der für die parallele
Arbeit mit dem Vektorsegment eingerichtet ist. Vorzugsweise ist
auch der Skalarverarbeitungsteil gepipelinet. Um die Funktionsweise des
Vektorsegments zu unterstützen,
gewährleistet
mindestens eine Funktionseinheit des Vektorsegments auch die Funktionalität des entsprechenden
Teils des Skalarsegments. Z. B. kann das Vektorsegment einer Verschiebungsfunktionseinheit
in funktioneller Hinsicht dort einen Vektor verschieben, wo eine
Skalarkomponente durch das Skalarsegment der Verschiebungsfunktionseinheit
eingegeben (oder zum Skalarsegment geliefert) wird. Als solche deckt
die Verschiebungsfunktionseinheit sowohl das Vektorsegment als auch
das Skalarsegment ab. Aus diesem Grunde haben mindestens einige
Funktionseinheiten nicht nur ein Vektorsegment, sondern auch ein
Skalarsegment, wo das Vektorsegment und Skalarsegment durch den
Austausch von Skalardaten zusammenarbeiten können. Das Vektorsegment einer
Funktionseinheit gewährleistet
die Rohdaten-Verarbeitungsleistung,
während
das entsprechende Skalarsegment (d. h. das Skalarsegment der gleichen Funktionseinheit)
die Arbeit des Vektorsegments durch das Eingeben und/oder Verbrauchen
von Skalardaten unterstützt.
Die Vektordaten für
die Vektorsegmente werden über
eine Vektor-Pipeline geliefert.
-
Bei
der bevorzugten Ausführungsform
in 2 umfasst der Skalar-/Vektorprozessor die folgenden sieben
spezialisierten Funktionseinheiten.
-
Befehlsverteilereinheit
(IDU 250). Die IDU enthält
den Programmspeicher 252, liest aufeinander folgende VLIW2-Befehle und verteilt die 7 Segmente jedes
Befehls auf die 7 Funktionseinheiten. Vorzugsweise enthält sie eine
Schleifeneinheit, die bis zu drei verschachtelte Ebenen eines Zero-Overhead
Loopings unterstützt.
Bei der bevorzugten Ausführungsform
unterstützt
sie keine Verzweigungen, Sprünge
oder Unterbrechungen. Der Startprogrammschrittzähler wird aus dem Arbeitspensum-Deskriptor
geladen, der weiter unten ausführlicher
beschrieben wird.
-
Vektorspeichereinheit
(VMU 260). Die VMU enthält
den Vektorspeicher (in 2 nicht abgebildet). Während jedes
Befehls kann sie eine Zeile oder einen Vektor aus dem Vektorspeicher
senden oder im Vektorspeicher eine Zeile empfangen. Der gleiche
Befehl kann außerdem
eine Skalarsendeoperation und/oder -empfangsoperation festlegen.
Die VMU ist die einzige Funktionseinheit, die mit der Außenwelt
verbunden ist, d. h. mit dem Außenbus 110.
-
Die
Codeerzeugungseinheit (CGU 262). Die CGU ist auf die Arithmetik
mit endlichem Feld spezialisiert. Z. B. kann die CGU zur Erzeugung
von Vektoren der CDMA-Codechips
und damit zusammenhängender Funktionen
verwendet werden, wie z. B. die Kanalcodierung und CRC.
-
ALU-MAC-Einheit
(AMU 264). Die AMU ist auf die reguläre Festkommaarithmetik und
Festpunktarithmetik spezialisiert. Sie unterstützt vektorübergreifende Rechenoperationen,
bei denen die Arithmetik elementweise an mehreren Vektoren durchgeführt wird.
Bei einer bevorzugten Ausführungsform
gewährleistet
die AMU auch einige vektorinterne Rechenoperationen, bei denen die
Arithmetik an den Elementen im Rahmen eines einzigen Vektors durchgeführt wird.
-
Mischungseinheit
(SFU 266). Die SFU kann Elemente eines Vektors nach einem
vorgegebenen Mischungsmuster neu anordnen.
-
Linksverschiebungseinheit
(SLU 268). Die SLU kann die Elemente des Vektors durch
eine Einheit, wie z. B. ein Wort, ein Doppelwort oder ein Quadwort,
nach links verschieben. Der erzeugte Skalar wird ihrem Skalarsegment
angeboten. In Abhängigkeit
vom Typ der ausgegebenen SLU-Vektoroperation ist der in Anspruch genommene
Skalar entweder gleich Null oder ihrem Skalarsegment entnommen.
-
Rechtsverschiebungseinheit
(SRU 270). Die SRU ähnelt
der SLU, verschiebt aber nach rechts. Außerdem besitzt sie die Fähigkeit,
fortlaufende Ergebnisse aus vektorinternen Rechenoperationen in
der AMU zusammenzuführen.
-
Die
folgende Tabelle zeigt, dass alle FU ein Funktionsvektorsegment
210 haben,
wobei einige kein Steuersegment
230 oder Skalarsegment
220 aufweisen.
Funktionseinheit | Steuerung | Skalar | Vektor |
| | | |
Befehlsverteilereinheit | Folgesteuerung,
Schleifendurchlauf | | Befehlsverteilung |
Vektorspeichereinheit | Adressenberechnung | E/A
Skalar | E/A
Vektor |
Codeerzeugungseinheit | | | Codevektorerzeugung |
ALU-MAC-Einheit | Indizieren | Übermitteln | Vektorübergreifend: ALU,
MAC; multipliz, ... |
| | Segmentierung | Vektorintern:
add, max |
Mischungseinheit | | | Vektormischung |
Linksverschiebungseinheit | | E/A
Skalar | Vektorverschiebung |
Rechtsverschiebungseinheit | | E/A
Skalar | Vektorverschiebungt |
-
Der
erfindungsgemäße Skalar-/Vektorprozessor
wendet die Parallelverarbeitung der Befehlsebenen bei zwei großen Verfahrensweisen
an:
Vektorverarbeitung, wo ein einziger Befehl Vektoren von
(skalaren) Daten veraibeitet. Diese Verfahrensweise ist auch als
Einzelbefehlsstrom und Mehrfachdatenstrom bzw. SIMD bekannt.
-
Parallele
Verarbeitung der Multifunktionseinheiten, wobei jede von ihnen Vektoren
verarbeitet. Das kann als eine (beschränkte) Form der Parallelverarbeitung
der VLIW-Befehlsebene
gesehen werden.
-
Es
sollte beachtet werden, dass diese beiden Formen der Parallelverarbeitung
auf einer Befehlsebene selbstständig
sind, und dass ihre Auswirkungen kumulativ sind.
-
Kommunikation zwischen den
FU
-
Die
Funktionseinheiten (FU) arbeiten parallel. Jede FU ist in der Lage,
Vektordaten zu empfangen und zu senden. Viele FU sind auch in der
Lage, Skalardaten zu empfangen und zu senden.
FU | Quelle | VMU | CGU | AMU | SFU | SLU | SRU |
Ziel | # Eingaben | | | | | | |
vmu | 1 | | | | | | | | | | | | |
cgu | 1 | | | | | | | | | | | |
amu | 2 | | | | | | | | | | | | |
sfu | 1 | | | | | | | | | | | | |
slu | 1 | | | | | | | | | | | |
sru | 1 | | | | | | | | | | | |
-
Alle
Funktionseinheiten arbeiten parallel. Beim Empfang ihres Befehlssegments
geben sie Daten ein, verarbeiten sie und geben sie aus, sowohl Vektor-
als auch – wo
zutreffend – Skalardaten.
Bei den FU erfolgt die Kommunikation strikt zwischen den Skalarsegmenten
oder zwischen den Vektorsegmenten (Kommunikation zwischen den FU).
Das heißt,
dass die Vektorsegmente aller FU – mit Ausnahme der IDU – durch
eine Pipeline miteinander verbunden sind. Bei einer bevorzugten
Ausführungsform
ist diese Pipeline auf Befehlsbasis konfigurierbar. Zu diesem Zweck
werden vorzugsweise die FU durch ein Verbindungsnetz miteinander verbunden,
was im Prinzip jedem Vektorsegment ermöglicht, einen Vektor von irgendeinem
der anderen Vektorsegmente während
jedes Zyklus zu empfangen. Diese Eigenschaft ermöglicht – unter anderem – die Schaffung
beliebiger Pipelines der FU (mit Ausnahme der IDU). Die sechs Funktionseinheiten,
die die Vektorbahn beeinflussen, können einen Vektor ausgeben
und ihn parallel während
jedes Taktzyklus zu anderen Einheiten senden. Sie können auch
einen Vektor von einer anderen Einheit empfangen. Das Netz ist fast
vollständig
angeschlossen. Nur die Netzverbindungen, die keine Bedeutung haben,
sind ausgelassen worden. Die AMU kann zwei Vektoren gleichzeitig
empfangen. Wie in 2 zu sehen ist, wird das Netz
vorzugsweise durch jede Funk tionseinheit gebildet, die als Signalquelle
(durch eine Scheibe angezeigt) mit einem Netzpfad verbunden ist.
Es ist mit allen anderen Pfaden als Signalempfänger (durch ein Dreieck angezeigt)
verbunden. Der Abschnitt des VLIW-Befehls für die Funktionseinheiten zeigt
an, von welchem Pfad es einen Vektor in Anspruch nehmen sollte.
Auf diese Weise kann die Pipeline auf der Grundlage eines Befehls
konfiguriert werden. Jeder Pfad kann einen vollständigen Vektor übertragen,
z. B. unter Verwendung von 256 parallelen Leitungen. In ähnlicher
Weise sind mindestens einige der Skalarsegmente der FU durch eine
separate Pipeline miteinander verbunden. Vorzugsweise ist diese
Pipeline auch auf der Befehlsgrundlage konfigurierbar. Das Verbindungsnetz
zwischen den Skalarsegmenten der FU kann in dem Sinne unvollständig sein,
dass kein Skalar zu einem Skalarsegment mindestens einer FU gesendet
oder von dort empfangen werden kann. Folglich können weniger Pipelineausrichtungen
vorgegeben werden. Die Skalar- und Vektor-Pipelines können selbstständig konfiguriert
werden. Dies geschieht z. B., indem im einschlägigen VLIW-Segment angezeigt
wird, dass sowohl die Skalar-Pipeline als auch die Vektor-Pipeline durch die
Funktionseinheit zu lesen sind.
-
Es
gibt keine Verknüpfbarkeit,
die zwischen den Steuersegmenten der unterschiedlichen Funktionseinheiten
vorgeschrieben ist. Diese Steuersegmente empfangen ein Segment des
VLIW-Befehls von der IDU, aktualisieren ihren eigenen Funktionszustand
und steuern ihre entsprechenden Skalar- und Vektorsegmente.
-
Kommunikation innerhalb der FU
-
Innerhalb
einer FU besteht ein enges Zusammenwirken zwischen diesen Segmenten
(Kommunikation innerhalb der FU). Das Zusammenwirken ist ein untrennbarer
Bestandteil der Funktionsweise der FU. Beispiele dafür sind die
SLU und SRU, in denen der erzeugte und/oder in Anspruch genommene
Skalar zum entsprechenden Skalarsegment der Funktionseinheit geliefert/aus
ihm entnommen wird.
-
Befehle
werden normalerweise in einem einzelnen Zyklus ausgeführt. Ausnahmen
werden durch Überlastung
im Vektorspeicher bedingt und zeigen sich als Stillstandszyklen.
-
Datenbreiten
-
Bei
einer bevorzugten Ausführungsform
unterstützt
der Skalar-/Vektorprozessor eine Mehrzahl von Datenbreiten und Datentypen,
wie in 3 zu sehen ist. Der Grundbaustein der Speicheradressierung
ist ein Wort, das auch als Einzelwort bezeichnet wird. Vorzugsweise
kann die Datenbreite ein Einzelwort (W), Doppelwort (DW oder 2 W
= 16 Bits) oder Quadwort (QW oder 4 W = 32 Bits) sein. Die Größe eines
Worts ist W = 8 Bits. Vorzugsweise erscheinen Skalare in drei Größen: (einzelne)
Worte, Doppelworte und Quadworte. Ein Vektor hat eine feststehende
Größe von PQ Quadworten. Er kann vorzugsweise in einem
der drei folgenden Formate strukturiert sein:
- – PQ Elemente in der Größe eines Quadwortes,
- – PD = 2PQ Elemente
mit der Größe eines
Doppelwortes,
- – PS = 2PD = 4PQ Elemente mit der Größe eines (einzelnen) Wortes.
-
Der
Indexierbereich eines Vektorelements ist [0 ... 4PQ – 1]. Daher
haben Doppelworte geradzahlige Indizes und die Indizes von Quadworten
sind Vielfache von Vier. 3 gibt einen Überblick über die
Datenmengen. Die Struktur ist völlig
skalierbar in PQ und wird für jede Vektorgröße PQ = 1 definiert. Jedoch für die meisten Situationen wird
es bevorzugt, eine Leistung von 2 für PQ zu
wählen.
Bei der bevorzugten Ausführungsform
ist PQ gleich 8, was eine Datenwegbreite
und Speicherbreite von 32 Worten zur Folge hat.
-
Befehle
-
Ein
CVP-Befehl ist entweder ein Steuerbefehl oder ein VLIW-Befehl. Steuerbefehle
können
z. B. eine Zero-Overhead-Loop-Initialisierungsein. Es gibt keine
Verzweigungen, Sprünge
oder Unterprogramme. Ein VLIW-Befehl wird in Segmente unterteilt,
bei denen jedes Befehlssegment die durch die entsprechende Funktionseinheit
auszuführende(n)
Operation(en) vorschreibt. Das Segment kann noch weiter in einen
Teil für
das Vektorsegment und das Skalarsegment (falls vorhanden) unterteilt
werden. Das Segment enthält
auch für
beide Teile Informati onen darüber,
welcher Netzteil für
den Datenempfang zu benutzen ist (ein Vektor oder mehrere Vektoren
für das
Vektorsegment und ein Skalar oder mehrere Skalare für das Skalarsegment).
-
Zustand des Skalar- bzw. Vektorprozessors
-
Der
Zustand des CVP besteht aus den kombinierten Zuständen seiner
Funktionseinheiten. Bei der bevorzugten Ausführungsform umfasst er:
- – den
Vektorspeicher (Teil der VMU);
- – den
Programmspeicher (Teil der DU);
- – Vektorregister
(alle Funktionseinheiten);
- – Skalarregister
(die meisten Funktionseinheiten);
- – Steuerregister,
einschließlich
der Programmschrittzähler
und Adressenversatzregister.
-
Zusätzlich zu
den Registern, die für
Programmierer sichtbar sind, enthält eine CVP-Ausführung
in typischen Fällen
zusätzliche
Register (Vektor-, Skalar- und Steuerregister) für das Pipelining und die Cachespeicherung.
Diese sind keine Bestandteile der Befehlslistenarchitektur der CVP.
-
Einige
der (Vektor-, Skalar- und Steuer-)Register sind so genannte Konfigurationsregister.
Der Inhalt eines Konfigurationsregisters kann nur aus dem Vektorspeicher
geladen werden. Es gibt keine andere Möglichkeit, seinen Wert zu verändern. Ein
Konfigürationsregister
unterstützt
die Konfiguration von Funktionseinheiten und definiert in typischer
Weise einen Funk tionsparameter. Durch das Speichern dieser „halbkonstanten” Funktionsparameter
in Konfigurationsregistern werden sowohl die Befehlsbreite als auch
der Speicherdatenverkehr beträchtlich
reduziert.
-
Ein Überblick über die
Bestandteile des CVP-Funktionszustandes wird in der unten gezeigten
Tabelle gegeben.
FU | Steuerweg | Skalarweg | Vektorweg |
| Daten | Konfiguration | Daten | Konfiguration | Daten | Konfiguration |
VMU | Versatz | 5 | Adressen-CU | 8 | | | Datenspeicher | 2048 | |
CGU | | | | | Zähler | 3 | Codes | 3 | Zustand | 6 | Masken | 2 |
| | | | | | | | | | | Polynome | 2 |
AMU | | | | 1 | Empfangen | 1 | Segmentgröße | 1 | Registerdatei | 16 | | |
SFU | | | | | | | | | Register | 1 | Shufflemuster | 4 |
SLU | | | | | Empfangen | 1 | | | Registerdatei | 2 | | |
SRU | | | | | Empfangen | 1 | | | Registerdatei | 2 | | |
IDU | PC | 1 | Schleifen-CU | 2 | | | | | Programmspeicher | 2048 | | |
-
Alle
Register, die für
den Programmierer sichtbar sind, können aus dem Vektorspeicher
geladen werden. Alle Register außer den Konfigurationsregistern
können
im Vektorspeicher gespeichert werden. Durch das Speichern der CVP-Register
am Ende eines Arbeitspensums und durch ihre Wiederherstellung zu
einem späteren
Zeitpunkt kann der CVP die Erfüllung
einer bestimmten Aufgabe fortsetzen, als wenn in der Zwischenzeit
keine anderen Arbeitspensa ausgeführt worden wären. Diese
Arbeitsgänge
zur Speicherung und Wiederherstellung sind der freien Auswahl und
vielleicht der Vorliebe des Nutzers überlassen und müssen ausdrücklich einprogrammiert
werden.
-
Die Speichereinheit
-
4 zeigt
ein Blockdiagramm der Speichereinheit (VMU 400), in der
die erfindungsgemäße Speicheranordnung
verwendet wird. Bei der unten beschriebenen, bevorzugten Ausführungsform
wird die Speichereinheit in einem Vektorprozessor in Verbindung
mit einem reellen Speicher mit einer Verarbeitungsbreite verwendet,
die einen ganzen Vektor speichern kann. Man wird anerkennen, dass
das gleiche Konzept auch Anwendung auf solche Skalarprozessoren
finden kann, wie z. B. die herkömmlichen
DSP. Die VMU enthält
und steuert den Vek torspeicher 410, der den anderen Funktionseinheiten
eine enorme Datenbandbreite zur Verfügung stellt. Der reelle Vektorspeicher 410 stützt sich
vorzugsweise auf einen SRAM mit einem Zugriffskanal. Da integrierte
SRAMs, die Ps·W
breit sind, nicht überall
erhältlich
sind, kann der reelle Speicher durch ein oder mehrere Registerbereiche
breite Random Access Memories (RAM) gebildet werden, die parallel
angeordnet sind. Vorzugsweise werden die Skalardaten im gleichen
Speicher wie dem gespeichert werden, der für die Speicherung der Vektordaten
genutzt wird. In solch einem System können Skalare mit Vektoren vermischt
werden, denen sie entsprechen. Aus Gründen der Kosteneffektivität und der
Gewährleistung
einer optimalen Speicherzugriffszeit ermöglicht der Speicher vorzugsweise
nur das Lesen und Schreiben vollständiger Vektorlinien. Als solcher
besteht der reelle Speicher logischerweise aus Linien, die jeweils
die Größe eines
Vektors haben. Um das Lesen und Schreiben der Skalare zu unterstützen, wird
zusätzliche
Hardware (Linien-Cache-Speicher 430 und Unterstützung 440 für die Skalarauswahl
im Rahmen einer Linie) genutzt, um Zugriff auf den reellen Speicher
mit Vektorbreite in skalarer Form zu haben.
-
5 zeigt
mehr Details der Anordnung. Sie zeigt den reellen Speicher 500 mit
einem vollbreiten Port 505 (bei diesem Beispiel mit der
Breite eines Vektors). In der Figur wird aber nur ein Leseport gezeigt.
Fachleute können
ohne weiteres die ähnliche
Anordnung für
das Schreiben von Daten erkennen. Zu dieser Anordnung zählt mindestens
ein Register der gleichen Breite, wie sie der Port 505 des
reellen Speichers aufweist. Zu sehen sind vier Register 510, 512, 514, 516.
Alle Register sind wahlweise an den Leseport 505 für den Datenempfang
anschließbar.
In der Figur ist ein Register 514 für das Lesen kleinerer Datenelemente
reserviert, bei diesem Beispiel: ein Skalar. Vorzugsweise passen
mindestens zwei der kleineren Datenelemente in das Register. Das
Datenregister 514 ist mit einem Leseport 525 verbunden,
der an eine Verarbeitungseinheit (oder allgemeiner: an eine Datensenke)
gekoppelt ist. Vorzugsweise wird ein Multiplexer 520 an
das Register 514 gekoppelt, um die relevanten skalaren
Daten aus dem Register auszuwählen.
Der Multiplexer kann durch die Nummer des Skalars im Register gesteuert
werden, die durch die niedrigstwertigen Bits der Adresse vorgegeben
ist (z. B. bei Verwen dung eines 256-Bit-Vektors mit 32 8-Bit-Worten
wird der Skalar durch die fünf
niedrigstwertigen Bits gekennzeichnet). Multiplexer sind bekannt
und werden deshalb nicht weiter beschrieben. Das Register ist an
den Leseport 505 des reellen Speichers für den Datenempfang
(volle Breite) angeschlossen. Im Allgemeinen kann es Nr-Skalar-Leseports
geben, die jeweils an ein Register mit Vektorbreite angeschlossen
sind. Das können
separate Register oder sogar das gleiche sein. Die Register sind
Bestandteil des Cache-Speichers 430 aus 4.
Die Multiplexer sind Bestandteil des Skalarauswahlblocks 440.
In ähnlicher
Weise kann es dort aber auch Nw-Skalar-Schreibports
mit Nw-vektorbreiten Registern (nicht abgebildet) geben, die im
Cache-Speicher 430 zur
Verfügung
stehen. Für
jeden Skalar-Schreibport ist das entsprechende Register im Cache-Speicher 430 an
einen vektorbreiten Demultiplexer von Nw-Eingabedaten angeschlossen,
um so auswählen
zu können,
welche Cache-Zeile in den reellen Speicher eingespeichert wird.
Wenn ein VMU-Befehl verlangt, dass mehrere Cache-Zeilen einzuspeichern
sind, erfolgt das sequentiell, indem alle anderen Funktionseinheiten
solange angehalten werden, bis alle Schreiboperationen beendet worden
sind. Bei Zugriffen auf unterschiedliche Schreibports (aber im gleichen
Befehl) ist es nicht gestattet, auf die gleiche Zeile im reellen Speicher
zuzugreifen. Wenn man von der Annahme einer räumlich-nahen Lage bei aufeinander
folgenden Skalarzugriffen ausgeht (z. B. aufeinander folgende Skalare,
die zu einer Verarbeitungsschleife gehören, werden im Wesentlichen
hintereinander im reellen Speicher 410 gespeichert), kann
die Häufigkeit
des Zugriffs auf den reellen Speicher 410 zum Laden/Speichern
dieser Register erheblich unter der Häufigkeit des skalaren Zugriffs
auf diese Register liegen.
-
Bei
der bevorzugten Ausführungsform
muss ein Vektor nicht auf Vektorgrenzen im Speicher ausgerichtet
werden. Als solcher kann ein Vektor, der aus PS Worten
besteht, eine beliebige Speicheradresse aufweisen. Eine Speicherzeile
hat die gleiche Größe, ihre
Startadresse ist aber definitionsgemäß ein Vielfaches von PS. (Um Zugriff auf die Zeilen zu haben, werden
die niedrigstwertigen 2log PS-Bits
der Adresse ignoriert.) Durch das Ermöglichen einer beliebigen Ausrichtung
der Vektoren (normalerweise eine Ausrichtung auf die kleinste Wortgrenze)
kann der Speicher besser genutzt werden, d. h. mit weniger leeren
Speicherplätzen.
Es werden Maß nahmen
getroffen, um dem Skalar-/Vektorprozessor zu ermöglichen, einzelne Vektoren
zu lesen/schreiben, während
der Vektor in zwei aufeinander folgenden Zeilen des reellen Speichers
gespeichert werden kann. Dafür
wird eine Ausrichtungseinheit für
Vektorsendeoperationen benutzt. Die Ausrichtungseinheit wird im
Block 440 in 4 gezeigt. Mehr Details werden
in 5 gezeigt. Die Ausrichtungseinheit 530 ist an
die zwei Zeilen-Cachespeicher 510 und 512 angeschlossen
(d. h. an zwei Register mit Vektorbreite), die beide Zeilen enthalten,
die vom angeforderten Vektor überspannt
werden. Wenn der Zugriff auf aufeinander folgende Vektoren erfolgt,
ist nur eine neue Zeile aus dem reellen Speicher abzurufen, da die
andere noch in einem dieser Zeilen-Cachespeicher vorhanden ist.
Die Teile der beiden im Cache abgespeicherten Zeilen, die den angeforderten
Vektor bilden, werden mit einem aus Multiplexer 530 bestehenden
Netz verbunden und dann in einem vektorbreiten Pipelineregister
gespeichert. Das Pipelineregister empfangt die Daten über einen Vektorleseport 535.
Aus dem Pipelineregister wird der Wert auf der Datensammelleitung
der VMU überlagen.
-
5 zeigt
auch ein weiteres vektorbreites Register 516 und einen
dazugehörigen
vektorbreiten Leseport 540, der das direkte Abrufen einer
Zeile aus dem Speicher aktiviert, in dem das Register als Cache-Speicher
fungiert.
-
Vorzugsweise
bleibt die Cachespeicherung rund um den Vektorspeicher dem Programmierer
verborgen. Trotz der Verwendung von Cache-Speichern zur Emulation
eines Mehrkanal-Vektorspeichers mit einem SRAM, der nur über einen
Zugriffskanal verfügt,
kann der Programmierer dann einen kohärenten Vektorspeicher voraussetzen.
Da jedes Register eine Kopie der möglicherweise gleichen Daten
im reellen Speicher enthalten kann, sollte dann die Kohärenz automatisch
aufrechterhalten werden, anstatt den Programmierer auf die Kohärenz aufpassen
zu lassen. Zu diesem Zweck erfolgt eine Überprüfung auf Adressenkonflikte,
d. h. es wird der Frage nachgegangen, ob es zu einer Schreiboperation
auf ein Register für
eine Zeilenadresse gekommen ist, bei der die gleiche Zeile auch
in einem der anderen Register gespeichert wird. Für eine solche Überprüfung reicht
es aus, bei jedem einzelnen Register die Zeilenadresse (den bedeutsamsten
Teil der Adresse) der in dem Register gespeicherten Zeile zu speichern.
-
Wenn
ein möglicher
Konflikt festgestellt wird, kann eine Korrekturmaßnahme getroffen
werden. Ein Leseregister wird zum Beispiel als ungültig markiert,
sobald eine Schreiboperation in einem Register mit der gleichen
Zeile vorgekommen ist. Von diesem Register kann kein weiterer Gebrauch
gemacht werden, wenn es nicht erneut aus dem reellen Speicher ausgelesen
worden ist (nachdem das Schreibregister zuerst in den Speicher zurück geschrieben
worden ist). Als Alternative dazu kann der Inhalt eines Schreibregisters
auf alle Leseregister mit der gleichen Zeile kopiert werden, nachdem
eine Schreiboperation auf das Schreibregister erfolgt ist. Eine
dritte Möglichkeit
besteht darin, bei den Lese- und Schreibports die Register gemeinsam
zu benutzen. Diese letztgenannte Verfahrensweise bedarf zusätzlicher
vektorbreiter Multiplexer, wodurch zwar die Kosten steigen, aber
auch ein Leistungsvorteil entsteht. Tatsächlich wird hier eine Umgehung
geschaffen, bei der ein an Leseports angeschlossenes Leseregister
umgangen wird und die Daten in Wirklichkeit aus einem Schreibregister über den
Leseport ausgelesen werden. All diese Korrekturmaßnahmen
erfolgen unter Nutzung einer Funktionsfähigkeit, die insgesamt als 'Kohärenzprüfer' bezeichnet wird.
Um festzustellen, wo möglicherweise
Daten in kopierter Form gespeichert sind (mit einem möglichen Übereinstimmungsproblem),
werden Kohärenzregister
verwendet, die Informationen über
den Inhalt speichern, der in dem Datenregister gespeichert ist,
mit dem das Kohärenzregister
verbunden ist. Das Kohärenzregister
speichert vorzugsweise die physische Adresse der Daten, die in dem
entsprechenden Datenregister gespeichert sind. Die gleichen Kohärenzprüfungen und
Maßnahmen
können
statt nur für
den Zugriff auf Skalare auch für
Vektorleseoperationen durchgeführt werden,
bei denen der Vektor (teilweise) in einem Register gespeichert wird,
das zu einem Schreibport gehört. Vorzugsweise
erfolgt eine Zeilenlese- oder Zeilenschreiboperation auf den reellen
Speicher in einem einzigen Taktzyklus durch einen einzigen Zugriff
auf den reellen Speicher 510.
-
Die
Vektorspeichereinheit kann bei einem einzigen VMU-Befehl bis zu
vier gleichzeitige „Teiloperationen” unterstützen:
einen
Vektor senden oder eine Zeile senden oder eine Zeile von/auf einem
VM-Platz empfangen;
einen Skalar aus einem VM-Platz senden;
einen
Skalar auf einem VM-Platz empfangen;
den Funktionszustand/die
Leistung einer Adressrechnungseinheit modifizieren.
VMU_cmd | =
(vopc, aid_v, ainc_v, sopc, aid_s, ainc_s, size, srcv, aid_r, ainc_r,
aopc, aid_a, imm_addr) |
vopc | = NOP|SENDL|SBNDV|RCVL_CGU|RCVL_AMU|RCVL_SFU|RCVL_SLU|RCVL_SRU |
Aid_v | =
{0, ..., 7} |
Ainc_v | =
NOP|INC |
sopc | =
NOP|SEND |
aid_s | =
{0, ..., 7} |
ainc_s | =
NOP|INC |
size | =
WORD|DWORD|QWORD |
srcv | =
NONE|VMU|AMU|SLU|SRU |
aid_r | =
{0, ..., 7} |
ainc_r | =
NOP|INC |
aopc | =
NOP|IMM|LDBASB|LDOFFS|LDINCR|LDBOUND |
aid_a | =
{0, ..., 7} |
imm_addr | =
{0.0, ..., 524288.31}|{–262144.0,
..., 262143.31} |
-
Der
Befehl der VMU kann in Abhängigkeit
von der Anzahl der Teiloperationen und der Kontinuität der Adressfolgen
eine variable Anzahl von Taktzyklen in Anspruch nehmen.
-
Die
VMU-Eingaben/Ausgaben sind folgende:
Eingabe | Erläuterung |
Cmd | VMU
Befehl |
rcv_amu | AMU
Vektorempfangsbus |
rcv_cgu | CGU
Vektorempfangsbus |
rcv_sfu | SFU
Vektorempfangsbus |
rcv_slu | SLU
Vektorempfangsbus |
rcv_sru | SRU
Vektorempfangsbus |
s_rcv_amu | AMU
Skalarempfangsbus |
s_rcv_slu | SLU
Skalarempfangsbus |
s_rcv_sru | SRU
Skalarempfangsbus |
Ausgabe | Erläuterung |
Snd | VMU
Vektorergebnis |
s_snd | VMU
Skalarergebnis |
-
Außerdem gibt
es zwei Skalarports (einen zum Senden, einen zum Empfangen), die
mit dem externen Bus zu verbinden sind. Die Aufgabe des Mikrokontrollers 130 besteht
darin, diese Speicherzugriffsmöglichkeiten
mit CVP-Befehlen zu synchronisieren.
-
Das
Vektorsegment der VMU enthält
den reellen Vektorspeicher
510:
Bezeichnung | Erläuterung |
mem
[4096][32] | Vektorspeicher:
4096 Zeilen mit jeweils 32 Worten |
-
Es
ist zu beachten, dass Vektorteiloperationen nicht auf den Skalarspeicher
zugreifen können.
Deshalb wird das bedeutsamste Adressenbit für Vektorteiloperationen ignoriert.
Das Vektorsegment der VMU unterstützt sieben Teiloperationen,
die in dem Befehlsfeld VOPC kodiert sind: Vektor senden (SENDV),
Zeile senden (SENDL) sowie fünf
Teiloperationen „Zeile
empfangen„ (RCVL_CGU,
RCVL_AMU, RCVL_SFU, RCVL_SLU und RCVL_SRU). Die Funktionseinheit,
die der Ausgangspunkt für
den Empfang ist, wird ausdrücklich
in der entsprechenden Teiloperation „Zeile empfangen„ kodiert.
Die Leseadresse oder Schreibadresse für jede Teiloperation wird durch
eine entsprechende Adressrechnungseinheit vorgegeben. Das Befehlsfeld AINC_V
wird von allen Vektorteiloperationen gemeinsam benutzt. Es wird
zu der im Befehlsfeld AID_V kodierten ACU weitergeleitet. Das Befehlsfeld
AINC_V gibt an, ob die betroffene Adressrechnungseinheit eine Nachinkrementierungsoperation
durchführen
sollte.
Schutz | Übergang |
vopc
= NOP | None |
vopc
= SENDL | snd
= mem.line[acu[aid_v].out] |
vopc
= SENDV | snd
= mem.vector[acu[aid_v].out] |
vopc
= RCVL_CGU | mem.line[acu[aid_v].out]
= rcv_cgu |
vopc
= RCVL_AMU | mem.line[acu[aid_v].out]
= rcv_amu |
vopc
= RCVL_SFU | mem.line[acu[aid_v].out]
= rcv_sfu |
vopc
= RCVL_SLU | mem.line[acu[aid_v].out]
= rcv_slu |
vopc
= RCVL_SRU | mem.line[acu[aid_v].out]
= rcv_sru |
-
Es
ist zu beachten, dass die Operationen als Sendeaktionen-(oder Empfangsaktionen)
und nicht als Ladeaktionen (oder Speicheraktionen) gedacht sind,
die einen Zielort (oder Ausgangsort) haben. Die letztgenannten werden
von Operationen in anderen Funktionseinheiten vorgegeben. Eine „Zeile
senden” entspricht in
funktioneller Hinsicht „Vektor
senden” mit
der gleichen Adresse. Die Teiloperationen „Zeile senden” werden normalerweise
genutzt, um Funk tionseinheiten zu konfigurieren oder den Zustand
einer Aufgabe in den verschiedenen Registern wiederherzustellen.
Durch Einführung
einer speziellen Betriebsart für
die Teiloperation „Zeile
senden”,
können
die Zugriffszeiten aufeinander folgender Vektorsendungen („vector
streaming”)
durch den effizienten Einsatz von Cache-Speichern optimiert werden.
-
Die
skalare Teiloperation der VMU wird im Befehlsfeld SOPC kodiert.
Sie unterstützt
nur die Teiloperation: Skalar senden (SEND). Die Leseadresse wird
von der Adressrechnungseinheit vorgegeben, die in dem Befehlsfeld
AID_S angegeben ist. Das Befehlsfeld AINC_S gibt an, ob diese Adressrechnungseinheit
eine Nachinkrementierungsoperation durchführen sollte. Der Operand SIZE
(WORD, DWORD oder QWORD) der skalaren Teiloperation wird durch das
Befehlsfeld SIZE determiniert.
Schutz | Übergang |
sopc
= NOP | None |
sopc
= SEND && size = WORD | S_snd
= mem.word[acu[aid_s].out] |
sopc
= SEND && size = DWORD | S_snd
= mem.dword[acu[aid_s].out] |
sopc
= SEND && size = QWORD | S_snd
= mem.qword[acu[aid_s].out] |
-
Die
Teiloperation „Skalar
empfangen” der
VMU wird im Befehlsfeld SRCV kodiert. Wenn der Wert gleich NONE
ist, wird kein „Skalar
empfangen” durchgeführt. Ansonsten
bestimmt das Befehlsfeld SRCV, welche Funktionseinheit als Ausgangsort
für die
Teiloperation „Skalar
empfangen” dienen
wird. Die Schreibadresse wird von der Adressrechnungseinheit vorgegeben,
die im Befehlsfeld AID_R angegeben ist. Das Befehlsfeld AINC_R gibt
an, ob diese Adressrechnungseinheit eine Nachinkrementierungsoperation
durchführen
sollte. Die Größe des Operanden
(WORD, DWORD oder QWORD) der Teiloperation „Skalar empfangen” wird von der
Größe des Ausgangsskalars
bestimmt.
Schutz | Übergang |
srcv
= NONE | None |
srcv
= VMU | mem.scalar[acu[aid_r].out]
= s_rcv_vmu |
srcv
= AMU | mem.scalar[acu[aid_r].out]
= s_rcv_amu |
srcv
= SLU | mem.scalar[acu[aid_r].out]
= s_rcv_slu |
srcv
= SRU | mem.scalar[acu[aid_r].out]
= s_rcv_sru |
-
Die
Telloperationen Senden und Empfangen können zu einer Skalarübertragungsoperation
von einem Vektorspeicherplatz zum anderen verknüpft werden. Die Adresse für jeden
Zugriff wird von einer entsprechenden Adressrechnungseinheit vorgegeben.
-
Das
Steuersegment der VMU 550 ist hauptsächlich eine Gruppe von Address-Computation Units (ACU)
oder Address Generation Units (AGU), die solche Adressierungsarten
unterstützen,
wie jene in den herkömmlichen
DSP. Eine solche Einheit führt
eine oder mehrere Adressenberechnungen pro Befehl durch, ohne den
Hauptdatenweg des Prozessors zu benutzen. Zum Beispiel kann die
Adresse eines Skalars nach jedem skalaren Lesezugriff nachinkrementiert
werden. Das macht es möglich,
dass die Adressenberechnung parallel zu Rechenoperationen an Daten
erfolgt, wodurch die Leistung des Prozessors verbessert wird. In
Abhängigkeit
von der unterstützten
Gruppe der Adressierungsarten braucht solch eine ACU den Zugriff
auf eine Anzahl von Registern. Zum Beispiel:
- – Eine relative
Adressierung, d. h. die Adressierung in Bezug auf eine so genannte
Basisadresse, bedarf eines Basisregisters base.
- – Der
Versatz in Bezug auf die Basisadresse wird in einem Versatzregister
offs gespeichert.
- – Vor-
bzw. Nachinkrementierung des Versatzes durch einen Wert, der in
einem Inkrementierungsregister incr gespeichert wird.
- – Moduloadressierung
in Bezug auf eine Adresse, die in einem Begrenzungsregister bound
gespeichert wird.
-
Mit
dieser Gruppe von Adressierungsarten kann Folgendes unterstützt werden.
Gehen Sie von der Annahme eines Versatzregisters offs aus. Nach
jedem Speicherzugriff (Lesen oder Schreiben) auf die Adresse base
+ offs wird das Register offs entsprechend dem offs = (offs + incr)
Modulo bound aktualisiert. Daher verändert sich offs häufig (nach
jedem Zugriff), während
die bei base, incr und bound gespeicherten Werte sich nicht häufig verändern. In
typischen Fällen
werden jene drei letztgenannten Register vor einer Programmschleife
initialisiert. Die Rechenoperation der ACU wird hier nicht im Detail
beschrieben.
-
Es
sollte beachtet werden, dass die oben erwähnten Ausführungsformen die Erfindung
mehr veranschaulichen als eingrenzen, und Fachleute werden in der
Lage sein, viele alternative Ausführungsformen zu ersinnen, ohne
vom Schutzumfang der beigefügten
Patentansprüche
abzuweichen. In den Patentansprüchen dürfen alle
in Klammern gesetzten Bezugszeichen nicht als Einschränkung des
Anspruchs ausgelegt werden. Die Wörter „umfassend” und „einschließlich” schließen neben den in einem Anspruch
genannten Elementen und Verfahrensschritten nicht das Vorhandensein
anderer Element oder Verfahrensschritte aus.
-
Datenmenge
zu bearbeiten, wobei die erste Datenbreite mindestens zweimal so
groß wie
die zweite Datenbreite ist.
-
15.
Verarbeitungssystem nach Anspruch 1, dadurch gekennzeichnet, dass
der Speicher in den Prozessor eingebaut ist.
-
Übersetzung der Zeichnungen
-
Fig.
1
rf
control = radio frequency control | Hochfrequenzregelung
bzw. -steuerung |
if/rf
= intermediate frequency/radio | |
frequency | Zwischenfrequenz/Hoch-
bzw. |
| Funkfrequenz, |
interface | Schnittstelle |
DSP
or | Digitaler
Signalprozessor oder |
μ controller | Mikrokontroller |
vector
memory | Vektorspeicher |
CVP
(Co-Vector-Processor) | Konvektorprozessor |
functional
units | Funktionseinheiten |
Fig.
2
control
section | Steuersegment |
scalar
section | Skalarsegment |
vector
section | Vektorsegment |
ctrl
= control | Steuerung
bzw. Regelung |
Fig.
4
ACU
= address computation unit | Adressrechnungseinheit |
address | Adresse |
physical
memory | Reeler
Speicher |
AMDC
SRAM | SRAM
von AMDC |
256
b wide data path | 256-Bit-breiter
Datenweg |
arbitration
+ control | Ausgleich
+ Steuerung |
line
caches | Zeilen-Cachespeicher |
vector
alignment | Vektorausrichtung |
scalar
selection | Skalarauswahl |
cmd
= command | Befehl |
external
bus (32 b) | externer
Datenbus (32 Bit) |
scalar
receive | Skalar
empfangen |
scalar
send | Skalar
senden |
vector/line
acc. | Vektor-/Zeilenzugriff |