-
Gebiet der Erfindung
-
Die vorliegende Erfindung bezieht
sich allgemein auf ein Verarbeitungsverfahren und eine Vorrichtung,
die eine Prozessorkonstruktion umfaßt, die eine Hashcodierung
verwendet.
-
Hintergrund
der Erfindung
-
Es sind Prozessoranweisungen bekannt,
die eine Verzweigung in Abhängigkeit
vom Wert eines gewissen Parameters, der an einer speziellen Position
(häufig
im Akkumulator der Prozessor-ALU) gespeichert ist, berücksichtigen.
Es sind auch Prozessoranweisungen bekannt, die einen Grad einer
Umleitung beim Zugreifen auf ein Element, das durch die Anweisung
gehandhabt werden soll, berücksichtigen;
damit ist gemeint, daß die
Position des Zielelements nicht direkt in der Anweisung spezifiziert
ist, sondern daß die
Anweisung stattdessen eine Position spezifiziert, die die Adresse
an der Position hält, die
das Zielelement speichert. Eine höher entwickelte Umleitung umfaßt eine
Vor- oder Nachindexierung basierend auf einem Wert, der in einem
spezifischen Prozessorregister gehalten wird (eine Vorindexierung involviert
ein Modifizieren der Adresse, die in der Anweisung spezifiziert
ist, wohingegen ein Nachindexieren ein Modifizieren der Adresse
involviert, die in der Position gespeichert ist, die in der Anweisung spezifiziert
ist).
-
Gemäß der EP-A-0 387 008 ist beispielsweise
bekannt, daß auf
eine Tabelle in einem Speicher bei einem Versatz relativ zu der
aktuellen Anweisung, die verarbeitet wird, zugegriffen wird, wobei
der Versatz auf Grundlage eines eingegebenen Datenwerts bestimmt
wird.
-
Bei einer Vorrichtung, wie z. B.
einem Paketschalter, muß ein
Steuerungsprozessor allgemein eine gewisse Aktion ba sierend auf
dem Wert einer eingegebenen Größe, wie
z. B. einer Paketdestinationsadresse, ausführen. Diese erwünschte Fähigkeit kann
als eine Verzweigungsoperation betrachtet werden, bei der der Prozessor
zu einer angeforderten Aktion abhängig vom Wert der eingegebenen
Größe verzweigen
muß. Alternativ
kann die gewünschte
Fähigkeit
mit einer Operation verglichen werden, die eine Umleitung involviert,
die durch den Wert der eingegebenen Größe nachindexiert wird. Bei
Anwendungen, wie z. B. einem Steuern eines Paketschalters, kann
jedoch der Bereich von möglichen
Werten der eingegebenen Größe sehr
groß sein,
selbst wenn nur ein sehr begrenzter Teilsatz dieser Werte von Interesse
sein mag. Die Standardverzweigungsanweisungen oder Anweisungen,
die eine Umleitung involvieren, können diese Anforderung nicht
in einer kompakten und einfachen Weise bewältigen und verwenden allgemein
eine Anzahl von Speicherplätzen,
die der Anzahl von möglichen
Werten der eingegebenen Größe entspricht.
-
Es ist eine Aufgabe der vorliegenden
Erfindung, eine kompakte und flexible Möglichkeit zum Steuern eines
Prozessors zu liefern, um auf Elemente in Abhängigkeit von dem Wert einer
eingegebenen Größe selektiv
zuzugreifen.
-
Wie nachstehend offensichtlich wird,
löst die vorliegenden
Erfindung diese Aufgabe durch Verwenden einer Hashicodierung. Die
Hashcodierung an sich ist eine hinreichend bekannte Technik, mit
der eine relativ lange Eingabe in eine kürze Ausgabe umgewandelt wird.
Die Hashcodierung wird für
viele unterschiedliche Zwecke einschließlich eines Speichernachschlagens
und zum Bilden von Nachrichtenauthentifizierungscodes verwendet.
Eine große
Anzahl von unterschiedlichen Hash-Codefunktionen sind bekannt.
-
Um das Verständnis für die vorliegende Erfindung
zu vereinfachen, erfolgt eine kurze Beschreibung der Hashcodierung,
das auf ein Speichernachschlagen angewendet wird, unter Bezugnahme
auf 1 der beigefügten Zeichnungen.
Spezieller soll in der Anordnung von 1 eine
Eingabe 10 (z. B. eine 48-Bit-Eingabe) verwendet werden,
um Daten wiederzugewinnen, die im Speicher 11 gehalten
werden. Bei dem aktuellen Beispiel sind nur eine relativ kleine
Anzahl von möglichen
Werten der Eingabe 10 von Interesse (z. B. sieben Werte).
Der Speicher ist mit einer Anzahl von Positionen 12, die
gleich oder größer als
die Anzahl von eingegebenen Werten von Interesse (jedoch kleiner
als alle möglichen
Eingabewerte) ist, versehen, und die Eingabe 10 wird auf
eine Hashcodierungsfunktion 13 angewendet, die die Eingabe 10 in
einen Index 14 einer kürzeren
Länge umwandelt,
der auf die Größe des Speichers
angepaßt ist
(bei dem aktuellen Beispiel könnte
dies ein 3-Bit-Index sein). Die Hashcodierungsfunktion 14 ist so
gewählt,
daß jeder
Eingabewert von Interesse einen eindeutigen Wert des Index 14 erzeugt
und dieser spätere
Wert dann verwendet wird, um auf eine entsprechende Position des
Speichers 11 zuzugreifen – wobei diese Position so beschaffen
ist, daß sie verwendet
wird, um Daten zu speichern, die dem entsprechenden Eingabewert
zuzuordnen sind.
-
Natürlich verursachen viele Werten
der Eingabe 10 die gleichen Indexwerte, jedoch besteht
lediglich der Wunsch, einen „Treffer" (bzw. „Hit") (eine gültige Ausgabe
von Daten vom Speicher 11) für den Eingabewert von Interesse
zu registrieren, der auf diesen Indexwert hash-codiert wird. Dementsprechend
speichert jeder Speicherplatz, zusammen mit den Daten, die ausgegeben
werden sollen, einen Überprüfungswert
entsprechend dem Eingabewert, für
die diese Daten gültig
sind. Wenn auf einen Speicherplatz 12 zugegriffen wird,
wird der Überprüfungswert
im Komparator 15 mit dem aktuellen Wert der Eingabe 10 verglichen,
und eine datengültiger
Ausgabe 16 wird nur produziert, wenn eine Übereinstimmung
vorliegt. Wenn der Überprüfungswert
und der Eingabewert nicht miteinander übereinstimmen, tritt ein „Fehlschlag" (bzw. „Miss") ein. Bei einer
sogenannten „perfekten" Hashcodierung, wo
jeder Eingabewert von Interesse durch die Hashcodierungsfunktion 13 in
seinen eigenen eindeutigen In dexwert abgebildet wird, ist dies das
Ende des Prozesses. Häufig
ist es jedoch effizienter, eine „nichtperfekte" Hashcodierung zu
praktizieren, bei der zwischen den Werten von Interesse Konflikte
bestehen. In solchen Fällen
sind verschiedene Strategien ausgearbeitet worden, z. B. kann die
indexierte Position einen Zugriff auf eine verknüpfte Liste von Werten von Interesse, die
dieser Position zugeordnet sind, liefern. Eine weitere Strategie
ist, eine erneute „Hashcodierung" auszuführen (d.
h. einen Hashcodierungsneuversuch auszuführen), wobei allgemein eine
andere Hash-Funktion als die ursprünglich verwendete verwendet
wird. Neue Hashcodierungsstrategien können sich auf mehrere Neu-Hashcodierungsversuche ausdehen,
die jeweils eine andere vorbestimmte Hash-Funktion aufweisen.
-
Die GB-A-2 148 562 offenbart ein
Bestimmen einer Prozedur, die durch einen Computer ausgeführt werden
soll, in dem die Zustandsregister des Computers hash-codiert werden,
um eine Zahl zu bilden, die das Verfahren anzeigt.
-
Eine hash-basierte Beschleunigung
von Leittabellenoperationen in einem ATM-Chipelement ist im Papier „An implementation
of hash-based ATM router chip" (Raskovic
u. a., 28. International Conference on System Sciences, Band 1,
3–6, Januar 1995,
Seiten 32–40,
XP002079415 Wailea, HI US) beschrieben.
-
Zusammenfassung
der Erfindung
-
Gemäß der vorliegenden Erfindung
wird ein Verarbeitungsverfahren geschaffen, bei dem eine programmgesteuerte
Verarbeitungseinrichtung im Verlaufe des Ausführens einer Anweisung eines
gegebenen Typs, der im Speicher gespeichert ist, dazu gebracht wird,
ein Element vom Speicher abhängig vom
Wert der Eingabedaten, die der Anweisung unterliegen, selektiv wiederzugewinnen.
Diese Anweisung weist einen Anfangsblock auf, der die Anweisung
des gegebenen Typs identifiziert, wobei das Verfahren folgende Schritte
aufweist:
- (a) Bestimmen, ob eine aktuelle Anweisung
durch die Verarbeitungseinrichtung des gegebenen Typs ausgeführt werden
soll;
- (b) wenn Schritt (a) bestimmt, daß die Anweisung des gegebenen
Typs ist, Verwenden der Eingabedaten, die der Anweisung unterliegen,
um einen Versatzwert zu erzeugen; und
- (c) Verwenden des Versatzwerts, der bei Schritt (b) erzeugt
wurde, um auf ein Element im Speicher zuzugreifen, relativ zu der
Position im Speicher der aktuellen Anweisung,
dadurch gekennzeichnet
daß:
- – die
Anweisung des gegebenen Typs einen Körper in der Form einer Hash-Tabelle
aufweist, die zumindest einen Eintrag mit sowohl (i) einem Überprüfungswert
entsprechend einem Wert von Interesse der Eingabedaten, die der
Anweisung unterliegen, als auch (ii) einem Element, das verwendet
werden soll, wenn die Eingabedaten den Wert von Interesse aufweisen;
- – bei
Schritt (b) diese Eingabe hash-codiert wird, um den Versatzwert
zu erzeugen, der dann bei Schritt (c) verwendet wird, um auf einen
entsprechenden Eintrag in der Hash-Tabelle der aktuellen Anweisung
zuzugreifen; und
- – wobei
das Verfahren einen weiteren Schritt aufweist:
- (d) Vergleichen des Werts der Eingabedaten mit dem Überprüfungswert,
der in dem Eintrag gehalten wird, auf den bei Schritt (c) zugegriffen
wurde, und Verfügbarmachen
des zugeordneten Eintrageelements Für aus schließlich eine wirksame Verwendung,
wenn die verglichenen Werte übereinstimmen.
-
In dieser Weise wird eine kompakte
Anweisung, die im Speicher wieder lokaliserbar ist, geschaffen,
die effektiv ist, um unterschiedliche Ergebnisse abhängig vom
Wert der Eingabedaten, die der Anweisung unterliegen, zu erzeugen:
-
Das Element, auf das bei Schritt
(d) zugegriffen wurde, kann durch die Verarbeitungseinrichtung auf
mehrere verschiedene Weisen verwendet werden. Somit kann das Element
als ein Steuerungswert ausgegeben werden und beispielsweise zum
Steuern einer Paketleitungsführung
in einem Paketschalter verwendet werden. Alternativ kann das Element, auf
das zugegriffen wurde, als ein Indikator der Position einer nächsten Anweisung
verwendet werden, die durch die Verarbeitungseinrichtung ausgeführt werden
soll. Eine weitere Verwendung des Elements, auf das zugegriffen
wurde, ist ein Rückgabewert,
der an eine vorherige Anweisung, die für ein Aufrufen der Anweisung
des gegebenen Typs verantwortlich ist, zurückgegeben wird, wobei der zurückgegebene Wert
beispielsweise als ein Index in einer Tabelle, die der vorherigen
Anweisung zugeordnet ist, verwendet wird.
-
Die Quelle der Eingabedaten, die
der Anweisung unterliegen, kann implizit sein (z. B. können alle solchen
Daten an der gleichen Quelle vorgesehen sein, wie allgemein der
Fall ist, wenn die Anweisung durch eine andere Anweisung aufgerufen
wird und die Eingabedaten als ein Aufrufparameter geleitet werden).
Alternativ kann der Anweisungsanfangsblock einen Eingabeauswahlparameter
umfassen, der einen Quellenindikator für die Eingabedaten 10 liefert.
Dieser Quellenindikator kann eine Speicher-/Registerposition spezifizieren,
die die Eingabedaten und/oder spezifischen Bits von Interesse von einer
breiteren Eingabe hält.
-
Der Anfangsblock der Anweisung kann
einen großen
Parameter umfassen, der die Größe der Hash-Tabelle
anzeigt, die im Körper
der Anweisung enthalten ist, wobei der Parameter von dieser Größe verwendet
wird, um die Größe und somit
den Wertebereich des Versatzwerts zu begrenzen, der bei Schritt
(b) produziert wurde, um diesen Wert an die Größe der Hash-Tabelle anzupassen.
-
Das Hash-Codieren der Eingabedaten
bei Schritt (b) kann unter Verwendung einer feststehenden Hashcodierungsfunktion
ausgeführt
werden. Vorzugsweise umfaßt
der Anfangsblock der Anweisung jedoch einen Hash-Steuerungscode,
und die Hashcodierung der Eingabedaten wird in Abhängigkeit
vom Wert dieses Hash-Steuerungscodes ausgeführt. Somit umfaßt Schritt
(b) bei einem Ausführungsbeispiel:
- – Bilden
eines umgewandelten Werts durch Kombinieren von zumindest Abschnitten
der unterschiedlichen Versionen der Eingabedaten, wobei der Hash-Steuerungscode
dazu dient, spezifische Parameter dieses Bildens zu setzen, und
- – Verwenden
des umgewandelten Werts, um den Versatzwert zu liefern.
-
Vorteilhafterweise sind die unterschiedlichen Versionen
der Eingabedaten bitverschobene Versionen der Eingabedaten, wobei
die Anzahl dieser unterschiedlichen Versionen und ihrer jeweiligen
Grade der Bitverschiebung durch den Hash-Steuerungscode bestimmt werden. Das
Kombinieren von zumindest der Abschnitte der unterschiedlichen Eingabedatenversionen
kann unter Verwendung einer exklusiven ODER-Operation ausgeführt werden.
-
Das Hash-Codieren in die Hash-Tabelle
muß nicht
perfekt sein, und eine beliebige Strategie, so wie z. B. eine neue
Hashcodierung, kann in Fällen übernommen
werden, wo mehr als ein Eingabedatenwert von Interesse auf den selben
Versatzwert hash-codiert wird.
-
Gemäß einem weiteren Aspekt der
vorliegenden Erfindung wird eine Vorrichtung geschaffen, die folgende
Merkmale aufweist:
- – eine Speichereinrichtung
zum Speichern eines Programms, das eine Anweisung eines gegebenen
Typs, die in einem Anfangsblock der Anweisung identifiziert ist,
umfaßt;
- – eine
Verarbeitungseinrichtung zum Ausführen des Programms in der Speichereinrichtung;
- – eine
Einrichtung zum Liefern von Eingabedaten;
- – eine
Versatzbestimmungseinrichtung, die auf die Verarbeitungseinrichtung
hin, die die Anweisung des gegebenen Typs verarbeitet, wirksam ist,
um die Eingabedaten zu verwenden, um einen Versatzwert zu erzeugen,
und
- – eine
Versatzzugriffseinrichtung zum Verwenden des Versatzwerts, um auf
die Speichereinrichtung bei einem Versatz relativ zu der Position
der aktuellen Anweisung zuzugreifen, die durch die Verarbeitungseinrichtung
ausgeführt
wird;
dadurch gekennzeichnet, daß die Vorrichtung angepaßt ist,
um die Anweisung des gegebenen Typs zu verarbeiten, wobei eine solche
Anweisung einen Körper
in der Form einer Hash-Tabelle aufweist,
die zumindest einen Eintrag mit sowohl (i) einem Überprüfungswert
entsprechend einem Wert von Interesse der Eingabedaten, die der
Anweisung unterliegen, als auch (ii) einem Element aufweist, das
durch die Anweisung verwendet werden soll, wenn die Eingabedaten
den Wert von Interesse aufweisen, wobei die Vorrichtung angepaßt ist,
um eine solche Anweisung zu verarbeiten durch:
- – die
Versatzbestimmungseinrichtung, die eine Hashcodierungseinrichtung
zum Hash-Codieren der Eingabedaten aufweist, um den Versatzwert zu
erzeugen,
- – die
Bereitstellung der Komparatoreinrichtung, die wirksam ist, um, nachdem
auf einen Hash-Tabelleneintrag
durch die Versatzzugriffseinrichtung während der Ausführung einer
Anweisung des gegebenen Typs durch die Verarbeitungseinrichtung zugegriffen
wurde, den Eingabedatenwert mit dem Überprüfungswert des Hash-Tabelleneintrags
zu vergleichen und zu bewirken, daß die Ausgabe des entsprechenden
Hash-Tabellenelements
erfolgt, wenn der Wert der Eingabedaten und der Überprüfungswert übereinstimmen.
-
Vorteilhafterweise umfaßt die Anweisung des
gegebenen Typs einen Hash-Steuerungscode, und das Hashcodierungseinrichtung
weist folgende Merkmale auf:
- – eine Einrichtung,
die wirksam ist, um, nachdem die Anweisung durch die Verarbeitungseinrichtung
ausgeführt
worden ist, die Eingabedaten und den Hash-Steuerungscode zu empfangen,
- – eine
Einrichtung zum Bilden eines umgewandelten Werts durch Kombinieren
von zumindest entsprechenden Abschnitten der mehreren bitverschobenen
Versionen der Eingabedaten, wobei die Anzahl solcher Versionen und
ihre jeweiligen Grade der Bitverschiebung durch den Hash-Steuerungscode
bestimmt werden, und
- – eine
Einrichtung zum Verwenden des umgewandelten Werts, um den Versatzwert
zu liefern.
-
Kurze Beschreibung
der Zeichnungen
-
Die Ausführungsbeispiele der Erfindung
werden nun mittels eines uneingeschränkten Beispiels unter Bezugnahme
auf die beigefügten
Diagrammzeichnungen beschrieben, wobei:
-
1 ein
Diagramm eines bekannten Speichernachschlagverfahrens unter Verwendung
einer Hashcodierungsfunktion ist;
-
2 ein
Diagramm ist, das eine Verarbeitungseinrichtung, die die vorliegende
Erfindung verkörpert,
darstellt;
-
3 ein
Diagramm eines Paketschalters ist, der ein Verarbeitungssystem von 2 verwendet, um eine Paketleitungsführung zu
steuern;
-
4 ein
Diagramm ist, das eine Sequenz von drei Anweisungen darstellt, die
zwei Verzweigungsanweisungen mit Hash-Tabellenkörpern zur Ausführung durch
das Verarbeitungssystem von 2 beim
Bewirken einer Operation gemäß der vorliegenden
Erfindung umfassen;
-
5 ein
Diagramm ist, das eine Sequenz von vier Anweisungen darstellt, die
eine aufgerufene Verzweigungsanweisung mit einem Hash-Tabellenkörper zur
Ausführung
durch das Verarbeitungssystem von 2 beim
Bewirken einer Operation gemäß der vorliegenden
Erfindung umfassen;
-
6 ein
Diagramm ist, das eine zweite Form eines Verarbeitungssystems darstellt,
das die vorliegende Erfindung verkörpert, wobei diese zweite Form ähnlich jener
ist, die in 2 gezeigt
ist, jedoch mit einem steuerbaren Hashcodierungfunktionsblock;
-
7 ein
Diagramm ist, das eine bevorzugte Form des steuerbaren Hashcodierungfunktionsblock von 6 darstellt;
-
8 ein
Diagramm ist, das einen Hash-Steuerungscode zeigt, der an den Hashcodierungfunktionsblock
von 7 geliefert wird;
-
9 ein
Blockschaltschaltungsdiagramm ist, das die Ableitung von einem Bit
eines umgewandelten Werts zeigt, der durch den Hashcodierungfunktionsblock
von 7 gebildet wird;
und
-
10 ein
Flußdiagramm
ist, das ein Hashcodierungsverfahren zeigt, das ein Ausführen von Neuversuchen
im Falle eines nicht validierten Speicherzugriffs involviert.
-
Beste Art und
Weise zum Ausführen
der Erfindung
-
2 stellt
ein Verarbeitungssystem dar, das eine Verarbeitungseinheit 55 aufweist,
die angeordnet ist, um Anweisungen auszuführen, die im Speicher 49 gehalten
werden. Diese Anweisungen umfassen eine Anweisung, um ein Element
von einem Speicher in Abhängigkeit
vom Wert einer Eingabe 10 wiederzugewinnen, wobei nur einige
der Eingabewerte von Interesse sind – Anweisung 50 ist eine
Anweisung dieses Typs.
-
Die Anweisung 50 umfaßt einen
Anweisungsanfangsblock 51, der den Anweisungstyp (BRANCH
(HASH BODY)) (bzw. Verzweigung (Hash-Körper)) identifiziert, und einen
Anweisungskörper 52 in
der Form einer Hash-Tabelle, die durch einen Satz von Überprüfungswert-/Elementpaaren, die
den jeweiligen der unterschiedlichen Eingabewerte von Interesse
entsprechen, gebildet ist. Diese überprüfungswert-/Elementpaare werden
in den Speicherpositionen im Anschluß an den Anweisungsan fangsblock 51 gehalten.
Die Wiedergewinnung des Elements, das einem Eingabewert von Interesse
entspricht, wird unter Verwendung einer Hashcodierung, die nun beschrieben
wird, erreicht.
-
Der Anweisungsanfangsblock 51 wird
an ein Anweisungsregister 56 der Verarbeitungseinheit 55 geleitet,
wenn die Anweisung durch die Einheit aufgerufen wird (ein Anweisungsadreßregister 57 in
der Einheit 55 hält
die Adresse der Anweisung, die geholt und ausgeführt werden soll). Der Anweisungsanfangsblock
dient zum Identifizieren des Anweisungstyps bezüglich der Verarbeitungseinheit 55. Der
Anweisungsanfangsblock 51 umfaßt auch ein Feld IN_SEL, das
dazu dient, die Quelle der Eingabe 10 zu spezifizieren,
und die Inhalte dieses Felds werden vom Anweisungsregister 56 an
eine Eingabeauswahleinheit 58 geleitet, die die gewünschte Eingabe
abholt. Der Anweisungsanfangsblock umfaßt ferner ein Feld, das eine
Indexbreite (IND_W) spezifiziert, die an den Hashcodierungfunktionsblock 13 geleitet
wird. Block 13 erzeugt einen Versatzindex 14,
der in der Einheit 60 zu der Basisadresse hinzugefügt wird,
die durch die Adresse im Speicher der Anweisung 50 dargestellt
wird. Das Ergebnis wird dann verwendet, um auf die entsprechende
Speicherposition zuzugreifen und das Überprüfungswert-/Elementpaar wiederzugewinnen,
das darin gehalten wird. Wenn der wiedergewonnene Überprüfungswert
und der aktuelle Eingabewert übereinstimmen,
wird das entsprechende Element ausgegeben; ansonsten wird ein Fehlschlag
gemeldet. Wie das Ausgabeelement verwendet wird, kann in dem Anweisungsanfangsblock
spezifiziert sein oder kann in das Element an sich kodiert werden;
typischerweise handelt es sich bei dem Element um eine Aktion, die ausgeführt werden
soll, einen Rückgabewert,
oder eine Sprunganweisung zur Verarbeitungseinheit 55.
-
Der Zweck des Indexbreitenparameters IND_W
ist, die Größe des Index 14 (und
somit die Anzahl von möglichen
Speicherpositionen, auf die er zeigen kann) auf die Größe des Hash- Tabellenkörpers 51 der
entsprechenden Anweisung 50 anzupassen.
-
Der Block 13, die Einheit 60 und
der Komparator 15 können
als eine Hashcodierungseinheit 59 des Verarbeitungssystems
von 2 bildend betrachtet
werden.
-
3 stellt
eine Anwendung des Verarbeitungssystems von 2 auf die Steuerung eines Paketschalters
dar. Fachleute werden darauf hingewiesen, daß der dargestellte Schalter
vereinfacht worden ist, wobei dies vorgenommen wird, um ein Verständnis der
Operation des Verarbeitungssystems von 2 in Zusammenhang mit dem Schalter zu vereinfachen.
Der Schalter weist zwei Ports A und B zum Empfangen und Senden von
Paketen auf. Die Ports werden durch einen Bus 75 miteinander
verbunden, über
den die empfangenen Pakete zwischen den Ports geleitet werden können. Der
Bus 75 ist ebenfalls mit einer Steuerung 70 verbunden.
Die Rolle der Steuerung 70 ist es, die eingehenden Pakete, die
an den Ports A und B empfangen werden, zu führen, indem jeder Port angewiesen
wird, welche Pakete durch diesen Port auszugeben sind. Die Steuerung trifft
ihre Leitungführungssentscheidung
für ein
Paket basierend auf der Paketdestinationsadresse, die im Paketanfangsblock
enthalten ist (in dem vorliegendem Beispiel ist diese Destinationsadresse
eine 16-Bit-Adresse),
und einem Zwei-Bit-Port-Identifizierer, der den Port identifiziert,
an dem das Paket empfangen wurde (z. B. kann Port A durch einen
binären Wert
von „01" bezeichnet sein
und Port B durch einen binären
Wert von „10"). Diese Informationen
werden der Steuerung 70 zur Verfügung gestellt, in dem für jeden
Port Vorkehrungen getroffen werden, den entsprechenden Portidentifizierer
an jeden Paketanfangsblock im voraus anzuhängen, bevor das Paket auf den
internen Bus 75 gesetzt wird, wobei der Paketanfangsblock
und der im voraus angehängte
Portidentifizierer dann außerhalb
des Busses 75 durch die Steuerung empfangen und in einem
Eingaberegister 71 gespeichert werden (in der Praxis würde dazu
eine Warteschlangenanordnung verwendet wer den). Nachdem die Steuerung
ihre Leitungsführungsentscheidung
getroffen hat, plaziert sie das Ergebnis in einem Ausgaberegister 72,
von wo aus es an die Ports geleitet wird, um zu bestimmen, welcher Port,
wenn überhaupt,
das Paket ausgeben wird.
-
Neben den Eingabe- und Ausgaberegistern 71, 72 weist
die Steuerung 70 die Verarbeitungseinheit 55 von 2, den Anweisungsspeicher 49,
das Hashcodierungseinheit 59 und die Eingabeauswahleinheit 58 auf.
-
Der Betrieb der Steuerung wird zuerst
bezüglich
der Sequenz von drei Anweisungen, die in 4 gezeigt sind, berücksichtigt, wobei diese Anweisungen
im Speicher 49 gehalten werden. Alle drei Anweisungen weisen
einen Anweisungsanfangsblock und einen Anweisungskörper auf,
jedoch sind nur die zweite und die dritte Anweisung vom vorstehend
beschriebenen BRANCH- (HASH-BODY-) Typ. Die erste Anweisung ist
ebenfalls eine BRANCH-Anweisung, jedoch enthält ihr Körper eine einfache Nachschlagtabelle,
in die direkt durch den Wert der Eingabegröße indexiert wird, die durch
einen IN_SEL-Parameter, der im Anweisungsanfangsblock enthalten
ist, spezifiziert ist. Diese Anweisung wird als eine Anweisung bezeichnet,
die vom Typ BRANCH (TABLE BODY) ist. Der Anfangsblock der ersten
Anweisung enthält
auch einen IND_W-Parameter,
der die gleiche Funktion wie für
die BRANCH- (HASH-BODY)
Anweisung 50 aufweist.
-
Die erste Anweisung wird verwendet,
um auf die zwei Port-Identifiziererbits
der Paketinformationen, die im Eingaberegister 71 (IN_SEL-Parameter, der
auf PORT gesetzt ist) gehalten werden, einen Blick zu werfen. Im
vorliegenden Fall weist der Portidentifizierer einen Wert von „1" oder „2" auf und führt dazu,
daß auf
eine entsprechende der Anweisungskörper-Speicherpositionen zugegriffen
wird. Weil der Portidentifizierer zwei Bits beträgt, ist die Anweisungskörpertabelle
dimensioniert, um vier Ergebnisse an entsprechenden Positionen {0}
bis {3} zu speichern, obwohl bei dem vorliegenden Beispiel nur zwei
tatsächlich bei
dem vorliegenden Beispiel nur zwei tatsächlich erforderlich sind. Tatsächlich werden nur
zwei Speicherworte für
die vier möglichen
Ergebnisse verwendet (somit weist der Parameter IND_W nur einen
Wert von eins auf, was eine Tabellengröße von zwei Speicherworten
anzeigt), weil in dem vorliegenden Fall jedes Speicherwort zwei
Ergebnisse halten kann. Es wird ebenfalls darauf hingewiesen, daß die in
den Anweisungsbeispielen von 5 und 4 angegebenen Zahlen in einer
hexadezimalen Notierung erfolgen.
-
Die in dem Körper der ersten Anweisung gespeicherten
Ergebnisse zeigen an, welche der zweiten und dritten Anweisung nun
ausgeführt
werden soll. Spezieller, wenn der Portidentifizierer einen Wert von „1" aufweist, dann wird
das Ergebnis, auf das zugegriffen wurde, die Adresse <0007> der zweiten Anweisung
sein, wohingegen, wenn der Portidentifizierer einen Wert „2" aufweist, das Ergebnis,
auf das zugegriffen wurde, die Adresse <000F> der
dritten Anweisung sein wird. Die Verarbeitungseinheit 55 nimmt
die Adresse, auf die zugegriffen wurde, und gewinnt die entsprechende
Anweisung wieder.
-
Die Anweisung von der zweiten und
dritten Anweisung, auf die gesprungen wurde, richtet dann ihren
Blick auf die sechzehn Destinationsadressenbits, die im Register 71 gehalten
werden (IN_SEL, gesetzt auf DA) und hash-codiert dieselben (unter Verwendung
einer Hashcodierungseinheit 59), um einen Versatzindex
zum Zugreifen in den Hash-Tabellenkörper zu
ermöglichen.
Bei dem vorliegenden Beispiel sind nur zwei Destinationsadressen
von Interesse, nämlich
die Adresse <0002> für Pakete, die am Port A empfangen
werden, und die Adresse <FFFI> für Pakete, die am Port B empfangen
werden. Die Größe der Hash-Tabelle
ist hier vier Worte (IND_W = 2), wobei jedes Wort einen Hash-Tabelleneintrag hält, Ein
Hash-Tabellen-„Treffer" führt zur
Ausgabe einer Portaktionsanweisung (ACTION 1 oder ACTION 2 in dem
aktuellen Beispiel), die unter der Steuerung der Verarbeitungseinheit 55 im
Ausgaberegister 72 gespeichert ist, um eine Leitungsführung des Pakets
zu bestimmen. Wenn kein „Treffer" erreicht wurde,
wird das Ausgaberegister nicht gesetzt und das Paket wird nicht
weitergeleitet.
-
Die Anweisungssequenz von 4 verwendet eine jeweilige
Hash-Tabelle für
jeden Port. Obgleich BRANCH (HASH BODY) eine kompakte Möglichkeit
zur Handhabung eines großen
Bereichs von potentiellen Destinationsadreßwerten ist, wobei die Anzahl
von Adressen von Interesse groß ist
(Tausende und nicht die zwei vom Beispiel von 4), wird bevorzugt, die Adressen nur
einmal aufzulisten, d. h. nur eine BRANCH- (HASH BODY-) Anweisung
und nicht zwei aufzuweisen. Dies kann durch Behandeln der Anweisung
als eine aufgerufene Funktion erreicht werden, die einen Nachschlagtabellenindex, wie
nachstehend unter Bezugnahme auf die Anweisungssequenz von 5 beschrieben wird, zurückgibt.
-
In der Anweisungssequenz von 5 ist die erste Anweisung
mit der Sequenz in 4 identisch, nämlich eine
BRANCH- (TABLE BODY-)
Anweisung, die einen Blick auf die Portidentifiziererbits wirft
und einen Sprung zur zweiten oder dritten Anweisung in Abhängigkeit
vom Wert des Portidentifizierers ausführt. Die zweite und dritte
Anweisung sind ebenfalls BRANCH- (TABLE BODY-) Anweisungen – diese
Anweisungen enthalten spezifische Aktionen, die am Ausgaberegister 72 für die spezifischen
Destinationsadressen von Interesse hinterlegt werden sollen, die
an den Port A bzw. B empfangen werden. Der Index im Tabellenkörper von
jeweils der zweiten und dritten Anweisung wird durch die Eingabequelle,
die durch den IN_SEL-Parameter angezeigt ist, geliefert. In diesem
Fall ist der IN_SEL-Parameter auf CALL <000F> für beide
Anweisungen gesetzt, um anzuzeigen, daß der Index, der verwendet
werden soll, der Wert ist, der vom Aufrufen der Anweisung zurückgegeben
wurde, die an der Adresse <000F> positioniert ist.
Die aufgerufene Anweisung (die vierte Anweisung von 5) ist eine BRANCH- (HASH BODY-) Anweisung,
die die Destinationsadressenbits hashcodiert, um einen Versatz in
ihrem Hash-Tabellenkörper
zu liefern. Der Hash-Tabellenkörper
enthält
die Rückgabewerte,
die an die Aufrufanweisung zurückgegeben
werden sollen. Unter Verwendung der selben zwei Destinationsadressen
von Interesse wie im Beispiel von 4,
resultiert die Adresse <0002> in einen Wert von „1", der zurückgegeben
wird, während
der Adreßwert <FFF1> in den Wert „2" resultiert, der
zurückgegeben
wird. Ein Hash-Tabellen-„Fehlschlag" führt dazu,
daß ein
Nullwert zurückgegeben wird.
Wie aus einer Studie von 5 zu
ersehen ist, wenn die aufrufende Anweisung die zweite Anweisung
(Port A, der Empfangsport) war, führt nur ein Rückgabewert
von „1" zur Ausgabe einer
Aktion (ACTION 1). Wenn desgleichen die aufrufende Anweisung die
dritte Anweisung (Port B, der Empfangsport) war, führt nun
ein Rückgabewert
von „2" zur Ausgabe einer
Aktion (ACTION 2).
-
Der Prozeß des Aufhebens der Operation der
aufrufenden Anweisung, während
die aufgerufene Anweisung ausgeführt
wird, wird in einer Standardweise unter Verwendung eines Stapels
vorgenommen, auf dem und von dem entsprechende Parameter des Betriebs
geschoben und entnommen werden.
-
6 stellt
eine Variante der Form des Verarbeitungssystems von 2 dar, bei dem die Hash-Funktion, die
durch den Hashcodierungs-Funktionsblock 13 verwendet wird,
durch einen Hash-Steuerungscode (HCC) 20 gesteuert wird,
der im Anfangsblock 51 von jeder Verzweigungsanweisung
umfaßt
ist, deren Körper
in der Form einer Hash-Tabelle ist. Nachdem eine solche Anweisung 50 in
die Verarbeitungseinheit 55 vom Speicher 49 geladen
worden ist, wird der Hash-Code an den Block 13 geleitet,
um Parameter der Hash-Funktion zu bestimmen, die zur Hashcodierung
der Eingabedaten, die der Anweisung unterliegen, verwendet werden
sollen. Weil die Hashcodierungfunktion gesteuert werden kann, kann
sie angepaßt
werden, um für
unterschiedliche Suchraumprobleme zu passen (d. h. um Situationen
zu entsprechen, die sich voneinander bezüglich der Charakteristika der
Eingabe relativ zur Anzahl und Identität der Eingabewerte von Interesse
un terscheiden), wobei der durch den Block 13 erzeugte Index 14 auf
einen entsprechend dimensionierten Speicherplatz, der für die aktuelle
Eingabe relevant ist, angewendet wird.
-
7 stellt
das Prinzip der Operation von einer Form des Blocks 13 dar,
der zur Verwendung im System von 6 geeignet
ist. Der Block 13 von 7 weist
einen Kombinationsblock 22 und einen Bitauswahlblock 23 auf.
Der Kombinationsblock 22 dient dazu, einen Zwischenwert 27 zu
bilden (der nachstehend als „umgewandelter
Wert" bezeichnet wird),
indem in einem Exklusiv-ODER-Block 26 unterschiedliche
bitverschobene Versionen 25A, 25B und 25C der
Eingabe 10 kombiniert werden. Die Anzahl und der Grad der
Bitverschiebung dieser Eingabeversionen 25 wird durch den
Hash-Steuerungscode 20 bestimmt.
Der Bitauswahlblock bildet dann den Index 14, indem die
Bits von dem umgewandelten Wert 27 ausgewählt werden, wobei die Anzahl dieser
Bits durch einen Indexbreitenparameter 21 (der in effektiver
Weise die Größe des Speicherplatzes
spezifiziert, auf den durch den Index 14 zugegriffen wird)
bestimmt wird.
-
Wie der Hash-Steuerungscode 20 verwendet
wird, um zu steuern, welche Eingabeversionen zusammen kombiniert
werden, ist in 8 diagrammatisch
dargestellt. Der Kombinierungsblock 22 weist das Potential
auf, um (zumindest begrifflich, wenn nicht ausdrücklich) P-Bit-verschobene Versionen
der Eingabe zu erzeugen, wobei diese Versionen mit Version 0 bis
Version (P-1) in 8 gekennzeichnet
sind. Diese Versionen werden in progressiver Weise weiter nach rechts
um Inkremente von einem Bit von Version 0 zu Version (P-1) bitverschoben,
wobei die Version 0 relativ zur Originaleingabe 10 (d.
h. um 1 linksverschoben) rechtsverschoben wird (–1). Bei dem vorliegenden Beispiel
wird die Eingabe verschoben und nicht zirkuliert, um die eingegebenen Versionen
0 bis (P-1) mit Nullwerten zu bilden, die hinzugefügt werden,
um ansonsten undefinierte Bitpositionen außerhalb der Eingabesequenz
zu füllen.
-
Der Hash-Steuerungscode 20 weist
P-Bits auf, die sich von Bitposition 0 zur Position P-01 erstrecken.
Wenn der Code 20 in einer speziellen Bitposition eine „1" aufweist, dann wird
die entsprechende Eingabeversion dem XOR-Block 26 zur Kombination
mit anderen Versionen, die so präsentiert
wurden, präsentiert.
Wenn die Bitpositionen 2, 7 und 9 des Codes 20 beispielsweise
Einsen sind und alle anderen Positionen null, dann werden die eingegebenen
Versionen 2, 7 und 9 (entsprechend den Rechtsverschiebungen von
1 Bit, 6 Bits bzw. 8 Bits) im XOR-Block 26 kombiniert,
um den umgewandelten Zwischenwert 27 zu bilden.
-
9 stellt
den Schaltungsaufbau zum Bewirken einer Versionsauswahl und Kombination
zum Erzeugen eines Bit (dem Bit in Position „n") des umgewandelten Werts 27 dar.
Spezieller wird der Hash-Steuerungscode im Register 32 gehalten,
und jedes Bit wird verwendet, um ein entsprechendes Zwei-Eingabe-AND-Gatter 30 zu
steuern. Die Ausgaben von allen Gattern 30 werden einem
XOR-Gatter 31 zugeführt.
Die andere Eingabe von jedem Gatter 30 empfängt das
Bit „n" der eingegebenen
Version, die dem Hash-Steuerungscode-Bit entspricht, das dieses
Gatter steuert (wobei Bit 0 die erste Bitposition in jeder Version
ist). Diese Bit-„n"-Werte für alle eingegebenen
Versionen können
einfach durch Abgreifen entsprechender Zellen eines Registers 33 abgeleitet
werden, das die Eingabe 10 hält, die an jedem Ende mit Null-Bits
aufgefüllt
ist. Somit ist das Bit „n" der Eingabeversion „m" das Bit (m + n – 1) der
Eingabe 10.
-
Wie offenbar wird, wird nur das Bit „n" der Eingabeversionen,
die durch die entsprechenden Bits des Hash-Steuerungscodes 32 freigegeben
werden, an das XOR-Gatter 31 geleitet. Dieses Gatter erzeugt
eine Ausgabe „1", wenn es mit einer
ungeraden Zahl von Einsen und Nullen, die ansonsten ausgegeben werden,
versorgt wird.
-
Der Schaltungsaufbau von 9, mit Ausnahme der Register 32, 33,
wird für
jedes Bit des umgewandelten Werts wiederholt (der beispielsweise ein
16-Bit-Wert sein kann).
-
Bezüglich des Bitauswahlblocks 23 nimmt dieser
bei dem vorliegenden Beispiel das Bit 1 bis Bit (Indexbreite) des
umgewandelten Werts und gibt dieselben als den Index 14 aus.
Komplexere Auswahlmuster können
alternativ verwendet werden. Ein geeigneter Schaltungsaufbau zum
Implementieren von Block 23 ist Fachleuten bekannt.
-
Mittels eines Beispiels unterscheiden
ein Hash-Steuerungscode
von h1dbb764747a (wobei h eine hexadezimale Notation anzeigt) und
eine Indexbreite von 3 zwischen den nachfolgenden sechs 48-Bit-Eingabewerten:
h080009732b60
h080009732d68
h080009732fd8
h080009732de8
h080009732cf8
h0800097329d8
-
Aus dem Vorstehenden ist zu erkennen,
daß der
Hash-Steuerungscode
eine praktische und flexible Möglichkeit
zum Liefern einer sehr großen
Anzahl von unterschiedlichen Hash-Funktionen ermöglicht. Die Bestimmung des
Hash-Steuerungscodes,
der notwendig ist, um die Hash-Funktion zu erzeugen, die für einen
speziellen Zweck am besten geeignet ist (z. B. zum Erreichen einer
perfekten Hashcodierung innerhalb eines minimalen Speicherplatzes),
kann durch einen automatisierten Trial-Error-Prozeß bestimmt
werden. Sobald der gewünschte
Hash-Steuerungscode bestimmt worden ist, kann er dann auf den Hashcodierungsfunktionsblock 13 angewendet werden,
immer wenn eine relevante Eingabe 10 empfangen wird. Gleichzeitig
wird auch die entsprechende Indexbreiteneingabe 23 geliefert.
-
Tatsächlich könnte die Trial- und -Errorbestimmung
eines geeigneten Hash-Steuerungscodes potentiell lange dauern, und
es ist daher angemessen, Schritte zu unternehmen, um die Aussichten
auf einen Erfolg zu verbessern, wenn Trial-und-Error kein erfolgreiches Ergebnis
nach einer gegebenen Anzahl von Versuchen erzeugt. Speziell kann
die Größe der Indexbreite
erhöht
werden, um ein größeres Ziel
zu ergeben (wobei der Nachteil ist, daß mehr Speicher erforderlich
ist). Ein weiterer Lösungsansatz
ist, eine Neu-Hashcodierung
zu ermöglichen – d. h.
nicht immer zu versuchen, eine perfekte Hashcodierung zu erreichen,
sondern zu ermöglichen, daß Eingabewerte
von Interesse auf denselben Index hashcodiert werden können (und
somit Speicherplatz) wobei nur einer dieser Werte validiert wird – wobei
beliebige nichtvalidierte Zugriffe auf einen Speicherplatz zu einer
neuen Hashcodierung unter Verwendung einer anderen Hash-Funktion
Anlaß geben.
-
Dieser Lösungsansatz ist in 10 dargestellt, wo die Schritte 40 bis 46 im
Feld 38 den gesamten Hashcodierungsprozeß darstellen.
Spezieller wird bei Schritt 40 ein erster Speicherzugriffsversuch an
der Eingabe 10 unter Verwendung des bereitgestellten Hash-Steuerungscodes 20 (und
der Indexbreite, wobei letztere nicht dargestellt ist, da sie für den gesamten
Hashcodierungsprozeß konstant
ist) geliefert. Bei Schritt 41 wird die Validität des Speicherzugriffsversuchs
geprüft,
indem die Eingabe 10 mit dem Überprüfungswert, der in der Position,
auf die zugegriffen wurde gespeichert ist, verglichen wird. Ist
er validiert (ein „Treffer") wird der Hashcodierungsprozeß verlassen.
Wenn jedoch kein „Treffer" erreicht wird, wird
ein neuer Speicherzugriffsversuch unter Verwendung eines Hashsteuerungs-Steuerungscodes
unternommen, der von einem Satz 47 von vorbestimmten Codes
ausgewählt
ist. Die Identität
des gewählten
Codes wird durch Bestimmen (Schritt 42) des Werts einer
Index idx in den Satz 47 auf Grundlage der abschließenden Bits
des bereitgestellten Hash-Steuerungscodes 20 gegeben. Unter Verwendung
des ausgewählten
vorbestimmten Hashsteuerungscodes wird ein neuer Zugriffsversuch
unternommen (Schritt 43), und seine Validität wird überprüft (Schritt 44).
Wenn ein „Treffer" erreicht wird, wird
der Hashcodierungsprozeß verlassen,
ansonsten wird der Wert von idx inkrementiert (Schritt 46)
und ein weiterer Neuversuch mit dem neu vorbestimmten Hashsteuerungscode,
auf den durch idx gezeigt wird, vorgenommen. Die Anzahl von Neuversuchen,
die erlaubt ist, ist durch einen Neuversuchwert 39 begrenzt,
wobei die aktuelle Anzahl von Neuversuchen gegenüber diesem Wert 39 bei
Schritt 45 getestet wird (wobei darauf hingewiesen wird,
daß ein
Zählwert über die
Anzahl von Neuversuchen gehalten wird). Wenn nach der maximalen
Anzahl von zulässigen
Neuversuchen „kein" Treffer erreicht
wird, wird ein „Fehlschlag" ausgegeben, um anzuzeigen, daß der Eingabewert
keiner von Interesse war, und der Hashcodierungsprozeß wird verlassen.
Es wird darauf hingewiesen, daß der
anfängliche
Hashsteuerungscode 20, die Indexbreite und die Anzahl von
zulässigen
Neuversuchen gewählt
sind, um sicherzustellen, daß alle
Eingabewerte von Interesse zu einem „Treffer" führen.
-
Bezüglich der beschriebenen Ausführungsbeispiele
der Erfindung ist natürlich
eine Anzahl von Varianten möglich.
Die Quelle von Eingabedaten für die
BRANCH- (HASH BODY-) Anweisung kann beispielsweise vielmehr implizit
und nicht explizit durch den IN_SEL-Parameter spezifiziert sein.
Ferner, obgleich der Hash-Steuerungscode von 6 bis 10 als
ein Code beschrieben worden ist, der die Anzahl und den Grad der
Bitverschiebung der Eingabeversionen 25 steuert, könnten zusätzliche
oder unterschiedliche Parameter der Hashcodierungfunktion gesteuert
werden. Somit könnte
der Hashcodierungssteuerungscode Bits zum Spezifizieren der Funktion,
die zum Kombinieren der Eingabeversionen verwendet wird (Multiplizierungen
der Versionen etc) und/oder zum Spezifizieren von vielmehr einer Zirkulation
und keiner Verschiebung der Eingabe und/oder zum Spezifizieren der
Richtung und der Größenordnung
der Verschiebung/Zirkulation zwischen Versionen und/oder zum Ordnen
der Bits umfassen, die durch den Bitauswahlblock 23 ausgewählt werden
etc. Zusätzlich
kann zumindest die Bitauswahlfunktion des Bitauswahlblocks 23 innerhalb der
Form von 4 der Kombinierungseinheit 22 implementiert
sein, in dem jene Instanzen des Gatterschaltungsaufbaus (Elemente 30, 31)
die auf die Bits des umgewandelten Werts bezogen sind, gesperrt werden,
die für
den aktuellen Index nicht erforderlich sind.
-
Im Hinblick auf 10 könnte
jeder Hash-Code vom aktuellen unter Verwendung einer gewissen Art
einer XOR-Funktion berechnet werden, und nicht die Steuerungscodes,
die für
Hashcodierungsneuversuche verwendet werden, die von einem vorbestimmten
Satz von Codes 47 ausgewählt werden.