DE112022000529T5 - Verfahren und vorrichtung für gather/scatter-vorgänge in einem vektorprozessor - Google Patents

Verfahren und vorrichtung für gather/scatter-vorgänge in einem vektorprozessor Download PDF

Info

Publication number
DE112022000529T5
DE112022000529T5 DE112022000529.7T DE112022000529T DE112022000529T5 DE 112022000529 T5 DE112022000529 T5 DE 112022000529T5 DE 112022000529 T DE112022000529 T DE 112022000529T DE 112022000529 T5 DE112022000529 T5 DE 112022000529T5
Authority
DE
Germany
Prior art keywords
address
vector
memory
write
port
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
DE112022000529.7T
Other languages
English (en)
Inventor
Christopher I. W. Norrie
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microchip Technology Inc
Original Assignee
Microchip Technology Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US17/669,995 external-priority patent/US20220342590A1/en
Application filed by Microchip Technology Inc filed Critical Microchip Technology Inc
Publication of DE112022000529T5 publication Critical patent/DE112022000529T5/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30141Implementation provisions of register files, e.g. ports
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Complex Calculations (AREA)

Abstract

In einer Implementierung umfasst eine Vektorprozessor-Gather/Scatter-Vorrichtung eine Mehrzahl von Vektoranschlüssen und einen Direktzugriffsspeicher, wobei die Mehrzahl von Vektoranschlüssen mit dem Direktzugriffsspeicher in Kommunikation steht, und wobei einer oder mehrere von der Mehrzahl von Vektoranschlüssen ein oder mehrere Adressregister und ein oder mehrere Schrittregister in Kommunikation mit dem Direktzugriffsspeicher verwenden, um das Gather/Scatter von Direktzugriffsspeicherinhalt zu ermöglichen.

Description

  • VERWANDTE ANMELDUNG
  • Diese Patentanmeldung beansprucht die Priorität der am 27. April 2021 durch denselben Erfinder eingereichten anhängigen US-Anmeldung mit der Seriennummer 63/180,562 mit dem Titel „Method and Apparatus for Gather/Scatteroperations in a Vector Processor“ und der am 11. Februar 2022 durch denselben Erfinder eingereichten US-Anmeldung mit der Seriennummer 17/669,995 mit dem Titel „Method and Apparatus for Gather/Scatter Operations in a Vector Processor“, die hiermit durch Bezugnahme hierin aufgenommen werden.
  • GEBIET
  • Das vorliegende Verfahren und die vorliegende Vorrichtung betreffen einen Vektorprozessor. Insbesondere bezieht sich das vorliegende Verfahren und die vorliegende Vorrichtung auf ein Verfahren und eine Vorrichtung für Gather/Scatter-Vorgänge in einem Vektorprozessor.
  • HINTERGRUND
  • Herkömmliche Gather/Scatter-Vorgänge für Universalprozessoren sind komplex, kompliziert, langsam, und dies bringt erhebliche Einschränkungen für Prozessoren mit sich, die für extrem hohe Geschwindigkeit gebaut sind, wie Vektorprozessoren, weil die Gather/Scatter-Vorgänge nicht mit der Geschwindigkeit der Vektorprozessoren Schritt halten können. Vektorprozessoren greifen mit hoher Geschwindigkeit auf Daten zu, sodass nicht zusammenhängende Daten zu einem Problem werden, das dazu führen kann, dass die Geschwindigkeit der Vektor- und Matrixverarbeitung verlangsamt wird.
  • Dies stellt ein technisches Problem dar, für das eine technische Lösung unter Verwendung eines technischen Mittels benötigt wird.
  • KURZDARSTELLUNG
  • Eine Vektorprozessor-Gather/Scatter-Vorrichtung mit einer Mehrzahl von Vektoranschlüssen und einem Direktzugriffsspeicher (Random Access Memory, RAM), wobei die Mehrzahl von Vektoranschlüssen mit dem RAM in Kommunikation steht und wobei einer oder mehrere von der Mehrzahl von Vektoranschlüssen ein oder mehrere Adressregister und ein oder mehrere Schrittregister in Kommunikation mit dem RAM verwenden.
  • Ein Verfahren zum Bauen einer Vektorprozessor-Gather/Scatter-Vorrichtung mit einer Mehrzahl von Vektoranschlüssen und einem RAM, wobei die Mehrzahl von Vektoranschlüssen mit dem RAM in Kommunikation steht, und wobei einer oder mehrere von der Mehrzahl von Vektoranschlüssen eines oder mehrere Adressregister und einen oder mehrere Schrittregister in Kommunikation mit dem RAM verwendet.
  • KURZBESCHREIBUNG DER ZEICHNUNGEN
  • Die offenbarten Techniken werden beispielhaft und nicht einschränkend in den Figuren der beigefügten Zeichnungen veranschaulicht. Gleich nummerierte Elemente sind nicht unbedingt gleich.
  • Die beigefügten Figuren veranschaulichen verschiedene nicht ausschließliche Beispiele der offenbarten Techniken.
    • 1 veranschaulicht, allgemein bei 100, eine Blockdiagrammübersicht.
    • 2 veranschaulicht, allgemein bei 200, eine Blockdiagrammübersicht.
    • 3 veranschaulicht, allgemein bei 300, eine 4x4-Matrix.
    • 4 veranschaulicht, allgemein bei 400, eine Speicheranordnung.
    • 5 veranschaulicht, allgemein bei 500, ein Blockdiagramm von 3 Anschlüssen.
    • 6 veranschaulicht, allgemein bei 600, ein Flussdiagramm für eine Implementierung eines Leseanschlussvorgangs.
    • 7 veranschaulicht, allgemein bei 700, ein Flussdiagramm für eine Implementierung eines Schreibanschlussvorgangs.
    • 8 veranschaulicht, allgemein bei 800, eine Speicherstruktur, die 2 Leseanschlüsse und 1 Schreibanschluss unterstützt.
    • 9 veranschaulicht, allgemein bei 900, einen Speicher, bei dem eine spezifische Struktur zu dem Speicher hinzugefügt ist.
    • 10 veranschaulicht, allgemein bei 1000, eine Implementierung, die eine logische Adresse in eine spezifische RAM-Bank und physische RAM-Adresse umwandelt.
    • 11 veranschaulicht, allgemein bei 1100, eine Implementierung, die einen Leseanschlussvorgang zeigt, die zwei Operanden-Lesevorgänge und einen Ergebnis-Schreibvorgang pro Taktvorgang unterstützt.
    • 12 veranschaulicht, allgemein bei 1200, eine Implementierung, die einen Schreibanschlussvorgang zeigt, der zwei Operand-Lesevorgänge und einen Ergebnis-Schreibvorgang pro Taktvorgang unterstützt.
    • 13 veranschaulicht, allgemein bei 1300, eine Implementierung eines beschleunigten Betriebsmodus, die einen Leseanschlussvorgang zeigt.
    • 14 veranschaulicht, allgemein bei 1400, eine Implementierung eines beschleunigten Betriebsmodus, die einen Schreibanschlussvorgang zeigt.
    • 15 veranschaulicht, allgemein bei 1500, eine Implementierung, die 8 Vektor-arithmetische Logikeinheiten (Vektor-ALUs) zeigt.
    • 16 veranschaulicht, allgemein bei 1600, eine Implementierung, die zeigt, wie verschiedene Adressen- und Schrittwerte dazu führen, dass auf unterschiedliche Werte von einem Speicher zugegriffen werden kann.
  • AUSFÜHRLICHE BESCHREIBUNG
  • Ein Verfahren und eine Vorrichtung für Gather/Scatter-Vorgänge in einem Vektorprozessor werden offenbart.
  • Gather und Scatter (Gather/Scatter) bezeichnen eine Datenverarbeitung in einem Computersystem, bei der Daten aus verschiedenen Speicherquellen gesammelt werden müssen, bevor sie verarbeitet werden, und diese dann an verschiedene Ziele im Speicher gestreut werden müssen, nachdem sie verarbeitet wurden.
  • Bei der mathematischen Verarbeitung von Daten in Form von Vektoren und Arrays erfordert ein Vorgang wie eine Array-Multiplikation, dass Daten in Form von Zeilen- und Spaltenvektoren abgerufen werden, und diese Zeilen- und Spaltenvektoren sind nicht notwendigerweise zusammenhängend im Speicher. Ein Vektorprozessor verarbeitet jedoch zusammenhängende Vektoren mit einer hohen Geschwindigkeit. Somit müssen die Sammelvorgänge den arithmetischen Elementen einen zusammenhängenden Datenstrom präsentieren, wobei die Quelle der abgerufenen Daten zusammenhängend sein kann oder nicht. Die Ausgaben der arithmetischen Elemente sind jeweils ein zusammenhängender Datenstrom aus den arithmetischen Elementen und müssen an Orte im Speicher gestreut werden, die zusammenhängend sein können oder nicht.
  • 1 veranschaulicht, allgemein bei 100, eine Blockdiagrammübersicht. Es ist zu beachten, dass die offenbarte Technik n *(2 Lesevorgänge und 1 Schreibvorgang) pro Takt unterstützt, wobei n => 1 ist. Außerdem unterstützt die Technik 8 ALU-Vorgänge (Vorgänge mit arithmetischen Logikeinheiten) pro Takt, jeden Takt ohne Unterbrechung durch einen vollständigen Vektor. Zusätzlich könnten ALU-Vorgänge ein einfaches ADD oder eine komplexe SGMD-Funktion (Sigmoid-Funktion) sein, ohne Einschränkung.
  • Bei 104 ist eine Vektorsteuerung, die Operand 1 (Opnd1) 150 mit Adressregister (- addr) 152 und Schrittregister (- stride) 154 an einem ersten Anschluss 106 in Kommunikation mit dem Direktzugriffsspeicher (RAM) 102 über die Schnittstelle 107 zeigt. Die Vektorsteuerung 104 zeigt zusätzlich Operand 2 (Opnd2) 156 mit Adressregister (- addr) 158 und Schrittregister (- stride) 160 an einem zweiten Anschluss 108 in Kommunikation mit dem RAM 102 über die Schnittstelle 109. Die Vektorsteuerung 104 zeigt zusätzlich ein Ergebnis (Result) 162 mit Adressregister (-addr) 164 und Schrittregister (- stride) 166 an einem dritten Anschluss 110 in Kommunikation mit dem RAM 102 über die Schnittstelle 111.
  • Innerhalb der Anschlüsse, zum Beispiel Anschluss 106, werden das - addr 152 und das - stride in Registern gespeichert. Das heißt, Anschluss 106 weist ein Adressregister (für - addr 152) und ein Schrittregister (für - stride 154) auf.
  • Ein Vektoranschluss ist die Steuerlogik, die Zugriff einem einzelnen anfordernden Agent, beispielsweise Opnd1 150, Zugriff auf den RAM bereitstellt. Ein Vektoranschluss schließt die Logik ein, die die Adressgenerierung unter Verwendung einer/s anfänglichen Adresse, Schritts und Länge und der Logik, die den Speicherzugriff sequenziert, durchführt.
  • Die Schnittstelle 107 ist eine Verbindung, die von dem Vektoranschluss 106 in den RAM 102 kommuniziert, da sie dem RAM 102 die Speicheradresse und Leseanforderungssignale (Anforderungssignale nicht gezeigt) bereitstellt. Die bereitgestellte Speicheradresse wird aus einer Adresse (- addr) 152 und einem Schrittwert (- stride) 154, der die generierte Adresse inkrementiert, und einer optionalen Länge (nicht gezeigt) der Anzahl der durchzuführenden Speicherzugriffe, die auf einen Speicherort eines Vektors (d. h. Opnd1 150) zeigt, generiert (generierte Adresse).
  • Die Schnittstelle 109 ist eine Verbindung, die von dem Vektoranschluss 108 in den RAM 102 kommuniziert, da sie dem RAM 102 die Adresse (- addr) 158 und den Schritt (-stride) 160 für den Operand 2 (Opnd2) 156 bereitstellt, der auf einen Speicherort (z. B. eine Kombination aus Adresse und Schritt) eines Vektors (d. h. Operand 2 156) zeigt.
  • Die Schnittstelle 111 ist eine Verbindung, die von dem Vektoranschluss 110 in den RAM 102 kommuniziert, da sie dem RAM 102 die Adresse (- addr) 164 und den Schritt (- stride) 166 für das Ergebnis 162 bereitstellt, wo das Ergebnis eines Vektorvorgangs gespeichert werden soll.
  • Bei 120 sind Vektordaten, die Operand 1 (Opnd 1) mit der Flusssteuerung 122 zeigen, verbunden mit dem RAM 102 über die Schnittstelle 121. Entsprechende Ausgabedaten sind bei 123 gezeigt. Die Vektordaten 120 zeigen zusätzlich Operand 2 (Opnd 2) mit der Flusssteuerung 126 und mit dem RAM 102 über die Schnittstelle 125 verbunden. Bei 127 sind jeweilige Ausgabedaten gezeigt. Die Vektordaten 120 zeigen zusätzlich das Ergebnis (Result) mit der Flusssteuerung 130 und mit dem RAM 102 über die Schnittstelle 129 verbunden. Die Eingabedaten sind bei 131 gezeigt.
  • Bei 141 ist externes Laden in RAM 102 gezeigt. Ebenfalls ist bei 143 externes Speichern aus RAM 102 gezeigt.
  • Die in 1 offenbarte Technik veranschaulicht Vektoranschlüsse, d. h. Schnittstellen 107, 109 und 111 in ein Direktzugriffsspeicherarray, d. h. RAM 102, das Adressregister und Schrittregister verwendet, um automatisches nicht zusammenhängende Sammeln und Streuen von Vektoren von Daten durchzuführen. Diese Anschlüsse können bis zu 2 Lesevorgänge und 1 Schreibvorgang pro Taktzyklus unterstützen, während das Sammeln und Streuen durchgeführt wird, wodurch eine maximale Vektorverarbeitungsgeschwindigkeit ermöglicht wird. Nachstehend in der Beschreibung ausführlich erläutert und in 8 veranschaulicht, ist ein Beispiel für eine Speicherstruktur, die bis zu 2 Lesevorgänge und 1 Schreibvorgang pro Taktzyklus unterstützt.
  • Die Vektoranschlüsse sind weiter parallelisierbar, um mehrere Einheiten von „2 Lesevorgängen und 1 Schreibvorgang pro Taktzyklus“ zu unterstützen. Dementsprechend kann diese Technik zum Beispiel auf einfache Weise 16 Lese- und 8 Schreibvorgänge pro Taktzyklus für Fälle unterstützen, die für Algorithmen für maschinelles Lernen besonders häufig und wichtig sind.
  • Wenn zum Beispiel die Anzahl der Vektor-ALUs gleich 8 ist (n in Block 120 ist gleich 8), kann der Vektorvorgang zwischen 8 Vektor-arithmetischen Logikeinheiten partitioniert werden, die parallel arbeiten, um eine 8-fache Erhöhung der Verarbeitungsgeschwindigkeit zu erreichen.
  • Die in 1 gezeigte Technik kann auf einem einzigen Vektorvorgang parallelisiert werden. Das heißt, anstatt einen einzigen Vektor-ALU-Vorgang in serieller Weise auf einem Vektorvorgang zu haben, kann dieser Vektorvorgang von mehr als einer Vektor-ALU parallel durchgeführt werden. Zusätzlich hat sie die Fähigkeit, nicht zusammenhängende Vektoren im Speicher ohne Leistungsverschlechterung zu handhaben.
  • Während 1 die Adresse und den Schritt offenbart, versteht es sich, dass in einer Implementierung solche Werte beispielsweise in Registern gehalten werden, aber nicht darauf beschränkt sind. Das heißt, die Adresse und der Schritt können in Registern gespeichert werden. Die Implementierung ist nicht dahin gehend beschränkt, und in anderen Implementierungen können die Adress- und Schrittwerte im Speicher gespeichert werden.
  • Während 1 verschiedene Busbreiten offenbart (zum Beispiel eine 256-Bit-Busbreite für jedes von 121, 125, 129, 141 und 143), ist die Erfindung nicht dahin gehend beschränkt, und Busbreiten anderer Größen können verwendet werden.
  • 2 veranschaulicht, allgemein bei 200, eine Blockdiagrammübersicht. Bei 202 ist eine Systemübersicht über ein VPU-Top (Vector-Processing-Unit-, Vektorverarbeitungseinheit-Top). Bei 204 ist eine Sammel-/Streu-Einheit. Bei 206 ist eine Vektorverarbeitungseinheit (VPU), die über die Verbindung 205 mit der Sammel-/Streu-Einheit 204 in Verbindung steht. Andere Blöcke, die in Bezug auf die Sammel-/Streu-Einheit 204 gezeigt, aber für das Verständnis der Sammel-/Streu-Einheit 204 nicht von Belang sind, sind eine CMU-Schnittstelle (Central-Memory-Unit-Schnittstelle) mit bidirektionaler Kommunikation zu bram (Buffer RAM, Puffer-RAM), ddr (Double Data Rate RAM, Doppeldatengeschwindigkeits-RAM), ccn (Coherent Connection Network, kohärentes Verbindungsnetzwerk). Die MIF (Memory Interface, Speicherschnittstelle) kommuniziert mit der CMU-Schnittstelle, dem Req-msg-Prozessor (Anforderungsnachrichtenprozessor) und dem Cpl-msg-Prozessor (Abschlussnachrichtenprozessor). Der Req-msg-Prozessor und der Cpl-msg-Prozessor kommunizieren mit der VPU 206. Ebenfalls gezeigt sind CSRs (eine Schnittstelle für nachrichtenbasierten Registerzugriff, die mit axi-lite (Advance Extensible Interface lite version) kommuniziert. Ebenfalls dargestellt sind Interrupts, die eine Schnittstelle zum VPU-Top 202 herstellen.
  • 3 veranschaulicht, allgemein bei 300, eine 4x4-Matrix mit Schreibangaben. Bei 302 ist eine 4x4-Matrix mit 4 Zeilen und 4 Spalten. Bei 311 ist ein Zeilenvektor 1 mit 4 Elementen mit den jeweiligen Werten 1, 2, 7 und 4. Bei 312 ist ein Zeilenvektor 2 mit 4 Elementen mit den jeweiligen Werten 3, 9, 1 und 8. Bei 313 ist ein Zeilenvektor 3 mit 4 Elementen mit den jeweiligen Werten 2, 7, 6 und 5. Bei 314 ist ein Zeilenvektor 4 mit 4 Elementen mit den jeweiligen Werten 3, 1, 7 und 4. Bei 321 ist ein Spaltenvektor 1 mit 4 Elementen mit den jeweiligen Werten 1, 3, 2 und 3. Bei 322 ist ein Spaltenvektor 2 mit 4 Elementen mit den jeweiligen Werten 2, 9, 7 und 1. Bei 323 ist ein Spaltenvektor 3 mit 4 Elementen mit den jeweiligen Werten 7, 1, 6 und 7. Bei 324 ist ein Spaltenvektor 4 mit 4 Elementen mit den jeweiligen Werten 4, 8, 5 und 4.
  • 4 veranschaulicht, allgemein bei 400, die in 3 gezeigte 4x4-Matrix angeordnet im Speicher, sodass jede Zeile der 4x4-Matrix aufeinander folgende Speicheradressen aufweist und jede Zeile auf die Zeile dahinter folgt, d. h. die Zeilen der 4x4-Matrix sind in aufeinander folgender Reihenfolge im Speicher angeordnet. Bei 402 ist die Speicheradresse, die im Bereich von 0 bis 15 liegt (16 Speicherorte), wie gezeigt. Und bei 404 sind die Speicherdaten für jede der entsprechenden Speicheradressen gezeigt. Zum Beispiel enthalten in dieser Anordnung die Speicheradressen 0, 1, 2 und 3 jeweils die Speicherdaten 1, 2, 7 und 4, die den Zeilenvektor 1 311 in 3 darstellen. Die Speicheradressen 4, 5, 6 und 7 enthalten jeweils die Speicherdaten 3, 9, 1 und 8, die den Zeilenvektor 2 312 in 3 darstellen. Die Speicheradressen 8, 9, 10 und 11 enthalten jeweils die Speicherdaten 2, 7, 6 und 5, die den Zeilenvektor 3 313 in 3 darstellen. Der Zeilenvektor 4 314 von 3 ist in den Speicheradressorten 12, 13, 14 und 15 enthalten, die die jeweiligen Werte 3, 1, 7 und 4 enthalten.
  • Wie aus 4 ersichtlich ist, sind Vektoren von Daten nicht notwendigerweise so organisiert, dass sie aufeinander folgende Orte im Speicher belegen. Dies gilt insbesondere, wenn die Daten eine Matrix sind. Wenn Zeilenvektoren der Matrix aufeinander folgende Speicherorte belegen, dann können Spaltenvektoren keine sequenziellen Speicherorte belegen.
  • Daher sind während einer Matrixmultiplikation, zum Beispiel, wenn der Zeilenvektor 1 311 mit Spaltenvektor 1 321 (siehe 3) multipliziert wird, die Adressen des Zeilenvektors 1 0, 1, 2 und 3, und die Adressen des Spaltenvektors 1 sind 0, 4, 8, 12 (siehe 4).
  • Diese Multiplikation des ersten Zeilenvektors mit dem ersten Spaltenvektor kann als Multiplizieren zweier Vektoren mit Länge 4 beschrieben werden, wobei:
    • Vektor 1 bei Adresse 0 beginnt und die Adresse um einen Schritt von 1 für jedes Vektorelement inkrementiert; und
    • Vektor 2 bei Adresse 0 beginnt und die Adresse um einen Schritt von 4 für jedes Vektorelement inkrementiert.
    • Die beiden Vektoren haben eine gemeinsame Länge, aber ihre Startadressen und Schritte sind unabhängige Werte.
  • Unter den hierin offenbarten Techniken kann man die Multiplikation dieser beiden Vektoren mit einer einzigen Vektormultiplikationsanweisung angeben. Dies unterscheidet sich wesentlich von den allgemeinen Mitteln der Programmierung. Zum Beispiel kann in Pseudocode eine Vektormultiplikation (Skalarprodukt) ausgedrückt werden als:
    Figure DE112022000529T5_0001
    Figure DE112022000529T5_0002
  • Es ist zu beachten, dass die vorstehende addr3 = 16 die Adresse ist, an der das Ergebnis der Vektormultiplikation gespeichert werden soll, und in 4 unmittelbar auf die Speicheradresse 15 folgen würde. Es sollte jedoch beachtet werden, dass addr3 eine andere Adresse zugewiesen werden kann und das Vektormultiplikationsergebnis dementsprechend an der anderen Adresse gespeichert würde.
  • Würde dieser Vorgang auf einem Universalprozessor durchgeführt, so wird die Schleife viele Anweisungen, die die Multiplikation und die Adressinkremente durchführen. Mit den offenbarten Techniken kann die Schleife jedoch auf eine einzige Anweisung reduziert werden. Diese einzige Anweisung wird von spezialisierten Speicheranschlüssen und Anweisungen unterstützt, die die Speicheranschlüsse steuern, indem die Parameter der Vektoren angegeben werden. Zum Beispiel würde die einzige Anweisung die laufende Summe mit 0 initialisieren, dann würde sie für jedes Paar Operanden aus den zwei Operanden-Leseanschlüssen das Produkt aus den beiden Operanden zu der laufenden Summe addieren. Nachdem das letzte Paar Operanden verarbeitet wurde, ist die laufende Summe das Skalarprodukt aus den zwei Operanden und wird in den Ergebnis-Schreibanschluss geschrieben.
  • In einer Implementierung erfordert jeder von 3 Anschlüssen eine Adresse und einen Schritt. Zwei der Anschlüsse führen Speicherlesevorgänge aus, und ein Anschluss führt Speicherschreibvorgänge aus. Darüber hinaus erfordern die zwei Leseanschlüsse auch eine Länge, die für die beiden Anschlüsse ein gemeinsamer Wert ist.
  • Der Schreibanschluss benötigt nicht notwendigerweise eine Länge. Dies liegt daran, dass, während die Operandenvektoren die gleiche Länge aufweisen können, der Ergebnisvektor kann eine andere Länge aufweisen kann. Beispielsweise generiert das Skalarprodukt aus zwei Vektoren nur ein einziges Ergebnis, ganz gleich, welche Länge die Operandenvektoren aufweisen. Somit kann es in einer Implementierung vorteilhafter sein, dass der Schreibanschluss einfach ein „write“-Signal von den arithmetischen Logikeinheiten (ALUs) empfängt, das das Ergebnis generiert, und dass für jede Assertion dieses Signals die Schreibadresse um den Schreibschritt inkrementiert wird.
  • 5 veranschaulicht, allgemein bei 500, ein Blockdiagramm von 3 Anschlüssen, die mit einem Speichersubsystem 502 interagieren. Bei 504 ist eine Vektorsteuerung, die bei 506 einen ersten Anschluss zeigt, der Operand 1 (Opnd 1) mit Adresse (- addr), Schritt (- stride) und Länge (- length x) einschließt und über die Schnittstelle 507 in Kommunikation mit dem Speichersubsystem 502 steht. Die Vektorsteuerung 504 zeigt zusätzlich bei 508 einen zweiten Anschluss, der Operand 2 (Opnd 2) mit Adresse (- addr), Schritt (- stride) und Länge (- length x) einschließt und über die Schnittstelle 509 in Kommunikation mit dem Speichersubsystem 502 steht. Es ist zu beachten, dass die Länge x bei 506 und die Länge x bei 508 die gleiche Länge sind. Die Vektorsteuerung 504 zeigt zusätzlich einen dritten Anschluss 510, der das Ergebnis (Result) mit Adresse (- addr) und Schritt (- stride) mit einer optionalen Länge einschließt und über die Schnittstelle 511 in Kommunikation mit dem Speichersubsystem 502 steht. Die optionale Länge bei 510 muss nicht die gleiche Länge sein wie die Länge x bei 506 oder 508. Die Anschlüsse 506, 508 und 510 kommunizieren über die Schnittstellen 507, 509 bzw. 511 jeweils zum Speichersubsystem 502 eine Sequenz von Adressen und Lese-/Schreibsteuerungen. Die Länge der Sequenz wird durch das Längenregister bestimmt, und die Adressen werden durch das Adress- und das Schrittregister bestimmt.
  • Die Länge (- length x) bei 506 und 508 und optional (opt) - length bei 510 werden verwendet, um die Anzahl der Speicherzugriffe anzugeben, die zum Beispiel erfolgen sollten, um einen Operanden (z. B. Opnd 1, Opnd 2) abzurufen oder ein Ergebnis (z. B. Result) zu schreiben. Zum Beispiel kann jeder Zyklus einen Satz von Operanden abrufen. Die Länge gibt die Anzahl der Zyklen an, in denen ein Satz von Operanden abgerufen wird. Wenn also ein Vektor aus 10 Elementen besteht, gibt eine Länge 10 an, dass der Anschluss ein Element für 10 aufeinander folgende Zyklen abrufen soll. In ähnlicher Weise für die Speicher-(Result)-Länge, wenn diese Option verwendet wird. Alternativ gibt die ALU an, wann ein Speichervorgang durchgeführt werden soll.) Somit kann im Wesentlichen der Längenparameter als Stoppsignal für die Vektorsteuerung (z. B. 504) betrachtet werden.
  • Wie in 5 veranschaulicht, wird über die Schnittstelle 507 und die Schnittstelle 509 eine Sequenz von Adressen und Lese-/Schreibsteuerungen übermittelt. Die Länge der Sequenz wird durch das Längenregister bestimmt, und die Adressen werden durch das Adress- und das Schrittregister in das Speichersubsystem 502 bestimmt, wo die Operanden Opnd 1 und Opnd 2 gelesen werden können. Das Adress-, Schritt- und Längenregister und die gesamte zugehörige Logik zum Generieren der Adressen und Lese-/Schreibsteuerungen in das Speichersubsystem werden als Leseanschluss betrachtet. Wie in 5 veranschaulicht, kommuniziert die Schnittstelle 511 eine Sequenz von Adressen und Lese-/Schreibsteuerungen. Die Länge der Sequenz wird durch das Längenregister bestimmt, und die Adressen werden durch das Adress- und das Schrittregister in das Speichersubsystem 502 bestimmt, wo das Ergebnis gespeichert werden soll, sodass dies als Schreibanschluss betrachtet wird. Alternativ zur Verwendung des optionalen Längenparameters weiß die Vektor-ALU, ob sie ein Ergebnis generiert hat, sodass sie angeben kann, dass der Schreibvorgang durchgeführt werden muss.
  • In einer Implementierung werden die Adresse, der Schritt und die Länge der Operanden, wie in 5 veranschaulicht, durch die folgenden Anweisungen festgelegt:
    • SLEN - Festlegen der Länge der Operandenvektoren in beiden Leseanschlüssen gleichzeitig
    • SAS1 - Festlegen der Adresse und des Schritts von Vektoroperand 1
    • SAS2 - Festlegen der Adresse und des Schritts von Vektoroperand 2
    • SAS0 - Festlegen der Adresse und des Schritts des Vektorergebnisses
  • Abhängig von der Natur des Anweisungssatzes für eine bestimmte Implementierung können die SAS-Anweisungen in separate Anweisungen zum Festlegen der Adresse und Festlegen des Schritts aufgeteilt werden. Es ist zu beachten, dass eine einzige Anweisung die gemeinsame Länge für beide Leseanschlüsse festlegen kann und jeder Anschluss seine eigene Adresse und seine eigenen Schrittwerte aufweist, die durch eine Anweisung oder Anweisungen festgelegt werden können.
  • Sobald die Anschlüsse (Lesen und Schreiben) eingerichtet wurden, wird die gesamte Multiplikationsoperation von einer einzelnen MUL-Anweisung (Multiplizieren) sequenziert. Die MUL-Anweisung weist die Leseanschlüsse an, ihre Abrufsequenz zu starten, weist die ALU an, die tatsächliche Multiplikation durchzuführen, und die Schreibanschlüsse führen Schreibvorgänge für jedes Ergebnis aus, das sie aus der arithmetischen Logikeinheit empfangen.
  • In einer Implementierung leitet die MUL-Anweisung den Vorgang über eine Pipeline. Zum Beispiel führt die Ausführung einer MUL-Anweisung (Element-mit-Element-Multiplikation) zu der folgenden Sequenz für einen Vorgang mit einem Vektor mit Länge 6:
    Zyklus 1 2 3 4 5 6 7 8 9 10
    Leseanschluss 0 r0 r1 r2 r3 r4 r5
    Leseanschluss 1 r0 r1 r2 r3 r4 r5
    ALU-Mul. m0 m1 m2 m3 m4 m5
    Schreibanschluss w0 w1 w2 w3 w4 w5
  • Diese zeitliche Abfolge ist ein nicht einschränkendes Beispiel. Hier zeigt es 2 Zyklen zwischen einem Speicherlesestart, r0, und das Ergebnis ist ab der ersten Multiplikation m0 zur Speicherung verfügbar. Der Speicherlesevorgang und die arithmetische Multiplikation können mehr oder weniger Zyklen erfordern.
  • In einer Implementierung initiiert jeder Leseanschluss, wenn das Startsignal gegeben wird, einen Speicherlesevorgang mit dem Adressregister des Anschlusses und inkrementiert das Adressregister um das Schrittregister des Anschlusses. Dieser Vorgang wird entsprechend einem Wert im Längenregister wiederholt. Das heißt, die Anzahl der Male, die ein Speicherlesevorgang mit dem Adressregister des Anschlusses ausgeführt und das Adressregister um das Schrittregister des Anschlusses inkrementiert wird, kann durch den Wert in einem Längenregister gesteuert werden. Für jedes Ergebnis, das eine ALU produziert, generiert sie ein begleitendes Schreibsignal, das dem Schreibanschluss angibt, dass er einen Speicherschreibvorgang mit seinem Adressregister initiieren soll, und inkrementiert es um sein Schrittregister. Der Schreibanschluss kann optional keine Kenntnis („No-Knowledge-Betriebsmodus“) davon haben, wie viele Schreibvorgänge von der Anweisung angefordert werden. Somit initiiert er für jedes Schreibsignal einen Speicherschreibvorgang mit seinem Adressregister und inkrementiert es um sein Schrittregister. Das Längenregister muss in diesem No-Knowledge-Betriebsmodus für den Schreibvorgang nicht berücksichtigt werden.
  • In einer Implementierung werden die Anschlussadressregister nach einem letzten Vorgang auf ihre Startwerte zurückgesetzt, d. h. nachdem der Längenwert in dem Längenregister erreicht wurde. Für den Schreibanschluss kann in einigen Beispielen ein Signal zum Angeben des letzten Schreibvorgangs erforderlich sein, da der Schreibanschluss sich in einem No-Knowledge-Betriebsmodus befinden kann. Der Grund dafür, dass die Anschlussadressregister nach einem letzten Vorgang auf ihre Startwerte zurückgesetzt werden, besteht darin, dass die Anschlussadressregister wiederherstellt werden, um die Adressen für den Start der Vektoren zu referenzieren, da oft in einem nachfolgenden Vorgang derselbe Vektor verwendet wird. Dadurch wird vermieden, dass viele SAS-Anweisungen ausgeführt werden müssen, um denselben Vektor einzurichten. Dies kann zu einer schnelleren Ausführung plus zu kompakterem und besser lesbarem Code führen.
  • Zum Beispiel weist in dem folgenden Code ein Operand 1 ein Offset auf, das in Adresse 200 zu finden ist, das zu dem Operanden 1 addiert wird, und das Ergebnis wird um einen Faktor skaliert, der bei Adresse 300 zu finden ist. Der ursprüngliche Operand 1 wird durch das letzte Ergebnis ersetzt. Es ist zu beachten, dass mehrere Vektoranweisungen ausgeführt werden, aber der Ergebnisanschluss und der Anschluss für Operand 1 werden nur einmal eingerichtet:
    Figure DE112022000529T5_0003
    Figure DE112022000529T5_0004
  • 6 veranschaulicht, allgemein bei 600, ein Flussdiagramm für eine Implementierung eines Leseanschlussvorgangs. Vor dem Eintritt in diesen Leseanschlussvorgang und nicht gezeigt in 6, wird das Adressregister des Leseanschlusses auf einen Wert gesetzt, den wir als ursprünglichen Wert bezeichnen. Dann wird bei 602 geprüft, ob ein Leseanschluss-Startsignal empfangen wurde? Wenn nicht (No), wird bei 602 eine weitere Prüfung vorgenommen. Wenn ein Leseanschluss-Startsignal empfangen wird (Yes), dann wird mit 603 fortgefahren und die Inkrementzahl auf Null gesetzt, dann wird mit 604 fortgefahren und ein Speicherlesevorgang unter Verwendung des Adressregisters des Anschlusses initiiert, und die Inkrementzahl wird um 1 erhöht. Die Inkrementzahl ist ein Zähler, der die Anzahl der Male dokumentiert, die der Vorgang 604 des Initiierens eines Speicherlesevorgangs unter Verwendung des Adressregister des Anschlusses erfolgt ist. Dann wird mit 606 fortgefahren, wo das Adressregister des Anschlusses um das Schrittregister des Anschlusses inkrementiert wird. Mit 608 fortfahrend, wird überprüft, ob die Inkrementzahl >= dem Längenregister des Anschlusses ist? Wenn nein (No), wird zu 604 zurückgekehrt. Wenn das Adressregister des Anschlusses größer oder gleich dem Längenregister des Anschlusses ist (Yes), wird mit dem optionalen 610 fortgefahren. Optional wird bei 610 das Adressregister des Anschlusses auf den ursprünglichen Wert zurückgesetzt und zu 602 zurückgekehrt.
  • Während in 6 bei 608 geprüft wird, ob die Inkrementzahl >= dem Längenregister des Anschlusses ist, ist die Implementierung nicht dahin gehend beschränkt, und es könnte geprüft werden, ob die Inkrementzahl < das Längenregister des Anschlusses ist, in welchem Fall die Logikentscheidung bei 608 möglicherweise anders sein muss. Der Grund dafür, dass in diesem Beispiel ein Inkrementzahlvergleich mit dem Längenregister verwendet wird statt eines Adressvergleichs, ist, dass jeder Leseanschluss einen anderen Schrittwert aufweisen kann.
  • 7 veranschaulicht, allgemein bei 700, ein Flussdiagramm für eine Implementierung eines Schreibanschlussvorgangs. Bei 702 wird überprüft, ob ein Anschluss-Schreibsignal empfangen wurde? Wenn nicht (Nein), dann wird bei 702 weiter geprüft. Wenn ein Anschluss-Schreibsignal empfangen wird (Yes), dann wird mit 704 fortgefahren und ein Speicherschreibvorgang unter Verwendung des Adressregisters des Anschlusses initiiert. Dann wird mit 706 fortgefahren und das Adressregister des Anschlusses um das Schrittregister des Anschlusses inkrementiert. Dann wird mit 708 fortgefahren und bestimmt, ob der letzte Schreibvorgang abgeschlossen wurde, und wenn nicht (No), dann wird mit 702 fortgefahren. Wenn der letzte Schreibvorgang abgeschlossen wurde (Yes), dann wird mit 710 fortgefahren, wo andere Vorgänge durchgeführt werden.
  • Die Bestimmung bei 708, ob der letzte Schreibvorgang abgeschlossen wurde, wird in einer Implementierung anhand eines Signals von einer Komponente in einer Vektorverarbeitungseinheit bestimmt.
  • In einer Implementierung, beispielsweise wie in 1 bei 102 veranschaulicht, gibt es nur einen Speicher, und dennoch sollten 2 Lesevorgänge und 1 Schreibvorgang gleichzeitig unterstützt und dies Zyklus für Zyklus aufrechterhalten werden. Dies ermöglicht es einer einzelnen arithmetischen Logikeinheit, eine Verarbeitungsgeschwindigkeit von einem Vorgang (z. B. Addieren oder Multiplizieren) pro Takt aufrechtzuerhalten. Dies wurde vorstehend bei dem Beispiel mit dem Vorgang für einen Vektor mit Länge 6 veranschaulicht.
  • 8 veranschaulicht, allgemein bei 800, eine Speicherstruktur 830, die 2 Leseanschlüsse und 1 Schreibanschluss unterstützt. In dieser Implementierung gibt es zwei Kopien jedes Speicherorts, d. h. eine erste Kopie bei Speicher 1 bei 802 und eine zweite Kopie bei Speicher 2 bei 810. Jeder von dem Speicher 1 bei 802 und dem Speicher 2 bei 810 weist einen Leseanschluss und einen Schreibanschluss auf, wie jeweils bei 804 und 808 für den Speicher 1 802 und bei 814 und 816 für den Speicher 2 810 gezeigt. Dadurch werden insgesamt 2 Leseanschlüsse und 2 Schreibanschlüsse bereitgestellt. In dieser Implementierung sind die Schreibvorgänge 808 und 816 über 820 miteinander verbunden, sodass Schreibvorgänge auf beiden Speichern 802 und 810 gleichzeitig durchgeführt werden, wodurch die Speicher 802 und 810 hinsichtlich ihrer Schreibinhalte identisch gehalten werden. Die Speicher 802 und 810 hinsichtlich ihrer Schreibinhalte identisch zu halten, wird aufwändiger (größenmäßig), wenn der Speicher größer wird.
  • In einer Implementierung kann die Speicherstruktur 830 als eine Speicherbank betrachtet werden, für die die Bank 2 Leseanschlüsse und 1 Schreibanschluss aufweist, was gleichzeitige Lesevorgänge von jedem der Leseanschlüsse und Schreiben in den Schreibanschluss ermöglicht.
  • Die Speicherstruktur 830 ist in einer Implementierung zu 2 Speicherlesevorgängen und 1 Speicherschreibvorgang basierend auf einem einzigen Taktzyklus in der Lage. Das heißt, während eines einzigen Taktzyklus kann der Speicher 1 802 einen durch den Leseanschluss 804 adressierten Speicherort lesen und kann einen durch den Schreibanschluss 808 adressierten Speicherort schreiben, ebenso kann während desselben einzigen Taktzyklus der Speicher 2 810 einen durch den Leseanschluss 814 adressierten Speicherort lesen und kann einen durch den Schreibanschluss 816 adressierten Speicherort schreiben. Da der Schreibanschluss 808 und der Schreibanschluss 816 über 820 miteinander verbunden sind, erfolgt während eines einzigen Taktzyklus nur ein einziger Schreibvorgang. Somit ist die Speicherstruktur 830 in einer Implementierung zu 2 Lesevorgängen und 1 Schreibvorgang basierend auf einem einzigen Taktzyklus in der Lage.
  • In einer anderen Implementierung ist der Speicher mit jeweiligen Lese- und Schreibsteuerungen für jede der Partitionen partitioniert, und eine Einschränkung wird hinzugefügt, die es erforderlich macht, dass Lese- und Schreibvorgänge auf unterschiedlichen Partitionen erfolgen. Dadurch werden doppelte Kopien des Speichers vermieden, aber nun wird eine Programmieranforderung auferlegt, um sicherzustellen, dass die Einschränkung nicht verletzt wird.
  • 9 veranschaulicht, allgemein bei 900, einen Speicher (zum Beispiel einen RAM), bei dem eine spezifische Struktur zu dem Speicher hinzugefügt ist - die der logischen Adressen 908. In einer bestimmten Implementierung ist zum Beispiel der Speicher 256 Bits breit 902, und jede 32-Bits sind Teil einer anderen Bank 904-0 bis 904-7, wodurch der Speicher 8 Bänke breit ist. Jede Bank hat ihren eigenen Satz von RAM-Lese- und -Schreibsteuerungen. Das Diagramm zeigt, wie die logische Adresse 908 auf die physischen Adressen der 8 Bänke verteilt ist. Beispielsweise befindet sich die logische Adresse 12 in an der physischen Adresse 1 in bank_4.
  • In einer Implementierung, beispielsweise wie in 9 gezeigt, ist es mit dieser RAM-Bankaufteilung möglich, den RAM durch einen externen Prozess mit der Geschwindigkeit von 256 Bits pro Takt (zum Beispiel wie in 1 veranschaulicht) laden zu lassen. Die Vektor-ALU kann jedoch mit 32-Bit-Gleitkommaoperanden arbeiten. Da jede RAM-Bank ihre eigenen RAM-Lese- und -Schreibanschlüsse aufweist (z. B. wie in 8 bei der Speicherstruktur 830 gezeigt), ermöglicht dies, dass der Schreibanschluss ein 32-Bit-Ergebnis in eine physische RAM-Adresse schreibt, ohne dass der Schreibanschluss einen Read-Modify-Write-Vorgang (RMW-Vorgang) durchführen muss. Ein RAM, der durch einen externen Prozess mit der Geschwindigkeit von 256 Bits pro Takt geladen wird, ist in 1 veranschaulicht, wobei bei 141 ein externes Laden von 256 Bits vorliegt.
  • In einer Implementierung schließen die Lese- und Schreibanschlüsse Komponenten ein, die die logische Adresse in eine spezifische RAM-Bank und physische RAM-Adresse umwandeln.
  • 10 veranschaulicht, allgemein bei 1000, eine Implementierung, die die logische Adresse 1006 in eine spezifische RAM-Bank 1002 und physische RAM-Adresse 1004 umwandelt. In diesem Fall geben die unteren 3 Bits 1002 der logischen Adresse 1006 die RAM-Bank (bank_id) an, und die übrigen Bits geben die RAM-Adresse (RAM physical address) 1004 an.
  • Eine logische Adresse ist die durch ein Programm angegebene Adresse - das heißt die in dem Adressregister festgelegte Adresse, die dann durch das Schrittregister inkrementiert wird. Die physische Adresse ist die Adresse, die an eine RAM-Bank gesendet wird. Da wir veranschaulicht haben, dass 8 Bänke vorhanden sind, ist die physische Adresse die logische Adresse, bei der die niederwertigen 3 Bits entfernt sind.
  • 11 veranschaulicht, allgemein bei 1100, eine Implementierung, die einen Satz RRWs pro Takt unterstützt (was zwei Operanden-Lesevorgänge und einen Ergebnis-Schreibvorgang pro Takt angibt). Die zwei Operanden-Lesevorgänge werden gleichzeitig durchgeführt. Zur Veranschaulichung ist jedoch der Lesevorgang, der durch einen einzigen Leseanschluss durchgeführt wird, in 11 veranschaulicht. Bei 1102 wird die bank_id (RAM-Bank) und die physische RAM-Adresse aus der logischen Adresse bestimmt. Bei 1104 wird die bank_id verwendet, um das Lesen für die geeignete Bank zu freizugeben. Bei 1106 wird die physische RAM-Adresse an den gesamten Speicher getrieben. Insbesondere kann die bank_id nur bestimmte Bits der logischen Adresse darstellen, wie vorstehend beschrieben, und infolgedessen sollten alle potenziellen Leseorte freigegeben sein. Bei 1108 wird optional die logische Adresse um den Schrittwert inkrementiert. Das Inkrementieren bei 1108 bereitet auf die Adressierung der nächsten RAM-Adresse vor und wird allgemein durchgeführt, sofern nicht im nächsten Vorgang derselbe Operand verwendet wird. Bei 1110 wird überprüft, ob die gelesenen Daten gültig sind. Die gelesenen Daten sind im Allgemeinen aufgrund der Pipeline ein oder zwei Taktzyklen später gültig. Wenn die Prüfung auf gültige Daten bei 1110 nein ergibt (No), dann wird die Prüfung bei 1110 wiederholt. Wenn die gelesenen Daten gültig sind (Yes), dann wird mit 1112 fortgefahren. Bei 1112 werden die 256 Bits RAM-Daten erfasst, die ausgelesen wurden. Bei 1114 werden die Daten um 32*bank _id rotiert, sodass sich die gewünschten gelesenen Daten, d. h. die gewünschten 32 Bits der 256 Bits, die ausgelesen wurden, nun an den Bitpositionen 31:0 befinden. Bei 1116 werden die Bits 31:0 zu der arithmetischen Logikeinheit getrieben.
  • 12 veranschaulicht, allgemein bei 1200, eine Implementierung, die einen Satz RRWs pro Takt unterstützt (was zwei Operanden-Lesevorgänge und einen Ergebnis-Schreibvorgang pro Takt angibt), wobei der Schreibvorgang durch einen Schreibanschluss durchgeführt wird. Bei 1202 wird die bank_id und die RAM-Adresse aus der logischen Adresse bestimmt. Bei 1204 wird die physische RAM-Adresse an den gesamten Speicher getrieben. Bei 1206 werden die 32 Bits Ergebnisdaten aus der arithmetischen Logikeinheit (Bits 31:0) erfasst. Bei 1208 werden die Ergebnisdaten um n*32*bank_id rotiert, sodass sich die Schreibdaten an der korrekten Bankposition befinden. Mit n angegeben ist die Anzahl der Vektor-ALUs, die arbeiten, das heißt n = 1, 2, 4 oder 8. Bei 1210 wird das rotierte Ergebnis an alle Bänke getrieben. Bei 1212 wird die bank_id verwendet, um die Schreibfreigabe für die geeignete Bank auszuwählen. Bei 1214 wird optional die Schreibanschlussadresse um den Schreibschrittwert inkrementiert. Das Inkrementieren bei 1214 bereitet die nächste Schreibanschluss-RAM-Adresse vor und wird allgemein durchgeführt, es sei denn, wir überschreiben den vorherigen Wert.
  • Die Rotation bei 1208 für n <> 1 ist für die Situation (weitere Details nachstehend), in der mehrere ALUs vorhanden sind. Die bank_id wird aus der ersten zu schreibenden logischen Adresse bestimmt. Das heißt, die Schreibdaten aus der 2. ALU werden zu dem Ort für die nachfolgende bank_id rotiert.
  • Während das vorstehende Beispiel einen Betriebsmodus mit einem einzigen RRW veranschaulicht, sind die offenbarten Techniken nicht auf einen Betriebsmodus mit einem einzigen RRW beschränkt, und andere Implementierungen unterstützen einen Betriebsmodus, der es ermöglicht, dass mehrere Sätze von RRWs gleichzeitig erfolgen. 8 Bänke können bis zu 8 arithmetische Logikeinheiten unterstützen, wodurch die Leistung eines Vektorvorgangs bis zu 8-fach verbessert wird. Wie in 1 gezeigt, können bei Vektordaten 120 Implementierungen 1, 2, 4 oder 8 Vektor-ALUs unterstützen. Das heißt, n kann 1, 2, 4 oder 8 sein.
  • Die Implementierung ist nicht dahin gehend beschränkt, und eine beliebige Anzahl von ALUs kann verwendet werden.
  • Bei einem Implementierungsfall von 8 Vektor-ALUs muss jeder Lese- und Schreibanschluss 8 gleichzeitige Lese- oder Schreibvorgänge unterstützen. Somit sind für einen RRW-Vorgang von 8 Vektor-ALUs 16 Lese- und 8 gleichzeitige Schreibvorgänge erforderlich. Dies ist erreichbar, wenn die Schrittregister einen Wert von 1 aufweisen, da dies vorsieht, dass zum Durchführen aller Lese- oder Schreibvorgänge von diesem Anschluss auf sich gegenseitig ausschließende Kombinationen von Bänken zugegriffen wird.
  • Wie schon erwähnt, ist eine logische Adresse die durch ein Programm angegebene Adresse - das heißt die in dem Adressregister festgelegte Adresse, die dann durch das Schrittregister inkrementiert wird. Die physische Adresse ist die Adresse, die an eine RAM-Bank gesendet wird. Da wir veranschaulicht haben, dass 8 Bänke verwendet werden, ist die physische Adresse die logische Adresse, bei der die 3 Bits niedrigerer Ordnung entfernt sind.
  • Wenn der Schritt 1 ist und die logische Adresse zum Beispiel 100 ist, lautet die Sequenz von logischen Adressen 100, 101, 102, ... usw. Das heißt, die logische Adresse, beginnend bei 100, wird dadurch inkrementiert, dass der Schritt 1 jedes Mal der logischen Adresse hinzugefügt wird, wenn wir die nächste Speicheradresse adressieren. Wenn wir 8 ALUs haben, müssen wir Operanden aus allen 8 Bänken gleichzeitig lesen.
  • Wenn die logische Adresse jedoch 100 ist (entsprechend binär 01100100) und wir die unteren 3 Bits weglassen, erhalten wir die physische Adresse 12 (binär 01100). Wenn wir nun für die logischen Adressen 101 (binär 01100101), 102 (binär 1100110) und 103 (binär 01100111) die unteren 3 Bits weglassen, haben wir die physische Adresse 12. Es ist jedoch zu beachten, dass, wenn wir eine logische Adresse 104 (binär 01101000) haben, wir eine physische Adresse 13 (binär 1101) haben.
  • Das heißt, es ist zu beachten, dass, wenn die physische Adresse für die logischen Adressen 100-103 12 ist (Adresse >> 3), ist für die logischen Adressen 104-108 die physische Adresse 13. Somit werden einige Bänke mit der physischen Adresse 12 und anderen mit der physischen Adresse 13 gelesen.
  • Die Startbank (die Startadresse ist in diesem Beispiel 100, hat die bank_id 4 („Adresse & 7“, was die unteren 3 Bits der Adresse ist, d. h. binär 100.) Die nachfolgenden Bänke sind 5, 6, 7 für die Adressen 101, 102, 103. Für die Adressen 104-107 (die gleichzeitig mit 100-103 gelesen werden) ist die bank _id jedoch 0, 1, 2, 3 - niedriger als die bank_id der Startadresse. Diese Bänke, diejenigen mit einer niedrigeren bank_id relativ zu der Start-bank _id, erfordern eine inkrementierte physische Adresse.
  • Der Anschluss muss jeder von den Bänken entweder die physische Adresse oder die inkrementierte physische Adresse bereitstellen.
  • Ein ähnlicher Umstand tritt für den Schreibanschluss auf, wenn mehr als 1 Schreibvorgang pro Zyklus erfolgt.
  • Ein von 1 abweichender Schritt kann für viele ALUs ein Problem werden. Nehmen wie zum Beispiel an, der Schritt beträgt 8. Da die niederwertigen 3 Bits von 8 000 sind, ändern sich die niederwertigen 3 Bits nicht, wenn wir den Schritt zu der Adresse hinzufügen. Das bedeutet, dass jede Adresse auf dieselbe Bank zugreift. Wenn wir 8 ALUs haben, wird eine Bank benötigt, um alle 8 Lesevorgänge im gleichen Zyklus durchzuführen. Und bei beiden Operanden kann das gleiche Problem auftreten, dass es erforderlich ist, dass jede der 8 Bänke 16 Leseanschlüsse aufweist. Dieses Problem tritt jedoch nicht auf, wenn der Schritt 1 ist und die Anzahl der ALUs die Anzahl der Bänke nicht überschreitet.
  • In einer Implementierung stellt der Schritt von 1 nicht notwendigerweise eine praktische Einschränkung dar. Zum Beispiel erfordert eine Matrix-Multiplikation, dass das Skalarprodukt für Zeilen einer Matrix mit den Spalten der zweiten Matrix generiert wird. Wenn Zeilen einen Schritt von 1 haben, dann Spalten nicht. Wenn die zweite Matrix jedoch transponiert wird, dann sind die bisherigen Spalten jetzt Zeilen, und daher können beide Matrizen nun einen Schritt von 1 aufweisen.
  • Zum Beispiel ist bei Algorithmen für maschinelles Lernen oft die zweite Matrix eine Matrix von vorbestimmten Konstanten, die als Bias oder Gewichtung verwendet werden. Da sie vorbestimmt ist, kann sie in einer bereits transponierten Form in das Speichersubsystem geladen werden, wodurch kein Overhead für das Durchführen einer Transposition durch das VPU-Programm (Vektorverarbeitungseinheitsprogramm) erforderlich ist.
  • Wenn zum Beispiel bei einer Vektoraddition die Schrittregister für alle Lese- und Schreibanschlüsse auf 1 gesetzt werden, beziehen sich die logischen Adressen addr+0, addr+1, addr+2, ..., addr+7 auf unterschiedliche RAM-Bänke, und somit kann gleichzeitig auf sie zugegriffen werden. Daher können die Lese- und Schreibanschlüsse 8 Vorgänge pro Takt unterstützen. Solange alle von der Anweisung vorgeschriebenen Lese- und Schreibanschlüsse auch die gleiche Geschwindigkeit unterstützen können (z. B. einen Schrittwert von 1 aufweisen, was bedeutet, dass gleichzeitig auf sich gegenseitig ausschließende Kombinationen von Bänken zugegriffen wird, um alle Lese- oder Schreibvorgänge von diesem Anschluss durchzuführen), kann die gesamte Anweisung mit der beschleunigten Geschwindigkeit ausgeführt werden.
  • Der beschleunigte Geschwindigkeit oder der Beschleunigungsfaktor (z. B. 1, 2, 4 oder 8) bezieht sich auf die Anzahl der Vektor-ALUs, die gleichzeitig arbeiten. Zum Beispiel gibt eine beschleunigte Geschwindigkeit von 1 an, dass 1 Vektor-ALU arbeitet, während eine beschleunigte Geschwindigkeit von 8 angibt, dass 8 Vektor-ALUs arbeiten.
  • Die beschleunigte Geschwindigkeit modifiziert das Inkrementieren des Adressregisters für jeden Anschluss. Anstatt das Adressregister um das Schrittregister zu inkrementieren, wird es um den Beschleunigungsfaktor multipliziert mit dem Schrittregister inkrementiert, in diesem Fall 8 * Schrittregister für eine beschleunigte Geschwindigkeit von 8. Der Beschleunigungsfaktor ist abhängig von der Anzahl der ALUs, die für einen bestimmten Vektor oder arithmetischen Vorgang verwendet werden. Wenn dies für eine bestimmte Implementierung auf eines von 1, 2, 4 oder 8 festgelegt ist, dann ist die Adressinkrementierungsfunktion Adressregister + (Schrittregister << {0, 1, 2 oder 3}). Eine Verschiebung von 0 ist für einen Vorgang erforderlich, der nicht beschleunigt werden kann, etwa, wenn nicht alle Schrittregister gleich 1 sind. Daher inkrementiert eine bestimmte Implementierung die Adresse um den Schritt << S, wobei S 1, 2 oder 3 ist, je nachdem, ob 2, 4 oder 8 ALUs verfügbar sind.
  • Darüber hinaus ist dies für mehr als 1 ALU der gleiche Datenrotationsalgorithmus. Rotation der Daten der Startadresse in Bit 31:0 bedeutet, dass nur 31:0 zu ALU 0 geht. Aber die gleiche Rotation bedeutet, dass 63:32 immer zu ALU 1 geht, 95:63 zu ALU 2, usw.
  • Dann müssen sie für die Daten, die von den ALUs für einen Schreibvorgang kommen, auf gleiche Weise rotiert werden. Die ALUs 7 bis 0 bilden 8*32 Datenbits in der Form 255:0 Bits. Dies wird rotiert, sodass die 31:0 Bits zu der durch die Startadresse angegebenen Bank rotiert werden. Auf diese Weise empfängt ALU 0 die gelesenen Daten von den Leseoperand-Startadressen und schreibt das Ergebnis in die Startschreibadresse. Die ALUs 1-7 werden korrekt rotiert, symmetrisch mit dem Leseprozess.
  • Der Grund dafür, dass alle an dem Vorgang beteiligten Schrittregister 1 sein sollten, ist, dass ein Bankkonflikt vermieden werden soll, wobei eine Bank eines bestimmten Anschlusses zwei unterschiedliche Lesevorgänge oder zwei unterschiedliche Schreibvorgänge gleichzeitig durchführen muss. Dies ist besonders offensichtlich, wenn das Schrittregister 8 ist, da das bedeuten würde, dass alle 8 unterschiedlichen Lesevorgänge von derselben Bank durchgeführt werden müssten! Das heißt, ein Schritt von 8 bedeutet, dass alle Adressen dieselbe bank_id aufweisen, in einem Beispiel, in dem die bank_id die niederwertigen 3 Bits ist, wobei es sich versteht, dass unterschiedliche Anzahlen von Bänken verwendet werden können, ohne den Schutzumfang zu überschreiten.
  • Das Verfahren mit dem beschleunigten Betriebsmodus muss auch berücksichtigen, dass der letzte Zyklus von Schreibvorgängen nicht notwendigerweise in alle Bänke schreibt. Zum Beispiel muss ein Vektor, der mit der Länge 83 hinzugefügt wird, für 10 Zyklen alle 8 Bänke schreiben und dann beim 11. Zyklus nur 3 Bänke. Es ist nicht schlimm, wenn von einer Bank gelesen wird, deren Daten nicht benötigt werden, aber es ist ein Problem, in eine Bank mit Daten zu schreiben, die nicht Teil des spezifizierten Vorgangs sind.
  • Das nachstehende Diagramm veranschaulicht, dass die Operandenlesevorgänge r0-r9 jeweils 8 Sätze von Operanden lesen. Die Vektormultiplikation erzeugt 8 Multiplikationsergebnisse pro Zyklus für m0-m9 für insgesamt 80 Ergebnisse. Diese 80 Ergebnisse werden von w0-w9 mit einer Geschwindigkeit von 8 pro Takt geschrieben. Die Vektorlänge beträgt jedoch 83, und r10, m10 und w10 sind für das Lesen und Schreiben der letzten 3 Ergebnisse verantwortlich. Es ist von entscheidender Bedeutung, dass w10 nur 3 Ergebnisse schreibt, nicht die volle Kapazität von 8 Ergebnissen, da er ansonsten den Speicher über die Länge des Ergebnisvektors hinaus modifiziert.
  • Ob r10 3 oder 8 Operanden liest oder m10 3 oder 8 Ergebnisse generiert, ist in diesem Beispiel unwichtig, da w10 nur die ersten 3 Ergebnisse schreibt. Wenn der Vektorvorgang jedoch ein Skalarprodukt wäre, muss die ALU die überschüssigen 5 Operanden so behandeln, als hätten Sie einen Nullwert, um das Ergebnis nicht falsch zu beeinflussen. Entweder muss r10 die überschüssigen 5 Operanden auf Null setzen, oder die ALU muss sie für einen Skalarproduktvorgang ignorieren.
    Figure DE112022000529T5_0005
  • 13 veranschaulicht, allgemein bei 1300, eine Implementierung des beschleunigten Betriebsmodus, die einen Leseanschlussvorgang zeigt. Bei 1302 wird bestimmt, ob dies ein beschleunigter Betrieb ist. Bei 1304 wird die bank_id, b und die RAM _address aus der logischen Adresse bestimmt (wobei b die Start-bank id ist). Bei 1306 wird, wenn ein beschleunigter Betrieb angegeben wird, die Lesefreigabe für alle Bänke aktiviert (optional werden unnötige Lesefreigaben eliminiert), andernfalls wird die bank_id verwendet, um die Lesefreigabe für die entsprechende Bank zu aktivieren. Bei 1308 werden die RAM address und die RAM _address+1 generiert. Bei 1310 wird die RAM _address zu den Bänken b bis 7 getrieben und die RAM _address+1 zu den Bänken 0 bis b-1 getrieben, wobei b die Start-bank _id ist. Bei 1312 wird bei einem beschleunigten Betrieb die Adresse um den Schrittwert << {1, 2, 3 }, je nach Beschleunigungsfaktor, inkrementiert, andernfalls wird die Adresse um den Schrittwert inkrementiert. Bei 1314 wird überprüft, ob die gelesenen Daten gültig sind. Die gelesenen Daten sind im Allgemeinen ein oder zwei Taktzyklen später gültig. Wenn die Prüfung auf gültige Daten bei 1314 nein ergibt (No), dann wird die Prüfung bei 1314 wiederholt. Wenn die gelesenen Daten gültig sind (Yes), dann wird mit 1316 fortgefahren. Bei 1316 werden die 256 Bits RAM-Daten erfasst, die ausgelesen wurden. Bei 1318 werden die Daten um 32*bank_id rotiert, sodass sich die gelesenen Daten der ersten Bank an den Bitpositionen 31:0 befinden und die gelesenen Daten der letzten Bank sich an den Bitpositionen 255:224 für den Beschleunigungsfaktor 8, 127:96 für den Beschleunigungsfaktor 4, 64:32 für den Beschleunigungsfaktor 2 und 31:0 für den Beschleunigungsfaktor 1 befinden. Bei 1320 werden die Bits 31:0 zu der arithmetischen Logikeinheit getrieben.
  • 14 veranschaulicht, allgemein bei 1400, eine Implementierung des beschleunigten Betriebsmodus, die den Schreibanschlussvorgang zeigt. Bei 1402 wird bestimmt, ob dies ein beschleunigter Betrieb ist. Bei 1404 wird die bank_id, b und die RAM _address aus der logischen Adresse bestimmt (b ist die Start-bank _id). Bei 1406 werden die RAM _address und die RAM _address+1 generiert. Bei 1408 wird die RAM_address zu den Bänken b bis 7 getrieben und die RAM _address+1 zu den Bänken 0 bis b-1 getrieben, wobei b die Start-bank _id ist. Bei 1410 werden die 256 Bits Ergebnisdaten aus den 8 arithmetischen Logikeinheiten erfasst. Bei 1412 werden die Ergebnisdaten um 32*bank_id rotiert, sodass die Schreibdaten aus ALU 0 mit der Bank b ausgerichtet sind, ALU 1 mit der Bank b+1 ausgerichtet ist und so weiter. Bei 1414 wird das rotierte Ergebnis an alle Bänke getrieben. Bei 1416 werden die Schreibfreigaben für jede Bank generiert, wo die Anzahl von Schreibfreigaben gleich dem Beschleunigungsfaktor ist. Wenn ein beschleunigter Betrieb und der letzte Schreibzyklus vorliegen, dann werden die Bankschreibfreigaben, die über die ALU hinausgehen, die das Ende angibt, auf Null gesetzt (deaktiviert). Die Schreibfreigaben werden auf ähnliche Weise wie die Daten rotiert, sodass die Daten und die Bankfreigaben auf ähnliche Weise mit der Bank ausgerichtet sind. Bei 1418 werden die generierten Schreibfreigaben zu den Bänken getrieben. Bei 1420 wird bei einem beschleunigten Betrieb die Adresse um den Schrittwert << { 1, 2, 3}, je nach Beschleunigungsfaktor, inkrementiert, andernfalls wird die Adresse um den Schrittwert inkrementiert.
  • Bei 1416 setzen wir Bankschreibfreigaben, die über die ALU hinausgehen, die das Ende angibt, auf Null (deaktivieren). Wenn zum Beispiel die Anzahl der durchzuführenden Schreibvorgänge 35 beträgt und 8 ALUs vorhanden sind, schreiben die ersten 4 Zyklen alle 8 Bänke, aber der letzte Zyklus schreibt nur die 3 Ergebnisse aus ALU 0, 1 und 2.
  • Es ist zu beachten, dass, obwohl die beschriebenen Techniken einen beschleunigten Betrieb ermöglichen, man zu bestimmten Zeiten möglicherweise nicht alle Vorgänge beschleunigen möchte. Wenn beispielsweise einer der Vorgänge darin besteht, die TANH-Werte aus einer Sequenz von Operanden zu berechnen, kann dies viel Schaltungslogik darstellen und wird möglicherweise nur in ALU #0 implementiert. Das heißt zum Beispiel, dass die 8 ALUs (z. B. Vektor-ALU #0 bis Vektor-ALU #7 in 15) nicht identisch sein müssen. Wenn ALU #0 zum Berechnen von TANH-Werten aus einer Sequenz von Operanden verbessert, oder nur verwendet, wird, kann dies nicht beschleunigt werden. Häufige Vorgänge, beispielsweise, aber nicht beschränkt auf, ADD, MUL, können jedoch in allen ALUs implementiert werden und können beschleunigt werden.
  • 15 veranschaulicht, allgemein bei 1500, eine Implementierung, die 8 Vektor-arithmetische Logikeinheiten (Vektor-ALUs) und deren unterstützende Vektorsteuerung und Vektordaten zeigt. Zur Vereinfachung der Veranschaulichung, während die Techniken nicht dahin gehend beschränkt sind, veranschaulichen wir in 15 8 Vektor-ALU-Einheiten, die alle als im Lockstep arbeitend verstanden werden können. Das heißt, sie arbeiten alle gleichzeitig und greifen gleichzeitig auf den Speicher zu. Das heißt, sie lesen alle ihre eigenen 2 Operanden gleichzeitig und sie schreiben alle ihre eigenen Ergebnisse gleichzeitig. Dementsprechend wird, zur Vereinfachung der Veranschaulichung, während die Techniken nicht dahin gehend beschränkt sind, nur eine einzige Vektorsteuerung benötigt, um zum Beispiel einen 256 Bit breiten Speicher für 2 Lesevorgänge und 1 Schreibvorgang pro Zyklus zu adressieren. Eine solche Speicherstruktur wurde in 8 veranschaulicht. Außerdem veranschaulicht 15, zur Vereinfachung der Veranschaulichung, während die Techniken nicht dahin gehend beschränkt sind, dedizierte Speicherbänke für jede Vektor-. Bei 1502 ist ein Speicheruntersystem mit 8 Ausgabebänken 1502-0 bank_0 bis 1502-7 bank_7 gezeigt. Die Vektorsteuerung 1504 schließt bei 1506 Operand 1 address and stride (als Vektorleseanschluss betrachtet) ein, der über 1508 eine Schnittstelle mit 1502 Speicheruntersystem aufweist.
  • Ebenfalls gezeigt ist bei 1504 Vektorsteuerung bei 1512 Operand 2 address and stride (als Vektorleseanschluss betrachtet), der über 1514 eine Schnittstelle mit 1502 Speicheruntersystem aufweist.
  • Ebenfalls gezeigt ist bei 1504 Vektorsteuerung bei 1518 Result address and stride (als Vektorschreibanschluss betrachtet), der über 1520 eine Schnittstelle mit 1502 Speichersubsystem aufweist. 15 zeigt bei 1520 zwei Pfeile, die in das Speicheruntersystem 1502 führen, obwohl nur einer benötigt wird. Dies dient lediglich der Veranschaulichung, damit sich der Leser zum Beispiel auf die in 8 veranschaulichte Speicherstruktur bei 830 beziehen kann, die 2 Leseanschlüsse und 1 Schreibanschluss unterstützt.
  • Bei 1534-0 ist die Vektor-ALU #0 gezeigt, die bei 1524-0 Operand 1 über 1522-0 aus bank_0 1502-0 empfangen wird; bei 1528-0 Operand 2 über 1526-0 aus bank _0 1502-0 empfangen wird; und bei 1530-0 Result über 1532-0 an bank_0 1502-0 gesendet wird.
  • Die nicht gezeigten 1534-1, 1534-2, 1534-3, 1534-4, 1534-5 und 1534-6 weisen eine ähnliche Struktur auf, wie die bei 1534-0 gezeigte.
  • Bei 1534-7 ist die Vektor-ALU #7 gezeigt, die bei 1524-7 Operand 1 über 1522-7 aus bank_7 1502-7 empfangen wird; bei 1528-7 Operand 2 über 1526-7 aus bank_7 1502-7 empfangen wird; und bei 1530-7 Result wird über 1532-7 an bank_7 1502-7 gesendet wird.
  • Wie in 15 gezeigt, sind, wenn die Vektor-ALU, zum Beispiel Vektor-ALU #0, eine 32-Bit-Vektor-ALU ist, sind die Lese- und Schreibanschlüsse 32 Bits breit.
  • Somit ist für eine Vektorprozessoreinheit mit 8 Vektor-ALUs der Speicher 8 Vektor-ALUs*32 Bits pro Vektor ALU = 256 Bits breit.
  • Wie in 15 zu sehen ist, liegt eine Mehrzahl von Vektoranschlüssen 1506 und 1512 und 1518 vor. Jeder kann jeweils einen Lesevorgang pro Taktzyklus über die Schnittstelle 1508 und 1514 von dem Speicheruntersystem 1502 und einen Schreibvorgang durch die Schnittstelle 1520 unterstützen, somit 2 Lesevorgänge und 1 Schreibvorgang pro Taktzyklus, während ein Sammel- und Streuvorgang durchgeführt wird. Das heißt, die Vektoranschlüsse 1506 stellen ihrem jeweiligen Speicher Adress- und Schrittinformationen zum Sammeln der jeweiligen Vektoren zur Verfügung, und 1518 stellt dem Speicher Adress- und Schrittinformationen zum Streuen der Ergebnisse der Vorgänge der jeweiligen Vektoren zur Verfügung.
  • Wie in 15 zu sehen ist, kann, wenn alle 8 jeweiligen Vektorsteuereinheiten (mit ihren Vektoranschlüssen) und Speicher und Vektor-ALUs arbeiten, die Mehrzahl von Vektoranschlüssen sechzehn Lese- und acht Schreibvorgänge pro Taktzyklus für das Speichersubsystem 1502 unterstützen, welches in einem Beispiel ein Direktzugriffsspeicher ist.
  • Während verschiedene Implementierungen der Lese- und Schreibanschlüsse zu Veranschaulichungszwecken beschrieben wurden, wurde die Struktur von 8 in 15 verwendet, um das Verständnis der Lese- und Schreibanschlüsse zu erleichtern.
  • Wie in der Beschreibung zu 15 erwähnt, bestand eine der Vereinfachungen darin, eine Bank des Speichersubsystems einer bestimmten Vektor-ALU zuzuordnen. Die Technik ist nicht dahin gehend beschränkt, und wie oben zum Beispiel bei 11, 12, 13 und 14 beschrieben wurde, machen die Speicheradressierung und Rotationen die Lese- und Schreibvorgänge (Sammel- und Streuvorgänge) sehr flexibel.
  • Eine Überlegung in Bezug auf das Programmieren, wenn eine Implementierung den beschleunigten Modus vorsieht, besteht darin, dass Vektoren vorzugsweise einen Schritt von 1 aufweisen, da dies den beschleunigten Modus ermöglicht. Zum Beispiel erfordert eine Matrixmultiplikation viele Skalarprodukte aus Zeilenvektoren und Spaltenvektoren. Von daher können diese nicht beschleunigt werden. Wenn aber die Matrix des zweiten Operanden zuerst transponiert wird, dann wird das Skalarprodukt mit Paaren von Zeilenvektoren durchgeführt, von denen jeweils beide einen Schritt von 1 aufweisen. Die erzielte Beschleunigung kann den Overhead für die Transposition weit überwiegen, da die Kosten der Transposition in O-Notation N (f(x) = O(N)) sind, aber der Leistungsgewinn in O-Notation N^2 (f(x) = O(N^2) ist.
  • Häufig können die Matrix-Transpositionen eliminiert werden, indem die Form der Daten geändert wird. Zum Beispiel kann in neuronalen Netzwerken häufig eine Matrix ein Satz von Konstanten und daher vorbestimmt sein. Es ist relativ einfach, die Daten zu transponieren, wenn sie vorbestimmt sind, sodass sie bereits in transponierter Form im Speicher vorliegen.
  • Während sich die vorstehenden Abbildungen auf Zeilen- und Spaltenadressierung konzentrieren, ist die Implementierung nicht dahin gehend beschränkt. Zum Beispiel wird eine diagonale Adressierung einer Matrix durch Verwenden des Schritts je nach Bedarf erreicht. Zum Beispiel sind, mit Bezug auf 3, wenn die Diagonale beginnend bei Zeile 1 Spalte 1 bis Zeile 4 Spalte 4 gewünscht ist (d. h. der Vektor 1, 9, 6, 4), die Adressen 0, 5, 10, 15. Durch Festlegen des Schritts auf 5 wird diese Adressierungssequenz erreicht. Wiederum mit Bezug auf 3 sind zum Beispiel, wenn der Diagonalvektor 4, 1, 7, 3 (Zeile 1 Spalte 4 bis Spalte 1 Zeile 4) gewünscht ist, die Adressen jeweils 3, 6, 9, 12. Auch hier wird durch Festlegen des Schritts auf 3 diese Adressierungssequenz erreicht.
  • 16 veranschaulicht, allgemein bei 1600, eine Implementierung, die zeigt, wie verschiedene Adress- und Schrittwerte dazu führen, dass auf unterschiedliche Werte von einem Speicher, der zum Beispiel Inhalte enthält, ohne Einschränkung einer Matrix zugegriffen werden kann. Bei 1630 ist eine 4x4-Matrix mit Schreibangaben. Bei 1602 ist eine 4x4-Matrix mit 4 Zeilen und 4 Spalten. Bei 1611 ist ein Zeilenvektor 1 mit 4 Elementen mit den jeweiligen Werten 1, 2, 7 und 4. Bei 1612 ist ein Zeilenvektor 2 mit 4 Elementen mit den jeweiligen Werten 3, 9, 1 und 8. Bei 1613 ist ein Zeilenvektor 3 mit 4 Elementen mit den jeweiligen Werten 2, 7, 6 und 5. Bei 1614 ist ein Zeilenvektor 4 mit 4 Elementen mit den jeweiligen Werten 3, 1, 7 und 4. Bei 1621 ist ein Spaltenvektor 1 mit 4 Elementen mit den jeweiligen Werten 1, 3, 2 und 3. Bei 1622 ist ein Spaltenvektor 2 mit 4 Elementen mit den jeweiligen Werten 2, 9, 7 und 1. Bei 1623 ist ein Spaltenvektor 3 mit 4 Elementen mit den jeweiligen Werten 7, 1, 6 und 7. Bei 1624 ist ein Spaltenvektor 4 mit 4 Elementen mit den jeweiligen Werten 4, 8, 5 und 4. Bei 1625 ist ein Diagonalvektor 1 mit 4 Elementen mit den jeweiligen Werten 1, 9, 6 und 4.
  • Bei 1640 wird das Ergebnis des Zugreifens auf die Matrix 1602 unter Verwendung einer Startadresse von 0 und eines Schritts von 1 für 4 Zugriffe gezeigt. Wie zu sehen ist, wurde damit auf 1611 Zeilenvektor 1 zugegriffen.
  • Bei 1642 wird das Ergebnis des Zugreifens auf die Matrix 1602 unter Verwendung einer Startadresse von 0 und eines Schritts von 4 für 4 Zugriffe gezeigt. Wie zu sehen ist, wurde damit auf 1621 Spaltenvektor 1 zugegriffen.
  • Bei 1644 wird das Ergebnis des Zugreifens auf die Matrix 1602 unter Verwendung einer Startadresse von 0 und eines Schritts von 5 für 4 Zugriffe gezeigt. Wie zu sehen ist, wurde damit auf den Diagonalvektor von der oberen linken 1 bis zur unteren rechten 4 zugegriffen, angegeben als Diagonalvektor 1 1625.
  • Somit wurden ein Verfahren und eine Vorrichtung für Gather/Scatter-Vorgänge in einem Vektorprozessor beschrieben.
  • Zum Zwecke der Erörterung und des Verständnisses der Beispiele versteht es sich, dass verschiedene vom Fachmann verwendete Begriffe verwendet werden, um Techniken und Ansätze zu beschreiben. Des Weiteren werden in der Beschreibung zu Erklärungszwecken zahlreiche spezifische Details dargelegt, um ein umfassendes Verständnis der Beispiele bereitzustellen. Es ist jedoch für den Durchschnittsfachmann offensichtlich, dass die Beispiele ohne diese spezifischen Details umgesetzt werden können. In einigen Fällen sind hinlänglich bekannte Strukturen und Vorrichtungen in Form eines Blockdiagramms und nicht im Detail gezeigt, um die Beispiele nicht zu verunklaren. Diese Beispiele sind hinreichend detailliert beschrieben, um es dem Durchschnittsfachmann zu ermöglichen, die Beispiele umzusetzen, und es versteht sich, dass andere Beispiele genutzt werden können und dass logische, mechanische und andere Änderungen vorgenommen werden können, ohne vom Schutzumfang der Beispiele abzuweichen.
  • Wie in dieser Beschreibung verwendet, versteht es sich für einen Fachmann, dass eine Schreibweise wie zum Beispiel „Schrittwert << { 1, 2, 3}“ angibt, dass der Schrittwert um 1, 2 oder 3 Bit-Positionen verschoben werden soll, was jeweils (Schrittwert)*2, (Schrittwert)*4 bzw. (Schrittwert)*8 entspricht.
  • Wie in dieser Beschreibung verwendet, sind Bezugnahmen auf Bits so zu verstehen, dass sie einzelne Daten bezeichnen. Eine Gruppierung mehrerer Bits kann durch Verwenden einer Endian-Schreibweise dargestellt werden. Die Endian-Schreibweise kann entweder Big-Endian oder Little-Endian sein. Bei Big-Endian werden die Bits von links nach rechts nummeriert. Zum Beispiel sind die Bits eines Bytes mit 0, 1, 2, 3, 4, 5, 6, 7 nummeriert. Bei Little-Endian werden die Bits von rechts nach links nummeriert. Zum Beispiel sind die Bits eines Bytes mit 7, 6, 5, 4, 3, 2, 1, 0 nummeriert.
  • Zum Beispiel versteht es sich, dass die Bits 31:0 die Bits folgendermaßen darstellen:
    • 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 10
  • Wie in dieser Beschreibung verwendet, bedeuten „ein Beispiel“ (im Sinne von einem einzigen) oder „ein Beispiel“ oder ähnliche Ausdrücke, dass das/die Merkmale/e in mindestens einem Beispiel eingeschlossen sind. Bezugnahmen auf „ein Beispiel“ in dieser Beschreibung beziehen sich nicht notwendigerweise auf das gleiche Beispiel; allerdings schließen sich solche Beispiele auch nicht gegenseitig aus. „Ein Beispiel“ impliziert auch nicht, dass es nur ein einziges Beispiel gibt. Zum Beispiel kann ein Merkmal, eine Struktur, ein Vorgang usw., das in „einem Beispiel“ beschrieben ist, auch in anderen Beispielen eingeschlossen sein. Somit kann die Erfindung eine Mehrzahl von Kombinationen und/oder Integrationen der hierin beschriebenen Beispiele einschließen.
  • Wie in dieser Beschreibung verwendet, werden „im Wesentlichen“ oder „im Wesentlichen gleich“ oder ähnliche Ausdrücke verwendet, um anzugeben, dass die Gegenstände einander sehr nahe kommen oder ähnlich sind. Da zwei physische Entitäten nie exakt gleich sein können, wird ein Ausdruck wie „im Wesentlichen gleich“ verwendet, um anzugeben, dass sie für alle praktischen Zwecke gleich sind.
  • Es versteht sich, dass in einem beliebigen Beispiel oder in beliebigen mehreren Beispielen, in denen alternative Ansätze oder Techniken erörtert werden, jegliche und alle etwaigen möglichen Kombinationen hiermit offenbart werden. Wenn zum Beispiel fünf Techniken erörtert werden, die alle möglich sind, dann bedeutet Bezeichnen der einzelnen Techniken wie folgt: A, B, C, D, E, dass jede Technik mit jeder anderen Technik vorhanden oder nicht vorhanden sein kann, wodurch sich 2^5 oder 32 Kombinationen ergeben, in binärer Reihenfolge im Bereich von nicht A und nicht B und nicht C und nicht D und nicht E bis A und B und C und D und E. Der/die Anmelder beanspruchen hiermit alle solchen möglichen Kombinationen. Der/die Anmelder bringen hiermit vor, dass die vorstehenden Kombinationen die geltenden EP-Normen (European-Patent-Normen) erfüllen. Es wird keiner Kombination der Vorzug gegeben.
  • Somit wurden ein Verfahren und eine Vorrichtung für Gather/Scatter-Vorgänge in einem Vektorprozessor beschrieben.
  • ZITATE ENTHALTEN IN DER BESCHREIBUNG
  • Diese Liste der vom Anmelder aufgeführten Dokumente wurde automatisiert erzeugt und ist ausschließlich zur besseren Information des Lesers aufgenommen. Die Liste ist nicht Bestandteil der deutschen Patent- bzw. Gebrauchsmusteranmeldung. Das DPMA übernimmt keinerlei Haftung für etwaige Fehler oder Auslassungen.
  • Zitierte Patentliteratur
    • US 63/180562 [0001]
    • US 17/669995 [0001]

Claims (10)

  1. Vektorprozessor-Gather/Scatter-Vorrichtung, umfassend: eine Mehrzahl von Vektoranschlüssen; einen Direktzugriffsspeicher; wobei die Mehrzahl von Vektoranschlüssen in Kommunikation mit dem Direktzugriffsspeicher steht; und wobei einer oder mehrere von der Mehrzahl von Vektoranschlüssen ein oder mehrere Adressregister und ein oder mehrere Schrittregister verwenden, um eine Adresse für den Direktzugriffsspeicher zu generieren.
  2. Vektorprozessor-Gather/Scatter-Vorrichtung nach Anspruch 1, wobei die Mehrzahl von Vektoranschlüssen bis zu zwei Lesevorgänge und einen Schreibvorgang pro Taktzyklus für den Direktzugriffsspeicher unterstützen kann, während ein Gather/Scatter-Vorgang durchgeführt wird.
  3. Vektorprozessor-Gather/Scatter-Vorrichtung nach Anspruch 1, wobei die Mehrzahl von Vektoranschlüssen sechzehn Lesevorgänge und acht Schreibvorgänge pro Taktzyklus für den Direktzugriffsspeicher unterstützen kann.
  4. Vektorprozessor-Gather/Scatter-Vorrichtung nach Anspruch 1, wobei das eine oder die mehreren Adressregister und das eine oder die mehreren Schrittregister ermöglichen, dass auf eine in dem Direktzugriffsspeicher gespeicherte Matrix entlang einer Sequenz zugegriffen werden kann, wobei die Sequenz aus einem oder mehreren der Folgenden besteht, und zwar entlang einer Zeile der Matrix, entlang einer Spalte der Matrix und entlang einer Diagonale der Matrix.
  5. Verfahren, umfassend: (a) Prüfen auf ein Leseanschluss-Startsignal, und bei Empfang Festlegen einer Inkrementzahl auf Null; (b) Initiieren eines Speicherlesevorgangs unter Verwendung eines Adressregisters und Festlegen der Inkrementzahl auf die Inkrementzahl + 1; (c) Inkrementieren des Adressregisters des Anschlusses durch das Schrittregister eines Anschlusses; (d) Prüfen, ob die Inkrementzahl größer oder gleich dem Längenregister eines Anschlusses ist, und wenn dies nicht der Fall ist, Fortfahren mit (b); und (e) Prüfen, ob die Inkrementzahl größer oder gleich dem Längenregister eines Anschlusses ist, und wenn dies der Fall ist, Fortfahren mit (a).
  6. Verfahren nach Anspruch 6, umfassend bei (e) Zurücksetzen des Adressregisters des Anschlusses auf einen ursprünglichen Wert.
  7. Verfahren, umfassend: (a) Empfangen einer logischen Adresse und Bestimmen aus der logischen Adresse einer Speicherbankadresse und einer physischen Speicheradresse; (b) Verwenden der Speicherbankadresse, um das Lesen aus einer Speicherbank zu ermöglichen; (c) Treiben der physischen Speicheradresse zu dem gesamten Speicher zum Lesen; (d) Prüfen, ob der Lesevorgang gültige Daten zurückgegeben hat, und wenn ja, Erfassen aller Speicherdaten, die ausgelesen wurden; (e) Rotieren der Speicherdaten, die gelesen wurden, um das 32-Fache der Bankadresse; und (f) Treiben der Bits 31:0 zu einer arithmetischen Logikeinheit.
  8. Verfahren nach Anspruch 7, umfassend bei (c) Inkrementieren der physischen Speicheradresse um einen Schrittwert.
  9. Verfahren, umfassend: Bestimmen einer Bankidentifikation und einer physischen Direktzugriffsspeicheradresse aus einer logischen Adresse; Treiben der physischen Direktzugriffsspeicheradresse zu dem gesamten Direktzugriffs speicher; Erfassen eines 32-Bit-Ergebnisses aus einer arithmetischen Einheit; Rotieren des erfassten 32-Ergebnisses basierend auf der Bankidentifizierung; Treiben des rotierten 32-Bit-Ergebnisses zu allen Bänken des Direktzugriffsspeichers; und Aktivieren einer Schreibfreigabe des Direktzugriffsspeichers basierend auf der Bankidentifikation.
  10. Verfahren nach Anspruch 9, umfassend das Inkrementieren einer Schreibanschlussadresse durch einen Schreib-Schrittwert.
DE112022000529.7T 2021-04-27 2022-02-22 Verfahren und vorrichtung für gather/scatter-vorgänge in einem vektorprozessor Pending DE112022000529T5 (de)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US202163180562P 2021-04-27 2021-04-27
US63/180,562 2021-04-27
US17/669,995 US20220342590A1 (en) 2021-04-27 2022-02-11 Method and Apparatus for Gather/Scatter Operations in a Vector Processor
US17/669,995 2022-02-11
PCT/US2022/017323 WO2022231683A1 (en) 2021-04-27 2022-02-22 Method and apparatus for gather/scatter operations in a vector processor

Publications (1)

Publication Number Publication Date
DE112022000529T5 true DE112022000529T5 (de) 2023-11-16

Family

ID=80735428

Family Applications (1)

Application Number Title Priority Date Filing Date
DE112022000529.7T Pending DE112022000529T5 (de) 2021-04-27 2022-02-22 Verfahren und vorrichtung für gather/scatter-vorgänge in einem vektorprozessor

Country Status (2)

Country Link
DE (1) DE112022000529T5 (de)
WO (1) WO2022231683A1 (de)

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5197130A (en) * 1989-12-29 1993-03-23 Supercomputer Systems Limited Partnership Cluster architecture for a highly parallel scalar/vector multiprocessor system
JPH0728786A (ja) * 1993-07-15 1995-01-31 Hitachi Ltd ベクトルプロセッサ
US6665790B1 (en) * 2000-02-29 2003-12-16 International Business Machines Corporation Vector register file with arbitrary vector addressing
JP5552692B2 (ja) * 2009-02-20 2014-07-16 インテル・コーポレーション マルチモードアクセス可能な記憶装置
US8635431B2 (en) * 2010-12-08 2014-01-21 International Business Machines Corporation Vector gather buffer for multiple address vector loads

Also Published As

Publication number Publication date
WO2022231683A1 (en) 2022-11-03

Similar Documents

Publication Publication Date Title
DE3210816C2 (de)
DE60018078T2 (de) Einstellung von bedingungswerten in einem rechner
DE19510879C2 (de) Brechnungsverfahren für simultane, lineare Gleichungen und speicherverteilter Parallelprozessor zur Durchführung des Verfahrens
DE3424962C2 (de)
DE2354521C2 (de) Verfahren und Einrichtung zum gleichzeitigen Zugriff zu verschiedenen Speichermoduln
DE102008031998A1 (de) System, Verfahren und Computerprogrammprodukt zum Ausführen einer Scanfunktion
DE2524046C2 (de) Elektronische Datenverarbeitungsanlage
DE1302494B (de)
DE202017007434U1 (de) Multicast-Netzwerk und Speichertransferoptimierungen zur Hardwarebeschleunigung neuronaler Netzwerke
DE2712224A1 (de) Datenverarbeitungsanlage
DE112013004770T5 (de) Lese- und -Schreibmaskenaktualisierungsbefehl zur Vektorisierung rekursiver Berechnungen über unabhängige Daten
DE60022206T2 (de) Registerspeicher zur verarbeitung von 2-d matrix
DE102017113867A1 (de) Kernprozesse für Blockoperationen an einem Bildprozessor mit einer zweidimensionalen Ausführungsbahnmatrix und einem zweidimensionalen Schieberegister
DE112011103211T5 (de) Auf einem Halbleiterchip implementierte vektorlogische Reduktionsoperation
DE102019126719A1 (de) Energieeffiziente Speichersysteme und Verfahren
DE102013006396A1 (de) Eine grafikverarbeitungseinheit, in der eine standardverarbeitungseinheit verwendet ist, und ein verfahren zum aufbau einer grafikverarbeitungseinheit
DE102013018135B4 (de) Adressenbit-Wiederabbildungsschema zur Reduzierung einer Zugriffsauflösung von DRAM-Zugriffen
DE2532125C2 (de) Modularbaustein für Datenverarbeitungsanlagen
DE3043653A1 (de) Datenverarbeitungsanlage
DE112020003004T5 (de) Dma-scatter- und gather-operationen für nicht zusammenhängenden speicher
DE4430195B4 (de) Verfahren zur Auswertung von Booleschen Ausdrücken
DE102014103184A1 (de) Auf dynamischer Umbenennung basierende Register-Rekonfiguration einer Vektorregisterdatei
DE2117581B2 (de) Einrichtung zur Adressenprüfung
DE102020106357A1 (de) Speichereinrichtung und verfahren mit anweisungsringspeicherwarteschlange
DE112022000529T5 (de) Verfahren und vorrichtung für gather/scatter-vorgänge in einem vektorprozessor

Legal Events

Date Code Title Description
R012 Request for examination validly filed