DE112020003066T5 - Transponierungsoperationen mit verarbeitungselementarray - Google Patents

Transponierungsoperationen mit verarbeitungselementarray Download PDF

Info

Publication number
DE112020003066T5
DE112020003066T5 DE112020003066.0T DE112020003066T DE112020003066T5 DE 112020003066 T5 DE112020003066 T5 DE 112020003066T5 DE 112020003066 T DE112020003066 T DE 112020003066T DE 112020003066 T5 DE112020003066 T5 DE 112020003066T5
Authority
DE
Germany
Prior art keywords
column
buffer
array
data elements
tensor
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
DE112020003066.0T
Other languages
English (en)
Inventor
Haichen Li
Ron Diamant
Jeffery T. Huynh
Yu Zhou
Se Jong Oh
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.)
Amazon Technologies Inc
Original Assignee
Amazon Technologies 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
Application filed by Amazon Technologies Inc filed Critical Amazon Technologies Inc
Publication of DE112020003066T5 publication Critical patent/DE112020003066T5/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/76Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data
    • G06F7/78Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data for changing the order of data flow, e.g. matrix transposition or LIFO buffers; Overflow or underflow handling therefor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06EOPTICAL COMPUTING DEVICES; COMPUTING DEVICES USING OTHER RADIATIONS WITH SIMILAR PROPERTIES
    • G06E1/00Devices for processing exclusively digital data
    • G06E1/02Devices for processing exclusively digital data operating upon the order or content of the data handled
    • G06E1/04Devices for processing exclusively digital data operating upon the order or content of the data handled for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06E1/045Matrix or vector computation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/50Adding; Subtracting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/52Multiplying; Dividing
    • G06F7/523Multiplying only
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • 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/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/06Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
    • G06N3/063Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Computational Mathematics (AREA)
  • Biophysics (AREA)
  • Biomedical Technology (AREA)
  • Health & Medical Sciences (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Mathematical Physics (AREA)
  • Mathematical Optimization (AREA)
  • Artificial Intelligence (AREA)
  • Computational Linguistics (AREA)
  • Molecular Biology (AREA)
  • Data Mining & Analysis (AREA)
  • Evolutionary Computation (AREA)
  • General Health & Medical Sciences (AREA)
  • Neurology (AREA)
  • Algebra (AREA)
  • Advance Control (AREA)
  • Complex Calculations (AREA)
  • Memory System (AREA)

Abstract

Es werden Systeme und Verfahren zum Transponieren eines Tensors unter Verwendung von Verarbeitungselementarray-Operationen bereitgestellt. In manchen Fällen kann es notwendig sein, Elemente eines Tensors zu transponieren, um eine Matrixoperation durchzuführen. Der Tensor kann in Blöcke von Datenelementen zerlegt werden, deren Dimensionen mit den Dimensionen eines systolischen Arrays übereinstimmen. Eine Identitätsmultiplikation kann mit jedem Block von Datenelementen durchgeführt werden, die in ein systolisches Array geladen werden, und die Multiplikationsprodukte werden in Spaltenpartitionen eines Ergebnispuffers summiert. Die Datenelemente in den Spaltenabschnitten des Ergebnispuffers können dann zur weiteren Verarbeitung auf Zeilenabschnitte eines Pufferspeichers abgebildet werden.

Description

  • HINTERGRUND
  • Ein Beschleuniger ist ein integrierter Schaltkreis, der für die Durchführung von Berechnungen (z. B. Berechnungen mit neuronalen Netzwerken) optimiert ist, die sonst von einem Universalprozessor durchgeführt werden könnten. Die in einem Hauptspeicher eines Computersystems gespeicherten Daten werden in Speicherplätze innerhalb des Beschleunigers kopiert oder abgebildet, um einen schnelleren Zugriff auf die Daten für die Durchführung von Berechnungen durch die Ausführungseinheiten des Beschleunigers zu ermöglichen. In einigen Fällen kann die Architektur des Beschleunigers auf der Grundlage der von den Ausführungsmaschinen auszuführenden Berechnungen genutzt werden, um die Berechnungsgeschwindigkeit zu erhöhen.
  • Figurenliste
  • Verschiedene Ausführungsformen der vorliegenden Offenbarung werden in Bezug auf die Zeichnungen beschrieben, in denen:
    • 1 ein Blockdiagramm ist, das ein Beispiel für ein Host-System zeigt, in dem ein Compiler gemäß Aspekten der vorliegenden Offenbarung ausgeführt werden kann;
    • 2 ein Blockdiagramm ist, das ein Beispiel für eine integrierte Schaltung gemäß Aspekten der vorliegenden Offenbarung veranschaulicht;
    • 3 ein Diagramm zur Veranschaulichung eines vereinfachten Beispiels eines Verfahrens zur Matrixtransponierung unter Verwendung von Verarbeitungselementarray-Operationen gemäß den Aspekten der vorliegenden Offenbarung ist;
    • 4 ein Diagramm ist, das ein verallgemeinertes Beispiel einer Tensor-Transponierungsoperation gemäß den Aspekten der vorliegenden Offenbarung zeigt;
    • 5 ein Flussdiagramm ist, das ein Beispiel für ein Verfahren zur Durchführung einer Transponierungsoperation an einem Block eines zerlegten Tensors gemäß den Aspekten der vorliegenden Offenbarung zeigt;
    • 6 ein Blockdiagramm umfasst, das ein Beispiel für eine Beschleunigungsmaschine gemäß Aspekten der vorliegenden Offenbarung veranschaulicht;
    • 7 ein Blockdiagramm umfasst, das ein Beispiel für ein Host-System gemäß Aspekten der vorliegenden Offenbarung veranschaulicht;
    • 8 ein Blockdiagramm umfasst, das ein Beispielnetzwerk gemäß Aspekten der vorliegenden Offenbarung veranschaulicht.
  • DETAILLIERTE BESCHREIBUNG
  • Eine Beschleunigungsmaschine kann einen oder mehrere Beschleuniger enthalten, um Berechnungen unter Verwendung eines Verarbeitungsmaschinenarrays auszuführen. Das Verarbeitungsmaschinenarray kann komplexe Berechnungen durchführen, wie z. B. die Multiplikation von Matrizen oder andere Berechnungen. Der Beschleuniger kann auch ein Speicher-Subsystem enthalten. Das Speicher-Subsystem kann einen oder mehrere Pufferspeicher enthalten, die Daten speichern, z. B. Gewichte des neuronalen Netzwerks und Daten, die von der Verarbeitungsmaschine verarbeitet werden sollen, sowie Zwischen- und/oder Endergebnisse von Berechnungen, die von der Verarbeitungsmaschine durchgeführt wurden.
  • Für verschiedene Berechnungen des Verarbeitungsmaschinenarrays können Daten in Form eines Tensors aus dem Host-Speicher (z. B. dynamischer Direktzugriffsspeicher (DRAM)) abgerufen und im Pufferspeicher gespeichert werden. In praktischen Anwendungen kann die Anzahl der Datenelemente in einem Tensor viel größer sein als die Anzahl der Datenelemente, die der Pufferspeicher auf einmal speichern kann und/oder die ein Verarbeitungsmaschinenarray auf einmal verarbeiten kann. So kann der Tensor in mehrere Blöcke von Datenelementen geeigneter Größe zerlegt werden, die im Pufferspeicher abgelegt werden. Außerdem kann die Anzahl der Datenelemente des zerlegten Tensors, die im Pufferspeicher gespeichert sind, zu groß sein, als dass die Verarbeitungsmaschine sie auf einmal verarbeiten könnte. Daher kann der im Pufferspeicher gespeicherte Block von Datenelementen erneut zerlegt werden, um die Verarbeitung durch das Verarbeitungsmaschinenarray zu ermöglichen.
  • In einigen Fällen kann es notwendig sein, die Art und Weise zu ändern, wie der Tensor auf den Pufferspeicher abgebildet wird. Beispielsweise kann bei einer Matrixmultiplikation mit Gewichten und Eingaben unterschiedlicher Größe eine Transponierung der Matrix für die Berechnung erforderlich sein. Eine Möglichkeit, eine Matrixtransponierung durchzuführen, besteht darin, die Matrixdaten aus dem Pufferspeicher in einen Host-Speicher (z. B. DRAM) zu kopieren und dann die Matrixdaten aus dem Host-Speicher an den transponierten Stellen zurück in den Pufferspeicher zu schreiben. Ein solches Verfahren kann jedoch zu erheblichen Verzögerungen beim externen Speicherzugriff führen und erfordert möglicherweise Eingriffe des Host-Prozessors, die Zyklen des Host-Prozessors in Anspruch nehmen. Um die Latenz zu verringern, wenn das Verarbeitungsmaschinenarray Berechnungen wie eine Matrixtransponierung durchführt, können interne Verarbeitungsmaschinenarray-Operationen verwendet werden, um die Matrixtransponierung durchzuführen, ohne dass die Matrixdaten in den Host-Speicher geschrieben und aus diesem gelesen werden müssen.
  • In der folgenden Beschreibung werden verschiedene Beispiele beschrieben. Zu Erklärungszwecken werden spezifische Konfigurationen und Details angegeben, um ein gründliches Verständnis der Beispiele zu ermöglichen. Für den Fachmann ist es jedoch auch offensichtlich, dass das Beispiel ohne die spezifischen Details ausgeführt werden kann. Weiterhin können bekannte Merkmale weggelassen oder vereinfacht werden, um die beschriebenen Ausführungsformen nicht zu verdecken.
  • Aspekte der vorliegenden Offenbarung bieten Systeme und Verfahren zur Durchführung von Matrixtransponierung an Datenelementen, die in einem Pufferspeicher eines Beschleunigers gespeichert sind, unter Verwendung systolischer Array-Operationen. Compiler-generierte Befehle können einen mehrdimensionalen Tensor von Datenelementen in einen Satz von zweidimensionalen (2D) Matrizen zerlegen, deren Abmessungen die Abmessungen des systolischen Arrays nicht überschreiten. Multiplizierende und akkumulierende systolische Array-Operationen können an jeder der 2D-Matrizen unter Verwendung einer Identitätsmatrix durchgeführt werden. Zusätzliche Befehle, die vom Compiler generiert werden, können dazu führen, dass die Ergebnisse der Identitätsmultiplikation im Pufferspeicher als Transponierung jeder der 2D-Matrizen gespeichert werden.
  • 1 ist ein Blockdiagramm, das ein Beispiel für ein Host-System 100 zeigt, in dem ein Compiler 130, wie im Vorliegenden beschrieben, gemäß Aspekten der vorliegenden Offenbarung ausgeführt werden kann. Das abgebildete Host-System 100 ist ein Beispiel für eine Computervorrichtung und umfasst einen Prozessor 102, einen Prozessorspeicher 104, mindestens eine Speichervorrichtung 106, verschiedene Eingabe/Ausgabevorrichtungen 108 und mindestens eine Netzwerkschnittstelle 110. Im Beispiel von 1 umfasst das Host-System 100 auch eine Beschleunigungsmaschine 112, bei der es sich um eine integrierte Schaltung handelt, die bestimmte vom Host-System 100 ausgeführte Operationen oder Berechnungen beschleunigen kann. In verschiedenen Beispielen kann das Host-System 100 unter anderem als Server in einem Rechenzentrum, als Desktop-Computer, Laptop, Tablet-Computer oder Smartphone implementiert sein. In einigen Beispielen können Operationen oder Komponenten, die im Folgenden als im Host-System 100 ausgeführt oder enthalten beschrieben werden, auch in anderen Computervorrichtungen ausgeführt oder enthalten sein. So kann beispielsweise der Compiler 130 auf dem Host-System 100 ausgeführt werden, während sich die Beschleunigungsmaschine 112 auf einem anderen Host-System befindet.
  • Der Prozessor 102 ist eine integrierte Schaltung, die Programmcode in Form von Befehlen ausführen kann. Der Programmcode kann für verschiedene Softwareanwendungen oder -tools verwendet werden, z. B. für das Betriebssystem 120 oder den veranschaulichten Compiler 130. Während der Prozessor 102 ein Programm ausführt, können die Befehle für das Programm im Prozessorspeicher 104 gespeichert werden. Die Befehle können auch an anderer Stelle gespeichert werden, z. B. auf der Speichervorrichtung 106, und bei Bedarf vom Prozessor 102 in den Prozessorspeicher 104 geladen werden. Der Prozessor 102 kann den Prozessorspeicher 104 auch zur vorübergehenden Speicherung anderer Daten nutzen, mit denen der Prozessor 102 arbeitet. In verschiedenen Beispielen handelt es sich bei dem Prozessorspeicher 104 um einen flüchtigen Speicher, z. B. einen Direktzugriffsspeicher, obwohl alternativ oder zusätzlich auch nichtflüchtige Speichertypen für den Prozessorspeicher 104 verwendet werden können.
  • Die Speichervorrichtung 106 ist ein Beispiel für eine Vorrichtung, die einen nichtflüchtigen Speicher enthalten kann. Die Speichervorrichtung 106 kann zum Beispiel ein Magnetplattenlaufwerk, ein Festkörperlaufwerk oder ein optisches Laufwerk sein, um nur einige Beispiele zu nennen. Die Speichervorrichtung 106 kann außerdem nichtflüchtig sein, so dass Programmcode und andere auf der Speichervorrichtung 106 gespeicherte Daten vorhanden bleiben, wenn die Speichervorrichtung 106 nicht eingeschaltet ist.
  • Die Speichervorrichtung 106 ist ein Beispiel für eine Peripherievorrichtung. Peripherievorrichtungen sind Komponenten, die mit dem Host-System 100 verbunden werden können, um dem Host-System 100 zusätzliche Funktionalität zu verleihen. Weitere Beispiele für Peripherievorrichtungen sind die Eingabe-/Ausgabevorrichtungen 108 und die Netzwerkschnittstelle 110. Die Eingabe-/Ausgabevorrichtungen 108 können Benutzer-Eingabe- und Ausgabevorrichtungen wie Tastaturen, Mäuse, Touchscreens, Mikrofone, Bildschirme, Lautsprecher, Drucker und Scanner und andere Beispiele umfassen. Die Netzwerkschnittstelle 110, die mit einer Netzwerkkarte implementiert werden kann, kann den Zugang zu einem oder mehreren Netzwerken ermöglichen. Die Netzwerkschnittstelle 110 kann beispielsweise einen physischen Port zum Anschluss eines Netzwerkkabels und/oder drahtlose Antennen für die Kommunikation mit WiFi und/oder Mobilfunknetzen umfassen. Die Netzwerkschnittstelle 110 kann auch als E/A-Vorrichtung bezeichnet werden.
  • Die Beschleunigungsmaschine 112 ist ebenfalls eine andere Art von Peripherievorrichtung oder E/A-Vorrichtung. Die Beschleunigungsmaschine 112 ist eine Vorrichtung, die speziell für das Ausführen bestimmter Operationen entwickelt wurde, die vom Prozessor 102 ausgeführt werden können, aber durch die Beschleunigungsmaschine 112 schneller ausgeführt werden können. Die Beschleunigungsmaschine 112 kann beispielsweise ein Beschleuniger für neuronale Netzwerke sein und als solcher in der Lage sein, die groß angelegten, parallelen Berechnungen eines neuronalen Netzwerks effizienter durchzuführen, als wenn die Berechnungen vom Prozessor 102 ausgeführt werden. Ein weiteres Beispiel: Die Beschleunigungsmaschine 112 kann eine Grafikverarbeitungseinheit (GPU) sein, die für das Ausführen der für die Grafikwiedergabe erforderlichen Berechnungen optimiert ist. Weitere Beispiele für Vorrichtungen, die von der Beschleunigungsmaschine 112 implementiert werden können, sind kryptografische Beschleuniger, Kompressions- und Dekompressionsbeschleuniger, 3D-Beschleuniger, Beschleuniger für reguläre Ausdrücke, Sicherheitsbeschleuniger und andere.
  • In verschiedenen Beispielen kann die Beschleunigungsmaschine 112 Programmcode ausführen, um bestimmte Operationen durchzuführen. Wenn es sich bei der Beschleunigungsmaschine 112 beispielsweise um einen Beschleuniger für neuronale Netzwerke handelt, kann die Beschleunigungsmaschine 112 so programmiert werden, dass sie ein bestimmtes neuronales Netzwerk ausführt, z. B. eines, das Bilderkennung oder maschinelle Übersetzung ausführt. Um das Ausführen eines neuronalen Netzwerks zu unterstützen, kann die Beschleunigungsmaschine 112 beispielsweise so programmiert werden, dass sie Operationen wie das Kopieren von Daten für das neuronale Netzwerk aus dem Prozessorspeicher 104 (zum Beispiel) in die Beschleunigungsmaschine 112, das Kopieren von Eingabedaten für das neuronale Netzwerk aus dem Prozessorspeicher 104 in die Beschleunigungsmaschine 112 und/oder das Kopieren von Ergebnissen von der Beschleunigungsmaschine 112 in den Prozessorspeicher 104 ausführt, neben anderen Beispielen.
  • Um Programmcode für die Beschleunigungsmaschine 112 zu erzeugen, kann das Host-System 100 in verschiedenen Beispielen den Compiler 130 ausführen. Bei Compilern handelt es sich im Allgemeinen um Softwareprogramme, die den in einer für Menschen lesbaren Sprache geschriebenen Programmcode in ein Format (z. B. Maschinenbefehle) übersetzen, das von einem integrierten Schaltkreis gelesen und verarbeitet werden kann. Im Beispiel von 1 ist die Beschleunigungsmaschine 112 ein Beschleuniger für neuronale Netzwerke und der Compiler 130 dient zum Kompilieren einer Beschreibung eines neuronalen Netzwerks in Befehle, die durch die Beschleunigungsmaschine 112 ausgeführt werden sollen. Wenn die Beschleunigungsmaschine 112 einen anderen Typ von Beschleuniger implementiert, kann ein anderer Compiler verwendet werden.
  • Der Compiler 130 kann z. B. aktiviert werden, wenn das Betriebssystem 120 Tastatur-, Maus-, Touchscreen-, Sprachbefehle oder andere Eingaben von den Eingabe-/Ausgabevorrichtungen 108 erhält. Die Eingaben können auch Parameter für den Compiler 130 enthalten, wie den zu kompilierenden Eingabecode 142 und Konfigurationsoptionen für den Kompilierungsprozess. Sobald der Compiler 130 aktiviert ist, kann der Prozessor 102 die Befehle für den Compiler 130 in den Prozessorspeicher 104 laden und die Befehle ausführen.
  • Im Beispiel von 1 umfasst der Compiler 130 eine erste Stufe 132, eine zweite Stufe 136 und eine dritte Stufe 140, die jeweils unterschiedliche Operationen ausführen, um den kompilierten Code 144 zu erzeugen. In anderen Beispielen kann der Compiler 130 die Operationen der ersten Stufe 132, der zweiten Stufe 136 und/oder der dritten Stufe 140 in weniger Stufen kombinieren oder die Operationen einer der Stufen in mehrere Stufen aufteilen.
  • Die erste Stufe 132 kann den Eingabecode 142 empfangen und verarbeiten. Der Eingabecode 142 kann ein Programm in einer höheren Programmiersprache beschreiben, wie Java, C++ oder Tensorflow, neben vielen anderen Beispielen. Der Eingabecode 142 kann z. B. Schritte zur Ausführung von Bilderkennung, Spracherkennung, maschineller Übersetzung oder anderen Operationen beschreiben. Der Eingabecode 142 kann z. B. von der Speichervorrichtung 106 bezogen werden. Alternativ, aber hier nicht dargestellt, kann sich der Eingabecode 142 im Prozessorspeicher 104 befinden oder über die Netzwerkschnittstelle 110 von einem Netzwerkstandort abgerufen werden. Die Verarbeitung des Eingabecodes 142 kann die Sortierung der im Eingabecode 142 beschriebenen Operationen in Schichten umfassen, wobei die Ausgaben einer Schicht die Eingaben für eine nächste Schicht liefern. Die Verarbeitung kann auch das Identifizieren von Schritten umfassen, die vom Prozessor 102 und nicht von der Beschleunigungsmaschine 112 ausgeführt werden. So muss der Prozessor 102 durch das Ausführen eines Treibers 122 unter Umständen Schritte wie die Konfiguration von Direct Memory Access(DMA)-Deskriptoren für die Übertragung von Daten in die oder aus der Beschleunigungsmaschine 112 ausführen, neben anderen Beispielen.
  • Die Ausgabe 134 der ersten Stufe 132 kann z. B. in den Schichten, Knoten und Verbindungen zwischen den Knoten eines neuronalen Netzwerks organisiert werden. Die zweite Stufe 136 kann eine Zwischenverarbeitung dieser Ausgabe 134 vornehmen. So können beispielsweise die in einer Ebene oder an einem Knoten in einer Ebene ausgeführten Operationen zu viele sein, als dass die Beschleunigungsmaschine 112 sie gleichzeitig ausführen könnte. Die Beschleunigungsmaschine 112 kann beispielsweise nur über eine begrenzte Menge an lokalem Speicherplatz für die Daten verfügen, die für eine Berechnung benötigt werden, oder die Berechnungen können mehr sein, als die Beschleunigungsmaschine 112 auf einmal ausführen kann. In diesem Beispiel kann die erste Stufe 132 die Operationen der Ebene oder des Knotens in kleinere Operationen aufteilen, die in den lokalen Speicher der Beschleunigungsmaschine und/oder in die Rechenkapazität der Beschleunigungsmaschine 112 passen. Die Verarbeitung der Ausgabe 134 der ersten Stufe 132 kann weitere Schritte umfassen, wie z. B. die Zeitplanung oder die Festlegung der Reihenfolge, in der die Beschleunigungsmaschine 112 und/oder der Prozessor 102 Operationen ausführen, neben anderen Beispielen.
  • In verschiedenen Beispielen umfasst die Ausgabe 138 der zweiten Stufe 136 die verschiedenen Schritte, die von den Komponenten der Beschleunigungsmaschine 112 in der Reihenfolge ausgeführt werden sollen, in der die Schritte ausgeführt werden sollen. Die Ausgabe 138 kann z. B. als Datenflussdiagramm dargestellt werden, wobei die Knoten im Diagramm Speicheroperationen, Berechnungen und andere Operationen darstellen und die Kanten oder Verbindungen zwischen den Knoten Abhängigkeiten zwischen den Knoten darstellen, wie z. B. Datenabhängigkeiten, Speicherabhängigkeiten oder betriebliche Abhängigkeiten, neben anderen Beispielen.
  • Die dritte Stufe 140 kann mit der Ausgabe 138 der zweiten Stufe 136 arbeiten und verschiedene Schritte ausführen, bevor sie die Befehle erzeugt, die von der Beschleunigungsmaschine 112 ausgeführt werden sollen. Diese Schritte können z. B. das Entfernen redundanter Abhängigkeiten, das Auflösen oder Behandeln von Abhängigkeiten zwischen Knoten durch Einfügen von Synchronisationsbefehle in den Code, das Erkennen möglicher Optimierungen bei der Speichernutzung oder der Nutzung der Speicherbandbreite und andere Operationen umfassen. In einigen Beispielen kann die dritte Stufe 140 einen Datenplaner 150 umfassen.
  • Das Ergebnis der dritten Stufe 140 ist ein kompilierter Code 144, der Maschinenbefehle im Binärformat enthalten kann. In einigen Beispielen kann der kompilierte Code 144 im Prozessorspeicher 104 gespeichert werden. Alternativ oder zusätzlich kann der kompilierte Code 144 auf die Speichervorrichtung 106 oder in ein Netzwerk kopiert werden. Wie bereits erwähnt, kann sich die Beschleunigungsmaschine 112 auf einem anderen Host-System befinden. In diesem Fall kann der kompilierte Code 144 über die Netzwerkschnittstelle 110 an das andere Host-System gesendet werden.
  • Im Beispiel von 1 kann das Host-System 100 einen Treiber 122 ausführen, der auch als Gerätetreiber oder Laufzeittreiber bezeichnet werden kann und der die Beschleunigungsmaschine 112 verwaltet. Der Treiber 122 kann eine Schnittstelle zwischen Anwendungen, die auf dem Host-System 100 (oder einem anderen Host-System) ausgeführt werden, und der Beschleunigungsmaschine 112 bilden. So kann der Treiber 122 beispielsweise eine Anwendungsprogrammschnittstelle (API) bereitstellen, die Funktionen für die Eingabe von Daten in die Beschleunigungsmaschine 112 und die Definition der mit den Eingabedaten durchzuführenden Operation definiert. In diesem und anderen Beispielen kann der Treiber 122 die Beschleunigungsmaschine 112 so konfigurieren, dass sie die Operation ausführt. Beispielsweise kann der Treiber 122 ein neuronales Netzwerk identifizieren, das die Beschleunigungsmaschine 112 ausführen soll, sowie den Ort im Prozessorspeicher 104 oder auf der Speichervorrichtung 106, an dem sich der kompilierte Code 144 für das neuronale Netzwerk befindet. Der Treiber 122 kann ferner den kompilierten Code 144 in die Beschleunigungsmaschine 112 laden oder die Beschleunigungsmaschine 112 dazu veranlassen, den kompilierten Code zu laden, er kann die Eingabedaten laden oder die Beschleunigungsmaschine 112 dazu veranlassen, die Eingabedaten zu laden, mit denen das neuronale Netzwerk arbeiten soll, und/oder er kann die Beschleunigungsmaschine 112 veranlassen, die Eingabedaten auszuführen. Sobald die Beschleunigungsmaschine 112 fertig ist, kann die Beschleunigungsmaschine 112 den Treiber 122 benachrichtigen, und der Treiber 122 kann ein Ergebnis an die Anwendung zurückliefern, die das Ergebnis angefordert hat.
  • 2 ist ein Blockdiagramm, das ein Beispiel für eine integrierte Schaltung zeigt, die ein Verarbeitungsmaschinenarray enthalten kann, das dazu verwendet wird, einen Tensor auf einen Zustandspuffer gemäß den Aspekten der vorliegenden Offenbarung umzuordnen. Das Beispiel von 2 veranschaulicht einen Beschleuniger 202. In verschiedenen Beispielen kann der Beschleuniger 202 für einen Satz von Eingabedaten (z. B. Eingabedaten 250) Berechnungen unter Verwendung eines Verarbeitungsmaschinenarrays 210, einer Aktivierungsmaschine 216 und/oder einer Poolingmaschine 218 ausführen. In einigen Beispielen kann der Beispiel-Beschleuniger 202 eine integrierte Schaltkreiskomponente eines Prozessors sein, wie z. B. ein Neuronalnetzwerk-Prozessor. Der Prozessor kann weitere integrierte Schaltkreiskomponenten haben, einschließlich zusätzlicher Beschleunigungsmaschinen.
  • In verschiedenen Implementierungen kann das Speicher-Subsystem 204 mehrere Speicherbänke 214 enthalten. In diesen Implementierungen kann jede Speicherbank 214 unabhängig zugänglich sein, was bedeutet, dass das Lesen einer Speicherbank nicht vom Lesen einer anderen Speicherbank abhängig ist. Ebenso hat das Schreiben in eine Speicherbank keinen Einfluss auf das Schreiben in eine andere Speicherbank bzw. schränkt dieses nicht ein. In einigen Fällen kann jede Speicherbank gleichzeitig gelesen und geschrieben werden. Es können verschiedene Techniken verwendet werden, um unabhängig voneinander zugängliche Speicherbänke 214 zu haben. Zum Beispiel kann jede Speicherbank eine physikalisch getrennte Speicherkomponente sein, die einen Adressraum hat, der getrennt und unabhängig von den Adressräumen jeder anderen Speicherbank ist. In diesem Beispiel kann jede Speicherbank mindestens einen Lesekanal und mindestens einen separaten Schreibkanal haben, die gleichzeitig verwendet werden können. In diesen Beispielen kann das Speicher-Subsystem 204 den gleichzeitigen Zugriff auf die Lese- oder Schreibkanäle mehrerer Speicherbänke ermöglichen. Als weiteres Beispiel kann das Speicher-Subsystem 204 eine Arbitrierungslogik enthalten, so dass die Arbitrierung zwischen z. B. den Ausgaben mehrerer Speicherbänke 214 dazu führen kann, dass die Ausgabe von mehr als einer Speicherbank verwendet wird. In diesen und anderen Beispielen kann jede Speicherbank, obwohl sie global vom Speicher-Subsystem 204 verwaltet wird, unabhängig von den anderen betrieben werden.
  • Die Tatsache, dass die Speicherbänke 214 unabhängig voneinander zugänglich sind, kann die Effizienz des Beschleunigers 202 erhöhen. Beispielsweise können Werte gleichzeitig gelesen und jeder Zeile des Verarbeitungsmaschinenarrays 210 zur Verfügung gestellt werden, so dass das gesamte Verarbeitungsmaschinenarray 210 in einem Taktzyklus in Gebrauch sein kann. Als weiteres Beispiel können die Speicherbänke 214 zur gleichen Zeit gelesen werden, in der die von dem Verarbeitungsmaschinenarray 210 berechneten Ergebnisse in das Speicher-Subsystem 204 geschrieben werden. Im Gegensatz dazu kann ein einzelner Speicher möglicherweise nur ein Lesen oder Schreiben zur gleichen Zeit bedienen. Bei einem einzelnen Speicher können z. B. mehrere Taktzyklen erforderlich sein, um Eingabedaten für jede Zeile des Verarbeitungsmaschinenarrays 210 zu lesen, bevor das Verarbeitungsmaschinenarray 210 gestartet werden kann.
  • In verschiedenen Implementierungen kann das Speicher-Subsystem 204 so konfiguriert werden, dass es gleichzeitig mehrere Clients bedient, einschließlich des Verarbeitungsmaschinenarrays 210, der Aktivierungsmaschine 216, der Poolingmaschine 218 und aller externen Clients, die über eine Kommunikationsstruktur 220 auf das Speicher-Subsystem 204 zugreifen. In einigen Implementierungen kann die Fähigkeit, mehrere Clients zu bedienen, bedeuten, dass das Speicher-Subsystem 204 mindestens so viele Speicherbänke hat, wie es Clients gibt. In einigen Fällen kann jede Zeile des Verarbeitungsmaschinenarrays 210 als ein separater Client zählen. In manchen Fällen kann jede Spalte des Verarbeitungsmaschinenarrays 210 ein Ergebnis ausgeben, so dass jede Spalte als separater Schreibclient zählen kann. In einigen Fällen kann die Ausgabe vom Verarbeitungsmaschinenarray 210 in die Speicherbänke 214 geschrieben werden, die dann anschließend Eingabedaten für das Verarbeitungsmaschinenarray 210 bereitstellen können. Als weiteres Beispiel können die Aktivierungsmaschine 216 und die Poolingmaschine 218 mehrere Ausführungskanäle enthalten, von denen jeder ein separater Speicher-Client sein kann. Die Speicherbänke 214 können z. B. mit statischem Direktzugriffsspeicher (SRAM) realisiert werden.
  • In verschiedenen Implementierungen kann das Speicher-Subsystem 204 Steuerlogik enthalten. Die Steuerlogik kann z. B. die Adressräume jeder der Speicherbänke 214 verfolgen, Speicherbänke 214 zum Lesen oder Schreiben identifizieren und/oder Daten zwischen den Speicherbänken 214 bewegen. In einigen Implementierungen können die Speicherbänke 214 mit bestimmten Clients fest verdrahtet werden. Zum Beispiel kann ein Satz von Speicherbänken 214 fest verdrahtet werden, um Werte für die Zeilen des Verarbeitungsmaschinenarrays 210 bereitzustellen, wobei eine Speicherbank jede Zeile bedient. Als weiteres Beispiel kann ein Satz von Speicherbänken fest verdrahtet werden, um Werte von Spalten des Verarbeitungsmaschinenarrays 210 zu empfangen, wobei eine Speicherbank Daten für jede Spalte empfängt.
  • Das Verarbeitungsmaschinenarray 210 ist die Berechnungsmatrix des Beispielbeschleunigers 202. Das Verarbeitungsmaschinenarray 210 kann z. B. parallele Integration, Faltung, Korrelation und/oder Matrixmultiplikation ausführen. Das Verarbeitungsmaschinenarray 210 umfasst mehrere Verarbeitungsmaschinen 211, die in Zeilen und Spalten angeordnet sind, so dass die von einer Verarbeitungsmaschine 211 ausgegebenen Ergebnisse direkt in eine andere Verarbeitungsmaschine 211 eingegeben werden können. Verarbeitungsmaschinen 211, die sich nicht an den Außenkanten des Verarbeitungsmaschinenarrays 210 befinden, können daher Daten zur Bearbeitung von anderen Verarbeitungsmaschinen 211 und nicht vom Speicher-Subsystem 204 erhalten.
  • In verschiedenen Beispielen verwendet das Verarbeitungsmaschinenarray 210 eine systolische Ausführung, bei der die Daten in regelmäßigen Abständen aus verschiedenen Richtungen an jeder Verarbeitungsmaschine 211 ankommen. In einigen Beispielen können die Eingabedaten von links in das Verarbeitungsmaschinenarray 210 fließen und die Gewichtungswerte können oben geladen werden. In einigen Beispielen können Gewichtungen und Eingabedaten von links und Teilsummen von oben nach unten fließen. In diesen und anderen Beispielen bewegt sich eine Multiplikations- und Akkumulationsoperation als diagonale Wellenfront durch das Verarbeitungsmaschinenarray 210, wobei sich die Daten nach rechts und unten über das Array bewegen. Steuersignale können gleichzeitig mit den Gewichtungen links eingegeben werden und mit der Berechnung quer und abwärts fließen.
  • In verschiedenen Implementierungen bestimmt die Anzahl der Spalten im Verarbeitungsmaschinenarray 210 die Rechenkapazität des Verarbeitungsmaschinenarrays 210, und die Anzahl der Zeilen bestimmt die erforderliche Speicherbandbreite zum Erreichen einer maximalen Auslastung des Verarbeitungsmaschinenarrays 210. Das Verarbeitungsmaschinenarray 210 kann z. B. 64 Spalten und 428 Zeilen oder eine andere Anzahl von Spalten und Zeilen haben.
  • Ein Beispiel für eine Verarbeitungsmaschine 211 ist in 2 in einem Beispieldiagramm dargestellt. Wie in diesem Beispiel dargestellt, kann eine Verarbeitungsmaschine 211 eine Multiplikator-Akkumulator-Schaltung enthalten. Eingaben von links können z. B. Eingabedaten i und einen Gewichtungswert w enthalten, wobei die Eingabedaten ein Wert sind, der entweder aus einem Satz von Eingabedaten oder einem Satz von Zwischenergebnissen entnommen wird, und der Gewichtungswert aus einem Satz von Gewichtungswerten stammt, die eine Schicht des neuronalen Netzwerks mit der nächsten verbinden. Ein Satz von Eingabedaten kann z. B. ein Bild sein, das zum Identifizieren oder zur Objekterkennung eingereicht wird, ein Audioclip, der für die Spracherkennung bereitgestellt wird, eine Textfolge für die Verarbeitung natürlicher Sprache oder die maschinelle Übersetzung, oder der aktuelle Zustand eines Spiels, der analysiert werden muss, um den nächsten Zug zu bestimmen, unter anderem. In einigen Beispielen werden die Eingabedaten und der Gewichtungswert nach rechts ausgegeben, zur Eingabe in die nächste Verarbeitungsmaschine 211.
  • Im dargestellten Beispiel kann eine Eingabe von oben eine Teilsumme, p in, enthalten, die entweder von einer anderen Verarbeitungsmaschine 211 oder von einer vorherigen Berechnungsrunde durch das Verarbeitungsmaschinenarray 210 bereitgestellt wird. Beim Starten einer Berechnung für einen neuen Satz von Eingabedaten kann die oberste Zeile des Verarbeitungsmaschinenarrays 210 einen festen Wert fürp in erhalten, z. B. Null. Wie in diesem Beispiel dargestellt, werden i und w miteinander multipliziert und das Ergebnis wird mit p in summiert, um eine neue Teilsumme, p_out, zu erzeugen, die in eine andere Verarbeitungsmaschine 211 eingegeben werden kann. Verschiedene andere Implementierungen der Verarbeitungsmaschine 211 sind möglich.
  • Die Ausgaben der letzten Zeile im Verarbeitungsmaschinenarray 210 können im Ergebnispuffer 212 zwischengespeichert werden. Bei den Ergebnissen kann es sich um Zwischenergebnisse handeln, die in die Speicherbänke 214 geschrieben werden können, um sie dem Verarbeitungsmaschinenarray 210 für weitere Berechnungen zur Verfügung zu stellen. Alternativ können die Ergebnisse Endergebnisse sein, die, nachdem sie in die Speicherbänke 214 geschrieben wurden, über die Kommunikationsstruktur 220 aus dem Speicher-Subsystem 204 gelesen werden können, um vom System ausgegeben zu werden.
  • In einigen Implementierungen umfasst der Beschleuniger 202 eine Aktivierungsmaschine 216. In diesen Implementierungen kann die Aktivierungsmaschine 216 die Ergebnisse aus dem Verarbeitungsmaschinenarray 210 zu einer oder mehreren Ausgabeaktivierungen kombinieren. Bei einem neuronalen Faltungsnetzwerk können z. B. die Faltungen von mehreren Kanälen summiert werden, um eine Ausgabeaktivierung für einen einzelnen Kanal zu erzeugen. In anderen Beispielen kann die Akkumulation von Ergebnissen aus einer oder mehreren Spalten im Verarbeitungsmaschinenarray 210 erforderlich sein, um eine Ausgabeaktivierung für einen einzelnen Knoten im neuronalen Netzwerk zu erzeugen. In einigen Beispielen kann die Aktivierungsmaschine 216 umgangen werden.
  • In verschiedenen Beispielen kann die Aktivierungsmaschine 216 mehrere separate Ausführungskanäle enthalten. In diesen Beispielen können die Ausführungskanäle den Spalten des Verarbeitungsmaschinenarrays 210 entsprechen und eine Operation an den Ausgaben einer Spalte ausführen, deren Ergebnis im Speicher-Subsystem 204 gespeichert werden kann. In diesen Beispielen kann die Aktivierungsmaschine 216 in der Lage sein, zwischen 1 und n parallele Berechnungen durchzuführen, wobei n gleich der Anzahl der Spalten im Verarbeitungsmaschinenarray 210 ist. In einigen Fällen können eine oder mehrere der Berechnungen gleichzeitig ausgeführt werden. Beispiele für Berechnungen, die jeder Ausführungskanal ausführen kann, sind u. a. Exponentiale, Quadrate, Quadratwurzeln, Identitäten, Binärschritte, Bipolarschritte, Sigmoidale und Rampen.
  • In einigen Implementierungen umfasst der Beschleuniger 202 eine Poolingmaschine 218. Pooling ist das Zusammenfassen von Ausgaben der Spalten des Verarbeitungsmaschinenarrays 210. Das Zusammenfassen kann z. B. die Berechnung eines Maximalwerts, eines Minimalwerts, eines Mittelwerts, eines Medianwerts, einer Summierung, einer Multiplikation oder einer anderen logischen oder mathematischen Kombination umfassen. In verschiedenen Beispielen kann die Poolingmaschine 218 mehrere Ausführungskanäle enthalten, die auf Werte aus entsprechenden Spalten des Verarbeitungsmaschinenarrays 210 arbeiten können. In diesen Beispielen kann die Poolingmaschine 218 in der Lage sein, zwischen 1 und n parallele Berechnungen durchzuführen, wobei n gleich der Anzahl der Spalten im Verarbeitungsmaschinenarray 210 ist. In verschiedenen Beispielen können die Ausführungskanäle der Poolingmaschine 218 parallel und/oder gleichzeitig arbeiten. In einigen Beispielen kann die Poolingmaschine 218 umgangen werden.
  • Hierin können die Aktivierungsmaschine 216 und die Poolingmaschine 218 gemeinsam als Ausführungsmaschinen bezeichnet werden. Das Verarbeitungsmaschinenarray 210 ist ein weiteres Beispiel für eine Ausführungsmaschine. Ein weiteres Beispiel für eine Ausführungsmaschine ist eine Direct Memory Access (DMA)-Maschine, die sich außerhalb des Beschleunigers 202 befinden kann.
  • Eingabedaten 250 können über die Kommunikationsstruktur 220 ankommen. Die Kommunikationsstruktur 220 kann den Beschleuniger 202 mit anderen Komponenten eines Prozessors verbinden, z. B. mit einer DMA-Maschine, die Eingabedaten 250 von einer Eingabe-/Ausgabevorrichtung (E/A), einem Speicherlaufwerk oder einer Netzwerkschnittstelle erhalten kann. Die Eingabedaten 250 können z. B. eindimensionale Daten sein, wie eine Zeichenkette oder eine numerische Sequenz, oder zweidimensionale Daten, wie ein Array von Pixelwerten für ein Bild oder Frequenz- und Amplitudenwerte über die Zeit für ein Audiosignal. In einigen Beispielen können die Eingabedaten 250 dreidimensional sein, wie es z. B. bei den von einem selbstfahrenden Auto verwendeten Situationsinformationen oder Virtual-Reality-Daten der Fall sein kann. In einigen Implementierungen kann das Speicher-Subsystem 204 einen separaten Puffer für die Eingabedaten 250 enthalten. In einigen Implementierungen können die Eingabedaten 250 in den Speicherbänken 214 gespeichert werden, wenn der Beschleuniger 202 die Eingabedaten 250 empfängt.
  • In einigen Beispielen kann der Beschleuniger 202 eine Maschine zur Verarbeitung neuronaler Netzwerke implementieren. In diesen Beispielen kann der Beschleuniger 202 für einen Satz von Eingabedaten 250 ein neuronales Netzwerk ausführen, um eine Aufgabe durchzuführen, für die das neuronale Netzwerk trainiert wurde. Das Ausführen eines neuronalen Netzwerks auf einem Satz von Eingabedaten kann als Schlussfolgerung oder Durchführen von Schlussfolgerung bezeichnet werden.
  • Die Gewichtungen für das neuronale Netzwerk können im Speicher-Subsystem 204 gespeichert werden, zusammen mit den Eingabedaten 250, auf denen das neuronale Netzwerk arbeiten wird. Das neuronale Netzwerk kann auch Befehle enthalten, die das Verarbeitungsmaschinenarray 210 programmieren können, um verschiedene Berechnungen mit den Gewichtungen und den Eingabedaten durchzuführen. Die Befehle können auch im Speicher-Subsystem 204, in den Speicherbänken 214 oder in einem separaten Befehlspuffer gespeichert werden. Das Verarbeitungsmaschinenarray 210 kann Zwischenergebnisse ausgeben, die die Ausgaben der einzelnen Schichten des neuronalen Netzwerks darstellen. In einigen Fällen kann die Aktivierungsmaschine 216 und/oder die Poolingmaschine 218 für Berechnungen aktiviert werden, die von bestimmten Schichten des neuronalen Netzwerks gefordert werden. Der Beschleuniger 202 kann die Zwischenergebnisse im Speicher-Subsystem 204 speichern, um sie in das Verarbeitungsmaschinenarray 210 einzugeben, um die Ergebnisse für die nächste Schicht des neuronalen Netzwerks zu berechnen. Das Verarbeitungsmaschinenarray 210 kann außerdem Endergebnisse aus einer letzten Schicht des neuronalen Netzwerks ausgeben. Die Endergebnisse können im Speicher-Subsystem 204 gespeichert und dann in den Speicher des Host-Prozessors oder an einen anderen Ort kopiert werden.
  • Der Beschleuniger 202 kann Berechnungen unter Verwendung eines Verarbeitungsmaschinenarrays, z. B. eines systolischen Arrays, durchführen. Das Verarbeitungsmaschinenarray kann eine systolische Ausführung verwenden, bei der die Daten in regelmäßigen Abständen aus verschiedenen Richtungen bei jeder Verarbeitungsmaschine des Verarbeitungsmaschinenarrays eintreffen. Zum Beispiel können unter Bezugnahme auf 2 Eingabedaten von links (z. B. über einen Datenbus) in das Verarbeitungsmaschinenarray fließen und die Gewichtungswerte können von oben (z. B. über einen anderen Datenbus) geladen werden. Das Verarbeitungsmaschinenarray kann hier auch als Verarbeitungselementarray bezeichnet werden. Das Verarbeitungselementarray kann eine feste Größe haben, z. B. 128 Zeilen mal 64 Spalten von Verarbeitungselementen oder ein Array einer anderen Größe. Das Verarbeitungselementarray kann Berechnungen durchführen, wie z. B. die Multiplikation von Matrizen und/oder andere Berechnungen.
  • Der Beschleuniger kann auch ein Speicher-Subsystem auf dem integrierten Schaltkreis enthalten (hier auch als On-Chip-Speicher bezeichnet). Der On-Chip-Speicher kann einen Pufferspeicher enthalten, z. B. einen Zustandspuffer, wie in 2 dargestellt, der Daten speichert. Der Pufferspeicher kann Daten speichern, z. B. Gewichte des neuronalen Netzwerks und Daten, die vom Verarbeitungselementarray verarbeitet werden sollen, sowie Zwischen- und/oder Endergebnisse der vom Verarbeitungselementarray durchgeführten Berechnungen. Der Pufferspeicher kann eine feste Größe haben, z. B. 128 Zeilen mal 128 Spalten von Speicherelementen oder ein Array einer anderen Größe. Eine Partition für den Pufferspeicher kann als eine Zeile des Pufferspeichers definiert werden. So kann ein Pufferspeicher mit 128 Zeilen 128 Partitionen haben, wobei jede Partition eine Anzahl von Elementen hat, die der Anzahl der Spalten im Pufferspeicher entspricht. Jede Partition ist ein logischer Teil des Speichers, der unabhängig von anderen Teilen des Pufferspeichers ist.
  • Für verschiedene Berechnungen des Verarbeitungselementarrays können Daten in Form eines Tensors aus dem Host-Speicher (z. B. dynamischer Direktzugriffsspeicher (DRAM)) abgerufen und im Pufferspeicher gespeichert werden. Ein Tensor ist ein mehrdimensionales Feld. Eine zweidimensionale (2D) Matrix kann als einfacher Tensor betrachtet werden, aber im Allgemeinen kann ein Tensor eine beliebige Anzahl von Dimensionen haben. Die Speicherung des Tensors im Pufferspeicher des Beschleunigers verringert die Latenzzeit, wenn das Verarbeitungselementarray Daten zur Durchführung von Berechnungen lädt.
  • In praktischen Anwendungen kann die Anzahl der Datenelemente in einem Tensor viel größer sein als die Anzahl der Datenelemente, die in dem Pufferspeicher auf einmal gespeichert werden können. In solchen Fällen kann der Compiler veranlassen, dass der Tensor in kleinere Blöcke von Datenelementen zerlegt wird, die kleiner oder gleich groß sind wie die Abmessungen des Pufferspeichers. Wenn beispielsweise der Pufferspeicher die Abmessungen p Zeilen mal q Spalten hat, kann ein Tensor mit den Abmessungen m Zeilen mal n Spalten, wobei m > p und n > q ist, durch den Compiler in k Blöcke von Datenelementen zerlegt werden, wobei die Anzahl der Blöcke k durch die Gleichung 1 gegeben ist. k = [ ( m 1 ) / / 128 + 1 ] · [ ( n 1 ) / / 128 + 1 ]
    Figure DE112020003066T5_0001
    wobei „//“ für Ganzzahl- oder Abrundungsteilung steht. Der Compiler kann jeden Block von Datenelementen des zerlegten Tensors den p Partitionen (d. h. Zeilen) des Pufferspeichers mit q Datenelementen in jeder Partition zuordnen.
  • Die Anzahl der Datenelemente in einem Block eines zerlegten Tensors, der im Pufferspeicher gespeichert ist, kann größer sein als die Anzahl der Datenelemente, die ein Verarbeitungselementarray gleichzeitig verarbeiten kann. Beispielsweise kann der Pufferspeicher eine Größe von 128 Zeilen mal 128 Spalten haben, während das Verarbeitungselementarray eine Größe von 128 Zeilen mal 64 Spalten haben kann. In solchen Fällen kann der Compiler den Datenblocks weiter in zwei Unterblöcke mit 128 Zeilen und 64 Spalten zerlegen. Jeder Unterblock kann separat in das Verarbeitungselementfeld geladen und von diesem verarbeitet werden.
  • In einigen Fällen, z. B. wenn Zwischenergebnisse von Berechnungen von Verarbeitungselementen im Pufferspeicher gespeichert werden, ist es erforderlich, die Art und Weise zu ändern, wie ein Tensor zur Verwendung in nachfolgenden Berechnungen auf den Pufferspeicher abgebildet wird. Um beispielsweise eine Matrixmultiplikation durchzuführen, kann es erforderlich sein, die Datenelemente in einer der Matrizen zu transponieren. Gemäß den Aspekten der vorliegenden Offenbarung kann die Geschwindigkeit des Berechnungsprozesses erhöht werden, indem Verarbeitungselementarray-Operationen verwendet werden, um die Art und Weise zu ändern, wie ein Tensor (z. B. eine Matrix) auf den Pufferspeicher abgebildet wird. Durch die Verwendung von Verarbeitungselementarray-Operationen können Latenzprobleme vermieden werden, die sich aus dem Entladen der Daten aus dem Pufferspeicher in den Host-Speicher und dem anschließenden erneuten Laden der Daten in den Pufferspeicher in einer entsprechend zugeordneten Form ergeben würden.
  • Beispielsweise kann ein 2D-Tensor (d. h. eine Matrix) A der Form m Zeilen, n Spalten mit p < m Zeilen und q < n Spalten in den Pufferspeicher eingefügt werden. Damit die Matrix A der linke Operand einer Matrixmultiplikation sein kann (z. B. A × B = C), kann die Matrix A wie oben beschrieben in k Blöcke von Datenelementen zerlegt werden. Jeder Block kann dann in den Pufferspeicher über p Partitionen mit q Elementen in jeder Partition abgebildet werden. In Fällen, in denen die Matrix A transponiert werden muss (d. h. AT), um der linke Operand einer Matrixmultiplikation zu sein, kann jeder Block k so transponiert werden, dass jeder Block in den Pufferspeicher über q Partitionen mit p Elementen in jeder Partition abgebildet wird. Bei der Matrix A kann es sich z. B. um Ergebnisse handeln, die von einer früheren Berechnung durch das Verarbeitungselementarray zurück in den Pufferspeicher gespeichert wurden.
  • 3 ist ein Diagramm zur Veranschaulichung eines vereinfachten Beispiels eines Verfahrens zur Matrixtransponierung unter Verwendung von Verarbeitungselementarray-Operationen gemäß den Aspekten der vorliegenden Offenbarung. Die Transponierung der Matrix kann von einem Beschleuniger durchgeführt werden (z. B. dem Beschleuniger 202 in 2). In 3 wird der Einfachheit halber ein Beispiel mit einer quadratischen Matrix gezeigt, doch ist die Transponierung der Matrix nicht auf eine quadratische Matrix beschränkt. Das vorliegende Beispiel wird zwar anhand einer 2D-Matrix erläutert, doch kann die 2D-Matrix ein Block oder ein Unterblock von Datenelementen eines größeren zerlegten mehrdimensionalen Tensors sein.
  • Unter Bezugnahme auf 3 können Datenelemente eines zerlegten Tensors, der eine 2D-Matrix A 311 bildet, auf Speicherplätze in einem Pufferspeicher, z. B. dem Zustandspuffer 310, abgebildet werden. Der Zustandspuffer 310 kann ein On-Chip-Speicher für den Beschleuniger sein. Im Beispiel von 3 können die Datenelemente der Matrix A 311 auf die Partitionen 0-3 312 des Zustandspuffers 310 abgebildet werden. Jede Partition 312 des Zustandspuffers 310 kann ein logischer Teil des Speichers sein, der von anderen Teilen unabhängig ist. In 3 kann jede Partition 312 des Zustandspuffers 310 eine Zeile des Zustandspuffers 310 mit einer Anzahl von Spalten sein, die der Spaltenabmessung des Zustandspuffers 310 entspricht. Die Datenelemente 1, 2, 3 und 4 der Matrix A 311 können auf die Partition 0 abgebildet werden, beginnend bei einer ersten Adresse (z. B. Adresse 0) des Zustandspuffers 310. Die Datenelemente 5-8 der Matrix A 311 können auf die Partition 1 des Zustandspuffers 310 abgebildet werden, die Datenelemente 9-12 der Matrix A 311 können auf die Partition 2 des Zustandspuffers 310 abgebildet werden und die Datenelemente 13-16 der Matrix A 311 können auf die Partition 3 des Zustandspuffers 310 abgebildet werden. Bei den im Zustandspuffer 310 gespeicherten Datenelementen des zerlegten Tensors kann es sich z. B. um Gewichte des neuronalen Netzwerks handeln, die aus einer vorhergehenden Berechnung des PE-Arrays 320 hervorgegangen sind.
  • Die im Zustandspuffer 310 gespeicherten Datenelemente 1-16 der Matrix A 311 können in das PE-Array 320 geladen werden. Das PE-Array 320 ist ein systolisches Array und die Datenelemente 1-16 können als Gewichte in das systolische Array geladen werden. Unter Bezugnahme auf 2 können die Datenelemente 1-16 von oben in das PE-Array geladen werden (z. B. über einen ersten Datenbus). Ein vom Compiler erzeugter Befehl, z. B. ein Befehl zum Laden von Gewichten, kann bewirken, dass jedes der Datenelemente der Reihe nach in ein anderes Verarbeitungselement im PE-Array 320 geladen wird. Die Datenelemente aus jeder Partition 312 im Zustandspuffer 310 können in eine entsprechende Zeile des PE-Arrays 320 geladen werden. Zum Beispiel können die Datenelemente 1-4 in der Partition 0 des Zustandspuffers 310 in die Zeile 0 des PE-Arrays 320 geladen werden, die Datenelemente 5-8 in der Partition 1 des Zustandspuffers 310 können in die Zeile 1 des PE-Arrays 320 geladen werden, die Datenelemente 9-12 in der Partition 2 des Zustandspuffers 310 können in die Zeile 2 des PE-Arrays 320 geladen werden, und die Datenelemente 13-16 in der Partition 3 des Zustandspuffers 310 können in die Zeile 3 des PE-Arrays 320 geladen werden. So können die Datenelemente 1-16 der Matrix A 311 in das PE-Array 320 in demselben Zeilen-Spalten-Format geladen werden, in dem sie im Zustandspuffer 310 gespeichert wurden, wobei die Datenelemente in jeder Zeile des PE-Arrays 320 einer Partition im Zustandspuffer 310 entsprechen.
  • Nachdem die Datenelemente (z. B. die Gewichte) der Matrix A 311 in die Verarbeitungselemente des PE-Arrays 320 geladen wurden, kann eine Matrixmultiplikation durch das systolische Array unter Verwendung einer Identitätsmatrix 330 durchgeführt werden. Die Matrixmultiplikation kann eine Element-für-Element-Multiplikation der Datenelemente in einer Spalte der Identitätsmatrix und der Gewichte in einer Spalte der PE-Array-Elemente durchführen und die Ergebnisse der Multiplikationen akkumulieren (d. h. summieren). Die Identitätsmatrix 330 kann auch im Zustandspuffer 310 gespeichert werden. Alternativ dazu kann die Identitätsmatrix 330 vom Compiler aus einem „0“-Datenelement und einem „1“-Datenelement, die im Zustandspuffer 310 gespeichert sind, konstruiert werden. Die Identitätsmatrix 330 kann von links in das PE-Array 320 einfließen (z. B. über einen zweiten Datenbus).
  • In der folgenden Beschreibung wird darauf hingewiesen, dass die Zeilen-0 341 bis Zeile-3 344 für den PSUM-Puffer 340 nur der Einfachheit halber angegeben sind. Zeile-0 341 bis Zeile-3 344, die für den PSUM-Puffer 340 identifiziert wurden, entsprechen nicht den Zeilenpartitionen im Zustandspuffer 310. Da die Identitätsmatrix 330 über den zweiten Datenbus vom Zustandspuffer 310 in das PE-Array 320 fließt, wird während des ersten Zyklus des systolischen Arrays Spalte-3 334 der Identitätsmatrix 330 mit Spalte-0 322 des PE-Arrays 320 multipliziert und die Ergebnisse der Multiplikation im Ergebnispuffer (z. B. PSUM-Puffer) 340 summiert (d. h. akkumuliert). Das erste Element (z. B. Gewichtung) in Spalte-0 321 des PE-Arrays 320 wird mit dem ersten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-0 321 PE-Array 320 wird mit dem zweiten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem dritten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem vierten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Partition-0 in Zeile-0 341 des PSUM-Puffers 340 summiert. Die Partitionen des PSUM-Puffers 340 können in Spalten und nicht in Zeilen wie im Zustandspuffer 310 angeordnet sein. Die Partitionen des PSUM-Puffers 340 können den Spalten des systolischen Arrays PE-Array 320 entsprechen. Da das erste Element in der Spalte 3 334 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, ist die Summe der in Zeile-0 341 der Partition-0 im PSUM-Puffer 340 gespeicherten Multiplikationen 1.
  • Während des zweiten Zyklus des systolischen Arrays wird Spalte 3 334 der Identitätsmatrix 330 mit Spalte-1 322 des PE-Arrays 320 multipliziert, und Spalte-2 333 der Identitätsmatrix wird mit Spalte-0 321 des PE-Arrays 320 multipliziert, und die Ergebnisse der Multiplikationen können im PSUM-Puffer summiert (d. h. akkumuliert) werden. Das erste Element in Spalte-1 322 des PE-Arrays 320 wird mit dem ersten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-1 322 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-1 322 des PE-Arrays 320 wird mit dem dritten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-1 322 des PE-Arrays 320 wird mit dem vierten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-0 341 der Partition 1 im PSUM-Puffer 340 summiert. Da das erste Element in Spalte-3 334 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-0 341 der Partition-1 im PSUM-Puffer 340 gespeicherten Multiplikationen 2.
  • In ähnlicher Weise wird während des zweiten Zyklus des systolischen Arrays das erste Element in Spalte 0 321 des PE-Arrays 320 mit dem ersten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-0 321 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem dritten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem vierten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-1 342 der Partition 0 im PSUM-Puffer 340 summiert. Da das zweite Element in Spalte-2 333 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-1 342 der Partition-0 im PSUM-Puffer 340 gespeicherten Multiplikationen 5.
  • Während des dritten Zyklus des systolischen Arrays wird Spalte-3 334 der Identitätsmatrix 330 mit Spalte-2 323 des PE-Arrays 320 multipliziert, Spalte-2 333 der Identitätsmatrix wird mit Spalte-1 322 des PE-Arrays 320 multipliziert, und Spalte-1 332 der Identitätsmatrix 330 wird mit Spalte-0 321 des PE-Arrays 320 multipliziert, und die Ergebnisse der Multiplikation können im PSUM-Puffer summiert (d. h. akkumuliert) werden.
  • Das erste Element in Spalte-2 323 des PE-Arrays 320 wird mit dem ersten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-2 323 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-2 323 des PE-Arrays 320 wird mit dem dritten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-2 323 des PE-Arrays 320 wird mit dem vierten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-0 341 der Partition 2 im PSUM-Puffer 340 summiert. Da das erste Element in Spalte-3 334 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-0 341 der Partition 2 im PSUM-Puffer 340 gespeicherten Multiplikationen 3.
  • In ähnlicher Weise wird während des dritten Zyklus des systolischen Arrays das erste Element in Spalte-1 322 des PE-Arrays 320 mit dem ersten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-1 322 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-1 322 des PE-Arrays 320 wird mit dem dritten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-1 322 des PE-Arrays 320 wird mit dem vierten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-1 342 der Partition-1 im PSUM-Puffer 340 summiert. Da das zweite Element in Spalte-2 333 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-1 342 der Partition 1 im PSUM-Puffer 340 gespeicherten Multiplikationen 6.
  • Außerdem wird während des dritten Zyklus des systolischen Arrays das erste Element in Spalte-0 321 des PE-Arrays 320 mit dem ersten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-0 321 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem dritten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem vierten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-2 343 der Partition 0 im PSUM-Puffer 340 summiert. Da das dritte Element in Spalte-1 332 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-2 343 der Partition-0 im PSUM-Puffer 340 gespeicherten Multiplikationen 9.
  • Während des vierten Zyklus des systolischen Arrays wird Spalte-3 334 der Identitätsmatrix 330 mit Spalte-3 324 des PE-Arrays 320 multipliziert, Spalte-2 333 der Identitätsmatrix wird mit Spalte-2 323 des PE-Arrays 320 multipliziert, Spalte-1 332 der Identitätsmatrix 330 wird mit Spalte-1 322 des PE-Arrays 320 multipliziert, Spalte-0 331 der Identitätsmatrix 330 wird mit Spalte-0 321 des PE-Arrays 320 multipliziert, und die Ergebnisse der Multiplikationen können (d. h. akkumuliert) in dem PSUM-Puffer summiert werden.
  • Das erste Element in Spalte-3 324 des PE-Arrays 320 wird mit dem ersten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-3 324 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-3 324 des PE-Arrays 320 wird mit dem dritten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-3 324 des PE-Arrays 320 wird mit dem vierten Element in Spalte-3 334 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-0 341 der Partition 3 im PSUM-Puffer 340 summiert. Da das erste Element in Spalte-3 334 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-0 341 der Partition-3 im PSUM-Puffer 340 gespeicherten Multiplikationen 4.
  • In ähnlicher Weise wird während des vierten Zyklus des systolischen Arrays das erste Element in Spalte-2 323 des PE-Arrays 320 mit dem ersten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-2 323 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-2 323 des PE-Arrays 320 wird mit dem dritten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-2 323 des PE-Arrays 320 wird mit dem vierten Element in Spalte-2 333 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-1 342 der Partition 2 im PSUM-Puffer 340 summiert. Da das zweite Element in Spalte-2 333 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-1 342 der Partition-2 im PSUM-Puffer 340 gespeicherten Multiplikationen 7.
  • Außerdem wird während des vierten Zyklus des systolischen Arrays das erste Element in Spalte-1 322 des PE-Arrays 320 mit dem ersten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-1 322 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-1 322 des PE-Arrays 320 wird mit dem dritten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-1 322 des PE-Arrays 320 wird mit dem vierten Element in Spalte-1 332 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile-2 343 der Partition 1 im PSUM-Puffer 340 summiert. Da das dritte Element in Spalte-1 332 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-2 343 der Partition-1 im PSUM-Puffer 340 gespeicherten Multiplikationen 10.
  • Schließlich wird während des vierten Zyklus des systolischen Arrays das erste Element in Spalte-0 321 des PE-Arrays 320 mit dem ersten Element in Spalte-0 331 der Identitätsmatrix 330 multipliziert, das zweite Element in Spalte-0 321 des PE-Arrays 320 wird mit dem zweiten Element in Spalte-0 331 der Identitätsmatrix 330 multipliziert, das dritte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem dritten Element in Spalte-0 331 der Identitätsmatrix 330 multipliziert, das vierte Element in Spalte-0 321 des PE-Arrays 320 wird mit dem vierten Element in Spalte-0 331 der Identitätsmatrix 330 multipliziert, und die Ergebnisse der Multiplikationen werden in Zeile 3 344 der Partition-0 im PSUM-Puffer 340 summiert. Da das vierte Element in Spalte-0 331 der Identitätsmatrix 330 „1“ ist und die übrigen Elemente „0“ sind, beträgt die Summe der in Zeile-3 344 der Partition-0 im PSUM-Puffer 340 gespeicherten Multiplikationen 13.
  • Der Prozess wird mit der Identitätsmatrix 330 fortgesetzt, die sich über das PE-Array 320 ausbreitet, bis alle Spalten der Identitätsmatrix 330 mit allen Spalten der Datenelemente (z. B. Gewichte) im PE-Array 320 multipliziert wurden, was zu den im PSUM-Puffer 340 angezeigten Werten führt. Die in den Spaltenpartitionen 0-3 des PSUM-Puffers 340 akkumulierten Datenelemente können z. B. über das Element 216 der Aktivierungsmaschine in 2 oder Poolingmaschine (Element 218 in 2) zurück in den Zustandspuffer 310 übertragen werden.
  • Die Hardwarekonfiguration des Beschleunigers ermöglicht die Zuordnung der Datenelemente aus den Spaltenpartitionen 346 im PSUM-Puffer 340 zu den Zeilenpartitionen 314 des Zustandspuffers 310. Wenn die Datenelemente im PSUM-Puffer 340 an den Zustandspuffer 310 übertragen werden, werden die Datenelemente in der Spaltenpartition-0 bis Spaltenpartition-3 346 im PSUM-Puffer 340 in die Zeilenpartition-0 bis Zeilenpartition-3 314 an einer zweiten Adresse (z. B. Adresse N) des Zustandspuffers 310 abgebildet. So enthält die Zeilenpartition 0 des Zustandspuffers 310 die Datenelemente 1, 5, 9 und 13 (aus der Spaltenpartition 0 des PSUM-Puffers 340), die Zeilenpartition-1 des Zustandspuffers 310 die Datenelemente 2, 6, 10 und 14 (aus der Spaltenpartition-1 des PSUM-Puffers 340), zeilenpartition-2 des Zustandspuffers 310 enthält die Datenelemente 3, 7, 11 und 15 (aus Spaltenpartition-2 des PSUM-Puffers 340), und Zeilenpartition-3 des Zustandspuffers 310 enthält die Datenelemente 4, 8, 12 und 16 (aus Spaltenpartition-3 des PSUM-Puffers 340). So kann die Matrix A 311 als transponierte Matrix AT 314 in den Zustandspuffer 310 übertragen werden.
  • 4 ist ein Diagramm, das ein verallgemeinertes Beispiel einer Tensor-Transponierungsoperation gemäß den Aspekten der vorliegenden Offenbarung zeigt. In diesem Beispiel hat ein Block von Datenelementen eines zerlegten Tensors die Abmessungen von 128 Zeilen mal 64 Spalten und wird in einen Block von Datenelementen mit den Abmessungen von 64 Zeilen mal 128 Spalten transponiert. In 4 kann ein Block 410 des zerlegten Tensors 410 in einem On-Chip-Pufferspeicher 420 eines Beschleunigers (z. B. des Beschleunigers 202 in 2) gespeichert werden, beginnend bei einer ersten Speicheradresse (z. B. Adresse 0). Bei den Datenelementen des zerlegten Tensorblocks 410, die im Pufferspeicher 420 gespeichert sind, kann es sich beispielsweise um Gewichte des neuronalen Netzwerks handeln, die aus einer früheren Berechnung des systolischen Arrays 430 hervorgegangen sind. Die Datenelemente des zerlegten Tensorblocks 410 können in 128 Zeilen (d. h. 128 Partitionen 422) des Pufferspeichers 420 abgebildet werden, wobei jede Zeile 64 Elemente (d. h. 64 Spalten) enthält. So kann der zerlegte Tensorblock 410 128 Zeilen (d. h. Zeilen 0-127) mal 64 Spalten (d. h. Spalten 0-63) des Pufferspeichers 420 belegen. Die Größe des zerlegten Tensorblocks 410 kann der Größe des systolischen Arrays 430 entsprechen, in diesem Beispiel 128 Zeilen mal 64 Spalten von Verarbeitungselementen, und kann durch den Compiler bestimmt werden. Die Datenelemente des zerlegten Tensorblocks 410 können durch Indizes gekennzeichnet werden, die die Zeilen-/Spaltenposition des Datenelements angeben, wie sie ursprünglich im Pufferspeicher 420 gespeichert waren. Wie beispielsweise in 4 veranschaulicht, bezeichnet a0,0 das ursprünglich im Pufferspeicher 420 in Zeile 0, Spalte 0 gespeicherte Datenelement und a127,63 bezeichnet das ursprünglich im Pufferspeicher 420 in Zeile 127, Spalte 63 gespeicherte Datenelement.
  • Die Datenelemente a0,0-a127,63 des zerlegten Tensorblocks 410 können über einen ersten Datenbus (nicht dargestellt) durch einen vom Compiler erzeugten Befehl in die Verarbeitungselemente des systolischen Arrays 430 geladen werden, um zu bewirken, dass alle Datenelemente a0,0-a127,63 des zerlegten Tensorblocks 410 in einem Vorgang geladen werden. Jedes Datenelement a0,0-a127,63 des zerlegten Tensorblocks 410 kann in ein anderes Verarbeitungselement des systolischen Arrays 430 geladen werden, so dass die Zeilen-/Spaltenpositionen der Datenelemente a0,0-a127,63 in dem systolischen Array 430 den Zeilen-/Spaltenpositionen der Datenelemente a0,0-a127,63 entsprechen, wie sie ursprünglich in dem Pufferspeicher 420 gespeichert waren. Wie beispielsweise in 4 veranschaulicht, wird das Datenelement a0,0, das ursprünglich in den Pufferspeicher 420 in Zeile 0 (d. h. Partition 0) abgebildet wurde, Spalte 0 in das Verarbeitungselement in Zeile 0, Spalte 0 des systolischen Arrays 430 geladen und das Datenelement a127,63 das ursprünglich in den Pufferspeicher 420 in Zeile 127 (d. h. Partition 127) abgebildet wurde, Spalte 63 wird in das Verarbeitungselement in Zeile 127, Spalte 63 des systolischen Arrays 430 geladen. So werden die Datenelemente in jeder Zeilenpartition 422 des Pufferspeichers 420 in die entsprechenden Zeilen des systolischen Arrays 430 geladen.
  • Nach Beendigung des Befehls zum Laden der Datenelemente in das systolische Array 430 kann das systolische Array 430 mit der Durchführung von Multiplikations- und Akkumulationsoperationen an den Datenelementen und einer Identitätsmatrix 440 beginnen. Die Identitätsmatrix 440 kann eine quadratische Matrix sein, deren Abmessungen der Anzahl der Partitionen im Pufferspeicher 420 entsprechen. In diesem Beispiel kann die Identitätsmatrix 440 eine Größe von 128 Zeilen und 128 Spalten haben, da es sich um eine quadratische Matrix handelt. Die Identitätsmatrix 440 kann im Pufferspeicher 420 gespeichert werden.
  • Die Identitätsmatrix 440 kann während jedes Verarbeitungszyklus des systolischen Arrays 430 spaltenweise über einen zweiten Datenbus (nicht dargestellt) in das systolische Array 430 einfließen. Während jedes Verarbeitungszyklus, wenn die Identitätsmatrix 440 das systolische Array 430 durchläuft, werden die Datenelemente (z. B. Gewichte), die in einer Spalte von Verarbeitungselementen des systolischen Arrays 430 gespeichert sind, mit einer Spalte von Elementen in der Identitätsmatrix 440 multipliziert, und die Produkte werden im Ergebnispuffer 450 akkumuliert. Zum Beispiel werden während eines ersten Verarbeitungszyklus des systolischen Arrays 430 die in Spalte-0 432 des systolischen Arrays 430 gespeicherten Datenelemente a0,0-a127,0 Element für Element mit den Elementen in Spalte-127 442 der Identitätsmatrix 440 multipliziert, so dass das Datenelement a0,0 in Spalte-0 432 des systolischen Arrays 430 mit dem ersten Element in Spalte-127 442 der Identitätsmatrix 440 multipliziert wird (d. h. a0,0 × 1 = a0,0). In ähnlicher Weise wird das Datenelement a1,0 in Spalte-0 432 des systolischen Arrays 430 mit dem zweiten Element in Spalte-127 442 der Identitätsmatrix 440 multipliziert (d. h. a1,0 × 0 = 0), und ebenso für die Datenelemente a2,0-a127,63 in Spalte-0 432 des systolischen Arrays 430 und die Elemente 2-127 in Spalte-127 442 der Identitätsmatrix 440. Da alle Elemente der Spalte-127 442 der Identitätsmatrix 440 mit Ausnahme des ersten Elements Null sind, bleibt bei der Akkumulation der Multiplikationsprodukte (d. h. der Summierung) nur das Datenelement a0,0 übrig. Das Datenelement a0,0 kann im Ergebnispuffer 450 in Zeile-0 452 der Partition 0 gespeichert werden. Die Partitionen 458 des Ergebnispuffers 450 können in Spalten statt in Zeilen wie im Pufferspeicher 420 angeordnet sein. Die Partitionen 458 des Ergebnispuffers 450 können den Spalten des systolischen Arrays 430 entsprechen.
  • Die Multiplikations- und Akkumulationsoperationen durchlaufen das systolische Array 430 mit jedem Verarbeitungszyklus. Bei jedem Zyklus des systolischen Arrays 430 werden die akkumulierten Produkte an verschiedenen Stellen im Ergebnispuffer 450 gespeichert. Zum Beispiel werden während des zweiten Verarbeitungszyklus des systolischen Arrays 430 die Datenelemente in Spalte-1 434 des systolischen Arrays 430 mit den Elementen in Spalte 127 442 der Identitätsmatrix 440 multipliziert, und die Datenelemente in Spalte-0 432 des systolischen Arrays 430 werden mit den Elementen in Spalte-126 444 der Identitätsmatrix 440 multipliziert. Die akkumulierten Produkte der Multiplikation von Spalte-1 434 des systolischen Arrays 430 und Spalte-127 442 der Identitätsmatrix 440 ergeben nur das Datenelement a0,1, da alle anderen Produkte Null sind. Das akkumulierte Produkt (d. h. a0,1) kann im Ergebnispuffer 450 in Zeile-0 452 der Partition 1 gespeichert werden.
  • In ähnlicher Weise ergeben die akkumulierten Produkte der Multiplikation von Spalte-0 432 des systolischen Arrays 430 und Spalte-126 444 der Identitätsmatrix 440 nur das Datenelement a1,0, da alle anderen Produkte Null sind. Das akkumulierte Produkt (d. h. a1,0) kann im Ergebnispuffer 450 in Zeile 1 454 der Partition 0 gespeichert werden. Da sich die Multiplikations-Akkumulations-Operationen mit jedem Verarbeitungszyklus über das systolische Array 430 bewegen, wird das akkumulierte Produkt für jede Spalte des systolischen Arrays 430, die eine Multiplikations-Akkumulations-Operation durchführt, in einer nachfolgenden Zeile in der Partition gespeichert, die der jeweiligen Spalte des systolischen Arrays 430 entspricht. Zum Beispiel wird während des ersten Verarbeitungszyklus des systolischen Arrays 430 das akkumulierte Produkt a0,0 in Zeile-0 der Partition-0 des Ergebnispuffers 450 gespeichert, während des zweiten Verarbeitungszyklus des systolischen Arrays 430 wird das akkumulierte Produkt a1,0 in Zeile-1 der Partition-0 des Ergebnispuffers 450 gespeichert, und so weiter.
  • Während des letzten Verarbeitungszyklus des systolischen Arrays 430 werden die Datenelemente in Spalte-63 436 des systolischen Arrays 430 mit den Elementen in Spalte-0 446 der Identitätsmatrix 440 multipliziert. Die akkumulierten Produkte der Multiplikation ergeben nur a127,63, da alle anderen Produkte Null sind, und das akkumulierte Produkt a127,63 wird im Ergebnispuffer 450 in Zeile-127 456 der Partition-63 gespeichert. Unter Verwendung der Multiplikations-Akkumulations-Operationen des systolischen Arrays 430 werden dann die Datenelemente des Blocks 410 des zerlegten Tensors 410, die in die Verarbeitungselemente des systolischen Arrays 430 geladen wurden, in der gleichen Zeilen-/Spaltenanordnung in den Ergebnispuffer 450 übertragen, wie sie in das systolische Array 430 geladen wurden, jedoch innerhalb von Partitionen, die in Spalten statt in Zeilen angeordnet sind.
  • Sobald die Datenelemente des Blocks 410 des zerlegten Tensors in den Spaltenfächern 458 des Ergebnispuffers 450 gespeichert sind, können vom Compiler erzeugte Befehle bewirken, dass die Datenelemente a0,0-a127,63 über eine andere Hardware-Ausführungsmaschine, beispielsweise eine Poolingmaschine oder eine Aktivierungsmaschine des Beschleunigers, ab einer zweiten Speicheradresse (z. B. Adresse N) zurück in den Pufferspeicher 420 übertragen werden. Die Hardware des Beschleunigers kann so konfiguriert werden, dass die Spaltenpartitionen 458 im Ergebnispuffer 450 auf Zeilenpartitionen 422 des Pufferspeichers 420 abgebildet werden. Beispielsweise kann, beginnend bei Adresse N im Pufferspeicher 420, das Datenelement a0,0 des Blocks 410 des zerlegten Tensors auf Spalte-0 424 der Partition-0 423 abgebildet werden, das Datenelement a1,0 des Blocks 410 des zerlegten Tensors kann auf Spalte-1 426 der Partition-0 423 abgebildet werden, und so weiter bis zum Datenelement a127,0 des Blocks 410 des zerlegten Tensors, das auf Spalte-127 428 der Partition-0 423 des Pufferspeichers 420 abgebildet werden kann.
  • In ähnlicher Weise kann das Datenelement a0,63 des Blocks 410 des zerlegten Tensors der Spalte-0 424 der Partition 63 427 zugeordnet werden, das Datenelement a1,63 des Blocks 410 des zerlegten Tensors kann der Spalte-1 426 der Partition-63 427 zugeordnet werden, und so weiter bis zum Datenelement a127,63 des Blocks 410 des zerlegten Tensors, das der Spalte-127 428 der Partition-63 427 des Pufferspeichers 420 zugeordnet werden kann. So kann unter Verwendung der Multiplikations-Akkumulations-Operationen des systolischen Arrays 430 der Block 410 des zerlegten Tensors, der ursprünglich im Pufferspeicher 420 in 128 Zeilenpartitionen mit 64 Spalten abgebildet war, im Pufferspeicher 420 in einen Tensorblock transponiert werden, der auf 64 Zeilenpartitionen mit 128 Spalten abgebildet ist.
  • In einigen Implementierungen kann der Compiler, wenn die akkumulierten Produkte (d. h. die Datenelemente des Blocks 410 des zerlegten Tensors) eine Zeile über alle Spaltenpartitionen im Ergebnispuffer 450 füllen, Befehle erzeugen, um ein Datenelement in jeder Spaltenpartition auf eine entsprechende Zeilenpartition im Pufferspeicher abzubilden, die vom Compiler bestimmt wird. In einigen Implementierungen kann der Compiler, nachdem alle akkumulierten Produkte (d. h. alle Datenelemente des Blocks 410 des zerlegten Tensors) in den Spaltenpartitionen des Ergebnispuffers 450 gespeichert wurden, Befehle generieren, um alle Datenelemente in jeder Spaltenpartition des Ergebnispuffers 450 auf entsprechende Zeilenpartitionen im Pufferspeicher 420 abzubilden, die vom Compiler bestimmt wurden.
  • 5 ist ein Flussdiagramm, das ein Beispiel für ein Verfahren 500 zur Durchführung einer Transponierungsoperation an einem Block eines zerlegten Tensors gemäß den Aspekten der vorliegenden Offenbarung zeigt. Diese Verfahren können durch die oben beschriebenen Systeme implementiert werden, wie z. B. den Compiler von 1, und den Beschleuniger von 2.
  • Unter Bezugnahme auf 5 kann in Block 510 ein Compiler Programmcode empfangen, um eine Ausführungsmaschine zu veranlassen, eine Reihe von Operationen durchzuführen. Beispielsweise kann der Programmcode verschiedene Elemente (z. B. ein systolisches Array, einen Pufferspeicher, einen Ergebnispuffer usw.) der Ausführungsmaschine veranlassen, Datenverarbeitungsvorgänge durchzuführen.
  • In Block 515 kann festgestellt werden, dass die Datenverarbeitungsoperationen eine Matrixtransponierungsoperation umfassen. In einigen Implementierungen muss ein mehrdimensionaler Tensor in kleinere Blöcke von Datenelementen zerlegt werden, deren Dimensionen mit den Dimensionen eines Pufferspeichers der Ausführungsmaschine kompatibel sind, um die Matrixtransponierungsoperation durchzuführen.
  • In Block 520 kann der Compiler Befehle generieren, um die Ausführungsmaschine zu veranlassen, die Datenverarbeitungsvorgänge durchzuführen. So kann der Compiler beispielsweise einen Satz von Befehlen erzeugen, um den mehrdimensionalen Tensor in Blöcke von Datenelementen zu zerlegen, die mit den Abmessungen eines Pufferspeichers kompatibel sind, und um die Ausführungsmaschine (d. h. den Beschleuniger) zu veranlassen, die Matrixtransponierungsoperationen an den Blöcken des zerlegten mehrdimensionalen Tensors durchzuführen. Der Compiler kann auch Befehle erzeugen, um die Operationen zur Transponierung der Matrix mit Hilfe von Identitätsmatrixmultiplikationen durchzuführen.
  • Ab Block 525 können die vom Compiler erzeugten Befehle ausgeführt werden. Der mehrdimensionale Tensor kann in kleinere Blöcke von Datenelementen zerlegt werden. Der Tensor kann ein mehrdimensionaler Tensor sein, der zunächst im Host-Speicher (z. B. DRAM) gespeichert wird. In praktischen Anwendungen kann die Anzahl der Datenelemente in einem Tensor viel größer sein als die Anzahl der Datenelemente, die in einem Pufferspeicher eines integrierten Schaltkreises, z. B. eines Beschleunigers, auf einmal gespeichert werden können. Der Compiler kann Befehle generieren, um den Tensor in kleinere Blöcke zu zerlegen, deren Größe mit dem Pufferspeicher kompatibel ist. Wenn beispielsweise der Pufferspeicher die Abmessungen p Zeilen mal q Spalten hat, kann ein Tensor mit den Abmessungen m Zeilen mal n Spalten, wobei m > p und n > q ist, durch vom Compiler erzeugte Befehle in k Blöcke zerlegt werden, wobei die Anzahl der Blöcke k durch die obige Gleichung 1 gegeben ist. In einigen Fällen können die Blöcke von Datenelementen Ergebnisse früherer Berechnungen sein, die im Pufferspeicher gespeichert wurden.
  • In Block 530 können ein oder mehrere Blöcke des zerlegten Tensors in Zeilenpartitionen des Pufferspeichers abgebildet werden. Der Pufferspeicher kann mit Partitionen konfiguriert werden, die den Speicherzeilen im Pufferspeicher entsprechen. Jede Partition ist ein logischer Teil des Speichers, der unabhängig von anderen Teilen des Pufferspeichers ist. Der Pufferspeicher kann zum Beispiel 128 Zeilen mal 128 Spalten groß sein. Jede Zeile des Pufferspeichers kann eine Partition sein, und jede Partition kann 128 Spalten umfassen. Ein Block des zerlegten Tensors mit denselben oder kleineren Abmessungen kann in den Pufferspeicher eingefügt werden.
  • In Block 535 kann ein Block des zerlegten Tensors aus dem Pufferspeicher in das systolische Array geladen werden. In einigen Fällen kann die Anzahl der Datenelemente in einem Block eines zerlegten Tensors, der im Pufferspeicher gespeichert ist, größer sein als die Anzahl der Datenelemente, die ein Verarbeitungselementarray gleichzeitig verarbeiten kann. Beispielsweise kann der Pufferspeicher eine Größe von 128 Zeilen mal 128 Spalten haben, während das Verarbeitungselementarray eine Größe von 128 Zeilen mal 64 Spalten haben kann. In solchen Fällen kann der Compiler Befehle zur weiteren Zerlegung des Datenblocks in zwei Unterblöcke mit 128 Zeilen und 64 Spalten erzeugen.
  • Die Datenelemente des zerlegten Tensorblocks oder Teilblocks können über einen ersten Datenbus durch einen vom Compiler erzeugten Befehl in die Verarbeitungselemente des systolischen Arrays geladen werden, um zu bewirken, dass alle Datenelemente des zerlegten Tensorblocks in einem Vorgang geladen werden. Jedes Datenelement des zerlegten Tensorblocks kann in ein anderes Verarbeitungselement des systolischen Arrays geladen werden, so dass die Zeilen-/Spaltenpositionen der Datenelemente in dem systolischen Array den Zeilen-/Spaltenpositionen der Datenelemente entsprechen, wie sie ursprünglich im Pufferspeicher gespeichert waren. So können die Datenelemente in jeder Zeile (d. h. Partition) des Pufferspeichers in die entsprechenden Zeilen des systolischen Arrays geladen werden.
  • In Block 540 können Matrixmultiplikationsoperationen mit einer Identitätsmatrix durchgeführt und die Multiplikationsprodukte im Ergebnispuffer akkumuliert werden. Wenn die Identitätsmatrix über einen zweiten Datenbus in das systolische Array fließt, kann das systolische Array bei jedem Verarbeitungszyklus eine Multiplikation zwischen einer oder mehreren Spalten der Identitätsmatrix und einer oder mehreren Spalten der in den Verarbeitungselementen des systolischen Arrays gespeicherten Datenelemente durchführen. Da jede Spalte der Identitätsmatrix nur an einer Stelle eine „1“ und an allen anderen Stellen Nullen enthält, kann die Spaltenmultiplikation nur ein von Null verschiedenes Produkt ergeben, nämlich das Datenelement, das der Position der „1“ in der Spalte der Identitätsmatrix entspricht.
  • In Block 545 werden die akkumulierten Multiplikationsprodukte in Spaltenpartitionen des Ergebnispuffers gespeichert. Die Partitionen des Ergebnispuffers können in Spalten statt in Zeilen wie im Pufferspeicher angeordnet sein. Jede Spaltenpartition des Ergebnispuffers kann einer Spalte des systolischen Arrays entsprechen. Da sich die Multiplikations-Akkumulations-Operationen mit jedem Verarbeitungszyklus über das systolische Array bewegen, wird das akkumulierte Produkt für jede Spalte des systolischen Arrays, die eine Multiplikations-Akkumulations-Operation durchführt, in einer nachfolgenden Zeile in der Partition gespeichert, die der jeweiligen Spalte des systolischen Arrays entspricht.
  • Zum Beispiel kann unter Bezugnahme auf 4 während des ersten Verarbeitungszyklus des systolischen Arrays das akkumulierte Produkt der Spalte 0 der Datenelemente im systolischen Array, multipliziert mit Spalte 127 der Identitätsmatrix, das Datenelement a0,0 sein. Das Datenelement a0,0 kann in Zeile-0 der Partition-0 im Ergebnispuffer gespeichert werden. Während des zweiten Verarbeitungszyklus des systolischen Arrays werden die Datenelemente in Spalte-1 des systolischen Arrays mit den Elementen in Spalte-127 der Identitätsmatrix multipliziert, und die Datenelemente in Spalte-0 des systolischen Arrays werden mit den Elementen in Spalte-126 der Identitätsmatrix multipliziert. Die akkumulierten Produkte der Multiplikation von Spalte-1 des systolischen Arrays und Spalte-127 der Identitätsmatrix ergeben nur das Datenelement a0,1, da alle anderen Produkte Null sind. Das akkumulierte Produkt (d. h. a0,1) kann im Ergebnispuffer in Zeile-0 der Partition-1 gespeichert werden. Die akkumulierten Produkte der Multiplikation von Spalte-0 des systolischen Arrays und Spalte 126 der Identitätsmatrix ergeben nur das Datenelement a1,0, da alle anderen Produkte Null sind. Das akkumulierte Produkt (d. h. a1,0) kann im Ergebnispuffer in Zeile-1 der Partition-0 gespeichert werden. Der Prozess kann fortgesetzt werden, bis alle Spalten der Identitätsmatrix durch alle Spalten der Datenelemente im systolischen Array propagiert und mit ihnen multipliziert worden sind. Unter Verwendung der Multiplikations-Akkumulations-Operationen des systolischen Arrays werden die Datenelemente des Blocks des zerlegten Tensors, die in die Verarbeitungselemente des systolischen Arrays geladen wurden, in der gleichen Zeilen-/Spaltenanordnung in den Ergebnispuffer übertragen, wie sie in das systolische Array geladen wurden, jedoch innerhalb von Partitionen, die in Spalten statt in Zeilen angeordnet sind.
  • Zurück zu 5: In Block 550 können die gespeicherten Multiplikationsprodukte aus den Spaltenpartitionen des Ergebnispuffers auf die Zeilenpartitionen des Pufferspeichers abgebildet werden. Sobald die Datenelemente des Blocks des zerlegten Tensors in den Spaltenfächern des Ergebnispuffers gespeichert sind, können vom Compiler erzeugte Befehle bewirken, dass die Datenelemente über eine andere Hardware-Ausführungsmaschine, beispielsweise eine Poolingmaschine oder eine Aktivierungsmaschine des Beschleunigers, ab einer zweiten Speicheradresse (z. B. Adresse N) wieder in den Pufferspeicher eingefügt werden. Die Hardware des Beschleunigers kann so konfiguriert werden, dass die Spaltenpartitionen im Ergebnispuffer in Zeilenpartitionen des Pufferspeichers transponiert werden. So kann der Block des zerlegten Tensors, der ursprünglich im Pufferspeicher in 128 Zeilenpartitionen mit 64 Spalten gespeichert war, im Pufferspeicher in einen Tensorblock mit 64 Zeilenpartitionen mit 128 Spalten transponiert werden, indem die Multiplikations-Akkumulationsoperationen des systolischen Arrays verwendet werden.
  • In einigen Implementierungen kann der Compiler, wenn jede Partition im Ergebnispuffer voll wird, d. h., wenn Datenelemente alle Zeilen in einer Spaltenpartition belegen, Befehle erzeugen, um die Datenelemente in der Spaltenpartition einer vom Compiler bestimmten Zeilenpartition im Pufferspeicher zuzuordnen. Durch die Implementierung der Matrixtransponierungsoperation unter Verwendung einer Identitätsmatrixmultiplikationsoperation innerhalb der Ausführungsmaschine, wie oben beschrieben, kann die Matrixtransponierungsoperation durchgeführt werden, ohne dass Daten in einen Host-Speicher (z. B. DRAM) geschrieben und aus dem Host-Speicher zurückgelesen werden müssen. Mit anderen Worten: Mit der oben beschriebenen Technik kann der Host-Speicher umgangen werden, wenn eine Matrixtransponierung durchgeführt wird. Infolgedessen kann die Rechenzeit für die Durchführung der Matrixtransponierungsoperation im Vergleich zu Implementierungen, die die Verwendung des Host-Speichers erfordern, reduziert werden. Darüber hinaus kann die Matrixtransponierungsoperation innerhalb der Ausführungsmaschine durchgeführt werden, so dass der Host-Prozessor weniger Verarbeitungszyklen benötigt.
  • Es wird darauf hingewiesen, dass die in 5 dargestellten spezifischen Schritte ein besonderes Verfahren zur Durchführung einer Transponierungsoperation an einem Block eines zerlegten Tensors gemäß einer Ausführungsform bereitstellen. In alternativen Ausführungsformen können auch andere Abfolgen von Schritten durchgeführt werden. Bei alternativen Ausführungsformen können die oben beschriebenen Schritte beispielsweise in einer anderen Reihenfolge durchgeführt werden. Außerdem können die einzelnen Schritte in 5 mehrere Teilschritte umfassen, die je nach Schritt in unterschiedlicher Reihenfolge durchgeführt werden können. Darüber hinaus können je nach Anwendungsfall weitere Schritte hinzugefügt oder entfernt werden. Ein Durchschnittsfachmann würde viele Variationen, Modifikationen und Alternativen erkennen.
  • Das Verfahren zur Durchführung einer Transponierungsoperation an einem Block eines zerlegten Tensors kann auf einem nichtflüchtigen, computerlesbaren Medium ausgeführt sein, das dem Fachmann bekannt ist und in dem ein Programm mit computerausführbaren Befehlen gespeichert ist, um einen Prozessor, Computer oder eine andere programmierbare Vorrichtung zu veranlassen, die Operationen der Verfahren auszuführen.
  • 6 umfasst ein Blockdiagramm, das ein Beispiel für eine Beschleunigungsmaschine 600 gemäß bestimmten Aspekten der vorliegenden Offenbarung veranschaulicht. Die Beschleunigungsmaschine 600 ist ein Beispiel für eine integrierte Schaltung, die einen oder mehrere Beschleuniger 602a-602n enthalten kann, die dem in 2 gezeigten ähneln.
  • Im Beispiel von 6 umfasst die Beschleunigungsmaschine 600 mehrere Beschleuniger 602a-602n, von denen jeder einen Satz von Operationen ausführen kann. In verschiedenen Beispielen sind die Beschleuniger 602a-602n für bestimmte Arten von Operationen vorgesehen, so dass die Beschleuniger 602a-602n die Operationen viel schneller ausführen können, als wenn ähnliche Operationen von einem Allzweckprozessor ausgeführt werden. In verschiedenen Beispielen müssen zur Ausführung eines Satzes von Operationen zunächst die Eingabedaten, auf denen die Operationen ausgeführt werden sollen, in die Beschleuniger 602a-602n bewegt werden. Zusätzlich wird in einigen Fällen auch Programmcode in die Beschleuniger 602a-602n verlagert, der die Operationen programmiert, die die Beschleuniger 602a-602n an den Daten ausführen werden. Im dargestellten Beispiel umfasst die Beschleunigungsmaschine 600 n Beschleuniger 602a-602n. Beispiele für Beschleuniger, die in der Beschleunigungsmaschine 600 enthalten sein können, sind Grafikbeschleuniger, Gleitkommabeschleuniger, Beschleuniger für neuronale Netzwerke und andere. In verschiedenen Beispielen können die Beschleuniger 602a-602n alle gleich sein (z. B. ist jeder von ihnen ein Grafikbeschleuniger) oder sie können unterschiedlich sein (z. B. umfassen die Beschleuniger 602a-602n einen Grafikbeschleuniger, einen Gleitkommabeschleuniger und einen Beschleuniger für neuronale Netzwerke).
  • Die beispielhafte Beschleunigungsmaschine 600 umfasst außerdem DRAM-Controller 642a-642k zur Kommunikation mit einem externen Speicher. Der externe Speicher wird in diesem Beispiel mit DRAM 630 realisiert. Im dargestellten Beispiel umfasst die Beschleunigungsmaschine 600 k DRAM-Controller 642a-642k, von denen jeder mit einem unabhängigen Satz von DRAM-Bänken kommunizieren kann. In anderen Beispielen können auch andere Arten von RAM-Technologie für den externen Speicher verwendet werden. Die DRAM-Controller 642a-642k können auch als Speichersteuerungen bezeichnet werden.
  • In verschiedenen Beispielen können Eingabedaten und/oder Programmcode für die Beschleuniger 602a-602n im DRAM 630 gespeichert werden. Unterschiedliche Programme können die Beschleuniger 602a-602n veranlassen, unterschiedliche Operationen auszuführen. Wenn es sich bei einem der Beschleuniger beispielsweise um einen Beschleuniger für neuronale Netzwerke handelt, kann ein Programm den Beschleuniger für neuronale Netzwerke so konfigurieren, dass er eine Spracherkennung ausführt, während ein anderes Programm den Beschleuniger für neuronale Netzwerke so konfiguriert, dass er eine Bilderkennung ausführt. In verschiedenen Beispielen können verschiedene Beschleuniger 602a-602n mit unterschiedlichen Programmen programmiert werden, so dass jeder einen anderen Satz von Operationen ausführt. In verschiedenen Beispielen können die Prozessoren 648a-648s das Verschieben von Programmcode aus dem DRAM 630 zu den Beschleunigern 602a-602n verwalten.
  • Die beispielhafte Beschleunigungsmaschine 600 umfasst außerdem E/A-Controller 644a-644p zur Kommunikation mit E/A-Vorrichtungen 632 im System. Die Beschleunigungsmaschine 600 kann z. B. über einen Prozessorbus mit E/A-Vorrichtungen kommunizieren. In einigen Beispielen kann der Prozessorbus mit Peripheral Component Interconnect (PCI) und/oder einer Variante des PCI-Bus-Protokolls implementiert werden. Der Prozessorbus kann die Beschleunigungsmaschine 600 unter anderem mit E/A-Vorrichtungen wie z. B. Ein- und Ausgabevorrichtungen, Speichersteuerungen, Speichervorrichtungen und/oder Netzwerk-Schnittstellenkarten verbinden. In einigen Beispielen können die E/A-Controller 644-644p die Beschleunigungsmaschine 600 in die Lage versetzen, als E/A-Vorrichtung für einen Host-Prozessor zu fungieren. Beispielsweise kann die Beschleunigungsmaschine 600 der Empfänger von Eingabedaten vom Host-Prozessor und einer Anweisung sein, die eine Operation angibt, die mit den Eingabedaten durchgeführt werden soll (z. B. eine bestimmte Berechnung oder Analyse). Im dargestellten Beispiel umfasst die Beschleunigungsmaschine 600 p E/A-Controller 644a-644p, von denen jeder einen separaten Root-Komplex enthalten und mit einem separaten Satz von E/A-Vorrichtungen 632 kommunizieren kann. In anderen Beispielen können andere standardisierte Busprotokolle, wie Ultra Path Interconnect (UPI), für den Host-Bus verwendet werden. In anderen Beispielen kann ein proprietäres Busprotokoll verwendet werden.
  • Die Bewegung von Daten in der Beschleunigungsmaschine 600 kann von einem oder mehreren Prozessoren 648a-648s verwaltet werden, die auch als Datenmanagementprozessoren bezeichnet werden können. Im Beispiel von 6 enthält die Beschleunigungsmaschine 600 s Prozessoren 648a-648s, die in die Vorrichtung integriert sind (z. B. auf demselben Silizium-Die). In anderen Beispielen können sich die Prozessoren 648a-648s außerhalb der Beschleunigungsmaschine 600 befinden (z. B. auf einem anderen Die und/oder in einem anderen Gehäuse). In einigen Beispielen können die Prozessoren 648a-648s die Bewegung von Daten von E/A-Vorrichtungen 632 zu den Beschleunigern 602a-602n oder dem DRAM 630 verwalten. Eingabedaten können sich z. B. an einer E/A-Vorrichtung 632 oder im Prozessorspeicher befinden, und die Prozessoren 648a-648s können die Eingabe von der E/A-Vorrichtung 632 oder Prozessorspeicher in einen Beschleuniger oder in den DRAM 630 übertragen. Als weiteres Beispiel kann sich der Programmcode für die Beschleuniger 602a-602n auf einer E/A-Vorrichtung 632 oder im Prozessorspeicher befinden.
  • Die beispielhafte Beschleunigungsmaschine 600 umfasst außerdem DMA-Maschinen 646a-646d, die Daten zwischen den Beschleunigern 602a-602n, den DRAM-Controllern 642a-642k und den E/A-Controllern 644a-644p bewegen können. Im dargestellten Beispiel umfasst die Beschleunigungsmaschine 600 d DMA-Maschinen 646a-646d. In einigen Implementierungen können die DMA-Maschinen 646a-646d bestimmten Aufgaben zugewiesen werden, z. B. dem Verschieben von Daten von den DRAM-Controllern 642a-642d zu den Beschleunigern 602a-602n oder dem Verschieben von Daten zwischen den E/A-Controllern 644a-644p und den Beschleunigern 602a-602n. Diese Aufgaben können z. B. durch das Einreihen von Deskriptoren in die Warteschlange der DMA-Maschinen 646a-646d zugewiesen werden, wobei ein Deskriptor eine Adresse für einen Datenblock und eine auszuführende Operation (z. B. eine Lese- oder Schreiboperation) identifiziert. Ein Deskriptor kann z. B. eine DMA-Maschine anweisen, einen DMA-Controller anzuweisen, einen Datenblock aus dem DRAM 630 zu lesen. Ein Deskriptor kann, als weiteres Beispiel, die DMA-Maschine anweisen, Daten, die vom DMA-Controller gelesen wurden, in einen Beschleuniger zu schreiben. Weitere Deskriptoren können verwendet werden, um Daten von einem Beschleuniger zum DRAM 630 zu bewegen.
  • In verschiedenen Beispielen kann jeder der Prozessoren 648a-648s für die Verwaltung der Datenbewegung für einen anderen Beschleuniger zuständig sein. In einigen Beispielen kann ein Prozessor die Datenbewegung für mehr als einen Beschleuniger verwalten. In ähnlicher Weise kann in verschiedenen Beispielen jeder der Prozessoren 648a-648s einer oder mehreren DMA-Maschinen 646a-646d zugewiesen werden. In diesen und anderen Beispielen werden die Zuordnungen zwischen den Prozessoren 648a-648s, den Beschleunigern 602a-602n und den DMA-Maschinen 646a-646d durch Programmcode bestimmt, der von den jeweiligen Prozessoren ausgeführt wird.
  • In der beispielhaften Beschleunigungsmaschine 600 können die verschiedenen Komponenten über eine Chip-Verbindung 620 kommunizieren. Die Chip-Verbindung 620 umfasst in erster Linie die Verdrahtung für die Weiterleitung von Daten zwischen den Komponenten der Beschleunigungsmaschine 600. In einigen Fällen kann die Chip-Verbindung 620 eine minimale Menge an Logik enthalten, wie z. B. Multiplexer zur Steuerung der Datenrichtung, Flip-Flops zur Behandlung von Taktbereichsübergängen und Timing-Logik.
  • 7 umfasst ein Blockdiagramm, das ein Beispiel für ein Host-System 700 zeigt, in dem eine Beschleunigungsmaschine 760 verwendet werden kann, gemäß Aspekten der vorliegenden Offenbarung. Die Beschleunigungsmaschine 760 von 7 ist ein Beispiel für eine Vorrichtung, die einen oder mehrere Beschleuniger enthalten kann, wie in 6 gezeigt. Das beispielhafte Host-System 700 von 7 umfasst die Beschleunigungsmaschine 760, einen Host-Prozessor 772, DRAM 730 oder Prozessorspeicher, E/A-Vorrichtungen 732 und Unterstützungssysteme 774. In verschiedenen Implementierungen kann das Host-System 700 weitere Hardware enthalten, die hier nicht dargestellt ist.
  • Der Host-Prozessor 772 ist eine integrierte Allzweckschaltung, die in der Lage ist, Programmbefehle auszuführen. In einigen Beispielen kann der Host-Prozessor 772 mehrere Rechenkerne enthalten. Ein Multi-Core-Prozessor kann mehrere Verarbeitungseinheiten innerhalb desselben Prozessors enthalten. In einigen Beispielen kann das Host-System 700 mehr als einen Host-Prozessor 772 enthalten. In einigen Beispielen können der Host-Prozessor 772 und die Beschleunigungsmaschine 760 ein Chip sein, z. B. ein oder mehrere integrierte Schaltkreise im selben Gehäuse.
  • In verschiedenen Beispielen kann der Host-Prozessor 772 mit anderen Komponenten im Host-System 700 über einen oder mehrere Kommunikationskanäle kommunizieren. Das Host-System 700 kann z. B. einen Host-Prozessor-Bus enthalten, über den der Host-Prozessor 772 z. B. mit dem DRAM 730 kommunizieren kann. Als weiteres Beispiel kann das Host-System 700 einen E/A-Bus enthalten, wie z. B. einen PCI-basierten Bus, über den der Host-Prozessor 772 mit der Beschleunigungsmaschine 760 und/oder den E/A-Vorrichtungen 732 kommunizieren kann. In verschiedenen Beispielen kann das Host-System 700 alternativ oder zusätzlich andere Kommunikationskanäle oder Busse enthalten, wie z. B. serielle Busse, Energiemanagementbusse, Speichervorrichtungsbusse usw.
  • In einigen Beispielen können Softwareprogramme, die auf dem Host-Prozessor 772 ausgeführt werden, Eingaben zur Verarbeitung durch die Beschleunigungsmaschine 760 empfangen oder erzeugen. In einigen Beispielen können die Programme ein geeignetes neuronales Netzwerk auswählen, das für eine bestimmte Eingabe ausgeführt wird. Zum Beispiel kann ein Programm für die Sprachübersetzung ein oder mehrere neuronale Netzwerke auswählen, die zur Spracherkennung und/oder maschinellen Übersetzung fähig sind. In diesen und anderen Beispielen können die Programme die Beschleunigungsmaschine 760 mit dem auszuführenden neuronalen Netzwerk konfigurieren und/oder eine neuronale Netzwerkverarbeitungsmaschine auf der Beschleunigungsmaschine 760 auswählen, die zuvor zur Ausführung des gewünschten neuronalen Netzwerks konfiguriert wurde. In einigen Beispielen kann der Host-Prozessor 772, sobald die Beschleunigungsmaschine 760 eine Schlussfolgerung auf Eingabedaten gestartet hat, die Bewegung von Daten (wie z. B. Gewichtungen, Befehle, Zwischenergebnisse, Ergebnisse von bedingten Schichten und/oder Endergebnisse) in die oder aus der Beschleunigungsmaschine 760 verwalten.
  • In einigen Beispielen kann ein Softwareprogramm, das die Beschleunigungsmaschine 760 zur Durchführung einer Schlussfolgerung verwendet, das Ergebnis einer bedingten Schicht aus der Beschleunigungsmaschine 760 und/oder aus einem Speicherort, z. B. im DRAM 730, lesen. In diesen Beispielen kann das Programm bestimmen, welche Aktion das neuronale Netzwerk als Nächstes ausführen soll. Das Programm kann z. B. festlegen, dass die Schlussfolgerung abgebrochen wird. Als weiteres Beispiel kann das Programm bestimmen, die Richtung der Schlussfolgerung zu ändern, was von einem Code auf niedrigerer Ebene und/oder dem Prozessor des neuronalen Netzwerks an eine nächste auszuführende Schicht übersetzt werden kann. In diesen und anderen Beispielen kann der Ausführungsablauf des neuronalen Netzwerks per Software koordiniert werden.
  • Der DRAM 730 ist ein Speicher, der vom Host-Prozessor 772 zur Speicherung von Programmcode verwendet wird, den der Host-Prozessor 772 gerade ausführt, sowie von Werten, mit denen gearbeitet wird. In einigen Beispielen können die Daten für ein neuronales Netzwerk (z. B. Gewichtswerte, Befehle und andere Daten) ganz oder teilweise im DRAM 730 gespeichert werden. DRAM ist ein gängiger Begriff für Prozessorspeicher, und obwohl DRAM ein flüchtiger Speicher ist, kann Prozessorspeicher flüchtig und/oder nicht flüchtig sein. Obwohl hier nicht dargestellt, kann das Host-System 700 auch andere flüchtige und nichtflüchtige Speicher für andere Zwecke enthalten. Zum Beispiel kann das Host-System 700 einen Nur-Lese-Speicher (ROM) enthalten, der Boot-Code zum Booten des Host-Systems 700 beim Einschalten und/oder BIOS-Code (Basic Input/Output System) speichert.
  • Obwohl hier nicht dargestellt, kann der DRAM 730 Befehle für verschiedene Programme speichern, die in den Host-Prozessor 772 geladen und von diesem ausgeführt werden können. Der DRAM 730 kann z. B. Befehle für ein Betriebssystem, einen oder mehrere Datenspeicher, ein oder mehrere Anwendungsprogramme, einen oder mehrere Treiber und/oder Dienste zur Implementierung der hierin offenbarten Funktionen speichern.
  • Das Betriebssystem kann den Gesamtbetrieb des Host-Systems 700 verwalten und orchestrieren, wie z. B. das Planen von Aufgaben, das Ausführen von Anwendungen und/oder das Steuern von Peripherievorrichtungen, neben anderen Operationen. In einigen Beispielen kann ein Host-System 700 eine oder mehrere virtuelle Maschinen hosten. In diesen Beispielen kann jede virtuelle Maschine dazu konfiguriert sein, ihr eigenes Betriebssystem auszuführen. Beispiele für Betriebssysteme sind Unix, Linux, Windows, Mac OS, iOS, Android und dergleichen. Das Betriebssystem kann, alternativ oder zusätzlich, auch ein proprietäres Betriebssystem sein.
  • Die Datenspeicher können permanente oder flüchtige Daten enthalten, die vom Betriebssystem, den Anwendungsprogrammen oder den Treibern verwendet und/oder betrieben werden. Beispiele für solche Daten sind Webseiten, Videodaten, Audiodaten, Bilder, Benutzerdaten und so weiter. Die Informationen in den Datenspeichern können in einigen Beispielen über das/die Netzwerk(e) an die Benutzervorrichtungen übermittelt werden. In einigen Fällen können die Datenspeicher zusätzlich oder alternativ gespeicherte Anwendungsprogramme und/oder Treiber enthalten. Alternativ oder zusätzlich können die Datenspeicher Standard- und/oder proprietäre Softwarebibliotheken und/oder Standard- und/oder proprietäre Application User Interface (API)-Bibliotheken speichern. In den Datenspeichern gespeicherte Informationen können maschinenlesbarer Objektcode, Quellcode, interpretierter Code oder Zwischencode sein.
  • Die Treiber können Programme enthalten, die die Kommunikation zwischen Komponenten im Host-System 700 ermöglichen. So können beispielsweise einige Treiber die Kommunikation zwischen dem Betriebssystem und den Peripherievorrichtungen oder E/A-Vorrichtungen 732 ermöglichen. Alternativ oder zusätzlich können einige Treiber die Kommunikation zwischen den Anwendungsprogrammen und dem Betriebssystem und/oder den Anwendungsprogrammen und Peripherievorrichtungen ermöglichen, die für das Host-System 700 zugänglich sind. In vielen Fällen können die Treiber solche Treiber enthalten, die eine gut verstandene Funktionalität bieten (z. B. Druckertreiber, Anzeigetreiber, Festplattentreiber, Solid-State-Device-Treiber usw.). In anderen Fällen können die Treiber proprietäre oder spezielle Funktionen bereitstellen.
  • Die E/A-Vorrichtungen 732 können Hardware für den Anschluss an Benutzer-Eingabe- und -Ausgabevorrichtungen umfassen, wie z. B. Tastaturen, Mäuse, Stifte, Tablets, Spracheingabevorrichtungen, Berührungseingabevorrichtungen, Displays oder Monitore, Lautsprecher und Drucker, neben anderen Vorrichtungen. Die E/A-Vorrichtungen 732 können auch Speicherlaufwerke und/oder Netzwerkschnittstellen zum Anschluss an ein Netzwerk 780 enthalten. Beispielsweise kann das Host-System 700 eine Netzwerkschnittstelle verwenden, um mit Speichervorrichtungen, Benutzerterminals, anderen Computervorrichtungen oder Servern und/oder anderen Netzwerken zu kommunizieren, um nur einige Beispiele zu nennen.
  • In verschiedenen Beispielen können eine oder mehrere der E/A-Vorrichtung 732 Speichervorrichtungen sein. In diesen Beispielen umfassen die Speichervorrichtungen nichtflüchtige Speicher und können Programmbefehle und/oder Daten speichern. Beispiele für Speichervorrichtungen umfassen unter anderem Magnetspeicher, optische Platten, Solid-State-Disks, Flash-Speicher und/oder Bandspeicher. Die Speichervorrichtung kann im gleichen Gehäuse wie das Host-System 700 oder in einem externen Gehäuse untergebracht sein. Eine Speichervorrichtung kann fest (z. B. durch Schrauben befestigt) oder abnehmbar sein (z. B. mit einem physischen Lösemechanismus und möglicherweise einem Hot-Plug-Mechanismus).
  • Speichervorrichtungen, der DRAM 730 und jede andere Speicherkomponente im Host-System 700 sind Beispiele für computerlesbare Speichermedien. Computerlesbare Speichermedien sind physikalische Medien, die in der Lage sind, Daten in einem Format zu speichern, das von einer Vorrichtung wie dem Host-Prozessor 772 gelesen werden kann. Die computerlesbaren Speichermedien können nichtflüchtig sein. Nichtflüchtige, computerlesbare Medien können die darauf gespeicherten Daten beibehalten, wenn kein Strom an das Medium angelegt wird. Beispiele für nichtflüchtige, computerlesbare Medien sind u. a. ROM-Vorrichtungen, Magnetplatten, Magnetbänder, optische Platten, Flash-Vorrichtungen und Solid-State-Laufwerke. Wie hierin verwendet schließt der Begriff computerlesbare Speichermedien keine computerlesbaren Kommunikationsmedien ein.
  • In verschiedenen Beispielen können die auf computerlesbaren Speichermedien gespeicherten Daten Programmbefehle, Datenstrukturen, Programmmodule, Bibliotheken, andere Software-Programmkomponenten und/oder andere Daten enthalten, die innerhalb eines Datensignals, wie einer Trägerwelle oder einer anderen Übertragung, übertragen werden können. Die computerlesbaren Speichermedien können zusätzlich oder alternativ Dokumente, Bilder, Video-, Audio- und andere Daten enthalten, die durch die Verwendung eines Softwareprogramms bearbeitet oder manipuliert werden können.
  • In verschiedenen Beispielen können eine oder mehrere der E/A-Vorrichtung 732 PCI-basierte Vorrichtungen sein. In diesen Beispielen enthält eine PCI-basierte E/A-Vorrichtung eine PCI-Schnittstelle zur Kommunikation mit dem Host-System 700. Der Begriff „PCI“ oder „PCI-basiert“ kann verwendet werden, um jedes Protokoll in der PCI-Busprotokollfamilie zu beschreiben, einschließlich des ursprünglichen PCI-Standards, PCI-X, Accelerated Graphics Port (AGP) und PCI-Express(PCIe) oder andere Verbesserungs- oder abgeleitete Protokolle, die auf den hierin beschriebenen PCI-Protokollen basieren. Die PCI-basierten Protokolle sind Standardbusprotokolle für die Verbindung von Vorrichtungen, wie z. B. einer lokalen Peripherievorrichtung mit einer Hostvorrichtung. Ein Standardbusprotokoll ist ein Datenübertragungsprotokoll, für das eine Spezifikation definiert und von verschiedenen Anbietern übernommen wurde. Die Anbieter stellen sicher, dass konforme Vorrichtungen mit Computersystemen kompatibel sind, die das Busprotokoll implementieren, und umgekehrt. Wie hierin verwendet, enthalten PCI-basierte Vorrichtungen auch Vorrichtungen, die über Non-Volatile Memory Express (NVMe) kommunizieren. NVMe ist eine Vorrichtungsschnittstellenspezifikation für den Zugriff auf nichtflüchtige Speichermedien, die an ein Computersystem mit PCIe angeschlossen sind.
  • Eine PCI-basierte Vorrichtung kann eine oder mehrere Funktionen enthalten. Eine „Funktion“ beschreibt die Hardware und/oder Software eines Vorgangs, der von der PCI-basierten Vorrichtung bereitgestellt werden kann. Beispiele für Funktionen sind unter anderem Massenspeichersteuerungen, Netzwerksteuerungen, Displaysteuerungen, Speichersteuerungen, serielle Bus-Controller, Wireless-Controller, Ver- und Entschlüsselungs-Controller. In einigen Fällen kann eine PCI-basierte Vorrichtung mehr als eine Funktion enthalten. So kann beispielsweise eine PCI-basierte Vorrichtung einen Massenspeicher-Controller und einen Netzwerkadapter bereitstellen. Als weiteres Beispiel kann eine PCI-basierte Vorrichtung zwei Speichersteuerungen bereitstellen, um zwei verschiedene Speicherressourcen zu steuern. In einigen Implementierungen kann eine PCI-basierte Vorrichtung bis zu acht Funktionen haben.
  • In einigen Beispielen kann die PCI-basierte Vorrichtung eine Single-Root-E/A-Virtualisierung (SR-IOV) enthalten. SR-IOV ist eine erweiterte Funktion, die in eine PCI-basierte Vorrichtung integriert werden kann. SR-IOV ermöglicht es, dass eine physische Ressource (z. B. ein einzelner Netzwerk-Schnittstellencontroller) als mehrere virtuelle Ressourcen (z. B. vierundsechzig Netzwerk-Schnittstellencontroller) erscheint. Somit kann eine PCI-basierte Vorrichtung, die eine bestimmte Funktionalität bereitstellt (z. B. eine Netzwerkschnittstellen-Steuerung), für eine Vorrichtung, die die PCI-basierte Vorrichtung verwendet, als mehrere Vorrichtungen mit derselben Funktionalität erscheinen. Die Funktionen einer SR-IOV-fähigen Speicheradaptervorrichtung können als physikalische Funktionen (PFs) oder virtuelle Funktionen (VFs) klassifiziert werden. Physische Funktionen sind vollwertige Funktionen der Vorrichtung, die entdeckt, verwaltet und manipuliert werden können. Physische Funktionen verfügen über Konfigurationsressourcen, mit denen die Speicheradaptervorrichtung konfiguriert oder gesteuert werden kann. Zu den physischen Funktionen gehören der gleiche Konfigurations-Adressraum und Speicher-Adressraum, den eine nicht-virtualisierte Vorrichtung haben würde. Eine physikalische Funktion kann mit einer Reihe von virtuellen Funktionen verbunden sein. Virtuelle Funktionen ähneln physischen Funktionen, sind aber leichte Funktionen, die im Allgemeinen keine Konfigurationsressourcen haben und im Allgemeinen durch die Konfiguration ihrer zugrunde liegenden physischen Funktionen gesteuert werden. Jede der physischen Funktionen und/oder virtuellen Funktionen kann einem entsprechenden Ausführungs-Thread (wie z. B. einer virtuellen Maschine) zugeordnet werden, der auf einer Hostvorrichtung läuft.
  • In verschiedenen Implementierungen können die Unterstützungssysteme 774 Hardware zur Koordinierung der Operationen der Beschleunigungsmaschine 760 enthalten. Die Unterstützungssysteme 774 können z. B. einen Mikroprozessor enthalten, der die Aktivitäten der Beschleunigungsmaschine 760 koordiniert, einschließlich der Bewegung von Daten auf der Beschleunigungsmaschine 760. In diesem Beispiel kann der Mikroprozessor eine integrierte Schaltung sein, die Mikrocode ausführen kann. Mikrocode ist ein Programmcode, der einer integrierten Schaltung eine gewisse Flexibilität bei den Operationen ermöglicht, die die integrierte Schaltung ausführen kann. Da der Programmcode jedoch einen begrenzten Befehlssatz verwendet, kann der Mikroprozessor begrenztere Fähigkeiten haben als der Host-Prozessor 772. In einigen Beispielen wird das vom Mikroprozessor ausgeführte Programm auf der Hardware des Mikroprozessors oder auf einem nichtflüchtigen Speicherchip im Host-System 700 gespeichert. In einigen Beispielen können der Mikroprozessor und die Beschleunigungsmaschine 760 auf einem Chip sein, wie z. B. ein integrierter Schaltkreis auf demselben Chip und im selben Gehäuse.
  • In einigen Beispielen können die Unterstützungssysteme 774 dafür verantwortlich sein, Befehle vom Host-Prozessor 772 entgegenzunehmen, wenn auf dem Host-Prozessor 772 ausgeführte Programme die Ausführung eines neuronalen Netzwerks anfordern. Beispielsweise kann der Host-Prozessor 772 den Unterstützungssystemen 774 einen Satz von Eingabedaten und eine Aufgabe zur Verfügung stellen, die mit dem Satz von Eingabedaten ausgeführt werden soll. In diesem Beispiel können die Unterstützungssysteme 774 ein neuronales Netzwerk identifizieren, das die Aufgabe ausführen kann, und die Beschleunigungsmaschine 760 so programmieren, dass das neuronale Netzwerk auf dem Satz von Eingabedaten ausgeführt wird. In einigen Beispielen müssen die Unterstützungssysteme 774 nur eine geeignete neuronale Netzwerkverarbeitungsmaschine des neuronalen Netzwerkprozessors auswählen. In einigen Beispielen müssen die Unterstützungssysteme 774 möglicherweise die Daten für das neuronale Netzwerk in die Beschleunigungsmaschine 760 laden, bevor die Beschleunigungsmaschine 760 mit der Ausführung des neuronalen Netzwerks beginnen kann. In diesen und anderen Beispielen können die Unterstützungssysteme 774 weiterhin die Ausgabe der Ausführung des neuronalen Netzwerks empfangen und die Ausgabe zurück an den Host-Prozessor 772 liefern.
  • In einigen Beispielen können die Operationen der Unterstützungssysteme 774 durch den Host-Prozessor 772 abgewickelt werden. In diesen Beispielen werden die Unterstützungssysteme 774 möglicherweise nicht benötigt und können vom Host-System 700 weggelassen werden.
  • In verschiedenen Beispielen kann das Host-System 700 eine beliebige Kombination von Host-Systemen, Prozessorknoten, Speicher-Subsystemen und E/A-Chassis sein, die Benutzervorrichtungen, Dienstanbietercomputer oder Computer von Drittanbietern darstellen.
  • Benutzervorrichtungen können Computervorrichtungen enthalten, um auf eine Anwendung zuzugreifen (z. B. einen Webbrowser oder eine Anwendung für mobile Vorrichtungen). In einigen Beispielen kann die Anwendung von einem Rechenzentrums- oder Dienstanbieter gehostet, verwaltet und/oder bereitgestellt werden. Die Anwendung kann es einem Benutzer ermöglichen, mit den Dienstanbietercomputern zu interagieren, um beispielsweise auf Webinhalte (z. B. Webseiten, Musik, Videos usw.) zuzugreifen. Die Benutzervorrichtung kann eine Computervorrichtung wie beispielsweise ein Mobiltelefon, ein Smartphone, ein Personal Digital Assistant (PDA), ein Laptop-Computer, ein Netbook-Computer, ein Desktop-Computer, eine Thin-Client-Vorrichtung, ein Tablet-Computer, ein elektronisches Buch (E-Book-Lesevorrichtung), eine Spielkonsole usw. sein. In einigen Beispielen kann (können) die Benutzervorrichtung(en) über ein oder mehrere Netzwerke mit den Dienstanbietercomputern kommunizieren. Darüber hinaus kann die Benutzervorrichtung Teil des verteilten Systems sein, das von dem Dienstanbietercomputer verwaltet, kontrolliert wird oder anderweitig Teil der Dienstanbietercomputer ist (z. B. eine mit den Dienstanbietercomputern integrierte Konsolenvorrichtung).
  • Das Host-System 700 kann auch einen oder mehrere Dienstanbietercomputer darstellen. Ein Dienstanbietercomputer kann eine native Anwendung bereitstellen, die so konfiguriert ist, dass sie auf Benutzervorrichtungen ausgeführt wird, mit denen Benutzer interagieren können. Der Dienstanbietercomputer kann in einigen Beispielen Computerressourcen bereitstellen, wie z. B. Client-Einheiten, Datenspeicher mit niedriger Latenzzeit, dauerhafte Datenspeicherung, Datenzugriff, Verwaltung, Virtualisierung, Cloud-basierte Softwarelösungen, elektronisches Content Performance Management und so weiter. Der Dienstanbietercomputer kann auch so betrieben werden, dass sie dem oder den Benutzer(n) Webhosting, Datenbanken, Computeranwendungsentwicklungs- und/oder Implementierungsplattformen, Kombinationen aus dem Vorstehenden oder dergleichen bereitstellen. In einigen Beispielen kann der Dienstanbietercomputer als eine oder mehrere virtuelle Maschinen bereitgestellt werden, die in einer gehosteten Computerumgebung implementiert sind. Die gehostete Computerumgebung kann eine oder mehrere schnell bereitgestellte und freigegebene Computerressourcen enthalten. Zu diesen Computerressourcen können Computer-, Netzwerk- und/oder Speichervorrichtungen gehören. Eine gehostete Computerumgebung kann auch als Cloud-Computing-Umgebung bezeichnet werden. Der Dienstanbietercomputer kann einen oder mehrere Server enthalten, die möglicherweise in einem Cluster, als Serverfarm oder als einzelne Server, die nicht miteinander verbunden sind, angeordnet sind, und können die Anwendung und/oder Cloud-basierte Softwaredienste hosten. Diese Server können als Teil einer integrierten, verteilten Computerumgebung konfiguriert werden. In einigen Beispielen kann der Dienstanbietercomputer zusätzlich oder alternativ Computervorrichtungen wie z. B. ein Mobiltelefon, ein Smartphone, einen persönlichen digitalen Assistenten (PDA), einen Laptop-Computer, einen Desktop-Computer, einen Netbook-Computer, einen Server-Computer, eine Thin-Client-Vorrichtung, einen Tablet-Computer, eine Spielkonsole usw. enthalten. In einigen Fällen kann der Dienstanbietercomputer mit einem oder mehreren Computern von Drittanbietern kommunizieren.
  • 8 umfasst ein Diagramm eines Beispielnetzwerks 800, das ein oder mehrere Host-Systeme umfassen kann, wie das in 7 veranschaulichte, gemäß bestimmten Aspekten der vorliegenden Offenbarung; Zum Beispiel umfasst das Beispielnetzwerk 800 von 8 mehrere Knoten 802a-802h, von denen einer oder mehrere ein Host-System sein können, wie in 7 gezeigt. Andere der Knoten 802a-802h können andere Computervorrichtungen sein, von denen jede mindestens einen Speicher zum Speichern von Programmbefehle, einen Prozessor zum Ausführen der Befehle und eine Netzwerkschnittstelle zum Verbinden mit dem Netzwerk 800 enthält.
  • In verschiedenen Beispielen kann das Netzwerk 800 zur Verarbeitung von Daten verwendet werden. Beispielsweise können Eingabedaten an einem der Knoten 802a-802h oder von anderen Netzwerken 808, mit denen das Netzwerk 800 kommunizieren kann, empfangen werden. In diesem Beispiel können die Eingabedaten an einen Knoten im Netzwerk 800 geleitet werden, der eine Beschleunigungsmaschine enthält, damit die Beschleunigungsmaschine darauf arbeitet und ein Ergebnis erzeugt. Das Ergebnis kann dann an den Knoten oder ein anderes Netzwerk übertragen werden, von dem die Eingabedaten empfangen wurden. In verschiedenen Beispielen können Eingabedaten von verschiedenen Quellen gesammelt werden, einschließlich eines oder mehrerer der Knoten 802a-802h und/oder Computervorrichtungen, die sich in den anderen Netzwerken 808 befinden, und die gesammelten Eingabedaten können an ein oder mehrere Host-Systeme im Netzwerk 800 geleitet werden. Die Ergebnisse aus den Host-Systemen können dann zurück an die Quellen verteilt werden, aus denen die Eingabedaten gesammelt wurden.
  • In verschiedenen Beispielen können einer oder mehrere der Knoten 802a-802h für Operationen wie das Sammeln von Eingabedaten für Host-Systeme, die bearbeitet werden sollen, das Verfolgen, welche Host-Systeme ausgelastet sind und welche mehr Arbeit annehmen können, das Bestimmen, ob die Host-Systeme korrekt und/oder möglichst effizient arbeiten, das Überwachen der Netzwerksicherheit und/oder andere Verwaltungsoperationen verantwortlich sein.
  • Im Beispiel von 8 sind die Knoten 802a-802h über eine Switched-Architektur mit Punkt-zu-Punkt-Verbindungen miteinander verbunden. Die Switched-Architektur umfasst mehrere Switches 804a-804d, die in einem mehrschichtigen Netzwerk wie einem Clos-Netzwerk angeordnet sein können. Eine Netzwerkvorrichtung, die Pakete zwischen LAN-Segmenten (Local Area Network) filtert und weiterleitet, kann als Switch bezeichnet werden. Switches arbeiten im Allgemeinen auf der Datenverbindungsschicht (Schicht 2) und manchmal auf der Netzwerkschicht (Schicht 3) des Open System Interconnect (OSI)-Referenzmodells und können mehrere Paketprotokolle unterstützen. Die Switches 804a-804d von 8 können mit mehreren Knoten 802a-802h verbunden werden und bieten mehrere Pfade zwischen zwei beliebigen Knoten.
  • Das Netzwerk 800 kann auch ein oder mehrere Netzwerkvorrichtungen zur Verbindung mit anderen Netzwerken 808 enthalten, wie z. B. einen Router 806. Router verwenden Header und Weiterleitungstabellen, um den besten Pfad für die Weiterleitung der Pakete zu bestimmen, und verwenden Protokolle wie das Internet Control Message Protocol (ICMP), um miteinander zu kommunizieren und die beste Route zwischen zwei beliebigen Vorrichtungen zu konfigurieren. Der Router 806 von 8 kann zur Verbindung mit anderen Netzwerken 808 wie Subnetzen, LANs, Wide Area Networks (WANs) und/oder dem Internet verwendet werden.
  • In einigen Beispielen kann das Netzwerk 800 ein beliebiges oder eine Kombination von vielen verschiedenen Arten von Netzwerken enthalten, wie beispielsweise Kabelnetzwerke, das Internet, drahtlose Netzwerke, zellulare Netzwerke und andere private und/oder öffentliche Netzwerke. Die zusammengeschalteten Switches 804a-804d und Router 806, falls vorhanden, können als Switch-Fabric 810, Fabric, Network-Fabric oder einfach als Netzwerk bezeichnet werden. Im Rahmen eines Computernetzwerks können die Begriffe „Fabric“ und „Netzwerk“ hierin austauschbar verwendet werden.
  • Die Knoten 802a-802h können eine beliebige Kombination von Host-Systemen, Prozessorknoten, Speicher-Subsystemen und E/A-Chassis sein, die Benutzervorrichtungen, Dienstanbietercomputer oder Computer von Drittanbietern darstellen.
  • Benutzervorrichtungen können Computervorrichtungen enthalten, um auf eine Anwendung 832 zuzugreifen (z. B. einen Webbrowser oder eine Anwendung für mobile Vorrichtungen). In einigen Aspekten kann die Anwendung 832 von einem Rechenzentrums- oder Dienstanbieter gehostet, verwaltet und/oder bereitgestellt werden. Die Anwendung 832 kann es den Benutzern ermöglichen, mit den Computern des Dienstanbieters zu interagieren, um beispielsweise auf Webinhalte (z. B. Webseiten, Musik, Videos usw.) zuzugreifen. Die Benutzervorrichtung(en) kann (können) eine Computervorrichtung wie beispielsweise ein Mobiltelefon, ein Smartphone, ein Personal Digital Assistant (PDA), ein Laptop-Computer, ein Netbook-Computer, ein Desktop-Computer, eine Thin-Client-Vorrichtung, ein Tablet-Computer, ein elektronisches Buch (E-Book-Lesevorrichtung), eine Spielkonsole usw. sein. In einigen Beispielen kann (können) die Benutzervorrichtung(en) über ein anderes Netzwerk 808 mit den Dienstanbietercomputern kommunizieren. Darüber hinaus kann (können) die Benutzervorrichtung(en) Teil des verteilten Systems sein, das von den Dienstanbietercomputern verwaltet, kontrolliert wird oder anderweitig Teil der Dienstanbietercomputer ist (z. B. eine mit den Dienstanbietercomputern integrierte Konsolenvorrichtung).
  • Der oder die Knoten von 8 können auch einen oder mehrere Dienstanbietercomputer darstellen. Ein oder mehrere Dienstanbietercomputer können eine native Anwendung bereitstellen, die so konfiguriert ist, dass sie auf den Benutzervorrichtungen ausgeführt wird, mit denen die Benutzer interagieren können. Die Dienstanbietercomputer können in einigen Beispielen Computerressourcen bereitstellen, wie z. B. Client-Einheiten, Datenspeicher mit niedriger Latenzzeit, dauerhafte Datenspeicherung, Datenzugriff, Verwaltung, Virtualisierung, Cloud-basierte Softwarelösungen, elektronisches Content Performance Management und so weiter. Der oder die Dienstanbietercomputer können auch so betrieben werden, dass sie dem oder den Benutzer(n) Webhosting, Datenbanken, Computeranwendungsentwicklungs- und/oder Implementierungsplattformen, Kombinationen aus dem Vorstehenden oder dergleichen bereitstellen. In einigen Beispielen können der oder die Dienstanbietercomputer als eine oder mehrere virtuelle Maschinen bereitgestellt werden, die in einer gehosteten Computerumgebung implementiert sind. Die gehostete Computerumgebung kann eine oder mehrere schnell bereitgestellte und freigegebene Computerressourcen enthalten. Zu diesen Computerressourcen können Computer-, Netzwerk- und/oder Speichervorrichtungen gehören. Eine gehostete Computerumgebung kann auch als Cloud-Computing-Umgebung bezeichnet werden. Der oder die Dienstanbietercomputer können einen oder mehrere Server enthalten, die möglicherweise in einem Cluster, als Serverfarm oder als einzelne Server, die nicht miteinander verbunden sind, angeordnet sind, und können die Anwendung 832 und/oder Cloud-basierte Softwaredienste hosten. Diese Server können als Teil einer integrierten, verteilten Computerumgebung konfiguriert werden. In einigen Aspekten können die Dienstanbietercomputer zusätzlich oder alternativ Computervorrichtungen wie z. B. ein Mobiltelefon, ein Smartphone, einen persönlichen digitalen Assistenten (PDA), einen Laptop-Computer, einen Desktop-Computer, einen Netbook-Computer, einen Server-Computer, eine Thin-Client-Vorrichtung, einen Tablet-Computer, eine Spielkonsole usw. enthalten. In einigen Fällen können die Dienstanbietercomputer mit einem oder mehreren Computern von Drittanbietern kommunizieren.
  • In einer Beispielkonfiguration können die Knoten 802a-802h mindestens einen Speicher 818 und eine oder mehrere Verarbeitungseinheiten (oder Prozessoren 820) enthalten. Der oder die Prozessor(en) 820 können in Hardware, computerausführbaren Befehlen, Firmware oder Kombinationen davon implementiert sein. Computerausführbare Befehle oder Firmware-Implementierungen des/der Prozessors(en) 820 können computerausführbare oder maschinenausführbare Befehle enthalten, die in jeder geeigneten Programmiersprache geschrieben sind, um die verschiedenen beschriebenen Funktionen auszuführen.
  • In einigen Fällen kann (können) der oder die Hardware-Prozessor(en) 820 ein Single-Core-Prozessor oder ein Multi-Core-Prozessor sein. Ein Multi-Core-Prozessor kann mehrere Verarbeitungseinheiten innerhalb desselben Prozessors enthalten. In einigen Beispielen können sich die Multi-Core-Prozessoren bestimmte Ressourcen wie Busse und Caches der zweiten oder dritten Ebene teilen. In einigen Fällen kann jeder Kern in einem Single- oder Multi-Core-Prozessor auch mehrere ausführende logische Prozessoren (oder ausführende Threads) enthalten. In einem solchen Kern (z. B. mit mehreren logischen Prozessoren) können auch mehrere Stufen der Ausführungspipeline und auch untergeordnete Caches gemeinsam genutzt werden.
  • Der Speicher 818 kann Programmbefehle speichern, die auf dem/den Prozessor(en) 820 ladbar und ausführbar sind, sowie Daten, die während der Ausführung dieser Programme erzeugt werden. Je nach Konfiguration und Typ der Knoten 802a-802h kann der Speicher 818 flüchtig (z. B. RAM) und/oder nichtflüchtig (z. B. ROM, Flash-Speicher, etc.) sein. Der Speicher 818 kann ein Betriebssystem 828, einen oder mehrere Datenspeicher 830, ein oder mehrere Anwendungsprogramme 832, einen oder mehrere Treiber 834 und/oder Dienste zur Implementierung der hierin offenbarten Funktionen enthalten.
  • Das Betriebssystem 828 kann die Grundfunktionen der Knoten 802a-802h unterstützen, wie z. B. die Planung von Aufgaben, das Ausführen von Anwendungen und/oder die Steuerung von Peripherievorrichtungenn. In einigen Implementierungen kann ein Dienstanbietercomputer eine oder mehrere virtuelle Maschinen bereitstellen. In diesen Implementierungen kann jede virtuelle Maschine dazu konfiguriert sein, ihr eigenes Betriebssystem auszuführen. Beispiele für Betriebssysteme sind Unix, Linux, Windows, Mac OS, iOS, Android und dergleichen. Das Betriebssystem 828 kann auch ein proprietäres Betriebssystem sein.
  • Die Datenspeicher 830 können permanente oder flüchtige Daten enthalten, die vom Betriebssystem 828, den Anwendungsprogrammen 832 oder den Treibern 834 verwendet und/oder betrieben werden. Beispiele für solche Daten sind Webseiten, Videodaten, Audiodaten, Bilder, Benutzerdaten und so weiter. Die Informationen in den Datenspeichern 830 können in einigen Implementierungen über das/die Netzwerk(e) 808 an die Benutzervorrichtungen übermittelt werden. In einigen Fällen können die Datenspeicher 830 zusätzlich oder alternativ gespeicherte Anwendungsprogramme und/oder Treiber enthalten. Alternativ oder zusätzlich können die Datenspeicher 830 Standard- und/oder proprietäre Softwarebibliotheken und/oder Standard- und/oder proprietäre Application User Interface (API)-Bibliotheken speichern. In den Datenspeichern 830 gespeicherte Informationen können maschinenlesbarer Objektcode, Quellcode, interpretierter Code oder Zwischencode sein.
  • Die Treiber 834 enthalten Programme, die die Kommunikation zwischen Komponenten in einem Knoten ermöglichen. So können beispielsweise einige Treiber 834 die Kommunikation zwischen dem Betriebssystem 828 und dem zusätzlichen Speicher 822, der Netzwerkvorrichtung 824 und/oder der E/A-Vorrichtung 826 ermöglichen. Alternativ oder zusätzlich können einige Treiber 834 die Kommunikation zwischen den Anwendungsprogrammen 832 und dem Betriebssystem 828 und/oder den Anwendungsprogrammen 832 und Peripherievorrichtungen ermöglichen, die für den Dienstanbietercomputer zugänglich sind. In vielen Fällen können die Treiber 834 Treiber enthalten, die eine gut verstandene Funktionalität bieten (z. B. Druckertreiber, Anzeigetreiber, Festplattentreiber, Solid-State-Device-Treiber). In anderen Fällen können die Treiber 834 proprietäre oder spezielle Funktionen bereitstellen.
  • Die Dienstanbietercomputer oder -server können auch zusätzlichen Speicher 822 enthalten, der Wechselspeicher und/oder nicht entfernbaren Speicher enthalten kann. Der zusätzliche Speicher 822 kann Magnetspeicher, optische Platten, Solid-State-Disks, Flash-Speicher und/oder Bandspeicher enthalten. Der zusätzliche Speicher 822 kann im gleichen Gehäuse wie die Knoten 802a-802h oder in einem externen Gehäuse untergebracht sein. Der Speicher 818 und/oder der zusätzliche Speicher 822 und die zugehörigen computerlesbaren Medien können eine nichtflüchtige Speicherung von computerlesbaren Befehlen, Datenstrukturen, Programmmodulen und anderen Daten für die Computervorrichtungen bereitstellen. In einigen Implementierungen kann der Speicher 818 mehrere verschiedene Speichertypen enthalten, wie beispielsweise SRAM, DRAM oder ROM.
  • Der Speicher 818 und die zusätzliche Speicherung 822, sowohl wechselbar als auch nicht wechselbar, sind Beispiele für computerlesbare Speichermedien. So können beispielsweise computerlesbare Speichermedien flüchtige oder nichtflüchtige, entfernbare oder nicht entfernbare Medien enthalten, die in einem Verfahren oder einer Technologie zur Speicherung von Informationen implementiert sind, wobei die Informationen beispielsweise computerlesbare Befehle, Datenstrukturen, Programmodule oder andere Daten enthalten. Der Speicher 818 und der zusätzliche Speicher 822 sind Beispiele für Computerspeichermedien. Zusätzliche Arten von Computerspeichermedien, die in den Knoten 802a-802h vorhanden sein können, können unter anderem PRAM, SRAM, DRAM, RAM, ROM, EEPROM, Flash-Speicher oder andere Speichertechnologien, CD-ROM, DVD oder andere optische Speicher, Magnetkassetten, Magnetbänder, Magnetplattenspeicher oder andere magnetische Speichervorrichtungen, Solid-State-Laufwerke oder andere Medien enthalten, die zum Speichern der gewünschten Informationen verwendet werden können und auf die die Knoten 802a-802h zugreifen können. Computerlesbare Medien umfassen auch Kombinationen aus einem der oben genannten Medientypen, einschließlich mehrerer Einheiten eines Medientyps.
  • Alternativ oder zusätzlich können computerlesbare Kommunikationsmedien computerlesbare Befehle, Programmmodule oder andere innerhalb eines Datensignals übertragene Daten, wie beispielsweise eine Trägerwelle oder eine andere Übertragung, enthalten. Der hier verwendete Begriff „computerlesbare Speichermedien“ schließt jedoch keine computerlesbaren Kommunikationsmedien ein.
  • Die Knoten 802a-802h können auch (eine) E/A-Vorrichtung(en) 826 enthalten, wie beispielsweise eine Tastatur, eine Maus, einen Stift, eine Spracheingabevorrichtung, eine Touch-Eingabevorrichtung, eine Anzeige, Lautsprecher, einen Drucker und dergleichen. Die Knoten 802a-802h können auch einen oder mehrere Kommunikationskanäle 836 enthalten. Ein Kommunikationskanal 836 kann ein Medium bereitstellen, über das die verschiedenen Komponenten des/der Knoten 802a-802h kommunizieren können. Der oder die Kommunikationskanäle 836 können die Form eines Busses, eines Rings, einer Schaltanlage oder eines Netzwerks annehmen.
  • Die Knoten 802a-802h können auch eine Netzwerkvorrichtung 824 enthalten, die es den Knoten 802a-802h ermöglicht, mit einer gespeicherten Datenbank, einer anderen Computervorrichtung oder einem Server, Benutzerendvorrichtungen und/oder anderen Vorrichtungen im Netzwerk/in den Netzwerken 800 zu kommunizieren.
  • In einigen Implementierungen ist die Netzwerkvorrichtung 824 eine Peripherievorrichtung, wie beispielsweise eine PCI-basierte Vorrichtung. In diesen Implementierungen beinhaltet die Netzwerkvorrichtung 824 eine PCI-Schnittstelle zur Kommunikation mit einer Hostvorrichtung. Der Begriff „PCI“ oder „PCI-basiert“ kann verwendet werden, um jedes Protokoll in der PCI-Busprotokollfamilie zu beschreiben, einschließlich des ursprünglichen PCI-Standards, PCI-X, Accelerated Graphics Port (AGP) und PCI-Express(PCIe) oder andere Verbesserungs- oder abgeleitete Protokolle, die auf den hierin beschriebenen PCI-Protokollen basieren. Die PCI-basierten Protokolle sind Standardbusprotokolle für die Verbindung von Vorrichtungen, wie z. B. einer lokalen Peripherievorrichtung mit einer Hostvorrichtung. Ein Standardbusprotokoll ist ein Datenübertragungsprotokoll, für das eine Spezifikation definiert und von verschiedenen Anbietern übernommen wurde. Die Anbieter stellen sicher, dass konforme Vorrichtungen mit Computersystemen kompatibel sind, die das Busprotokoll implementieren, und umgekehrt. Wie hierin verwendet, enthalten PCI-basierte Vorrichtungen auch Vorrichtungen, die über Non-Volatile Memory Express (NVMe) kommunizieren. NVMe ist eine Vorrichtungsschnittstellenspezifikation für den Zugriff auf nichtflüchtige Speichermedien, die an ein Computersystem mit PCIe angeschlossen sind. So kann beispielsweise das Bus-Schnittstellenmodul NVMe implementieren, und die Netzwerkvorrichtung 824 kann über eine PCIe-Schnittstelle mit einem Computersystem verbunden werden.
  • Eine PCI-basierte Vorrichtung kann eine oder mehrere Funktionen enthalten. Eine „Funktion“ beschreibt Operationen, die von der Netzwerkvorrichtung 824 bereitgestellt werden können. Beispiele für Funktionen sind unter anderem Massenspeichersteuerungen, Netzwerksteuerungen, Displaysteuerungen, Speichersteuerungen, serielle Bus-Controller, Wireless-Controller, Ver- und Entschlüsselungs-Controller. In einigen Fällen kann eine PCI-basierte Vorrichtung mehr als eine Funktion enthalten. So kann beispielsweise eine PCI-basierte Vorrichtung einen Massenspeicher-Controller und einen Netzwerkadapter bereitstellen. Als weiteres Beispiel kann eine PCI-basierte Vorrichtung zwei Speichersteuerungen bereitstellen, um zwei verschiedene Speicherressourcen zu steuern. In einigen Implementierungen kann eine PCI-basierte Vorrichtung bis zu acht Funktionen haben.
  • In einigen Implementierungen kann die Netzwerkvorrichtung 824 eine Single-Root-E/A-Virtualisierung (SR-IOV) enthalten. SR-IOV ist eine erweiterte Funktion, die in eine PCI-basierte Vorrichtung integriert werden kann. SR-IOV ermöglicht es, dass eine physische Ressource (z. B. ein einzelner Netzwerk-Schnittstellencontroller) als mehrere Ressourcen (z. B. vierundsechzig Netzwerk-Schnittstellencontroller) erscheint. Somit kann eine PCI-basierte Vorrichtung, die eine bestimmte Funktionalität bereitstellt (z. B. eine Netzwerkschnittstellen-Steuerung), für eine Vorrichtung, die die PCI-basierte Vorrichtung verwendet, als mehrere Vorrichtungen mit derselben Funktionalität erscheinen. Die Funktionen einer SR-IOV-fähigen Speicheradaptervorrichtung können als physikalische Funktionen (PFs) oder virtuelle Funktionen (VFs) klassifiziert werden. Physische Funktionen sind vollwertige Funktionen der Vorrichtung, die entdeckt, verwaltet und manipuliert werden können. Physische Funktionen verfügen über Konfigurationsressourcen, mit denen die Speicheradaptervorrichtung konfiguriert oder gesteuert werden kann. Zu den physischen Funktionen gehören der gleiche Konfigurations-Adressraum und Speicher-Adressraum, den eine nicht-virtualisierte Vorrichtung haben würde. Eine physikalische Funktion kann mit einer Reihe von virtuellen Funktionen verbunden sein. Virtuelle Funktionen ähneln physischen Funktionen, sind aber leichte Funktionen, die im Allgemeinen keine Konfigurationsressourcen haben und im Allgemeinen durch die Konfiguration ihrer zugrunde liegenden physischen Funktionen gesteuert werden. Jede der physischen Funktionen und/oder virtuellen Funktionen kann einem entsprechenden Ausführungs-Thread (wie z. B. einer virtuellen Maschine) zugeordnet werden, der auf einer Hostvorrichtung läuft.
  • Ausführungsformen der Offenbarung können im Hinblick auf die folgenden Abschnitte beschrieben werden:
    • Abschnitt 1. Ein Verfahren zum Transponieren eines Tensors unter Verwendung von Verarbeitungselementarray-Operationen, wobei das Verfahren umfasst:
      • Abbilden eines Blocks von Datenelementen des Tensors auf eine Anzahl von Zeilenpartitionen eines Zustandspuffers einer integrierten Schaltung, wobei jede Zeilenpartition eine Anzahl von Spalten aufweist;
      • Laden der Datenelemente in ein Verarbeitungselementarray des integrierten Schaltkreises in entsprechenden Zeilen und Spalten von Verarbeitungselementen;
      • Durchführen einer Reihe von Multiplikationsoperationen mit einer Identitätsmatrix, so dass jede Spalte der Identitätsmatrix sequentiell mit jeder Spalte von Datenelementen in dem Verarbeitungselementarray multipliziert wird;
      • nach jeder Multiplikationsoperation Summieren der Multiplikationsprodukte für jede Spalte des Verarbeitungselementarrays, das eine Multiplikationsoperation mit einer Spalte der Identitätsmatrix durchführt;
      • Speichern der summierten Multiplikationsprodukte für jede Spalte des Verarbeitungselementarrays, das eine Multiplikationsoperation durchführt, in einer entsprechenden Spaltenpartition eines Ergebnispuffers, wobei der Ergebnispuffer eine gleiche Anzahl von Spaltenpartitionen wie Spalten in dem Verarbeitungselementarray aufweist, wobei die summierten Multiplikationsprodukte für nachfolgende Multiplikationsoperationen in nachfolgenden Zeilen für jede entsprechende Spaltenpartition gespeichert werden und wobei der Ergebnispuffer eine gleiche Anzahl von Zeilen wie das Verarbeitungselementarray aufweist; und
      • Laden der summierten Multiplikationsprodukte, die in den Spaltenpartitionen im Ergebnispuffer gespeichert sind, in eine entsprechende Anzahl von Zeilenpartitionen im Zustandspuffer.
    • Abschnitt 2. Das Verfahren nach Abschnitt 13, ferner umfassend das Zerlegen des Tensors in mehrere Blöcke von Datenelementen, wobei jeder Block von Datenelementen eine Größe hat, die einer Größe des Zustandspuffers entspricht.
    • Abschnitt 3. Das Verfahren nach einem der vorhergehenden Abschnitte, wobei jedes summierte Multiplikationsprodukt, das im Ergebnispuffer gespeichert ist, einem der Datenelemente entspricht, die in dem Verarbeitungselementarray gespeichert sind.
    • Abschnitt 4. Das Verfahren nach einem der vorhergehenden Abschnitte, wobei die Summierung der Multiplikationsprodukte in den Spaltenpartitionen des Ergebnispuffers den Block von Datenelementen des Tensors in denselben Zeilen- und Spaltenpositionen im Ergebnispuffer reproduziert, wie der Block von Datenelementen in das Verarbeitungselementarray geladen wurde.
    • Abschnitt 5. Ein Computerimplementiertes Verfahren, umfassend:
      • Empfangen eines Satzes von Operationen, die von einer Ausführungsmaschine ausgeführt werden sollen, durch einen Compiler;
      • Bestimmen, durch den Compiler, dass der Satz von Operationen die Durchführung einer Matrixtransponierungsoperation an einem Tensor umfasst;
      • Umwandeln der Matrixtransponierungsoperation in eine IdentitätsmatrixMultiplikationsoperation durch den Compiler; und
      • Erzeugen eines Satzes von Befehlen durch den Compiler, die den Tensor durch Laden von Datenelementen des Tensors aus einem Pufferspeicher der Ausführungsmaschine in ein systolisches Array der Ausführungsmaschine transponieren können, Durchführen einer Identitätsmultiplikation an den Datenelementen in dem systolischen Array, Speichern eines Ergebnisses der Identitätsmultiplikation in einem Ergebnispuffer der Ausführungsmaschine und Laden des Ergebnisses aus dem Ergebnispuffer in den Pufferspeicher.
    • Abschnitt 6. Das computerimplementierte Verfahren nach Abschnitt 5, wobei das Laden der Datenelemente des Tensors das Laden der Datenelemente in das systolische Array über einen ersten Datenbus als Reaktion auf einen ersten Befehl des Befehlssatzes umfasst.
    • Abschnitt 7. Das computerimplementierte Verfahren nach Abschnitt 5 oder 6, wobei das Durchführen der Identitätsmultiplikation das spaltenweise Übertragen von Spalten einer Identitätsmatrix aus dem Pufferspeicher in das systolische Array über einen zweiten Datenbus während jedes Verarbeitungszyklus des systolischen Arrays durch einen zweiten Befehl des Satzes von Befehlen umfasst.
    • Abschnitt 8. Das computerimplementierte Verfahren nach einem der Abschnitte 5-7, wobei der Ergebnispuffer einen Satz von Spaltenpartitionen umfasst und jede Spaltenpartition im Ergebnispuffer einer Spalte von Verarbeitungselementen in der systolischen Anordnung entspricht.
    • Abschnitt 9. Das computerimplementierte Verfahren nach einem der Abschnitte 5-8, wobei:
      • der Pufferspeicher einen Satz von Zeilenpartitionen umfasst, und
      • ein erster Befehl in dem Satz von Befehlen jede Spaltenpartition in dem Ergebnispuffer einer Zeilenpartition des Pufferspeichers zuordnet.
    • Abschnitt 10. Das computerimplementierte Verfahren nach einem der Abschnitte 5-9, wobei die Identitätsmultiplikation das Multiplizieren von Datenelementen des Tensors, die in jeder Spalte eines Satzes von Spalten von Verarbeitungselementen des systolischen Arrays gespeichert sind, mit jeder Spalte einer Identitätsmatrix umfasst, und wobei die Multiplikation einer Spalte von Datenelementen des Tensors mit einer Spalte der Identitätsmatrix höchstens einen Nicht-Null-Wert erzeugt.
    • Abschnitt 11. Das computerimplementierte Verfahren nach einem der Abschnitte 5-10, wobei das Speichern des Ergebnisses der Identitätsmultiplikation im Ergebnispuffer das Summieren der Multiplikationsprodukte von jeder Spaltenmultiplikation umfasst, die von dem systolischen Array durchgeführt wird, und wobei jedes summierte Multiplikationsprodukt einen Wert hat, der gleich einem Datenelement des Tensors ist, das einem Nicht-Null-Element in der Spalte der Identitätsmatrix entspricht.
    • Abschnitt 12. Das computerimplementierte Verfahren nach einem der Abschnitte 5-11, wobei das Speichern des Ergebnisses der Identitätsmultiplikation im Ergebnispuffer die Datenelemente des Tensors in denselben Zeilen- und Spaltenpositionen im Ergebnispuffer reproduziert, wie die Datenelemente in die Ausführungsmaschine geladen wurden.
    • Abschnitt 13. Das computerimplementierte Verfahren nach einem der Abschnitte 5-12, ferner umfassend:
      • vor dem Transponieren des Tensors, Zerlegen des Tensors in Blöcke von Datenelementen des Tensors mit Dimensionen, die die Dimensionen des Pufferspeichers nicht überschreiten, durch den vom Compiler erzeugten Satz von Befehlen; und
      • Speichern eines Blocks von Datenelementen im Pufferspeicher.
    • Abschnitt 14. Das computerimplementierte Verfahren nach einem der Abschnitte 5-13, wobei das computerimplementierte Verfahren ferner Folgendes umfasst:
      • Zerlegen der Blöcke von Datenelementen des im Pufferspeicher gespeicherten Tensors in Unterblöcke von Datenelementen mit Dimensionen, die die Dimensionen des systolischen Arrays nicht überschreiten, durch den vom Compiler erzeugten Satz von Befehlen; und
      • Laden eines Teilblocks von Datenelementen in das systolische Array.
    • Abschnitt 15. Das computerimplementierte Verfahren nach einem der Abschnitte 5-14, wobei:
      • der Pufferspeicher einen Satz von Zeilen umfasst,
      • jede Zeile des Pufferspeichers eine Partition umfasst,
      • die Datenelemente des Tensors im Unterblock auf die Partitionen im Pufferspeicher abgebildet werden, und
      • die in jeder Partition des Pufferspeichers gespeicherten Datenelemente in die entsprechenden Zeilen des systolischen Arrays geladen werden.
    • Abschnitt 16. Das computerimplementierte Verfahren nach einem der Abschnitte 5-15, wobei die Datenelemente des Tensors Zwischenergebnisse von Berechnungen sind, die von der Ausführungsmaschine durchgeführt werden.
    • Abschnitt 17. Ein nichtflüchtiges computerlesbares Medium, in dem Befehle gespeichert sind, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, einen Compiler auszuführen, der wiederum Operationen durchführt, umfassend:
      • Empfangen eines Satzes von Operationen, die von einer Ausführungsmaschine ausgeführt werden sollen;
      • Bestimmen, dass der Satz von Operationen die Durchführung einer Matrixtransponierungsoperation an einem Tensor umfasst;
      • Umwandeln der Matrixtransponierungsoperation in eine IdentitätsmatrixMultiplikationsoperation; und
      • Erzeugen eines Satzes von Befehlen, die den Tensor durch Laden von Datenelementen des Tensors aus einem Pufferspeicher der Ausführungsmaschine in ein systolisches Array der Ausführungsmaschine transponieren können, Durchführen einer Identitätsmultiplikation an den Datenelementen in dem systolischen Array, Speichern eines Ergebnisses der Identitätsmultiplikation in einem Ergebnispuffer der Ausführungsmaschine und Laden des Ergebnisses aus dem Ergebnispuffer in den Pufferspeicher.
    • Abschnitt 18. Das nichtflüchtige computerlesbare Medium nach der Abschnitt 17, wobei der Ergebnispuffer einen Satz von Spaltenpartitionen umfasst und jede Spaltenpartition im Ergebnispuffer einer Spalte von Verarbeitungselementen in der systolischen Anordnung entspricht. der Pufferspeicher einen Satz von Zeilenpartitionen umfasst, und ein erster Befehl in dem Satz von Befehlen jede Spaltenpartition in dem Ergebnispuffer einer Zeilenpartition des Pufferspeichers zuordnet.
    • Abschnitt 19. Das nichtflüchtige computerlesbare Medium nach Abschnitt 17 oder 18, das ferner Befehle enthält, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, den Compiler veranlassen, Operationen durchzuführen, umfassend:
      • vor dem Transponieren des Tensors, Zerlegen des Tensors in Blöcke von Datenelementen des Tensors mit Dimensionen, die die Dimensionen des Pufferspeichers nicht überschreiten, und
      • Speichern eines Blocks von Datenelementen im Pufferspeicher.
    • Abschnitt 20. Das nichtflüchtige computerlesbare Medium nach einem der Abschnitte 17-19, das ferner Befehle enthält, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, den Compiler veranlassen, Operationen durchzuführen, umfassend:
      • Zerlegen der Blöcke von Datenelementen des im Pufferspeicher gespeicherten Tensors in Unterblöcke von Datenelementen mit Dimensionen, die die Dimensionen des systolischen Arrays nicht überschreiten; und
      • Laden eines Teilblocks von Datenelementen in das systolische Array.
    • Abschnitt 21. Eine integrierte Schaltungsvorrichtung, die Folgendes umfasst:
      • einen Zustandspuffer;
      • ein mit dem Zustandspuffer gekoppeltes Verarbeitungselementarray; und
      • einen Ergebnispuffer, der mit dem Verarbeitungselementarray verbunden ist,
      • wobei die integrierte Schaltungsvorrichtung so konfiguriert ist, dass sie:
        • einen Block von Datenelementen des Tensors auf eine Anzahl von Zeilenpartitionen eines Zustandspuffers einer integrierten Schaltung empfängt, wobei jede Zeilenpartition eine Anzahl von Spalten aufweist;
        • die Datenelemente in ein Verarbeitungselementarray des integrierten Schaltkreises in entsprechenden Zeilen und Spalten von Verarbeitungselementen lädt;
        • eine Reihe von Multiplikationsoperationen mit einer Identitätsmatrix durchführt, so dass jede Spalte der Identitätsmatrix sequentiell mit jeder Spalte von Datenelementen in dem Verarbeitungselementarray multipliziert wird;
        • nach jeder Multiplikationsoperation die Multiplikationsprodukte für jede Spalte des Verarbeitungselementarrays, das eine Multiplikationsoperation mit einer Spalte der Identitätsmatrix durchführt, summiert;
        • die summierten Multiplikationsprodukte für jede Spalte des Verarbeitungselementarrays, das eine Multiplikationsoperation durchführt, in einer entsprechenden Spaltenpartition eines Ergebnispuffers speichert, wobei der Ergebnispuffer eine gleiche Anzahl von Spaltenpartitionen wie Spalten in dem Verarbeitungselementarray aufweist, wobei die summierten Multiplikationsprodukte für nachfolgende Multiplikationsoperationen in nachfolgenden Zeilen für jede entsprechende Spaltenpartition gespeichert werden und wobei der Ergebnispuffer eine gleiche Anzahl von Zeilen wie das Verarbeitungselementarray aufweist; und
        • die summierten Multiplikationsprodukte, die in den Spaltenpartitionen im Ergebnispuffer gespeichert sind, in eine entsprechende Anzahl von Zeilenpartitionen im Zustandspuffer lädt.
    • Abschnitt 22. Die integrierte Schaltungsvorrichtung nach Abschnitt 21, wobei jedes summierte Multiplikationsprodukt, das im Ergebnispuffer gespeichert ist, einem der Datenelemente entspricht, die in dem Verarbeitungselementarray gespeichert sind.
    • Abschnitt 23. Die integrierte Schaltungsvorrichtung nach Abschnitt 21 oder 22, wobei die Summierung der Multiplikationsprodukte in den Spaltenpartitionen des Ergebnispuffers den Block von Datenelementen des Tensors in denselben Zeilen- und Spaltenpositionen im Ergebnispuffer reproduziert, wie der Block von Datenelementen in das Verarbeitungselementarray geladen wurde.
  • Die hierin beschriebenen Module können Softwaremodule, Hardwaremodule oder eine geeignete Kombination davon sein. Wenn es sich bei den Modulen um Softwaremodule handelt, können die Module auf einem nichtflüchtigen, computerlesbaren Medium verkörpert und von einem Prozessor in einem der hierin beschriebenen Computersysteme verarbeitet werden. Es ist zu beachten, dass die beschriebenen Prozesse und Architekturen entweder in Echtzeit oder in einem asynchronen Modus vor jeder Benutzerinteraktion ausgeführt werden können. Die Module können auf die in den vorausgegangenen Figuren vorgeschlagene Weise konfiguriert werden, und/oder die hierin beschriebenen Funktionen können von einem oder mehreren Modulen bereitgestellt werden, die als separate Module existieren und/oder die hierin beschriebenen Modulfunktionen können auf mehrere Module verteilt werden.
  • Die Beschreibung und die Zeichnungen sind dementsprechend eher veranschaulichend als einschränkend zu verstehen. Es ist jedoch offensichtlich, dass verschiedene Modifikationen und Änderungen daran vorgenommen werden können, ohne vom breiteren Geist und Umfang der Offenbarung abzuweichen, wie sie in den Ansprüchen dargelegt sind.
  • Weitere Variationen liegen im Geist der vorliegenden Offenbarung. Während die offenbarten Techniken für verschiedene Modifikationen und alternative Konstruktionen anfällig sind, sind bestimmte veranschaulichte Beispiele davon in den Zeichnungen gezeigt und wurden oben im Detail beschrieben. Es versteht sich jedoch, dass nicht beabsichtigt ist, die Offenbarung auf die bestimmte Form oder die bestimmten offenbarten Formen zu beschränken, sondern dass im Gegenteil beabsichtigt ist, alle Modifikationen, alternativen Konstruktionen und Äquivalente abzudecken, die in den Geist und Umfang der Offenbarung fallen, wie in den beigefügten Ansprüchen definiert.
  • Die Verwendung der Begriffe „ein“ und „eine/r“ und „der/die/das“ und ähnlicher Verweise im Zusammenhang mit der Beschreibung der offenbarten Beispiele (insbesondere im Zusammenhang mit den folgenden Ansprüchen) soll so ausgelegt werden, dass sie sowohl den Singular als auch den Plural abdeckt, sofern hierin nichts anderes angegeben ist oder der Kontext dem eindeutig widerspricht. Die Begriffe „umfassen“, „haben“, „aufweisen“ und „enthalten“ sind als nicht einschränkende Begriffe zu verstehen (d. h. bedeuten „einschließlich, aber nicht darauf beschränkt“), sofern nicht anders angegeben. Der Begriff „verbunden“ ist so zu verstehen, dass etwas teilweise oder vollständig in etwas enthalten ist, daran angehängt oder zusammengefügt ist, selbst wenn etwas dazwischen liegt. Die Angabe von Wertebereichen hierin soll lediglich als Kurzform dienen, um sich einzeln auf jeden einzelnen Wert zu beziehen, der in den Bereich fällt, sofern hier nichts anderes angegeben ist, und jeder einzelne Wert wird in die Beschreibung aufgenommen, als ob er hier einzeln angegeben wäre. Alle hier beschriebenen Verfahren können in jeder geeigneten Reihenfolge ausgeführt werden, sofern hier nichts anderes angegeben ist oder der Kontext dem eindeutig widerspricht. Die Verwendung aller hierin bereitgestellten Beispiele oder beispielhaften Ausdrücke (z. B. „wie“) soll lediglich Beispiele der Offenbarung besser veranschaulichen und stellt keine Einschränkung des Umfangs der Offenbarung dar, sofern nicht anders beansprucht. Keine Sprache in der Beschreibung sollte so ausgelegt werden, dass sie ein nicht beanspruchtes Element anzeigt, das für die Ausübung der Offenbarung wesentlich ist.
  • Eine disjunktive Sprache wie der Ausdruck „mindestens eines von X, Y oder Z“ soll, sofern nicht ausdrücklich anders angegeben, in dem Kontext verstanden werden, der allgemein verwendet wird, um darzustellen, dass ein Artikel, Begriff usw. entweder X, Y oder Z sein kann oder eine beliebige Kombination davon (z. B. X, Y und / oder Z). Somit soll und sollte eine solche disjunktive Sprache nicht generell bedeuten, dass bei bestimmten Beispielen mindestens eines von X, mindestens eines von Y oder mindestens eines von Z vorhanden sein muss.
  • Verschiedene Beispiele der vorliegenden Offenbarung werden hierin beschrieben, einschließlich der den Erfindern bekannten besten Art zum Ausführen der Offenbarung. Variationen dieser Beispiele können für den Fachmann beim Lesen der vorstehenden Beschreibung offensichtlich werden. Die Erfinder erwarten von Fachleuten, dass sie solche Variationen nach Bedarf anwenden, und die Erfinder beabsichtigen, dass die Offenbarung anders als hier spezifisch beschrieben praktiziert wird. Dementsprechend umfasst diese Offenbarung alle Modifikationen und Äquivalente des in den beigefügten Ansprüchen angegebenen Artikels, soweit dies nach geltendem Recht zulässig ist. Darüber hinaus ist jede Kombination der oben beschriebenen Elemente in allen möglichen Variationen davon von der Offenbarung umfasst, es sei denn, es ist hierin anders angegeben oder durch den Kontext klar widersprüchlich.

Claims (15)

  1. Computerimplementiertes Verfahren, umfassend: Empfangen eines Satzes von Operationen, die von einer Ausführungsmaschine ausgeführt werden sollen, durch einen Compiler; Bestimmen, durch den Compiler, dass der Satz von Operationen die Durchführung einer Matrixtransponierungsoperation an einem Tensor umfasst; Umwandeln der Matrixtransponierungsoperation in eine Identitätsmatrix-Multiplikationsoperation durch den Compiler; und Erzeugen eines Satzes von Befehlen durch den Compiler, die den Tensor durch Laden von Datenelementen des Tensors aus einem Pufferspeicher der Ausführungsmaschine in ein systolisches Array der Ausführungsmaschine transponieren können, Durchführen einer Identitätsmultiplikation an den Datenelementen in dem systolischen Array, Speichern eines Ergebnisses der Identitätsmultiplikation in einem Ergebnispuffer der Ausführungsmaschine und Laden des Ergebnisses aus dem Ergebnispuffer in den Pufferspeicher.
  2. Computerimplementiertes Verfahren nach Anspruch 1, wobei das Laden der Datenelemente des Tensors das Laden der Datenelemente in das systolische Array über einen ersten Datenbus als Reaktion auf einen ersten Befehl des Befehlssatzes umfasst.
  3. Computerimplementiertes Verfahren nach einem der Ansprüche 1 oder 2, wobei das Durchführen der Identitätsmultiplikation das spaltenweise Übertragen von Spalten einer Identitätsmatrix aus dem Pufferspeicher in das systolische Array über einen zweiten Datenbus während jedes Verarbeitungszyklus des systolischen Arrays durch einen zweiten Befehl des Satzes von Befehlen umfasst.
  4. Computerimplementiertes Verfahren nach einem der Ansprüche 1-3, wobei der Ergebnispuffer einen Satz von Spaltenpartitionen umfasst und jede Spaltenpartition im Ergebnispuffer einer Spalte von Verarbeitungselementen in der systolischen Anordnung entspricht.
  5. Computerimplementiertes Verfahren nach einem der Ansprüche 1-4, wobei: der Pufferspeicher einen Satz von Zeilenpartitionen umfasst, und ein erster Befehl in dem Satz von Befehlen jede Spaltenpartition in dem Ergebnispuffer einer Zeilenpartition des Pufferspeichers zuordnet.
  6. Computerimplementiertes Verfahren nach einem der Ansprüche 1-5, wobei die Identitätsmultiplikation das Multiplizieren von Datenelementen des Tensors, die in jeder Spalte eines Satzes von Spalten von Verarbeitungselementen des systolischen Arrays gespeichert sind, mit jeder Spalte einer Identitätsmatrix umfasst, und wobei die Multiplikation einer Spalte von Datenelementen des Tensors mit einer Spalte der Identitätsmatrix höchstens einen Nicht-Null-Wert erzeugt.
  7. Computerimplementiertes Verfahren nach einem der Ansprüche 1-6, wobei das Speichern des Ergebnisses der Identitätsmultiplikation in dem Ergebnispuffer das Summieren von Multiplikationsprodukten von jeder Spaltenmultiplikation, die von dem systolischen Array durchgeführt wird, umfasst, und wobei jedes summierte Multiplikationsprodukt einen Wert hat, der gleich einem Datenelement des Tensors ist, das einem Nicht-Null-Element in der Spalte der Identitätsmatrix entspricht.
  8. Computerimplementiertes Verfahren nach einem der Ansprüche 1-7, wobei das Speichern des Ergebnisses der Identitätsmultiplikation im Ergebnispuffer die Datenelemente des Tensors in denselben Zeilen- und Spaltenpositionen im Ergebnispuffer reproduziert, wie die Datenelemente in die Ausführungsmaschine geladen wurden.
  9. Computerimplementiertes Verfahren nach einem der Ansprüche 1-8, ferner umfassend: vor dem Transponieren des Tensors, Zerlegen des Tensors in Blöcke von Datenelementen des Tensors mit Dimensionen, die die Dimensionen des Pufferspeichers nicht überschreiten, durch den vom Compiler erzeugten Satz von Befehlen; und Speichern eines Blocks von Datenelementen im Pufferspeicher.
  10. Computerimplementiertes Verfahren nach einem der Ansprüche 1-9, wobei das computerimplementierte Verfahren ferner Folgendes umfasst: Zerlegen der Blöcke von Datenelementen des im Pufferspeicher gespeicherten Tensors in Unterblöcke von Datenelementen mit Dimensionen, die die Dimensionen des systolischen Arrays nicht überschreiten, durch den vom Compiler erzeugten Satz von Befehlen; und Laden eines Teilblocks von Datenelementen in das systolische Array.
  11. Computerimplementiertes Verfahren nach einem der Ansprüche 1-10, wobei: der Pufferspeicher einen Satz von Zeilen umfasst, jede Zeile des Pufferspeichers eine Partition umfasst, die Datenelemente des Tensors im Unterblock auf die Partitionen im Pufferspeicher abgebildet werden, und die in jeder Partition des Pufferspeichers gespeicherten Datenelemente in die entsprechenden Zeilen des systolischen Arrays geladen werden.
  12. Computerimplementiertes Verfahren nach einem der Ansprüche 1-11, wobei die Datenelemente des Tensors Zwischenergebnisse von Berechnungen sind, die von der Ausführungsmaschine durchgeführt werden.
  13. Integrierte Schaltungsvorrichtung, die Folgendes umfasst: einen Zustandspuffer; ein mit dem Zustandspuffer gekoppeltes Verarbeitungselementarray; und einen Ergebnispuffer, der mit dem Verarbeitungselementarray verbunden ist, wobei die integrierte Schaltungsvorrichtung so konfiguriert ist, dass sie: einen Block von Datenelementen des Tensors auf eine Anzahl von Zeilenpartitionen eines Zustandspuffers einer integrierten Schaltung empfängt, wobei jede Zeilenpartition eine Anzahl von Spalten aufweist; die Datenelemente in ein Verarbeitungselementarray des integrierten Schaltkreises in entsprechenden Zeilen und Spalten von Verarbeitungselementen lädt; eine Reihe von Multiplikationsoperationen mit einer Identitätsmatrix durchführt, so dass jede Spalte der Identitätsmatrix sequentiell mit jeder Spalte von Datenelementen in dem Verarbeitungselementarray multipliziert wird; nach jeder Multiplikationsoperation die Multiplikationsprodukte für jede Spalte des Verarbeitungselementarrays, das eine Multiplikationsoperation mit einer Spalte der Identitätsmatrix durchführt, summiert; die summierten Multiplikationsprodukte für jede Spalte des Verarbeitungselementarrays, das eine Multiplikationsoperation durchführt, in einer entsprechenden Spaltenpartition eines Ergebnispuffers speichert, wobei der Ergebnispuffer eine gleiche Anzahl von Spaltenpartitionen wie Spalten in dem Verarbeitungselementarray aufweist, wobei die summierten Multiplikationsprodukte für nachfolgende Multiplikationsoperationen in nachfolgenden Zeilen für jede entsprechende Spaltenpartition gespeichert werden und wobei der Ergebnispuffer eine gleiche Anzahl von Zeilen wie das Verarbeitungselementarray aufweist; und die summierten Multiplikationsprodukte, die in den Spaltenpartitionen im Ergebnispuffer gespeichert sind, in eine entsprechende Anzahl von Zeilenpartitionen im Zustandspuffer lädt.
  14. Integrierte Schaltungsvorrichtung nach Anspruch 13, wobei jedes summierte Multiplikationsprodukt, das im Ergebnispuffer gespeichert ist, einem der Datenelemente entspricht, die in dem Verarbeitungselementarray gespeichert sind.
  15. Integrierte Schaltungsvorrichtung nach Anspruch 13 oder 14, wobei die Summierung der Multiplikationsprodukte in den Spaltenpartitionen des Ergebnispuffers den Block von Datenelementen des Tensors in denselben Zeilen- und Spaltenpositionen im Ergebnispuffer reproduziert, wie der Block von Datenelementen in das Verarbeitungselementarray geladen wurde.
DE112020003066.0T 2019-06-27 2020-06-25 Transponierungsoperationen mit verarbeitungselementarray Pending DE112020003066T5 (de)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/455,201 2019-06-27
US16/455,201 US10884707B1 (en) 2019-06-27 2019-06-27 Transpose operations using processing element array
PCT/US2020/039670 WO2020264197A1 (en) 2019-06-27 2020-06-25 Transpose operations using processing element array

Publications (1)

Publication Number Publication Date
DE112020003066T5 true DE112020003066T5 (de) 2022-04-07

Family

ID=71728882

Family Applications (1)

Application Number Title Priority Date Filing Date
DE112020003066.0T Pending DE112020003066T5 (de) 2019-06-27 2020-06-25 Transponierungsoperationen mit verarbeitungselementarray

Country Status (4)

Country Link
US (2) US10884707B1 (de)
CN (1) CN114008586A (de)
DE (1) DE112020003066T5 (de)
WO (1) WO2020264197A1 (de)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20190392296A1 (en) * 2019-06-28 2019-12-26 John Brady Hardware agnostic deep neural network compiler
US11537864B2 (en) * 2019-11-26 2022-12-27 Apple Inc. Reduction mode of planar engine in neural processor
US11928443B2 (en) * 2019-12-19 2024-03-12 Intel Corporation Techniques for transposing a matrix using a memory block
US11836549B2 (en) * 2020-10-15 2023-12-05 Advanced Micro Devices, Inc. Fast block-based parallel message passing interface transpose
US20220342666A1 (en) * 2021-04-26 2022-10-27 Nvidia Corporation Acceleration of operations
KR20230061180A (ko) * 2021-10-28 2023-05-08 주식회사 사피온코리아 컴퓨팅 시스템 및 이를 위한 전치 방법
KR20230063519A (ko) 2021-11-02 2023-05-09 삼성전자주식회사 뉴럴 네트워크 연산 장치 및 방법
GB2620473A (en) * 2022-04-22 2024-01-10 Advanced Risc Mach Ltd Method for permuting dimensions of a multi-dimensional tensor
CN115759294B (zh) * 2022-11-25 2023-10-24 北京百度网讯科技有限公司 数据处理方法、装置、电子设备及存储介质

Family Cites Families (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4760543A (en) * 1986-11-10 1988-07-26 American Telephone And Telegraph Company, At&T Bell Laboratories Orthogonal transform processor
US5321639A (en) * 1992-03-02 1994-06-14 Regents Of The University Of California Dual-scale topology optoelectronic matrix algebraic processing system
JPH07271744A (ja) * 1994-03-31 1995-10-20 Matsushita Electric Ind Co Ltd 並列計算機
US6167502A (en) * 1997-10-10 2000-12-26 Billions Of Operations Per Second, Inc. Method and apparatus for manifold array processing
US6675187B1 (en) * 1999-06-10 2004-01-06 Agere Systems Inc. Pipelined linear array of processor elements for performing matrix computations
US6438747B1 (en) * 1999-08-20 2002-08-20 Hewlett-Packard Company Programmatic iteration scheduling for parallel processors
US6754687B1 (en) * 1999-11-12 2004-06-22 Pts Corporation Methods and apparatus for efficient cosine transform implementations
US7596678B2 (en) * 2003-04-23 2009-09-29 Micron Technology, Inc. Method of shifting data along diagonals in a group of processing elements to transpose the data
US8443169B2 (en) * 2005-03-28 2013-05-14 Gerald George Pechanek Interconnection network connecting operation-configurable nodes according to one or more levels of adjacency in multiple dimensions of communication in a multi-processor and a neural processor
US8229688B2 (en) * 2007-06-18 2012-07-24 Commonwealth Scientific And Industrial Research Organisation Method and apparatus for detection using magnetic gradient tensor
US7844630B2 (en) * 2007-09-01 2010-11-30 International Business Machines Corporation Method and structure for fast in-place transformation of standard full and packed matrix data formats
US8327114B1 (en) * 2008-07-07 2012-12-04 Ovics Matrix processor proxy systems and methods
US8473540B1 (en) * 2009-09-01 2013-06-25 Xilinx, Inc. Decoder and process therefor
US8583896B2 (en) * 2009-11-13 2013-11-12 Nec Laboratories America, Inc. Massively parallel processing core with plural chains of processing elements and respective smart memory storing select data received from each chain
US8898432B2 (en) * 2011-10-25 2014-11-25 Geo Semiconductor, Inc. Folded SIMD array organized in groups (PEGs) of respective array segments, control signal distribution logic, and local memory
US9471377B2 (en) * 2013-11-13 2016-10-18 Reservoir Labs, Inc. Systems and methods for parallelizing and optimizing sparse tensor computations
US9432082B2 (en) * 2014-07-17 2016-08-30 Kandou Labs, S.A. Bus reversable orthogonal differential vector signaling codes
US10824693B2 (en) * 2015-12-10 2020-11-03 Reservoir Labs, Inc. Systems and methods for selective expansive recursive tensor analysis
US11170294B2 (en) * 2016-01-07 2021-11-09 Intel Corporation Hardware accelerated machine learning
US10489479B1 (en) * 2016-09-12 2019-11-26 Habana Labs Ltd. Matrix multiplication engine
US10909447B2 (en) 2017-03-09 2021-02-02 Google Llc Transposing neural network matrices in hardware
US10838910B2 (en) * 2017-04-27 2020-11-17 Falcon Computing Systems and methods for systolic array design from a high-level program
US11036827B1 (en) * 2017-10-17 2021-06-15 Xilinx, Inc. Software-defined buffer/transposer for general matrix multiplication in a programmable IC
US11544619B2 (en) * 2018-01-02 2023-01-03 Basehealth, Inc. Dimension reduction of claims data

Also Published As

Publication number Publication date
US10884707B1 (en) 2021-01-05
CN114008586A (zh) 2022-02-01
US20200409664A1 (en) 2020-12-31
WO2020264197A1 (en) 2020-12-30
US20210096823A1 (en) 2021-04-01
US11347480B2 (en) 2022-05-31

Similar Documents

Publication Publication Date Title
DE112020003066T5 (de) Transponierungsoperationen mit verarbeitungselementarray
DE112020003128T5 (de) Dilatierte faltung mit systolischem array
DE112020004625T5 (de) Transponierte faltung mit systolischem array
DE102020127705A1 (de) Techniken für einen effizienten fabric-attached-speicher
DE102019133028A1 (de) Für neuronale netzwerke geeignetes effizientes matrixformat
DE102020131050A1 (de) Konfigurierbare prozessorelementarrays zum implementieren von konvolutionellen neuronalen netzwerken
DE102021107050A1 (de) Gradientenkomprimierung für verteiltes training
DE112020005789T5 (de) Hierarchische partitionierung von operatoren
DE102020104637A1 (de) Techniken zur effizienten partitionierung von speicher
DE102019103310A1 (de) Schätzer for einen optimalen betriebspunkt für hardware, die unter einer beschränkung der gemeinsam genutzten leistung/wärme arbeitet
DE112013004770T5 (de) Lese- und -Schreibmaskenaktualisierungsbefehl zur Vektorisierung rekursiver Berechnungen über unabhängige Daten
DE102019102009A1 (de) Reduzierung des rauschens während des renderings durch parallele path-space-filterung unter verwendung von hashing
DE102021102589A1 (de) Berechnungsgraph-optimierung
DE102013020968A1 (de) Technik zum Zugreifen auf einen inhaltsadressierbaren Speicher
DE112018005205T5 (de) Komprimierung von vollständig verbundenen / wiederkehrenden Schichten von einem oder mehreren tiefen Netzen durch Durchsetzen von räumlicher Lokalität für Gewichtsmatrizen und erwirken von Frequenzkomprimierung
DE102021107509A1 (de) Multi-modell-trainingspipeline in verteilten systemen
DE102021107586A1 (de) Spekulatives training unter verwendung der aktualisierung partieller gradienten
DE202017007434U1 (de) Multicast-Netzwerk und Speichertransferoptimierungen zur Hardwarebeschleunigung neuronaler Netzwerke
DE102017213160B4 (de) Kompilierung für knotenvorrichtungs-GPU-basierte Parallelverarbeitung
CN111465943A (zh) 芯片上计算网络
DE112020003105T5 (de) Schicht für schicht-debugging von neuronalen netzwerken
DE102013020485A1 (de) Technik zur Ausführung von Speicherzugriffsoperationen über eine Textur-Hardware
DE112020003129T5 (de) Dynamisches laden von code für mehrfachausführungen auf einem sequenzialprozessor
DE102010044529A1 (de) Autonome Subsystem-Architektur
DE102020132377A1 (de) Vorrichtung und Verfahren zur Drosselung einer Raytracing-Pipeline

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R082 Change of representative

Representative=s name: ZACCO LEGAL RECHTSANWALTSGESELLSCHAFT MBH, DE