DE102017117381A1 - Beschleuniger für dünnbesetzte faltende neuronale Netze - Google Patents

Beschleuniger für dünnbesetzte faltende neuronale Netze Download PDF

Info

Publication number
DE102017117381A1
DE102017117381A1 DE102017117381.1A DE102017117381A DE102017117381A1 DE 102017117381 A1 DE102017117381 A1 DE 102017117381A1 DE 102017117381 A DE102017117381 A DE 102017117381A DE 102017117381 A1 DE102017117381 A1 DE 102017117381A1
Authority
DE
Germany
Prior art keywords
vector
zero
values
positions
input
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
DE102017117381.1A
Other languages
English (en)
Inventor
William J. Dally
Angshuman Parashar
Joel Springer Emer
Stephen William Keckler
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.)
Nvidia Corp
Original Assignee
Nvidia Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US15/458,799 external-priority patent/US10528864B2/en
Application filed by Nvidia Corp filed Critical Nvidia Corp
Publication of DE102017117381A1 publication Critical patent/DE102017117381A1/de
Pending legal-status Critical Current

Links

Images

Classifications

    • 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/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks

Landscapes

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

Abstract

Ein Verfahren, ein Computerprogrammprodukt und ein System führen Berechnungen unter Verwendung eines Beschleunigers für dünnbesetzte faltende neuronale Netze aus. Ein erster Vektor, welcher nur Gewichtswerte ungleich Null und erste zugehörige Positionen der Gewichtswerte ungleich Null in einem dreidimensionalen Raum umfasst, wird erfasst. Ein zweiter Vektor, welcher nur Eingabeaktivierungswerte ungleich Null und zweite zugehörige Positionen der Eingabeaktivierungswerte ungleich Null in einem zweidimensionalen Raum umfasst, wird erfasst. Die Gewichtswerte ungleich Null werden mit den Eingabeaktivierungswerte ungleich Null in einer Multipliziereranordnung multipliziert, um einen dritten Vektor von Produkten zu erzeugen. Die ersten zugehörigen Positionen werden mit den zweiten zugehörigen Positionen kombiniert, um einen vierten Vektor von Positionen zu erzeugen, wobei jede Position in dem vierten Vektor einem entsprechenden Produkt in dem dritten Vektor zugeordnet ist. Die Produkte in dem dritten Vektor werden zu Addierern in einer Akkumulatoranordnung abhängig von der Position, welche jedem der Produkte zugeordnet ist, übertragen.

Description

  • Beanspruchte Priorität
  • Diese Anmeldung beruft sich auf die vorläufige US-Anmeldung mit der Nr. 62/373,919 (Kanzleiaktenzeichen NVIDP1137+/16-SC-0139-US01) mit dem Titel ”Sparse Convolutional Neural Network Accelerator”, eingereicht am 11. August 2016, deren gesamter Inhalt hierin durch Verweis aufgenommen wird.
  • Bereich der Erfindung
  • Die vorliegende Erfindung bezieht sich auf faltende neuronale Netze, und insbesondere auf einen Beschleuniger für faltende neuronale Netze.
  • Hintergrund
  • Durch die Verfügbarkeit von Massendaten und die rechnergestützte Verarbeitung dieser Daten hat sich das Tiefenlernen („Deep Learning”) in jüngster Zeit zu einem kritischen Werkzeug entwickelt, um komplexe Probleme in einer Vielzahl von Bereichen zu lösen, darunter Bilderkennung, Sprachverarbeitung, Verarbeitung natürlicher Sprache, Sprachübersetzung und autonome Fahrzeuge. Faltende neuronale Netze („Convolutional Neural Networks” (CNNs)) sind für viele dieser Bereiche zum populärsten algorithmischen Ansatz für Tiefenlernen geworden. Hohe Leistung und extreme Energieeffizienz sind entscheidend für den Einsatz von CNNs in einer Vielzahl von Situationen, insbesondere bei mobilen Plattformen, wie autonomen Fahrzeugen, Kameras und elektronischen Assistenten.
  • Der Einsatz von CNNs lässt sich in zwei Aufgaben zerlegen: (1) Training – bei dem die Parameter eines neuronalen Netzes durch die Beobachtung zahlreicher Trainingsbeispiele erlernt werden, und (2) Klassifikation – bei der ein trainiertes neuronales Netz im Feld eingesetzt wird und die beobachteten Daten klassifiziert werden. Heute wird das Training häufig an Grafikprozessoren (GPUs) oder Farmen von GPUs durchgeführt, während die Klassifizierung abhängig von der Anwendung ist und zentrale Prozessoreinheiten (CPUs), GPUs, feldprogrammierbare Gate-Arrays (FPGAs) oder applikationsspezifische integrierte Schaltkreise (ASICs) einsetzen kann.
  • Während des Trainingsprozesses erstellt ein Experte für Tiefenlernen typischerweise das Netzwerk, ermittelt die Anzahl der Schichten im neuronalen Netz, die von jeder Schicht ausgeführte Operation und die Verbindung zwischen den Schichten. Viele Schichten haben Parameter, typischerweise Filtergewichte, die die genaue Berechnung, welche durch die Schicht ausgeführt wird, bestimmen. Ziel des Trainingsprozesses ist es, die Filtergewichte zu erlernen, meist über eine stochastische Gradienten abhängige Exkursion durch den Raum der Gewichte. Der Trainingsprozess verwendet in der Regel eine vorwärts propagierende Berechnung für jedes Trainingsbeispiel, eine Messung des Fehlers zwischen der berechneten und der gewünschten Ausgabe und anschließend eine Rückpropagation durch das Netz, um die Gewichte zu aktualisieren. Inferenz hat Ähnlichkeiten, beinhaltet aber nur die vorwärts propagierende Berechnung. Dennoch können die Berechnungsanforderungen für Inferenz jedoch sehr hoch sein, insbesondere bei der Herausbildung von tieferen Netzen (Hunderte von Schichten) und größeren Eingabesätzen, wie z. B. High-Definition-Video. Darüber hinaus ist die Energieeffizienz dieser Berechnung wichtig, insbesondere für mobile Plattformen, wie autonome Fahrzeuge, Kameras und elektronische persönliche Assistenten. Die Rechenanforderungen und der Energieverbrauch eines neuronalen Netzes für das maschinelle Lernen stellen mobile Plattformen vor Herausforderungen. Daher besteht ein Bedarf, diese und/oder andere Probleme beim Stand der Technik zu lösen.
  • Zusammenfassung
  • Ein Verfahren, ein Computerprogrammprodukt und ein System führen Berechnungen mit einem Beschleuniger für dünnbesetzte faltende neuronale Netze durch. Ein erster Vektor, der nur Gewichtswerte ungleich Null und erste zugeordnete Positionen der Gewichtswerte ungleich Null innerhalb eines dreidimensionalen Raums umfasst, wird empfangen. Ein zweiter Vektor, der nur Eingabeaktivierungswerte ungleich Null und zweite zugeordnete Positionen der Eingabeaktivierungswerte ungleich Null innerhalb eines zweidimensionalen Raums enthält, wird erfasst. Die Gewichtswerte ungleich Null werden mit den Aktivierungswerten ungleich Null innerhalb einer Multiplikationsanordnung multipliziert, um einen dritten Vektor von Produkten zu erzeugen. Die ersten zugeordneten Positionen werden mit den zweiten zugeordneten Positionen kombiniert, um einen vierten Vektor von Positionen zu erzeugen, wobei jede Position im vierten Vektor mit einem entsprechenden Produkt in dem dritten Vektor verknüpft ist. Der dritte Vektor wird an eine Akkumulatoranordnung übertragen, wobei jedes der Produkte im dritten Vektor an einen Addierer in der Akkumulatoranordnung übertragen wird, der so konfiguriert ist, dass er an der dem Produkt zugeordneten Position einen Ausgabeaktivierungswert erzeugt.
  • Kurze Beschreibung der Zeichnungen
  • 1 zeigt ein Flussdiagramm eines Verfahrens zur Durchführung von Berechnungen mit Hilfe eines Beschleunigers für dünnbesetzte faltende neuronale Netze (SCNN) in Übereinstimmung mit einer Ausführungsform;
  • 2A zeigt ein Blockschaltbild eines SCNN-Beschleunigers nach einer Ausführungsform;
  • 2B zeigt ein konzeptuelles Diagramm der Organisation von Eingabeaktivierungen und Filtergewichten für die Verarbeitung durch den in 2A dargestellten SCNN-Beschleuniger bei einer Ausführungsform;
  • 2C zeigt ein Blockschaltbild eines Verarbeitungselements gemäß einer Ausführungsform;
  • 3A zeigt ein Blockdiagramm eines anderen Verarbeitungselements gemäß einer Ausführungsform;
  • 3B zeigt zwei 3 × 3-Gewichtskerne und Positionen gemäß einer Ausführungsform;
  • 3C zeigt ein einstufiges F*I-Zuteilungskoppelfeld gemäß einer Ausführungsform;
  • 3D zeigt eine Akkumulatoreinheit gemäß einer Ausführungsform;
  • 3E zeigt ein zweistufiges F*I-Zuteilungskoppelfeld gemäß einer Ausführungsform;
  • 4A zeigt ein Flussdiagramm eines Verfahrens zur Komprimierung von Gewichts- und Aktivierungswerten gemäß einer Ausführungsform;
  • 4B zeigt eine Kachel mit Gewichtswerten für zwei Ausgabekanäle gemäß einer Ausführungsform;
  • 4C zeigt ein Codierungsschema für Gewichte und Eingabeaktivierungen (IA) gemäß einer Ausführungsform;
  • 4D zeigt die Gewichtswerte für vier 3 × 3-Faltungskerne gemäß einer Ausführungsform;
  • 4E zeigt eine Codierung der Positionen für die Gewichtswerte in den vier in 4D gezeigten 3 × 3-Faltungskernen gemäß einer Ausführungsform;
  • 4F zeigt ein Blockdiagramm zur Bestimmung der Gewichtskoordinaten (r, s) gemäß einer Ausführungsform;
  • 4G zeigt ein Blockdiagramm zur Bestimmung der Eingabeaktivierungskoordinaten (x, y) gemäß einer Ausführungsform;
  • 5A zeigt ein nichtlineares Codierungsschema für die Eingabeaktivierungsnullanzahlwerte gemäß einer Ausführungsform;
  • 5B zeigt ein weiteres Codierungsschema für die Eingabeaktivierungsnullanzahlwerte gemäß einer Ausführungsform;
  • 5C zeigt ein weiteres Codierungsschema für die Eingabeaktivierungsnullzahlwerte gemäß einer Ausführungsform;
  • 5D zeigt ein weiteres Codierungsschema für Gewichtsnullanzahlwerte gemäß einer Ausführungsform;
  • 5E zeigt ein weiteres Codierungsschema für Gewichtsnullanzahlwerte gemäß einer Ausführungsform; und
  • 6 zeigt ein beispielhaftes System, in dem die unterschiedlichen Architekturen bzw. Funktionalitäten der verschiedenen vorhergehenden Ausführungsformen umgesetzt sein könnten.
  • Detaillierte Beschreibung
  • Neuronale Netze weisen in der Regel eine signifikante Redundanz auf und können während des Trainings drastisch reduziert werden, ohne die Genauigkeit des neuronalen Netzes wesentlich zu beeinträchtigen. Die Anzahl der Gewichte, die eliminiert werden können, variiert stark zwischen den Schichten des neuronalen Netzes, liegt aber in der Regel zwischen 20% und 80%. Die Eliminierung von Gewichten führt zu einem neuronalen Netz mit einer beträchtlichen Anzahl von Nullwerten, was die rechnerischen Anforderungen für eine Schlussfolgerung bzw. Inferenz verringern kann.
  • Die Inferenz-Berechnung bietet auch eine weitere Optimierungsmöglichkeit. Insbesondere viele neuronale Netze nutzen die Funktion der gleichgerichteten Lineareinheit („Rectified Linear Unit” (ReLU)), die alle negativen Aktivierungswerte gemäß einem nichtlinearen Operator auf Null setzt. Die Aktivierungen sind die Ausgabewerte einer einzelnen Schicht, die als Eingaben an die nächste Schicht übergeben werden. Bei typischen Datensätzen werden 50–70% der Aktivierungen auf Null gesetzt. Da die Multiplikation von Gewichten und Aktivierungen die Schlüsselberechnung für die Inferenz ist, kann die Kombination von Aktivierungen, die Null sind, und von Gewichten, die Null sind, den Rechenaufwand um mehr als eine Größenordnung reduzieren. Eine hier beschriebene dünnbesetzte CNN(SCNN)-Beschleunigerarchitektur nutzt die Seltenheit von Gewichten und/oder Aktivierungen, um den Energieverbrauch zu reduzieren und den Verarbeitungsdurchsatz zu verbessern. Die SCNN-Beschleunigerarchitektur koppelt einen algorithmischen Datenfluss, der alle Multiplikationen mit einem Null-Operanden eliminiert, während eine komprimierte Darstellung von Gewichten und Aktivierungen durch nahezu die gesamte Berechnung hindurch verwendet wird. In einer Ausführungsform wird jedes Gewicht und jeder Aktivierungswert, das bzw. der nicht Null ist, durch ein (Wert-Positions-)Paar repräsentiert.
  • Weitere Vorteile ergeben sich durch eine komprimierte oder kompakte Codierung für spärlich verteilte Gewichte und/oder Aktivierungen, welche mehrere Nullen aufweisen, wodurch mehr Gewichts- und/oder Aktivierungswerte in einen On-Chip-RAM-Speicher („Random Access Memory”) passen und die Anzahl der energiekostenintensiven DRAM-Zugriffe („Dynamic Random Access Memory”), um Aktivierungen und Gewichte zu lesen, reduziert werden kann. Außerdem kann die Übertragung der kompakten Codierung die Anzahl von Übertragungen auf Bussen reduzieren, wobei der Energieverbrauch weiter reduziert wird. Schließlich werden den Multiplizierern als Operanden nur die Nicht-Null-Elemente bzw. Elemente ungleich Null von Gewichten und Eingabeaktivierungen bereitgestellt, so dass sichergestellt ist, dass jeder Multiplizierer innerhalb eines Verarbeitungselements ((„Processing Element”) PE) ein Produkt erzeugt, das einen Ausgabeaktivierungswert beeinflusst. Im Zusammenhang mit der folgenden Beschreibung bezieht sich die Aktivierung auf eine Eingabe- und/oder Ausgabeaktivierung. Im Zusammenhang mit der folgenden Beschreibung sind die Gewichts- und Aktivierungswerte Multibit-Werte, die Null, positive oder negative Werte darstellen. Im Zusammenhang mit der folgenden Beschreibung sind die Positionen Koordinaten in einem N-dimensionalen Raum.
  • 1 zeigt ein Flussdiagramm eines Verfahrens 100 zur Durchführung von Berechnungen mit einem SCNN-Beschleuniger nach einer Ausführungsform. Obwohl das Verfahren 100 im Kontext eines Verarbeitungselements innerhalb eines SCNN-Beschleunigers beschrieben wird, kann das Verfahren 100 auch von einem Programm, einer benutzerdefinierten Schaltung oder einer Kombination aus benutzerdefinierter Schaltung und einem Programm ausgeführt werden. Darüber hinaus wird der Fachmann verstehen, dass jedes System, das das Verfahren 100 ausführt, zum Umfang und Geist der erfindungsgemäßen Ausführungsformen gehört.
  • Bei Schritt 105 wird ein erster Vektor empfangen, der nur Gewichtswerte ungleich Null und die ersten zugehörigen Positionen der Gewichtswerte ungleich Null innerhalb eines dreidimensionalen (3D-)Raums umfasst. Bei einer Ausführungsform wird der erste Vektor aus einem Speicher empfangen. Bei einer Ausführungsform wird der erste Vektor von einem Verarbeitungselement (PE) innerhalb eines SCNN-Beschleunigers empfangen, wie z. B. bei dem in Bild 2A beschriebenen SCNN-Beschleuniger 200.
  • Bei Schritt 110 wird ein zweiter Vektor empfangen, der nur Eingabeaktivierungswerte ungleich Null und zweite zugeordnete Positionen der Eingabeaktivierungswerte ungleich Null innerhalb eines zweidimensionalen (2D-)Raums umfasst. Bei einer Ausgestaltung wird der zweite Vektor aus einem Speicher empfangen. Bei einer Ausführungsform wird der zweite Vektor von einem PE innerhalb eines SCNN-Beschleunigers empfangen, wie z. B. des in beschriebenen SCNN-Beschleunigers 200. Bei einer Ausführungsform wird der zweite Vektor durch den SCNN-Beschleuniger 200 während der Verarbeitung einer vorhergehenden Schicht eines neuronalen Netzes erzeugt.
  • Bei Schritt 115 wird jeder der Gewichtswerte ungleich Null mit jedem der Aktivierungswerte ungleich Null innerhalb einer Multipliziereranordnung multipliziert, um einen dritten Vektor von Produkten zu erzeugen. Im Schritt 120 werden die ersten zugeordneten Positionen mit den zweiten zugehörigen Positionen kombiniert, um einen vierten Vektor von Positionen zu erzeugen, wobei jede Position im vierten Vektor mit einem entsprechenden Produkt im dritten Vektor verknüpft ist. Bei einer Ausführungsform umfasst das Kombinieren das Durchführen einer Vektoraddition, um Koordinaten in den ersten zugeordneten Positionen mit den zweiten zugeordneten Positionen zu summieren, um den vierten Vektor von Positionen zu erzeugen, wobei jede Position in dem vierten Vektor einem entsprechenden Produkt im dritten Vektor zugeordnet ist.
  • Bei Schritt 125 wird der dritte Vektor zu einer Akkumulatoranordnung übertragen, wobei jedes der Produkte im dritten Vektor zu einem Addierer in der Akkumulatoranordnung übertragen wird, der so konfiguriert ist, dass er einen Ausgabeaktivierungswert an der dem Produkt zugeordneten Position erzeugt. Bei einer Ausführungsform wird der dritte Vektor durch ein Anordnung von Puffern in der Akkumulatoranordnung übertragen, wobei jeder der Puffer mit einem Eingang eines der Addierer in der Akkumulatoranordnung gekoppelt ist.
  • Es werden nun illustrativere Informationen zu verschiedenen optionalen Architekturen und Merkmalen gegeben, mit denen das vorstehende Framework je nach Wunsch des Benutzers implementiert werden kann oder auch nicht. Es sei darauf hingewiesen, dass die folgenden Informationen zur Veranschaulichung dienen und nicht als Beschränkung ausgelegt werden sollen. Alle folgenden Merkmale können wahlweise mit oder ohne Ausschluss der beschriebenen anderen Merkmal eingesetzt werden.
  • Beschleuniger für dünnbesetzte faltende neuronale Netze
  • 2A zeigt ein Blockschaltbild des SCNN 200 gemäß einer Ausführungsform. Das SCNN 200 koppelt einen algorithmischen Datenfluss, der alle Multiplikationen mit einem Null-Operanden eliminiert und gleichzeitig eine kompakte Darstellung von Gewichten und/oder Eingabeaktivierungen zwischen Speicher und Logikblöcken innerhalb des SCNN 200 überträgt. Das SCNN 200 verfügt über eine Speicherschnittstelle 205, eine Schichtablaufsteuerung 215 und eine Anordnung mit Verarbeitungselementen (PEs) 210.
  • Die Speicherschnittstelle 205 liest Gewichts- und Aktivierungsdaten aus einem an das SCNN 200 gekoppelten Speicher aus, wobei die Speicherschnittstelle 205 auch Gewichts- und/oder Aktivierungsdaten von dem SCNN 200 in den Speicher schreiben kann. Bei einer Ausführungsform werden alle Aktivierungsdaten innerhalb der PEs 210 gespeichert, so dass über die Speicherschnittstelle 205 nur auf Gewichtsdaten zugegriffen wird. Die Gewichts- und/oder Aktivierungsdaten können in einem kompakten Format oder einem erweiterten Format im Speicher abgelegt werden. Das kompakte Format kann Vektoren enthalten, die nur Elemente mit einem Wert von ungleich Null (Gewichte oder Aktivierungen) und Positionen, die den Elementen mit einem Wert von ungleich Null zugeordnet sind, aufweisen.
  • Der Speicher kann mit einem dynamischen Arbeitsspeicher (DRAM) oder Ähnlichem implementiert werden. Bei einer Ausführungsform wird bzw. werden die Speicherschnittstelle 205 oder die PEs 210 so konfiguriert, dass Multi-Bit-Daten, wie die Gewichte, Eingabe- und Ausgabeaktivierungen, komprimiert werden. Die Schichtablaufsteuerung 215 steuert das Auslesen des Speichers, um die kompakten Eingabeaktivierungen und die kompakten Gewichte zu erhalten. Die kompakten Eingabeaktivierungen und die kompakten Gewichte können vor der Übertragung an die PEs 210 in der Speicherschnittstelle 205 abgespeichert werden.
  • Die kompakten Aktivierungen und die kompakten Gewichte sind bei einer Ausführungsform Datenfolgen, die als Nicht-Null-Elemente und Positionen codiert sind. Bei einer Ausführungsform werden die Nicht-Null-Elemente und Positionen jeweils als Paar (Wert, Position) codiert. Die kompakten Aktivierungen und die kompakten Gewichte können bei Bedarf zu Datenfolgen von Gewichten und Aktivierungen erweitert werden, die Multibit-Null- und Nicht-Null-Elemente enthalten. Wichtig ist, dass bei kompakter Form der Gewichte und Eingabeaktivierungen nur Nicht-Null-Gewichte und Nicht-Null-Eingabeaktivierungen von der Speicherschnittstelle 205 in die PEs 210 übertragen werden. Bei einer Ausführungsform weisen die Nicht-Null-Elemente 8 Bits und die Positionen 4 Bits auf. Die Nicht-Null-Elemente können jedoch mehr als 8 Bits oder weniger als 8 Bits und die Positionen können mehr als 4 Bits oder weniger als 4 Bits aufweisen.
  • Die Schichtablaufsteuerung 215 liest die Gewichte aus und gibt die Gewichtsvektoren aus, die mit den PEs 210 zu multiplizieren sind. Bei einer Ausführung liegen die Gewichte in kompakter Form vor und werden nur einmal vom Off-Chip-DRAM gelesen und im SCNN-Beschleuniger 200 gespeichert. Bei einer Ausführungsform überträgt die Schichtablaufsteuerung 215 einen Gewichtsvektor an jedes PE 210 und lässt mehrere Aktivierungsvektoren der Reihe nach folgen, bevor ein weiterer Gewichtsvektor übertragen wird. Bei einer Ausführungsform überträgt die Schichtablaufsteuerung 215 einen Eingabeaktivierungsvektor an jedes PE 210 und lässt mehrere Gewichtsvektoren der Reihe nach folgen, bevor ein weiterer Eingabeaktivierungsvektor übertragen wird. Die von den Multiplizierern innerhalb jedes PE 210 erzeugten Produkte werden zu Zwischenwerten (z. B. Teilsummen) addiert, die nach einer oder mehreren Iterationen zu Ausgabeaktivierungen werden. Wenn die Ausgabeaktivierungen für eine neuronale Netzwerkschicht berechnet und in einem Ausgabeaktivierungspuffer gespeichert wurden, kann die Schichtablaufsteuerung 215 eine weitere Schicht verarbeiten, indem die Ausgabeaktivierungen als Eingabeaktivierungen angewendet werden.
  • Jedes PE 210 enthält eine Multipliziereranordnung, die einen Vektor der Gewichte (Gewichtsvektor) und einen Vektor der Eingabeaktivierungen (Aktivierungsvektor) entgegennimmt, wobei jeder Multiplizierer innerhalb der Anordnung so konfiguriert ist, dass er ein Produkt aus einem Eingabeaktivierungswert im Aktivierungsvektor und einem Gewicht im Gewichtsvektor erzeugt. Die Gewichte und Eingabeaktivierungen in den Vektoren können alle wie ein kartesisches Produkt miteinander multipliziert werden. Wenn die Eingabevektoren zum Beispiel a, b, c, d und p, q, r, s sind, ist die Ausgabe ein 16-Vektor mit den Werten a*p, a*q, a*r, a*s, b*p, b*q, b*r, b*s, c*p, c*q, c*r, c*s, c*s, d*p, d*q, d*r und d*s.
  • Wichtig ist, dass nur Gewichte und Eingabeaktivierungen ungleich Null an die Multipliziereranordnung innerhalb jedes PE 210 übertragen werden. Zusätzlich können die Eingabeaktivierungsvektoren innerhalb jedes PE 210 in einer stationären Eingabeform bei mehreren Gewichtsvektoren wiederverwendet werden, um Datenzugriffe zu reduzieren. Die von den Multiplizierern erzeugten Produkte werden dann zu Teilsummen und Ausgabeaktivierungen addiert. Da die Nullwerte entfernt wurden, kann das Zuordnen der Produkte auf Akkumulatoren jedoch für jedes Produkt, das innerhalb des Multipliziereranordnung erzeugt wird, variieren. Bei einer konventionellen Implementierung, bei der die Nullwerte beibehalten werden, können zum Beispiel die in einem Taktzyklus erzeugten Produkte zu einer Teilsumme summiert werden. Im Gegensatz dazu müssen die Produkte, die während eines Taktzyklus innerhalb eines PE 210 erzeugt werden, nicht notwendigerweise zu einer Teilsumme addiert werden. Daher werden die Ausgangskoordinaten, welche jeder Multiplikation zugeordnet sind, innerhalb des PE 210 verfolgt und eine Ausgabeposition (definiert durch die Ausgangskoordinaten) und ein Produkt zur Addition einer verteilten Akkumulatoranordnung zur Verfügung gestellt. Die verteilte Akkumulatoranordnung ermöglicht abhängig von der Ausgangsposition des Produkts die Übertragung eines beliebigen Produkts auf einen beliebigen Addierer. Bei einer Ausführungsvariante sind die PEs 210 so konfiguriert, dass sie Faltungsoperationen mit den Gewichten und Eingabeaktivierungen durchführen. Die Addition der Produkte in den Addierern vervollständigt die Faltungsoperation und erzeugt die Ausgabeaktivierungen.
  • Das SCNN 200 kann so konfiguriert werden, dass es CNN-Algorithmen implementiert, die als kaskadierter Satz von Mustererkennungsfiltern, die mittels Überwachung trainiert wurden, ausgeführt werden. Ein CNN besteht aus einer Reihe von Schichten, zu denen Faltungsschichten, nicht-lineare skalare Operator-Schichten und Schichten gehören, die die Zwischendaten downsamplen, zum Beispiel durch Pooling. Die Faltungsschichten stellen den Kern der CNN-Berechnung dar und zeichnen sich durch eine Reihe von Filtern aus, die in der Regel 1 × 1 oder 3 × 3 und gelegentlich 5 × 5 oder größer sind. Die Werte dieser Filter sind die Gewichte, die mit einer Trainingsmenge für das Netz trainiert werden. Einige tiefe neuronale Netze („Deep Neuronal Networks” (DNNs)) enthalten auch vollständig verbundene Schichten, typischerweise gegen Ende des DNN. Bei der Klassifikation wird dem neuronalen Netz ein neues Bild (im Falle der Bilderkennung) präsentiert, das die Bilder in die Trainingskategorien klassifiziert, indem nacheinander jede Schicht des neuronalen Netzes berechnet wird. Das SCNN 200 beschleunigt die Faltungsschichten, das Empfangen von Gewichten und Eingabeaktivierungen und die Erzeugung von Ausgabeaktivierungen.
  • Die Seltenheit bzw. Dünnbesetztheit („sparsity”) in einer Schicht eines CNN ist definiert als der Anteil von Nullen in der Gewichts- und Eingabeaktivierungsmatrix der Schicht. Die primäre Technik zur Erzeugung einer Seltenheit von Gewichten besteht darin, das Netz während des Trainings zu beschneiden. Bei einer Ausführungsvariante wird jedes Gewicht mit einem Absolutwert nahe Null (z. B. unter einem definierten Schwellenwert) auf Null gesetzt. Der Beschneidungsvorgang bewirkt, dass die Gewichte aus den Filtern entfernt werden, und erzwingt manchmal sogar, dass eine Ausgabeaktivierung immer gleich Null ist. Das verbleibende Netz kann erneut trainiert werden, um die durch den naiven Schnitt verlorene Genauigkeit wiederzuerlangen. Das Ergebnis ist ein kleineres Netz mit einer Genauigkeit, die dem ursprünglichen Netz extrem nahe kommt. Der Prozess kann iterativ wiederholt werden, um die Netzgröße zu reduzieren, während die Genauigkeit beibehalten wird.
  • Die Aktivierungsseltenheit tritt dynamisch während der Inferenz auf und ist stark abhängig von den verarbeiteten Daten. Bei einer Ausführungsform werden Aktivierungen mit negativen Werten auf Null gesetzt. Bei einer Ausführungsform werden Eingabeaktivierungen mit einem Absolutwert unter einem definierten Schwellwert auf Null gesetzt.
  • Bei einer Ausführungsvariante setzt eine Komprimierungsmaschine innerhalb des PE 210 Ausgabeaktivierungen mit einem Absolutwert unter einer definierten Schwelle auf Null. Wenn die Aktivierungen in komprimierter Form vorliegen, werden die Aktivierungen nach Bedarf von der Komprimierungsmaschine neu formatiert, nachdem eine oder mehrere Aktivierungen auf Null gesetzt wurden, um komprimierte Aktivierungen zu erzeugen. Nach Abschluss der Berechnung der Ausgabeaktivierungen für eine Schicht eines CNN kann jedes Element in den Ausgabeaktivierungsmatrizen, das unter einem Schwellenwert liegt, auf Null gesetzt werden, bevor die Ausgabeaktivierungsdaten an die nächste Schicht übergeben werden.
  • SCNN-Berechnungsdatenfluss
  • Die Kernoperation in einer CNN-Schicht ist eine zweidimensionale Schiebefensterfaltung eines R × S-Elementfilters über einer W × H-Element-Eingabeaktivierungsebene, um eine W × H-Element-Ausgabeaktivierungsebene zu erzeugen. Es können mehrere (C) Eingabeaktivierungsebenen vorhanden sein, die als Eingabekanäle bezeichnet werden. An jedem Eingabeaktivierungskanal wird ein eigenes Filter angewendet, und die Filterausgabe für jeden der C Kanäle wird elementweise in einer einzigen Ausgabeaktivierungsebene zusammengefasst. Mehrere Filter (K) können auf den gleichen Körper von Eingabeaktivierungen angewendet werden, um K Ausgabekanäle von Ausgabeaktivierungen zu erzeugen. Schließlich kann ein Stapel der Länge N von Gruppen von C Kanälen der Eingabeaktivierungsebenen auf dasselbe Volumen an Filtergewichten angewendet werden.
  • 2B zeigt die Eingabeaktivierungen, Gewichte und Ausgabenaktivierungen für eine einzelne CNN-Schicht gemäß einer Ausführungsform. Der Satz von Berechnungen für die gesamte Schicht kann als Schleifenverschachtelung über die sieben Variablen (N, K, C, W, H, R und S) formuliert werden. Da Multiplizier-Addier-Operationen assoziativ sind (modulo Rundungsfehlern, die im Rahmen der folgenden Beschreibung ignoriert werden), sind alle Permutationen der sieben Schleifenvariablen legal. Tabelle 1 zeigt ein Beispiel für eine Schleifenverschachtelung basierend auf einer solchen Permutation. Die Verschachtelung kann kurz und bündig als N → K → C → W → H → R → S dargestellt werden. Jeder Punkt im siebendimensionalen Raum, der aus den Variablen gebildet wird, stellt eine einzelne Multiplikations-Akkumulations-Operation dar. Es sei angemerkt, dass für den Rest der Beschreibung eine Stapelgröße von 1 angenommen wird, was eine übliche Stapelgröße für Inferenzaufgaben darstellt. Tabelle 1: siebendimensionale Schleifenverschachtelung
    Figure DE102017117381A1_0002
  • Die in Tabelle 1 gezeigte einfache Schleifenverschachtelung kann auf vielfältige Weise transformiert werden, um verschiedene Wiederverwendungsmuster der Aktivierungen und Gewichte zu erfassen und die Berechnung auf eine Hardware-Beschleuniger-Implementierung abzubilden, wie z. B. den SCNN-Beschleuniger 200. Der Datenfluss eines CNN definiert, wie die Schleifen geordnet, partitioniert und parallelisiert werden. Die Wahl des Datenflusses kann einen wesentlichen Einfluss auf die Fläche und Energieeffizienz einer Architektur haben.
  • Während das Konzept des Datenflusses für dichte Architekturen untersucht wurde, können spärliche bzw. dünnbesetzte Architekturen auch verschiedene alternative Datenflüsse nutzen, die jeweils eigene Kompromisse eingehen. Ein solcher spezifischer Datenfluss, der hier beschrieben wird, ist ein PTIS-sparse („sparse Planar-Tiled Input-Stationary”). PTIS-sparse ermöglicht die Wiederverwendung von Mustern, die die Eigenschaften von dünnbesetzten Gewichten und Aktivierungen ausnutzen. Zunächst wird ein äquivalenter dichter Datenfluss (PTIS-dense) beschrieben, um die Zerlegung der Berechnungen zu erklären. Anschließend werden die Besonderheiten für PTIS-sparse beschrieben.
  • 2C zeigt ein PE 220 gemäß einer Ausführungsform. Zum Verständnis der zeitlichen Komponente des PTIS-dense-Datenflusses wird die Funktionsweise des PE 220 beschrieben. PTIS verwendet eine Input-Stationary-Rechenreihenfolge, bei der eine Eingabeaktivierung stationär an den Berechnungseinheiten festgehalten wird, wenn die Eingabeaktivierung mit allen Filtergewichten multipliziert wird, die erforderlich sind, um alle Beiträge der Eingabeaktivierung zu jedem der K Ausgabekanäle (ein K × R × S-Teilvolumen) zu leisten. So trägt jede Eingabeaktivierung zu einem Volumen von K × R × S-Ausgabeaktivierungen bei. Die Reihenfolge der bezüglich der Eingabe stationären Berechnung maximiert die Wiederverwendung der Eingabeaktivierungen, während die Kosten für die Übertragung der Gewichte auf die PEs 220 gezahlt werden. Die Aufnahme mehrerer Eingabekanäle (C) fügt eine zusätzliche äußere Schleife hinzu und führt zur Schleifenverschachtelung C → W → H → R → S.
  • Der PTIS-dense-Datenfluss beruht auf Eingabepuffern, Gewichtspuffern 230 und Eingabeaktivierungspuffern 235, um Gewichte bzw. Eingabeaktivierungen zu speichern. Ein Akkumulatorpuffer 250 speichert die Teilsummen der Ausgabeaktivierungen. Für jeden Zugriff auf eine zuvor geschriebene Teilsumme im Akkumulatorpuffer 250 wird eine Lese-Addier-Schreiboperation durchgeführt. Der Akkumulatorpuffer 250 bildet in Verbindung mit einer angeschlossenen Addiereinheit 255 eine Akkumulationseinheit 245.
  • Die Parameter heutiger Netze bewirken, dass der Gewichtspuffer 230 und der Eingabepuffer 235 groß und der Zugriff energieaufwendig ist. Die bezüglich Eingaben stationäre zeitliche Schleifenverschachtelung amortisiert die Energiekosten für den Zugriff auf den Gewichtspuffer 230 und den Eingabeaktivierungspuffer 235 über mehrere Zugriffe auf den Gewichtspuffer 235 und den Akkumulatorpuffer 250. Genauer gesagt dient das Register, in dem die Eingabe über K × R × S Iterationen stationär bzw. konstant gehalten wird, als innerer Puffer, wobei Zugriffe auf den größeren Eingabepuffer (z. B. Gewichtspuffer 230 oder Eingabeaktivierungspuffer 235) gefiltert werden.
  • Leider kostet das Merkmal, die Eingabeaktivierungen konstant zu halten, mehr Zugriffe auf die Gewichte im Gewichtspuffer 230 (oder im Speicher) und auf die Teilsummen im Akkumulatorpuffer 250. Durch ein Blockieren der Gewichte und Teilsummen im Ausgabekanal (K-fach) kann die Wiederverwendung des Gewichtspuffers 230 und des Pufferspeichers 250 erhöht werden, was die Energieeffizienz verbessert. Die Ausgabekanalvariable (K) kann mit Kc (genannt Ausgabekanalgruppe) berücksichtigt werden, und K/Kc entspricht der Anzahl der Ausgabekanalgruppen. Bei einer Ausführungsform werden jeweils nur die Gewichte und Ausgaben einer Ausgabekanalgruppe im Gewichtspuffer 230 und im Akkumulationspuffer 250 gespeichert. Die Teilvolumen, die in Puffern bei der Berechnungseinheit aufgenommen sind, lauten also:
    Gewichte: Kc × R × S
    Eingabeaktivierungen: C × B × H
    Teilsummen: Kc × B × H
  • Eine äußere Schleife über alle K/Kc Ausgabekanalkacheln ergibt die komplette Schleifenverschachtelung K/Kc → C → W → H → Kc → R → S. Es sei angemerkt, dass für jede Iteration der äußeren Schleife der Gewichtspuffer 230 erneut gefüllt werden muss und der Akkumulatorpuffer 250 entleert und gelöscht werden muss, während der Inhalt des Eingabeaktivierungspuffers 235 vollständig wiederverwendet wird, da dieselben Eingabeaktivierungen über alle Ausgabekanäle verwendet werden.
  • Um die Parallelität vieler Multiplizierer innerhalb eines PE 220 auszunutzen, kann aus dem Gewichtspuffer 230 ein Vektor von F Filtergewichten und aus dem Eingabeaktivierungspuffer 235 ein Vektor von I Eingängen geholt werden. Die Vektoren werden an eine Anordnung von FxI Multiplizierern 240 übergeben, um ein vollständiges kartesisches Produkt von Ausgabeteilsummen zu berechnen. Jedes Produkt liefert eine sinnvolle Teilsumme, so dass keine belanglosen Zugriffe oder Berechnungen durchgeführt werden. PTIS-sparse nutzt dieselbe Eigenschaft, um effiziente Berechnungen auf komprimierte-dünnbesetzte Gewichte und Eingabeaktivierungen durchzuführen.
  • Die Multipliziererausgaben (z. B. Produkte) werden an die Akkumulationseinheit 245 gesendet, welche die Teilsummen aktualisiert, die in dem Akkumulationspuffer 250 gespeichert sind. Jedes Produkt wird mit einer Teilsumme an den Ausgabekoordinaten in dem Ausgabeaktivierungsraum akkumuliert, welche mit einer Position übereinstimmt (d. h. dieser entspricht), die dem Produkt zugeordnet ist. Die Ausgabepositionen für die Produkte werden parallel mit den Produkten berechnet (in 2C nicht dargestellt). Bei einer Ausführungsform werden Koordinaten, welche die Ausgabepositionen definieren, durch eine Zustandsmaschine bzw. Logikschaltung in der Akkumulationseinheit 245 berechnet. Die Anzahl der Addierer in der Addierereinheit 255 entspricht nicht notwendigerweise der Anzahl der Multiplizierer in der FxI-Multipliziereranordnung 240. Die Akkumulationseinheit 245 muss jedoch mindestens FxI Addierer in der Addierereinheit 255 einsetzen, um dem Durchsatz der FxI-Multipliziereranordnung 240 zu entsprechen.
  • Tabelle 2 zeigt einem Pseudocode für den PTIS-dense-Datenfluss, einschließlich eines Blockierens in der K-Dimension, eines Holens von Vektoren der Eingabeaktivierungen und der Gewichte (B, D) und eines Berechnens des kartesischen Produktes parallel (E, F). Es sei angemerkt, dass dieser PTIS-dense-Datenfluss einfach eine neu angeordnete, aufgeteilte und parallelisierte Version des Pseudocodes ist, welcher in Tabelle 1 dargestellt ist. Tabelle 2: Pseudocode für den PTIS-dense-Datenfluss
    Figure DE102017117381A1_0003
  • Es sei angemerkt, dass die Ausgabepositionen, welche einem Ausgangspuffer (out_buf) zugeordnet sind, mittels der Schleifenindices berechnet werden können, welche im Abschnitt (F) der Tabelle 2 dargestellt sind.
  • Um die praktischen Grenzen der Multipliziereranzahl und Puffergrößen in einem PE 220 zu überwinden, kann eine Tiling-Strategie eingesetzt werden, um die Arbeit über eine Anordnung von PEs 210 zu verteilen, so dass jedes PE 210 unabhängig arbeiten kann. Bei einer Ausführungsform der PTIS-dense-Technik wird die W × H-Elementaktivierungsebene in kleinere Wt × Ht-Elementkacheln aufgeteilt, welche über die PEs 210 in dem SCNN-Beschleuniger 200 aufgeteilt werden. Jede Kachel erstreckt sich vollständig in der Eingabekanaldimension C, was zu einem Eingabeaktivierungsvolumen von C × Wt × Ht führt, welches jedem PE 210 zugeordnet ist. Die Gewichte werden an die PEs 210 übertragen, und jedes PE 210 arbeitet auf einer exklusiven Teilmenge des Eingabe- und Ausgabe-Aktivierungsraums. Mit anderen Worten existiert keine Verdopplung von Eingabeaktivierungen oder Ausgabeaktivierungen zwischen den PEs 210.
  • Leider funktioniert ein striktes Trennen sowohl von Eingabeaktivierungen als auch Ausgabeaktivierungen in Wt × Ht Kacheln nicht, da aufgrund der Eigenschaft des gleitenden Fensters bei der Faltungsoperation Überkreuzkachelabhängigkeiten an den Kachelrändern eingeführt werden. Diese Abhängigkeiten werden Halos genannt. Halos können auf zwei Arten bestimmt werden. Bei der ersten Technik zur Bearbeitung von Halos werden die Eingabeaktivierungspuffer 235 bei jedem PE 210 etwas größer als C × Wt × Ht ausgebildet, um die Halos aufzunehmen. Die Halo-Eingabeaktivierungswerte werden über benachbarte PEs 210 repliziert, aber die berechneten Produkte sind für jedes PE 210 streng privat. Die replizierten Eingabeaktivierungswerte können per Multicast übertragen werden, wenn die Eingabeaktivierungswerte in den Eingabeaktivierungspuffern 235 gespeichert werden. Die zweite Technik zur Bearbeitung von Halos ist, den Akkumulationspuffer bei jedem PE 210 etwas größer als Kc × W × H auszubilden, um die Halos aufzunehmen. Die Halos enthalten dann vollständige Teilsummen, welche zur Akkumulation zu benachbarten PEs 210 kommuniziert werden müssen. Bei einer Ausführungsform tritt die Kommunikation zwischen benachbarten PEs 210 am Ende einer Berechnung von jeder Ausgabekanalgruppe auf.
  • Die PTIS-sparse-Technik ist eine natürliche Erweiterung der PTIS-dense-Technik, wobei die PTIS-sparse-Technik die Seltenheit (sparsity) bei den Gewichten und Aktivierungen ausnutzt. Der PTIS-sparse-Datenfluss ist speziell entworfen, um auf einer komprimierten dünnbesetzten (d. h. kompakten) Codierung der Gewichte und Eingabeaktivierungen zu arbeiten, um eine komprimierte-dünnbesetzte (sparse) Codierung der Ausgabeaktivierungen zu erzeugen. Bei einer CNN-Schichtgrenze werden die Ausgabeaktivierungen der vorherigen Schicht die Eingabeaktivierungen der nächsten Schicht. Das spezielle Format, welches eingesetzt wird, um die komprimierten-dünnbesetzten codierten Daten zu erzeugen, ist orthogonal zu der dünnbesetzten (sparse) Architektur selbst. Das wichtige Merkmal ist, dass ein Decodieren eines dünnbesetzten Formats ultimativ Datenwerte ungleich Null und eine Position ergibt, welche die Koordinaten des Wertes in der Gewichtsmatrix oder Eingabeaktivierungswertematrix angibt. Bei einer Ausführungsform ist die Position durch einen Index oder eine Adresse definiert, wie beispielsweise eine Adresse, welche einem der Akkumulationspuffer 250 oder Addierereinheiten 255 entspricht.
  • 3A zeigt ein Blockschaltbild eines PE 210 nach einer Ausführungsform. Das PE 210 ist so konfiguriert, dass es den PTIS-sparse-Datenfluss unterstützt. Wie das PE 220, welches in 2C dargestellt ist, enthält auch das PE 210 einen Gewichtspuffer 305, einen Eingabeaktivierungspuffer 310 und eine FxI-Multipliziereranordnung 325. Eine Parallelität innerhalb eines PE 210 wird durch die Verarbeitung eines Vektors von F Filtergewichten ungleich Null und eines Vektors von I Eingabeaktivierungen ungleich Null innerhalb der FxI-Multipliziereranordnung 325 erreicht. FxI Produkte werden in jedem Verarbeitungszyklus von jedem PE 210 im SCNN-Beschleuniger 200 erzeugt. Bei einer Ausführungsform gilt F = I = 4. Bei anderen Ausführungsformen können F und I jede positive ganze Zahl sein, und der Wert von F kann größer oder kleiner als I sein. Die Werte von F und I können jeweils so abgestimmt sein, dass sie die Gesamtleistung und die Schaltungsfläche im Gleichgewicht halten. Bei typischen Dichtewerten von 30% sowohl für Gewichte als auch für Aktivierungen entsprechen 16 Multiplikationen bezüglich der komprimierten dünnbesetzten Gewichts- und Eingabeaktivierungswerte 178 Multiplikationen in einem dichten Beschleuniger, der Gewichts- und Eingabeaktivierungswerte mit Nullen verarbeitet.
  • Die Akkumulatoranordnung 340 kann einen oder mehrere Akkumulationspuffer und Akkumulationsaddierer aufweisen, um die Produkte, welche in der Multipliziereranordnung 325 erzeugt werden, zu speichern und die Produkte in die Teilsummen aufzusummieren. Das PE 210 weist auch Positionspuffer 315 und 320, Indexpuffer 355, eine Zielberechnungseinheit 330, ein F*I-Zuteilungskoppelfeld 335 und eine Nachverarbeitungseinheit 345 auf.
  • Um eine einfachere Decodierung der komprimierten-dünnbesetzten Daten zu ermöglichen, werden Gewichte in komprimierte-dünnbesetzte Blöcke mit der Granularität einer Ausgabekanalgruppe gruppiert, wobei Kc × R × S Gewichte in einen komprimierten-dünnbesetzten Block codiert werden. In ähnlicher Weise werden Eingabeaktivierungen mit der Granularität der Eingabekanäle codiert, wobei ein Block von Wt × Ht in einen komprimierten-dünnbesetzten Block codiert wird. Bei jedem Zugriff liefert der Gewichtspuffer 305 und der Positionspuffer 315 einen Vektor von F Filtergewichten ungleich Null zusammen mit den zugehörigen Positionen (z. B. Koordinaten) in dem Kc × R × S-Bereich. In ähnlicher Weise liefern der Eingabeaktivierungspuffer 310 und der Positionspuffer 320 einen Vektor von I Eingabeaktivierungen ungleich Null und die zugehörigen Positionen (z. B. Koordinaten) in dem Wt × Ht-Bereich. In ähnlicher Weise wie bei dem PTIS-dense-Datenfluss berechnet die FxI-Multipliziereranordnung 325 das vollständige Kreuzprodukt von FxI Teilsummenausgaben ohne irrelevante Berechnungen. Anders als bei einer dense bzw. dichten Architektur, welche Nullwerte aufweist, werden die Ausgabekoordinaten, welche die Ausgabepositionen definieren, nicht von den Schleifenindices bei einer Zustandsmaschine abgeleitet, sondern werden stattdessen von den Positionen (z. B. Koordinaten) der Elemente ungleich Null abgeleitet, welche in dem komprimierten Format eingebettet sind.
  • Wenn auch die Berechnung der Ausgabepositionen der Produkte nicht schwierig ist, sind die Produkte, anders als bei der PTIS-dense-Technik, nicht typischerweise zusammenhängend, wenn die PTIS-sparse-Technik eingesetzt wird. Daher müssen die Produkte, welche durch die FxI-Multipliziereranordnung 325 erzeugt werden, auf nicht zusammenhängende Positionen in dem Kc × Wt × Ht-Ausgaberaum verteilt werden. Da jede Teilsumme in dem Ausgaberaum Null sein kann, speichert die Akkumulatoranordnung 340 die Daten in einem dichten Format, welches sowohl Nicht-Nullwerte als auch Nullwerte aufweist. Tatsächlich weisen Ausgabeaktivierungen mit hoher Wahrscheinlichkeit eine hohe Dichte auf, auch wenn die Dichte der Gewichte und der Eingabeaktivierungen sehr gering ist (d. h. eine hohe Seltenheit aufweisen), bis die Ausgabeaktivierungen eine ReLU-Operation durchlaufen.
  • Um die Akkumulation von dünn besetzten Teilsummen durchzuführen, wird der monolithische Kc × Wt × Ht-Akkumulationspuffer 250, welcher bei dem PTIS-dense-Datenfluss eingesetzt wird, in eine verteilte Anordnung von kleineren Akkumulationspuffern modifiziert, auf welche über ein verteiltes Netzwerk zugegriffen wird, das als ein Koppelfeld-Switch, wie z. B. das FxI-Zuteilungskoppelfeld 335, implementiert sein kann. Das FxI-Zuteilungskoppelfeld 335 routet FxI Produkte zu einer Anordnung von A Akkumulatoreinheiten abhängig von den Ausgabepositionen, welche jedem Produkt zugeordnet sind. Die Positionen können übersetzt werden, um eine Adresse auszubilden. Ein bestimmtes Produkt wird zu der Akkumulatoreinheit in der Akkumulatoranordnung 340 übertragen, welche ausgestaltet ist, um die Ausgabeaktivierung für die Position zu berechnen, welche dem Produkt zugeordnet ist. Zusammengenommen ist eine verteilte Akkumulatoranordnung, welche das FxI-Zuteilungskoppelfeld 335 und die Akkumulatoranordnung 340 umfasst, einem Kc × Wt × Ht-Adressbereich zugeordnet. Der Adressraum wird über die A Akkumulatoreinheiten verteilt und jede Akkumulatoreinheit weist eine Bank eines adressierbaren Speichers und einen Addierer auf, um eine Teilsumme für die Ausgabeposition zu akkumulieren (wenn die Verarbeitung einer Kachel abgeschlossen ist, entspricht die Teilsumme einer Ausgabeaktivierung).
  • Die PTIS-sparse-Technik kann anhand von kleinen Anpassungen an dem in Tabelle 2 dargestellten Pseudocode implementiert werden. Anstatt dass ein dichter Vektor geholt wird, sind (B) und (D) modifizierte Hohloperationen für komprimierte dünnbesetzte Eingabeaktivierungen bzw. Gewichte. Darüber hinaus werden die Positionen der Elemente ungleich Null in der komprimierten-dünnbesetzten Form der Datenstrukturen von den entsprechenden Puffern (in Tabelle 2 nicht dargestellt) geholt. Nachdem die Gewichte, Eingabeaktivierungen und Positionen geholt sind, wird der Akkumulatorpuffer (F) mit den Ausgabepositionen indiziert, welche aus dem dünnbesetzten Gewicht und den dünnbesetzten Eingabeaktivierungen berechnet werden.
  • Bei einer Ausführungsform sind die Akkumulationseinheit 245, welche in 2C dargestellt ist, und die verteilte Akkumulatoranordnung doppelt gepuffert, so dass Produkte, welche für eine Kachel von Gewichten erzeugt werden, in einem Satz von Addierern in der Akkumulatoranordnung 340 akkumuliert werden, während auf Register in der Akkumulatoranordnung 340, welche Teilprodukte für die vorherige Kachel speichern, zugegriffen wird, um Halos zu bestimmen und die sich ergebenden Ausgabeaktivierungen in das komprimierte Format zu codieren. Wenn die Berechnung für die Ausgabekanalgruppe abgeschlossen worden ist, wird schließlich die Akkumulatoranordnung 340 ausgelesen und die komprimierten Ausgabeaktivierungen werden in dem Ausgabeaktivierungspuffer 350 gespeichert und die Ausgabekoordinaten werden in dem Indexpuffer 355 gespeichert.
  • Die Tabelle 3 stellt einen Pseudocode für den PTIS-sparse-Datenfluss dar. Mit Bezug zu 2A steuert die Schichtablaufsteuerung 215 die Speicherschnittstelle 205, um die Gewichte einmal von dem DRAM außerhalb des Chips („off-chip DRAM”) in einer vollständig komprimierten Form zu lesen und die Gewichte zu den PEs 210 zu übertragen. In jedem PE 210 werden die Gewichte pro Kachel (d. h. Ausgabekanalgruppe) (g), dann pro Eingabekanal (c), dann pro Ausgabekanal innerhalb der Kachel (k) geordnet. Die Berechnung pro PE unter Verwendung der Kachel-/Eingabekanal-/Ausgabekanal-Reihenfolge ist in Tabelle 3 dargestellt. Tabelle 3: Pseudocode für den PTIS-sparse-Datenfluss
    Figure DE102017117381A1_0004
  • Verarbeitungselement
  • Mit Bezug zu 3A werden die Gewichte, wenn die Gewichte durch die Speicherschnittstelle 205 von dem DRAM gelesen werden, an die PEs 210 übertragen und lokal pro PE in einem Gewichtspuffer 305 gehalten. Die Eingabeaktivierungen können durch die Speicherschnittstelle 205 von dem DRAM gelesen werden oder von dem Ausgabeaktivierungspuffer 350 übertragen und lokal pro PE in einem Eingabeaktivierungspuffer 310 gespeichert werden.
  • Eine Zustandsmaschine in der Zielberechnungseinheit 330 arbeitet mit den Gewichten und Eingabeaktivierungen gemäß der Reihenfolge, welche durch den PTIS-sparse-Datenfluss definiert wird, um eine Ausgabekanalgruppe von Kc × Wt × Ht Teilsummen in der Akkumulatoranordnung 340 zu erzeugen. Zuerst wird ein Vektor F von komprimierten Gewichten und ein Vektor 1 von komprimierten Eingabeaktivierungen von dem Gewichtspuffer 305 bzw. dem Eingabeaktivierungspuffer 310 geholt. Die Vektoren werden in der FxI-Multipliziereranordnung 325 verteilt, welche eine Form des kartesischen Produkts der Vektoren berechnet.
  • Während die Vektoren durch die FxI-Multipliziereranordnung 325 verarbeitet werden, um Produkte zu berechnen, werden die Positionen von den dünnbesetzten-komprimierten Gewichten und Aktivierungen durch die Zielberechnungseinheit 330 verarbeitet, um die Ausgabepositionen zu berechnen, welche den Produkten zugeordnet sind. Die FxI Produkte werden an eine Anordnung von A Akkumulatoreinheiten in der Akkumulatoranordnung 340 geliefert, welche durch die Ausgabepositionen adressiert werden. Jede Akkumulatoreinheit in der Akkumulatoranordnung 340 weist eine adressierbare Speicherbank, Addierer und ein Register auf, um Teilsummen zu speichern, welche der Ausgabekanalgruppe zugeordnet sind, die bearbeitet wird. Wenn eine Bearbeitung einer Ausgabekanalgruppe abgeschlossen ist, ist die Teilsumme, welche in jedem Register gespeichert ist, der Ausgabeaktivierungswert für eine der Ausgabepositionen. Bei einer Ausführungsform sind die Akkumulatoreinheiten doppelt gepuffert, so dass die eine Gruppe von Registern neue Teilsummen speichern kann, während die zweite Gruppe von Registern von der Nachverarbeitungseinheit 345 ausgelesen wird. Wenn die Ausgabekanalgruppe abgeschlossen ist, führt die Nachverarbeitungseinheit 345 die folgenden Aufgaben durch: (1) Austauschen von Teilsummen mit benachbarten PEs 210 für die Halobereiche an der Grenze der Ausgabeaktivierungen des PEs 210, (2) Anwenden der nichtlinearen Aktivierung (z. B. ReLU), Pooling und Dropout-Funktionen, und (3) Komprimieren der Ausgabeaktivierungen in die komprimierte-dünnbesetzte Form und Schreiben der komprimierten-dünnbesetzten Ausgabeaktivierungen in die Ausgabeaktivierungspuffer 350 und Schreiben der Ausgabepositionen, welche den komprimierten-dünnbesetzten Ausgabeaktivierungen zugeordnet sind, in den Indexpuffer 355. Bei einer Ausführungsform weist die Nachbearbeitungseinheit 345 eine Komprimierungsmaschine auf, welche ausgestaltet ist, um die Ausgabeaktivierungen und Ausgabepositionen in die komprimierte-dünnbesetzte Form zu codieren.
  • Bei einer Ausführungsform ist der Gewichtspuffer 305 ein FIFO-Puffer („First In First Out”-Puffer) (WFIFO). Der Gewichtspuffer 305 sollte genug Speicherkapazität aufweisen, um all die Gewichte ungleich Null für einen Eingabekanal in einer Kachel (d. h. für die innerste „For”-Schleife in Tabelle 3) zu halten. Wenn es möglich ist, werden die Gewichte und Eingabeaktivierungen in dem Gewichtspuffer 305 bzw. Eingabeaktivierungspuffer 310 gehalten und werden niemals in das DRAM ausgelagert. Wenn das Ausgabeaktivierungsvolumen einer Schicht des neuronalen Netzes als das Eingabeaktivierungsvolumen für die nächste Schicht des neuronalen Netzes dienen kann, dann wird der Ausgabeaktivierungspuffer 350 logisch zwischen der Bearbeitung der verschiedenen Schichten des neuronalen Netzes in den Eingabeaktivierungspuffer 310 ausgelagert. In ähnlicher Weise wird zwischen der Verarbeitung der verschiedenen Schichten des neuronalen Netzes der Indexpuffer 355 logisch in den Puffer 320 ausgelagert.
  • Wenn der Gewichtspuffer 305 bei irgendeinem PE 210 vollläuft, dann wird bei einer Ausführungsform die Übertragung der Gewichtswerte in den Gewichtspuffer 305 angehalten. Wenn der Gewichtspuffer 305 groß genug ist, um einige Eingabekanäle einer Kachel zu halten, können einige PEs 210 zu dem nächsten Eingabekanal voranschreiten, während ein oder mehrere andere PEs 210 einige Kanäle zurück sind – Glätten von Lastungleichgewichten zwischen den PEs 210. Bei einer Ausführungsform weist der Gewichtspuffer 305 eine ausreichende Speicherkapazität auf, um mehr als alle Gewichte in einer Kachel (d. h. einer Ausgabekanalgruppe) zu halten, um einige Lastungleichgewichte zwischen den PEs 210 auszugleichen.
  • Die verschiedenen Logikblöcke in dem PE 210 können hintereinander ausgeführt werden, wenn es erforderlich ist, um einer Zieltaktrate zu genügen. Jedoch müssen die Pipeline-Register zwischen den Pipeline-Stufen fixiert bzw. eingefroren werden können, wenn der Logikblock, welcher eine Datenausgabe durch die Pipeline-Register empfängt, angehalten ist. Alternativ können elastische Puffer zwischen den Pipeline-Stufen eingesetzt werden, um die Verteilung eines Bereitschaftssignals, welches anzeigt, dass Daten akzeptiert werden können, zu vereinfachen.
  • Bei einer Ausführungsform ist der Gewichtspuffer 305 ein FIFO-Puffer, welcher einen Endezeiger, einen Kanalzeiger und einen Anfangszeiger aufweist. Die Schichtablaufsteuerung 215 steuert die „Eingabe-„Seite des Gewichtspuffers 305, wobei Gewichtsvektoren in den Gewichtspuffer 305 geschoben werden. Der Endezeiger darf sich nicht über den Kanalzeiger hinweg fortbewegen. Eine Vollbedingung wird signalisiert, wenn sich der Endezeiger an dem Kanalzeiger vorbei bewegt, wenn ein anderer Schreibvektor gespeichert wird. Der Puffer 315 kann auf dieselbe Weise wie der Gewichtspuffer 305 implementiert sein und kann ausgestaltet sein, um die Positionen zu speichern, welche jedem Gewichtsvektor zugeordnet sind. Bei einer Ausführungsform gibt der Gewichtspuffer 305 einen Gewichtsvektor von F Gewichten {w[0] ... w[F – 1]} aus, und der Puffer 315 gibt die zugeordneten Positionen {x[0] ... x[F – 1]} aus. Jede Position spezifiziert r, s und k für ein Gewicht. Der Ausgabekanal k ist relativ zu der Kachel codiert. Wenn die Kachel zum Beispiel die Kanäle 40– 47 enthält, dann wird der Kanal 42 als k = 2 codiert – einen Versatz von 2 von 40, der Basis der Kachel.
  • Die Zielberechnungseinheit 330 steuert den Anfangs- und Kanalzeiger (HeadPtr und ChannelPtr) des Gewichtspuffers 305 und des Puffers 315, um die Berechnung einer Kachel in eine Reihenfolge zu bringen. Der Eingabeaktivierungspuffer 310 und der Puffer 320 können eine Gruppe von Registern oder ein SRAM sein, welche ausgestaltet sind, um die Eingabeaktivierungen und die Positionen, welche jedem Eingabeaktivierungswert zugeordnet sind, zu speichern. Die Zielberechnungseinheit 330 steuert auch einen Zeiger (IAPtr) in dem Eingabeaktivierungspuffer 310 und dem Puffer 320, um die Berechnung einer Kachel in eine Reihenfolge zu bringen. Die Reihenfolge, welche durch die Zielberechnungseinheit 330 implementiert wird, entspricht den drei inneren Schleifen des Pseudocodes, welcher in Tabelle 3 dargestellt ist. Der Pseudocode zum Betrieb der Zielberechnungseinheit 330 ist in Tabelle 4 dargestellt. ScatterAdd ist eine Funktion, welche die Produkte zu den A Akkumulatoreinheiten in der Akkumulatoranordnung 340 überträgt. Tabelle 4: Pseudocode, um die Berechnungen für eine Kachel in eine Reihenfolge zu bringen
    Figure DE102017117381A1_0005
  • Während der Pseudocode, welcher in Tabelle 4 dargestellt ist, einige Zeilen lang ist, benötigt jede Iteration der inneren Schleife einen einzigen Zyklus und der Overhead eines Inkrementierens der Zähler und eines Testens der Schleifengrenzen findet parallel statt. Daher führt die F*I-Multipliziereranordnung 325 FxI Multiplikationen (von Werten und Positionen) in jedem Verarbeitungszyklus durch, bis der Gewichtspuffer 305 leer gelaufen ist oder das F*I-Zuteilungskoppelfeld 335 signalisiert, dass es keine Eingaben mehr akzeptieren kann. Wenn die Verarbeitung nicht angehalten ist, inkrementiert die Zielberechnungseinheit 330 die Anfangszeiger in jedem Verarbeitungszyklus, wobei ein anderer Vektor von F Gewichten (und zugehörigen Positionen) in jedem Verarbeitungszyklus ausgegeben wird. Die Zielberechnungseinheit 330 setzt damit fort, den Anfangszeiger in jedem Verarbeitungszyklus, in welchem die Verarbeitung nicht angehalten ist, zu inkrementieren, bis das nächste Inkrement das Ende des aktuellen Kanals passieren würde (d. h. den Kanalzeiger passieren würde). Wenn das Ende des aktuellen Kanals erreicht wird, schreibt die Zielberechnungseinheit 330 den IAPtr fort und der Anfangszeiger wird zurückgerollt (erneut gesetzt) auf den Anfang des aktuellen Kanals. Der IAPtr wird dann eingesetzt, um den nächsten Vektor von I Eingabeaktivierungen zu lesen und der zurückgerollte Anfangszeiger wird eingesetzt, um den ersten Vektor von F Gewichten zu lesen. Die Zielberechnungseinheit 330 bringt dann all die Gewichte für einen anderen Vektor von Eingabeaktivierungen in eine Reihenfolge, um einen anderen Vektor von Produkten zu erzeugen. Wenn der letzte Vektor von Eingabeaktivierungen für den Kanal c verarbeitet ist, schreitet die Zielberechnungseinheit 330 mit Kanal c + 1 fort, indem der Kanalzeiger gesetzt wird, so dass er auf den ersten Gewichtsvektor des Kanals c + 1 zeigt.
  • Am Ende eines Eingabekanals müssen nicht alle F Gewichte oder I Aktivierungen gültig sein. Ungültige Aktivierungen werden durch einen Wert 0 angezeigt und führen nicht zu einer Anforderung bezüglich der ScatterAdd-Funktion. Das Ende eines Eingabekanals c wird durch Zählen identifiziert. Die Gewichte und Aktivierungen für jeden Eingabekanal werden durch ein Zählen der Elemente ungleich Null für den Kanal bestimmt. Zu Beginn des Kanals werden IACnt und WCnt auf die Anzahl von I-großen oder F-großen Einträgen für den Kanal initialisiert. IACnt und WCnt werden dekrementiert, nachdem der jeweilige Vektor abgearbeitet ist, und auf Null überprüft, um das Ende des Kanals zu bestimmen. Um zu vermeiden, dass für ein Lesen von IACnt und WCnt für einen Kanal ein Verarbeitungszyklus verloren wird, werden die Zähler in einem Paar von separaten kleinen RAMs gehalten – eines für die Gewichtszähler und eines für die IA-Zähler (in 3A nicht dargestellt).
  • Positionswandlung zu einer Akkumulatoradresse
  • 3B stellt zwei 3 × 3-Gewichtskerne und Positionen gemäß einer Ausführungsform dar. Eine erste Gruppe von Gewichten weist für k = 1 die Elemente ungleich Null a, b und c auf, und eine zweite Gruppe von Gewichten weist für k = 2 die Elemente ungleich Null d, e und f auf. Das Format (r, s, k) codiert die Positionen für die Gewichte ungleich Null als den folgenden Positionsvektor:
    (2, 0, 1), (0, 1, 1), (1, 2, 1), (0, 1, 2), (2, 1, 2), (1, 2, 2)
  • Wenn eine Multiplikation auf der „Wert„-Komponente von jedem (Wert, Positions)-Paar ausgeführt wird, führt die Zielberechnungseinheit 330 eine Vektoraddition auf die Positionen durch – woraus sich eine Position (x, y, k) (z. B. Ausgabekoordinaten) für das sich ergebende Produkt ergibt. Insbesondere werden für jedes Produkt die x-Koordinaten, welche den Gewichts- und Eingabeaktivierungspositionen zugeordnet sind, aufsummiert und die y-Koordinaten, welche den Gewichts- und Eingabeaktivierungspositionen zugeordnet sind, werden aufsummiert, um die Position (x, y k) für das sich ergebende Produkt zu erzeugen. Zum Beispiel erzeugt ein Aufsummieren der ersten Position in dem Gewichtspositionsvektor mit einer Gruppe von vier Positionen für Eingabeaktivierungen ungleich Null (7, 3), (12, 3), (20, 3) und (24, 3) einen Produktpositionsvektor (9, 3, 1), (14, 3, 1), (22, 3, 1) und (26, 3, 1).
  • Die Zielberechnungseinheit 330 linearisiert dann die Koordinaten der Ausgabeposition, um eine Akkumulatoradresse zu erzeugen, welche an das F*I-Zuteilungskoppelfeld 335 ausgegeben wird. Tabelle 5 ist ein Pseudocode für die Operationen, welche in der F*I-Multipliziereranordnung 325 und der Zielberechnungseinheit 330 ausgeführt werden. Tabelle 5: Pseudocode für Produkt- und Positionsberechnungen
    Figure DE102017117381A1_0006
  • Das „forall” in Tabelle 5 impliziert, dass alle P Iterationen der inneren Schleife parallel ausgeführt werden – in einem einzigen Zyklus. Nach einem Berechnen der Ausgabeposition jedes Produkts p[t] in der Form (x, y, k) wird die Ausgabeposition in eine Akkumulatoradresse p[t].a gemäß der Formel linearisiert: P[t].a = p[t].x + p[t].y*max_x_oa + p[t].k*max_x_oa*max_y_oa (1)
  • Es sei angemerkt, dass max_x_oa typischerweise um Eins weniger als R, der Breite des Faltungskerns, max_x_weight, größer als max_x_ia ist. In ähnlicher Weise ist m_y_oa typischerweise um Eins weniger als S, der Höhe des Faltungskerns, max_y_weight, größer als max_y_ia. max_x_oa und max_y_oa bezeichnen die Dimensionen des Halo. Bei einer Fortsetzung des vorherigen Beispiels wird der Ausgabepositionsvektor (9, 3, 0), (14, 3, 0), (22, 3, 0) und (26, 3, 0) in 105, 110, 118 und 122 gewandelt wobei angenommen wird, dass eine Ausgabekachel max_x_oa = 32 aufweist.
  • Das F*I-Zuteilungskoppelfeld 335 überträgt die Produkte dem zugeordneten Akkumulator in der Akkumulatoranordnung 340 abhängig von den Produktpositionen. Die niederwertigen Bits der linearisierten Akkumulatoradresse werden durch das F*I-Zuteilungskoppelfeld 335 eingesetzt, um jedes Produkt zu einer Akkumulatoreinheit in der Akkumulatoranordnung 340 zu routen, und das Produkt wird durch den Addierer in der Akkumulatoranordnung 340 zu einer Teilsumme addiert, welche durch die hochwertigen Bits der Adresse ausgewählt wird. Die Arbeitsweise des F*I-Zuteilungskoppelfelds 335 wird im Detail mit Bezug zu 3C beschrieben.
  • Wenn eine Entscheidung getroffen wird und zwei Produkte derselben Ausgabeposition (z. B. Adresse) zugeordnet werden, wird eines der zwei Produkte durch das F*I-Zuteilungskoppelfeld 335 übertragen und in einer Akkumulatoreinheit in der Akkumulatoranordnung 340 gespeichert, während das andere Produkt, welches für dieselbe Akkumulatoreinheit bestimmt ist, durch das F*I-Zuteilungskoppelfeld 335 angehalten wird. Jede Akkumulatoreinheit kann als eine Bank von einem adressierbaren Speicher kombiniert mit einem Addierer angesehen werden, so dass Produkte, welche derselben Adresse zugeordnet sind, akkumuliert bzw. addiert werden können. Wenn ein Produkt angehalten wird, werden bei einer Ausführungsform Ausgaberegister in der F*I-Multipliziereranordnung 325 angehalten und eine Berechnung von neuen Produkten angehalten. Bei einer Ausführungsform wird ein FIFO-Puffer an dem Ausgang von jedem Multiplizierer in der F*I-Multipliziereranordnung 325 eingesetzt, um Lastungleichgewichte zwischen Akkumulatoreinheiten zu glätten. Eine Leistungsverbesserung kann auftreten, wenn die Anzahl von Bänken A größer als die Anzahl der Produkte F*I ist. Bei einer Ausführungsform gilt A = 2F*I, wobei F*I = 16 und A = 32 gilt.
  • Nachdem alle Teilsummen für eine Kachel berechnet worden sind, wird die doppelt gepufferte Akkumulatoranordnung 340 geschaltet. Das PE 210 kann mit der Verarbeitung der nächsten Kachel beginnen, wobei das „primäre” der Akkumulatoranordnung 340 verwendet wird, während die Nachbearbeitungseinheit 345 eine Nachbearbeitung der letzten Kachel parallel beginnt, wobei das „sekundäre” der Akkumulatoranordnung 340 verwendet wird. Die Nachbearbeitungseinheit 345 führt die folgenden Schritte durch: eine Halobestimmung, eine Evaluierung der nichtlinearen Funktion und eine Codierung. Die Addierer und Register in der „sekundären” Akkumulatoranordnung 340 werden auch gelöscht, um die Teilsummen für eine nachfolgende Kachel auf Werte von Null zu zwingen, wenn der Codierungsprozess abgeschlossen ist.
  • Scatter-Add
  • Eine Scatter-Add-Funktion wird durch eine Kombination des F*I-Zuteilungskoppelfeld 335 und der Akkumulatoranordnung 340 durchgeführt. Das F*I-Zuteilungskoppelfeld 335 empfängt F*I = P Produkte und Ausgabepositionen von der FxI-Multipliziereranordnung 325. Bei einer Ausführungsform sind die Ausgabepositionen als lineare Adressen repräsentiert. Die Produkte werden an die Addierer in der Akkumulatoranordnung 340 geroutet, wobei jedes Produkt zu einem bestimmten Addierer, ausgewählt durch die lineare Adresse, welche dem Produkt zugeordnet ist, geroutet wird. Bei einer Ausführungsform werden Produkte durch einen Puffer (z. B. eine Akkumulatoreinheit) zu dem Addierer geroutet. Das Produkt wird dann zu dem Wert addiert, welcher in dem Register gespeichert ist, welches paarweise mit dem Addierer angeordnet ist, um eine Teilsumme zu erzeugen. Die Tabelle 6 ist der Pseudocode für die Scatter-Add-Funktion, welche durch das F*I-Zuteilungskoppelfeld 335 und die Akkumulatoranordnung 340 ausgeführt wird. Tabelle 6 Pseudocode für die Scatter-Add-Funktion
    Figure DE102017117381A1_0007
  • Um ein Adressieren der Addierer zu vereinfachen, sollte die Anzahl der Akkumulatoreinheiten eine Potenz von 2, A = 2b sein, wobei b eine ganzzahlige Zahl ist. Die niederwertigen Bits der Adresse selektieren die Akkumulatoreinheit, welche Acc[a] enthält, und die höherwertigen Bits der Adresse spezifizieren einen Offset in dem Speicher in der Akkumulatoreinheit. Das F*I-Zuteilungskoppelfeld 335 enthält ein Netzwerk, um die Werte zu der richtigen Akkumulatoreinheit zu routen. A sollte größer als F*I sein, um die Konkurrenzsituation für die Akkumulatoreinheiten zu verringern und um für einen adäquaten Verarbeitungsdurchsatz zu sorgen. Für kleine Werte von A kann das Netzwerk eine einzige Stufe eines Zuteilungsmultiplexers sein. Für größere Werte von A kann ein mehrstufiges Netzwerk eingesetzt werden, um die Verdrahtungskomplexität zu verringern. Bei einer Ausführungsform wird ein FIFO bei jedem Eingang zu dem F*I-Zuteilungskoppelfeld 335 bereitgestellt, um ein Lastungleichgewicht zwischen den Akkumulatoreinheiten zu glätten.
  • 3C stellt ein einstufiges F*I-Zuteilungskoppelfeld 335 gemäß einer Ausführungsform dar. Das einstufige F*I-Zuteilungskoppelfeld 135 weist ein FIFO 362, einen Decoder 364, einen Zuteiler 365, einen Multiplexer 366 und ein Oder-Gatter 370 auf. Eine Akkumulatoreinheit 368 in der Akkumulatoranordnung 340 ist mit dem Ausgang des Multiplexers 366 gekoppelt. Head-of-Line-Blocking bei der Akkumulatoranordnung 340 kann vermieden werden, indem mehrere Eingangs-FIFOs bei den Akkumulatoreinheiten 368 eingesetzt werden, wobei jedes FIFO Paare (p, a) für eine Teilmenge der Akkumulatoreinheiten 368 hält. Nur ein Eingang und eine Akkumulatoreinheit 368 sind in 3C dargestellt. Ein vollständiges F*I-Zuteilungskoppelfeld 335 weist P FIFOs 362, P Decoder 364, P Oder-Gatter 370, A Zuteiler 365 und A Multiplexer 366, welche mit A Akkumulatoreinheiten 368 gekoppelt sind, auf.
  • Die Produkte p[i] werden in das FIFO 362 geschoben. Bei einer Ausführungsform weist das FIFO 362 eine Tiefe von 2 oder 3 auf. Wenn jedes der FIFOs 362 gefüllt ist, ist das F*I-Zuteilungskoppelfeld 335 nicht bereit und hält die F*I-Multipliziereranordnung 325 an. Die Ausgabe des FIFO 362 besteht aus einem Produkt p[i] und einer Adresse a[i]. Das Produkt p[i] von dem Eingang i wird mit dem i-ten Eingang des Multiplexers 366 an dem Eingang jeder Akkumulatoreinheit 368 verbunden. Die niederwertigen Bits der Adresse a[i] werden durch den Decoder 364 in einen One-Hot-Anforderungsvektor r[i][j] decodiert. Über alle Eingänge gilt, wenn r[i][j] wahr ist, impliziert das, dass der Eingang i eine Anforderung für die j-te Akkumulatoreinheit 368 ausbildet. Wenn das FIFO 362 leer ist, wird der Decoder 364 deaktiviert, so dass keine Anforderungen geltend gemacht werden. Bei einer Ausführungsform wird die Auswahl der niederwertigen Bits von a[i] durch einen Hash bzw. Hashwert ersetzt, um die Adressen in der Akkumulatoranordnung 340 über die Akkumulatoreinheiten 368 zu verteilen, um Bankkonflikte zu verringern.
  • Jede Akkumulatoreinheit 368 in der Akkumulatoranordnung 340 fungiert als eine Speicherbank (z. B. eine Latch- oder Registeranordnung), welche einem Addierer zugeordnet ist. Die Anforderungen rq[*][j] von dem Decoder 364 an die Akkumulatoreinheit 368 werden dem Zuteiler 365 eingegeben. Der Zuteiler 365 erzeugt einen Zugangsgewährungs-Vektor gr[*][j] (wobei das gewinnende i für die Akkumulatoreinheit 368 j ausgewählt wird). Über alle Akkumulatoreinheiten 368 gilt, wenn das Bit gr[i][j] der P×I-Zugangsgewährungs-Matrix wahr ist, impliziert dies, dass dem Eingang i Zugang zu der Akkumulatoreinheit 368 j für den nächsten Zyklus gewährt wird. Die Zugangsgewährungs-Signale werden eingesetzt, um sowohl den Multiplexer 366 zu steuern, als auch um das gewinnende Produkt und die gewinnende Adresse von den Multiplexereingängen auszuwählen und einen Hinweis zurück zu dem FIFO 362 bereitzustellen – so dass das gewinnende Produkt am Ende des Verarbeitungszyklus aus dem FIFO 362 ausgegliedert wird.
  • 3D stellt die Akkumulatoreinheit 368 gemäß einer Ausführungsform dar. Die Akkumulatoreinheit 368 weist ein Flipflop 382, eine Speicheranordnung 380 und einen Addierer 385 auf. Die Adressausgabe des Multiplexers 366 wird eingesetzt, um ein Latch oder Register von der Speicheranordnung 382 zur Ausgabe zu dem Addierer 385 auszuwählen. Die Speicheranordnung 380 speichert Teilsummen und wird mittels der Adresse a'[i] ausgelesen. Das Produkt p'[i], welches durch die Akkumulatoreinheit 368 empfangen wird, wird zu der Teilsumme aufsummiert, welche in der Speicheranordnung 380 an der Stelle gespeichert ist, die der Adresse a'[i] zugeordnet ist. Wie in 3D dargestellt ist, wird die Adresse a'[i] durch ein Flipflop 382 abgegriffen und dadurch um einen Taktzyklus verzögert, um als eine Schreibadresse zum Speichern der Summenausgabe von dem Addierer 385 eingesetzt zu werden. Bei anderen Ausführungsformen kann a'[i] um mehr als einen Taktzyklus verzögert werden, um die Summe, welche durch den Addierer 385 erzeugt wird, zu dem Produkt in der Teilsumme zu akkumulieren.
  • Head-of-Line-Blocking bei der Akkumulatoranordnung 340 kann vermieden werden, indem mehrere Eingangs-FIFOs bei der Akkumulatoreinheit 368 eingesetzt werden und wobei jedes FIFO Paare (p, a) für eine Teilmenge der Akkumulatoreinheiten 368 hält. Bei einer Ausführungsform wird ein separates FIFO an jedem Eingang zu jedem Addierer 385 für jede der Akkumulatoreinheiten 368 bereitgestellt (d. h. eine virtuelle Ausgabereihenbildung wird an den Ausgängen der Akkumulatoreinheit 368 eingesetzt). Ein Nachteil des einstufigen F*I-Zuteilungskoppelfels 335, welches in 3C dargestellt ist, ist die komplexe Verdrahtung, da ein direkter Pfad von jeder Produkteingabe zu jeder Akkumulatoreinheit 368 existiert, was zu P × A Pfaden führt. Wenn zum Beispiel P = 16 und A = 32 gilt, dann existieren 612 Pfade, wobei jeder ein Produkt, eine Adresse, eine Anforderung und eine zurückkehrende Zugangsgewährung trägt. Die Verdrahtungskomplexität kann verringert werden, indem die Scatter-Add-Funktion faktorisiert wird.
  • 3E stellt ein zweistufiges F*I-Zuteilungskoppelfeld 380 gemäß einer Ausführungsform dar. Obwohl das zweistufige F*I-Zuteilungskoppelfeld 335 für P = 16 und A = 32 beschrieben ist, können andere Werte für P und A bei zwei oder mehr Stufen eingesetzt werden. Eine erste Stufe besitzt 4 Instanzen des einstufigen F*I-Zuteilungskoppelfelds 335 mit P = 4 und A = 8. Eine zweite Stufe besitzt 8 Instanzen des einstufigen F*I-Zuteilungskoppelfelds 335 mit P = 4 und A = 4. Jede der Stufen erfordert 128 direkte Pfade. Die Anzahl der Stufen kann erhöht werden, um die Anzahl der direkten Pfade zu verringern. Bei einer Ausführungsform sind FIFOs an den Zwischenstufen eines mehrstufigen Zuteilungskoppelfelds vorhanden. Wenn jedoch alle Zuteilungen in einem Verarbeitungszyklus abgeschlossen werden können, stellen die FIFOs an den Zwischenstufen nicht unbedingt irgendeinen Vorteil bezüglich eines Verarbeitungsdurchsatzes dar.
  • Die Energie zum Zugreifen auf die Akkumulatoranordnung 340 kann reduziert werden, indem Produkte kombiniert werden, welche derselben Ausgabeposition zugeordnet sind. Bei einer Ausführungsform werden die Produkte an den Akkumulatoreinheiten 368 in einem Kombinationspuffer (z. B. ein FIFO mit 8 Eingängen) gepuffert, um die Wahrscheinlichkeit für das Kombinieren zu maximieren, und die Produkte werden nur in der Teilsumme akkumuliert, wenn der Kombinationspuffer voll ist. Adressen von ankommenden Produkten werden mit Einträgen in dem Kombinationspuffer verglichen und wenn eine Adresse eines ankommenden Produkts mit der Adresse eines gespeicherten Produkts übereinstimmt, wird das ankommende Produkt mit dem gespeicherten Produkt aufsummiert. Bei einer Ausführungsform weisen die Kombinationspuffer mehrere Schreibanschlüsse auf, wodurch zwei oder mehr ankommende Produkte gleichzeitig in den Kombinationspuffer eingefügt werden können.
  • Nachverarbeitung
  • Die Nachverarbeitungseinheit 345 führt drei Funktionen aus: eine Halobestimmung, eine Evaluierung nichtlinearer Funktionen und eine Codierung der dünnbesetzten Ausgabeaktivierungen. Bei einer Ausführungsform ist die Akkumulatoranordnung 340 doppelt gepuffert. Die drei Funktionen werden auf einer vollständigen Kachel von Ausgabeaktivierungen in der zweiten Akkumulatoranordnung 340 ausgeführt, während eine aktuelle Kachel von Ausgabeaktivierungen in der primären Akkumulatoranordnung 340 berechnet wird.
  • Die Anzahl der durchzuführenden Operationen der Nachbearbeitungseinheit 345 ist im Vergleich zu der FxI-Multipliziereranordnung 325 relativ gering. Die FxI-Multipliziereranordnung 325 führt eine sechsfach verschachtelte Schleife (über x, y, r, s, c, k) aus, während die Nachbearbeitungseinheit 345 nur eine dreifach verschachtelte Schleife (über x, y, k) ausführt. Daher sollte eine Nachbearbeitungseinheit 345, welche eine Operation pro Zyklus ausführt, mit einer FxI-Multipliziereranordnung 325 Schritt halten, welche 16 Operationen pro Zyklus ausführt. Bei einer Ausführungsform ist die Nachbearbeitungseinheit 345 mittels eines Mikrocontrollers oder einer Zustandsmaschine implementiert.
  • Der Pseudocode für die Halobestimmung ist in Tabelle 7 dargestellt. Tabelle 7: Pseudocode für die Halobestimmung
    Figure DE102017117381A1_0008
  • Der in Tabelle 7 dargestellte Pseudocode iteriert über die acht Halobereiche. Jeder Bereich wird durch ein 7-Tupel beschrieben, welches von einer Bereichsdeskriptortabelle geladen wird. Das 7-Tupel weist die x- und y-Bereiche des Halobereichs in dem Ursprungs-PE bzw. Ausgangs-PE 210 (x1:x2, y1:y2) auf. Das 7-Tupel weist den x- und y-Versatz (xo, yo) auf, um eine Position in diesem PE 210 zu einer Position in dem Ziel-PE 210 zu versetzen. (Die Versätze sind Werte mit einem Vorzeichen). Schließlich weist das 7-Tupel die Nachbarzahl des Ziel-PEs 210 auf. Die Funktion linearAddress wandelt (x, y, k) in eine lineare Akkumulatoradresse um, gemäß: linearAddress(x, y, k) = x + y*max_x_oa + k*max_x_oa*max_y_oa (2)
  • Es sei ein Beispiel betrachtet, wobei R × S = 3 × 3 Faltungen auf Eingabeaktivierungen mit den Dimensionen 50 × 50 × c durchgeführt werden, und wobei das Ergebnis ein Satz von Ausgabeaktivierungen mit den Dimensionen 52 × 52 × |h| ist. Das Halo besteht aus acht Bereichen – vier Rändern und vier Ecken. Die vier Bereichsdeskriptoren für diesen Fall sind in Tabelle 8 dargestellt. Tabelle 8: Halo-Bereichsdeskriptoren für R = S = 3 und W = H = 50
    Region x1 x2 y1 y2 xo yo PE
    Left 0 0 1 51 51 0 (–1, 0)
    Top 1 51 0 0 0 51 (0, –1)
    Right 52 52 1 51 –51 0 (1, 0)
    Bottom 1 51 52 52 0 –51 (0, 1)
    Upper-Left 0 0 0 0 51 51 (–1, –1)
    Upper-Right 52 52 0 0 –51 51 (1, –1)
    Lower-Right 52 52 52 52 –51 –51 (1, 1)
    Lower-Left 0 0 52 52 51 –51 (-1, 1)
  • In dem Beispiel spezifiziert der Bereich Left einen Ausgangsbereich von (0,1:51), einen Versatz von (51, 0) und ein PE 210 mit den Koordinaten (–1, 0) relativ zu dem aktuellen PE 210. Der Versatz führt zu dem Zielbereich (51, 1:51). Die Nachbearbeitungseinheit 345 setzt den Deskriptor ein, um die Akkumulatoranordnung 340 in dem PE 210 zu lesen, über den linken Rand zu gehen und Wert-, Positions-Paare an ein Nachbar-PE 210 nach links (–1, 0) zu senden. Das Nachbar-PE 210 verarbeitet die Wert-, Positions-Paare in derselben Weise wie die Wert-, Positions-Paare, welche von der FxI-Multipliziereranordnung 325 kommen, mit der Ausnahme, dass die Wert-Positions-Paare den sekundären Akkumulatoreinheiten 368 eingegeben werden. Zusätzliche Eingabeanschlüsse sind durch das FxI-Zuteilungskoppelfeld 335 vorhanden, um die Wert-, Positions-Paare von jedem der benachbarten PEs 210 zu den sekundären Akkumulatoreinheiten 368 zu routen. Die PEs 210 an den Rändern und Ecken der PE-Anordnung in dem SCNN-Beschleuniger 200 sind die fehlenden 3(Rand-) oder 5(Eck-)Nachbarn. Die Deskriptoren für die fehlenden Nachbarn sind als ungültig markiert, was bewirkt, dass die Nachbearbeitungseinheit 345 die Halobestimmung für die nicht existierenden Nachbarn überspringt.
  • Nachdem die Halobestimmung für ein PE 210 und alle seine direkten Nachbarn abgeschlossen ist, scannt die Nachbearbeitungseinheit 345 die Akkumulatoranordnung 340 und führt eine nichtlineare Funktion für jede Ausgabeaktivierung in der Kachel aus. Der Pseudocode für die nichtlineare Funktion ist in Tabelle 9 dargestellt. Tabelle 9: die nichtlineare Funktion
    Figure DE102017117381A1_0009
  • Der in Tabelle 9 dargestellte Pseudocode iteriert über den Nicht-Halobereich der Akkumulatoranordnung 340. Der Nicht-Halobereich weist alle der Akkumulatoreinheiten in der Akkumulatoranordnung 340 auf, welche nicht Teil eines Rand- oder Eckbereichs sind. Bei dem vorherigen Beispiel ist der Nicht-Halobereich (1:51, 1:51). Die am häufigsten eingesetzte nichtlineare Funktion ist die gleichgerichtete nichtlineare Funktion (ReLU), welche negative Werte in Null wandelt, aber andere Funktionen (wie z. B. Sigmoid) können auch eingesetzt werden. Einige Funktionen können näherungsweise als stückweise lineare Funktionen angesehen werden. Bei einer Ausführungsform werden positive Werte unterhalb eines vorbestimmten Schwellenwerts auf 0 und negative Werte oberhalb eines vorbestimmten Schwellenwerts auf 0 gelegt.
  • Nachdem die nichtlineare Funktion auf die Kachel in den sekundären Registern in der Akkumulatoranordnung 340 angewendet worden ist, wird die Kachel codiert, um Elemente ungleich Null zu komprimieren. Der Pseudocode für die Komprimierungsoperation ist in Tabelle 10 dargestellt. Tabelle 10: Pseudocode für die Komprimierungsoperation
    Figure DE102017117381A1_0010
  • Der in Tabelle 10 dargestellte Pseudocode geht über die Akkumulatoranordnung 340 mit einem Kanal von Ausgabeaktivierungen zu einem Zeitpunkt und schreibt einen (Wert-, Positions)-Eintrag in den Ausgabeaktivierungspuffer 350 und den Indexpuffer 355 für jeden Ausgabeaktivierungswert ungleich Null. Die Funktion „encode” codiert die Position relativ zu der letzten Position unter Verwendung einer der im Folgenden beschriebenen Verfahren. Es sei angemerkt, dass „encode” ein oder mehrere „Dummy”-Werte (ein Wert ungleich Null mit einem Wert von Null) emittiert, wenn der Unterschied zwischen der aktuellen Position (x, y) und „lastNZPos” nicht direkt codiert werden kann. Nachdem jeder Kanal abgearbeitet worden ist, wird die Anzahl von Werten ungleich Null in diesem Kanal (nzCount) in einer separaten Tabelle gespeichert. Wenn Ausgaben codiert werden, adressiert der OAptr einzelne (Wert-, Poistions-)Einträge in dem Ausgabeaktivierungspuffer 350 und dem Indexpuffer 355. Nachdem alle Kacheln in einer Schicht des neuronalen Netzes fertig bearbeitet worden sind, wechseln der Ausgabeaktivierungspuffer 350 und der Indexpuffer 355 und der Eingabeaktivierungspuffer 310 und der Puffer 320 jeweils ihre Funktionen und die nächste Schicht des neuronalen Netzes wird bearbeitet. Wenn der Ausgabeaktivierungspuffer 350 und der Indexpuffer 355 umgeschaltet werden, liest der IAptr vier Vektoren von (Wert, Position) zu einem Zeitpunkt.
  • Um die Parallelisierung über einen einzelnen PE 210 hinaus zu erhöhen, werden mehrere PEs 210 parallel betrieben, wobei jedes auf einer getrennten dreidimensionalen Kachel von Eingabeaktivierungen arbeitet. Aufgrund der durchgehenden Komprimierung von Aktivierungen können die Eingabe- und Ausgabe-Aktivierungen beide von jeder Kachel lokal bezüglich des PE 210, welches die Kachel bearbeitet, gespeichert werden, wobei eine energiehungrige Datenübertragung weiter verringert wird. Insgesamt stellt der SCNN-Beschleuniger 200 eine effiziente komprimierte Speicherung und Zuführung von Eingabeoperanden zu der FxI-Multipliziereranordnung 325, eine hohe Wiederverwendbarkeit der Eingabeoperanden in der FxI-Multipliziereranordnung 325 bereit, und dies verbraucht keine Verarbeitungszyklen für Multiplikation mit Operanden gleich Null.
  • komprimierte-dünnbesetzte Gewichte und Aktivierungen
  • Um einen Energieverbrauch von Gewichten und Eingabeaktivierungen mit dem Wert Null zu verringern, nutzt die Architektur des SCNN 200 dünnbesetzte Gewichte und Aktivierungen aus. Eine dichte Codierung von dünnbesetzten Gewichten und Aktivierungen wird unter verschiedenen Stufen der Speicherhierarchie und unter verschiedenen Logikschaltungen in dem SCNN 200 eingesetzt, um die Bandbreite zu verringern, welche erforderlich ist, um die Gewichts- und Aktivierungswerte von dem Speicher zu dem SCNN 200 zu übertragen. Eingabedaten, wie z. B. Gewichte und Aktivierungen mit Werten gleich Null, können in einer kompakten Form dargestellt werden, was als komprimiertes-dünnbesetztes Format bezeichnet wird. Der Umfang, mit welchem die Eingabedaten komprimiert werden können, erhöht sich mit der Anzahl von Nullen. Auch wenn nur 10% der Mehrbitelemente gleich Null sind, kann es sinnvoll sein, die Eingabedaten in dem komprimierten-dünnbesetzten Format zu codieren. Ein Codieren der dünnbesetzten Gewichte und/oder Aktivierungen verringert den Daten-Fußabdruck, was ermöglicht, größere Matrizen in einer Speicherstruktur vorgegebener Größe, wie z. B. dem Eingabeaktivierungspuffer 235 um dem Gewichtspuffer 230, zu speichern. Bei einer Ausführungsform weisen der Gewichtspuffer 230 und der Eingabeaktivierungspuffer 235 jeweils einen Overhead von 10 Bit für jeden Wert von 16 Bit auf, um mehrdimensionale Positionen von Elementen ungleich Null in dem komprimierten-dünnbesetzten Format zu codieren.
  • 4A stellt einen Flussplan eines Verfahrens 400 zur Verarbeitung von komprimierten-dünnbesetzten Daten in dem SCNN 200 gemäß einer Ausführungsform dar. Obwohl das Verfahren 400 im Kontext eines Verarbeitungselements in dem SCNN 200 beschrieben wird, kann das Verfahren 400 auch durch ein Programm, eine Anwenderschaltung oder durch eine Kombination aus einer Anwenderschaltung und eines Programms ausgeführt werden. Darüber hinaus versteht der Fachmann, dass jedes System, welches das Verfahren 400 ausführt, im Umfang und im Geist der Ausführungsformen der vorliegenden Erfindung liegt.
  • Im Schritt 405 werden komprimierte-dünnbesetzte Daten für eine Eingabe zu dem PE 210 empfangen, wobei die komprimierten-dünnbesetzten Daten Elemente ungleich Null codieren und entsprechende mehrdimensionale Positionen codieren. Bei einer Ausführungsform repräsentieren die komprimierten-dünnbesetzten Daten Gewichtswerte. Bei einer anderen Ausführungsform repräsentieren die komprimierten-dünnbesetzten Daten Eingabeaktivierungswerte.
  • Bei Schritt 410 werden die Elemente ungleich Null parallel durch das PE 210 verarbeitet, um mehrere Ergebniswerte zu erzeugen. Bei einer Ausführungsform werden die Elemente ungleich Null in der FxI-Multipliziereranordnung 325 multipliziert, um Ergebniswerte zu erzeugen, welche Produkte sind. Bei Schritt 415 werden die entsprechenden mehrdimensionalen Positionen parallel verarbeitet, um Zieladressen für den jeweiligen Ergebniswert in der Vielzahl von Ergebniswerten zu erzeugen. Bei einer Ausführungsform werden die mehrdimensionalen Positionen in der Zielberechnungseinheit 330 bearbeitet, um für jeden der Ergebniswerte eine Zielakkumulatoradresse zu erzeugen, welche einer Stelle in der Akkumulatoranordnung 340 zugeordnet ist. Genauer gesagt kann die Zielakkumulatoradresse eine Stelle in der Speicheranordnung 380 (d. h. eine Bank) in einer Akkumulatoreinheit 368 anzeigen. Bei Schritt 420 wird jeder Ergebniswert zu einer Akkumulatoreinheit 368 übertragen, welche der Zieladresse für den Ergebniswert zugeordnet ist. Bei einer Ausführungsform ist jeder Ergebniswert ein Produkt, welches durch das FxI-Zuteilungskoppelfeld 335 zu einer der Akkumulatoreinheiten 368 abhängig von der entsprechenden Zieladresse übertragen wird.
  • Bei einer Ausführungsform setzt das SCNN 200 einen einfachen komprimierten-dünnbesetzten Codierungsansatz basierend auf einem Lauflängencodierungsschema ein. Ein Datenvektor kann von den komprimierten-dünnbesetzten codierten Daten extrahiert werden, wobei der Datenvektor eine Folge von Werten ungleich Null ist. Ein Indexvektor kann von den komprimierten-dünnbesetzten codierten Daten extrahiert werden, wobei der Indexvektor eine Folge einer Anzahl von Nullwerten (die Anzahl von Nullen zwischen jeweiligen Elementen ungleich Null) ist. Zum Beispiel entspricht eine komprimierte-dünnbesetzte Codierung der Daten, welche in 3B dargestellt sind, (a, b, c, d, e, f) und (2, 0, 3, 4, 1, 1), die einen Datenvektor und einen entsprechenden Indexvektor repräsentieren, wobei jedes Element in dem Indexvektor eine Anzahl von Nullwerten ist, welche dem entsprechenden Element ungleich Null voranstehen.
  • Ein Bestimmen der Koordinaten einer Stelle in der Akkumulatoranordnung 340 für jede Produktausgabe durch einen Multiplizierer in der FxI-Multipliziereranordnung 325 erfordert ein Lesen der Indexvektoren für F und I und ein Kombinieren der Indexvektoren mit den Koordinaten eines Abschnitts des Ausgabeaktivierungsraums, welcher aktuell bearbeitet wird. Vier Bits pro Index ermöglichen, dass bis zu 15 Nullwerte zwischen irgendwelchen zwei Elementen ungleich Null existieren. Wenn mehr als 15 Nullwerte zwischen zwei Elementen ungleich Null vorhanden sind, wird ein Nullwert-Platzhalter (d. h. ein Nullfüllwert) als ein dazwischenkommendes Element ungleich Null eingefügt, ohne dass eine merkliche Verschlechterung in der Kompressionseffizienz erzielt wird. Mit einer erwarteten Dichte von Elementen ungleich Null von 30% existieren im Mittel näherungsweise zwei Nullwerte zwischen Elementen ungleich Null.
  • Während das SCNN 200 am effizientesten arbeitet, wenn die Aktivierungen in die Eingabeaktivierungspuffer 235 passen, können große Netze erfordern, dass Aktivierungen gesichert und von einem DRAM durch die Speicherschnittstelle 205 wiederhergestellt werden. Daher kann das SCNN 200 einen Tiling-Ansatz einsetzen, welcher auf einer 2D-Teilmenge des Aktivierungsraums zu einem Zeitpunkt arbeitet. Die vom DRAM erforderlichen Zugriffe, um eine Kachel von Eingabeaktivierungen zu lesen, können verborgen werden, indem die Leseoperationen zusammen mit der Berechnung der vorherigen Kachel von Ausgabeaktivierungen hintereinander ausgeführt werden. In ähnlicher Weise kann ein Lesen der Gewichte von dem DRAM auf einer Kachelgranularität ausgeführt werden.
  • Bei einer Ausführungsform werden die Gewichte in einem komprimierten-dünnbesetzten Format von Kacheln codiert, welche höchstens K Ausgabekanäle aufweisen, und die Kacheln werden durch einen Eingabekanal geordnet. Das Ziel ist, die Wiederverwendung von Eingabeaktivierungen unter Voraussetzung einer feststehenden Anzahl von Akkumulatoren (und damit einer Begrenzung der Anzahl der Ausgabekanäle) zu maximieren. Das komprimierte-dünnbesetzte Format ermöglicht ein Lesen von W Gewichten und entsprechenden Positionen (r, s, k) parallel für einen Eingabekanal c. Daher ist ein Format, bei welchem die Gewichte und die Positionen feste Stellen aufweisen, wünschenswert, – so dass eine inkrementelle Decodierung nicht erforderlich ist. Die Gewichtswerte entsprechen einer vier-dimensionalen Matrix, wobei x, y, c und k die vier Dimensionen sind. Eine Kachel ist eine Scheibe eines Gewichtsdatenvektors k mit {k1, k2, ..., kK} – d. h. beliebige Werte r, s, aber mit k beschränkt auf eine Gruppe von K Werten. Eine Kachel kann in ein komprimiertes-dünnbesetztes Format codiert werden, was K (die Anzahl der Ausgabekanäle), k1, k2, ..., kK (die aktuellen Zahlen der K Ausgabekanäle) und C (die Anzahl der Eingabekanäle in der Kachel) einschließt. Für jeden Eingabekanal weist das komprimierte-dünnbesetzte Format einen codierten Deltaindex c für den Eingabekanal (d. h. eine Differenz von dem vorherigen Eingabekanal) und eine Anzahl der Gewichte ungleich Null in dem Eingabekanal auf. Für jeden Ausgabekanal k weist das komprimierte-dünnbesetzte Format drei Parameter für jedes Gewicht ungleich Null in dem Kern ck auf. Ein erster Parameter ist die Anzahl von Nullen zwischen dem vorherigen Gewicht ungleich Null und dem aktuellen Gewicht. Es sei angemerkt, dass die Nullwerte am Ende eines Kerns und dem Beginn des nächsten Kerns zusammen codiert werden. Ein zweiter Parameter ist der codierte Gewichtswert wxyck, welcher entweder ein binäres Gewicht oder einen Index in einem Codebuch repräsentiert.
  • 4B stellt eine Kachel 340 von Gewichtswerten für zwei Ausgabekanäle gemäß einer Ausführungsform dar. Bei einer Ausführungsform können 3 × 3-Faltungen mittels der Kachel 340 von Gewichtswerten über zwei Eingabekanäle ausgeführt werden, um Ergebnisse für zwei Ausgabekanäle zu erzeugen. Die Kachel 340 von Gewichtswerten ist dünn besetzt und kann in einem komprimierten-dünnbesetzten Format dargestellt werden.
  • Bei einer Ausführungsform ist die Kachel 340 von Gewichtswerten als {2, 1, 2, 4, 0, 6, 1, 3, 4, 4, 1, 5, 0, 6, 3, 7, 3, 8, 0, ...} codiert. Die ersten vier Symbole bezeichnen die „Form” der Kachel K = 2 mit k1 = 1 und k2 = 2 und C = 4. Die erste 0 bezeichnet den ersten Eingabekanal mit einem Versatz von 0 von der Startposition, c = 0. Die folgende 6 zeigt an, dass sechs Gewichte ungleich Null in dem ersten Eingabekanal existieren. Die nächsten sechs Symbole sind Nullanzahl-, Gewichts-Paare, welche den Kern c = 0, k = 1 codieren. Die 1 zeigt an, dass es einen Nullwert vor der 3 gibt, und die erste 4 zeigt an, dass 4 Nullwerte zwischen der 3 und der 4 liegen. Da die 5 die letzte Position für c = 0, k = 1 ist, wissen wir, dass die 0 nach der 5 der Beginn der Codierung des nächsten Kanals ist. Die nächsten 6 Symbole codieren den Kern c = 0, k = 2. Die letzte 0 zeigt an, dass es keine leeren Kanäle vor dem nächsten Eingabekanal gibt, so dass die nächsten Symbole den Kanal c = 1 codieren. Die Folge von Nullanzahlen zeigt die Anzahl von Nullwerten bzw. Nullen vor dem ersten Gewichtswert ungleich Null und zwischen benachbarten Paaren von Gewichtswerten ungleich Null an.
  • Nach einem Abstreifen des Kachelkopfes (2, 1, 2, 4) und des Kanalkopfes (0, 6) können die nächsten 12 Symbole parallel als der Datenvektor und der Indexvektor gelesen werden, was sechs Gewichte zusammen mit den entsprechenden Positionen r, s, k ergibt. Eine laufende Summe ist erforderlich, um einen linearen Index für jedes Gewicht zu berechnen, und die linearen Indices werden dann zu den Positionskoordinaten r, s, k gewandelt. Um es einfacher zu machen, den linearen Index in die Koordinaten r, s zu decodieren, kann rmax auf die nächste Potenz von 2 aufgerundet werden. Zum Beispiel wird ein 3 × 3-Kern zu einem 3 × 4-(smax × rmax)-Kern, wobei die letzte Spalte der Gewichte auf Nullen gesetzt wird. Wenn eine laufende Summe eingesetzt wird, um den linearen Index zu berechnen, bilden bei einer Ausführungsform die niederwertigen zwei Bits r und die verbleibenden Bits s.
  • Jede Position r, s, k für ein Gewicht oder jede Position (x, y) für eine Eingabeaktivierung kann mittels der Positionskoordinaten des vorherigen Gewichts bzw. der vorherigen Eingabeaktivierung berechnet werden. Die Gewichtspositionsberechnung ist in Tabelle 11 dargestellt, wobei „value” der Nullanzahl entspricht. Tabelle 11: Pseudocode für die Positionsberechnungen
    Figure DE102017117381A1_0011
  • Ein r vom Koordinatentyp (R) codiert die Nullanzahl, d. h. die Anzahl von Nullen zwischen dem letzten Element ungleich Null und dem aktuellen Element ungleich Null. Wenn eine laufende Summe in jeder Dimension (z. B. position.r und position.s) den maximalen Dimensionswert für r (rmax) übersteigt, kann die Position optional umgebrochen werden – y wird inkrementiert und r wird um rmax verringert. Das y vom Koordinatentyp (S) inkrementiert die Koordinate s der Position um 1 und setzt die Position r auf den Wert. Das k vom Koordinatentyp (K) inkrementiert die Koordinate k der Position, setzt s auf 0 zurück und setzt r auf den Wert. Die Umbruchprozedur ist in Tabelle 12 dargestellt, wobei max_r rmax entspricht und max_s smax entspricht. Tabelle 12: Pseudocode für die Positionsberechnungen mit Umbruch
    Figure DE102017117381A1_0012
  • Ein Umbrechen kann möglicherweise zu einer dichteren Codierung führen – indem mehr Codierungsoptionen bereitgestellt werden. Jedoch erfordert die Unterstützung eines Umbrechens eine komplexere Decodierungsschaltung, um die Divisions- und Modulo-Operationen auszuführen. Eine Zwischenoption ist, ein Umbrechen auszuführen, es aber bezüglich rmax und smax auf Potenzen von 2 zu beschränken – wobei das Dividieren und das Modulo auf Schiebe- bzw. Maskierungs-Operationen vereinfacht wird. Alternativ kann das Umbrechen unterlassen werden, und der entsprechende Koordinatentyp muss die Koordinate s oder k vorrücken. Die Koordinaten (r, s, k) können durch die Koordinaten (x, y) ersetzt werden, wobei k ausgespart ist, um die Positionsberechnungen für die Eingabeaktivierungen auszuführen.
  • Bei einer Ausführungsform können die Gewichte als direkte 16-Bit oder 8-Bit-Werte paarweise angeordnet mit einem „Code”-Wert mit variabler Bitbreite, welcher eingesetzt wird, um ein „Codebuch” zu indizieren, um die zugehörige Nullanzahl zu lesen, repräsentiert werden. Verschiedene Codebücher können bei verschiedenen Kacheln eingesetzt werden. Die Codierung des Koordinatentyps und des Nullanzahlwerts sollte in einer Weise stattfinden, welche die Codierungseffizienz maximiert, indem mehr Codierungen bzw. Codewerte für allgemeinere Koordinatentypen und Nullanzahlen bereitgestellt werden.
  • 4C stellt ein Codierungsschema für Gewichte und Eingabeaktivierungen (IA) gemäß einer Ausführungsform dar. Ein 4-Bit-Code stellt den Koordinatentyp und den Nullanzahlwert dar. Andere Codierungsschemata sind möglich, und ein Codierungsschema kann mehr oder weniger als vier Bit einsetzen. Die Gewichtscodewerte weisen die Koordinatentypen R, S und K auf, während die Aktivierungscodewerte nur die Koordinatentypen X und Y aufweisen. Bei den Gewichten ist eine größere Anzahl von Codewerten (10) dem Koordinatentyp R gewidmet, da er am häufigsten eingesetzt wird. Das Inkrement zwischen den Werten muss nicht 1 sein. Zum Beispiel sind die Nullanzahlwerte R9 und X9 nicht vorhanden, um mehr „Reichweite” zwischen den Elementen ungleich Null zu ermöglichen. Neun Nullen zwischen zwei Elementen ungleich Null können als R4 (oder X4) beigefügt zu R4 (oder X4) mit einem Nullgewichtswert eingepackt zwischen den zwei Läufen von Nullen codiert werden. Für die Aktivierungscodierung kann eine aggressivere Codierung von langen Läufen von Nullen ermöglicht werden, mit großen Inkrementlücken zwischen den Codewerten.
  • Wenn Gruppen von F Gewichten und I Eingabeaktivierungen in jedem Zyklus von dem Gewichtspuffer 305 bzw. dem Eingabeaktivierungspuffer 310 gelesen werden, werden der Positionsabschnitt der Gewichte und der Eingabeaktivierungen, welche von dem Puffer 315 bzw. 320 gelesen werden, von den 4-Bit-Werten, welche in der in 4C dargestellten Tabelle dargestellt sind, auf die vollständigen Positionen (x, y) für die Aktivierungen und (r, s, k) für die Gewichte decodiert. Wie vorab erläutert ist, nimmt die FxI-Multipliziereranordnung 325F Gewichte und I Eingabeaktivierungen entgegen und erzeugt P = F*I Produkte. Jedes Produkt ist einer Position zugeordnet, welche durch die Zielberechnungseinheit 330 berechnet wird. Für alle Produkt-Positions-Paare werden die Gewichts- und Eingabeaktivierungswerte ungleich Null im komprimierten-dünnbesetzten Format ohne Expansion multipliziert. Der Positionsabschnitt des komprimierten-dünnbesetzten Formats weist Nullanzahlen auf, welche in (r, s, k) für jedes Gewicht und (x, y) für jede Eingabeaktivierung decodiert werden und dann addiert werden, um eine Position (x, y, k) für das entsprechende Produkt zu erzeugen. Die Produkt-Positionsberechnung wurde früher in Tabelle 5 dargestellt.
  • 4D stellt Gewichtswerte für vier 3 × 3-Faltungskerne 435 gemäß einer Ausführungsform dar. 4E stellt eine Codierung 440 der Positionen für die Gewichtswerte in den vier 3 × 3-Faltungskernen 435 gemäß einer Ausführungsform dar. Die erste Reihe der Codierung 440 umfasst einen Strom von 12 Codewerten, einen für jeden Gewichtswert ungleich Null in den vier 3 × 3-Faltungskernen 435. Mit einem Umbrechen und rmax = smax = 3 sind die Positionen in der ersten Reihe der Codierung 440 codiert. Der erste Wert S1 korrespondiert mit der Null in der oberen linken Position, welche von einer 3 gefolgt wird. Der Wert S4 folgt dem ersten Wert S1 und korrespondiert mit der Null in der ersten Reihe, welche der 3 folgt, und mit den drei Nullen in der zweiten Reihe des ersten Faltungskerns. Ein zweiter Wert S1, welcher dem Wert S4 folgt, korrespondiert mit der einen Null in der dritten Reihe des ersten Faltungskerns zwischen der 4 und der 5. Dem zweiten Wert S1 folgen zwei Werte SO, welche dem Ausbleiben von Nullen zwischen der 5 und der 6 und zwischen der 6 und der 7 in der ersten Reihe des zweiten Faltungskerns entsprechen. Den zwei Werten SO folgt ein Wert 55, welcher mit den fünf Nullen vor der 8 in der dritten Reihe des zweiten Faltungskerns korrespondiert. Die verbleibenden Codewerte werden dann in einer ähnlichen Weise abgeleitet.
  • Die zweite Reihe der Codierung 440, welche in 4E dargestellt ist, stellt die Positionen für die Gewichtswerte ungleich Null in den vier 3 × 3-Faltungskernen 435 dar. Die Positionen können abhängig von den Codewerten in der ersten Reihe bestimmt werden. Beginnend mit einer initialen Position von (0, 0, 0) wird der erste Wert S1 in die Position (r, s, k) = (1, 0, 0) decodiert, welcher in der zweiten Reihe dargestellt ist und welcher mit der Position des Gewichtswerts von 3 in der ersten Reihe des ersten Faltungskerns korrespondiert. Der erste Wert 84 wird in die Position (r, s, k) = (0, 2, 0) decodiert, welcher in der zweiten Reihe dargestellt ist und welcher mit der Position des Gewichtswerts von 4 in der dritten Reihe des ersten Faltungskerns korrespondiert. Die verbleibenden Positionen können in einer ähnlichen Weise abgeleitet werden.
  • Bei einer Ausführungsform werden lineare Indices für die Codewerte in der obersten Reihe der Codierung 440 abgeleitet, indem eine laufende Summe, welche bei –1 startet, berechnet wird und 1 für jeden Gewichtswert zusammen mit dem Nullanzahlwert addiert wird. Ein Extrahieren der Nullanzahlen von der obersten Reihe erzeugt {1, 4, 1, 0, 0, 5, 2, 1, 1, 1, 4, 1}. Wenn rmax auf 4 anstatt auf 3 gesetzt wird (für einen Faltungskern, welcher 4 × 3 anstatt von 3 × 3 ist), werden die Nullanzahlen {1, 6, 1, 0, 0, 7, 3, 2, 1, 2, 6, 1}. Die Nullanzahlen werden dann in eine laufende Summe gewandelt, welche bei –1 beginnt und eine 1 wird für jede Position für jedes der entsprechenden Gewichte hinzugefügt. Die laufende Summe, welche ein linearer Index Li der Nullanzahlen Ci ist, beträgt {1, 8, 10, 11, 12, 20, 24, 27, 29, 32, 39, 41), wobei Li = Li-1 + Ci + 1 und L0 = –1 gilt. Der lineare Index wird dann in die Positionskoordinaten (r, s, k) gewandelt.
  • Wenn rmax auf 4 gesetzt wird (oder eine andere Potenz von 2), kann r extrahiert werden, indem nur die zwei niederwertigsten Bit entfernt werden. Eine Division durch 3 ist erforderlich, um k und s von den verbleibenden Bits zu separieren. Die Division kann vermieden werden, indem die Kerndimensionen auf 4 × 4 (oder eine andere Potenz von 2 in jeder Dimension) aufgerundet wird, wobei die komprimierte-dünnbesetzte Codierung aufgrund der zusätzlichen Nullen nicht so dicht sein kann. Es sei angemerkt, dass die Koordinate k in der Position (r, s, k) nicht der absoluten Adresse des Ausgabekanals entspricht, sondern der temporären Adresse des Akkumulators, welcher aktuell den Ausgabekanal hält. Die Positionen, welche von dem linearen Index extrahiert werden, sind in der zweiten Reihe der Codierung 440 dargestellt.
  • 4F zeigt ein Blockdiagramm 450 zur Bestimmung der Gewichtskoordinaten (r, s, k) gemäß einer Ausführungsform. Es sei angenommen, dass rmax klein ist (kleiner als die maximale Nullanzahl) und daher auf eine Potenz von 2 aufgerundet wird, so dass die Koordinaten r und s als ein einziges Feld rs behandelt werden können, wobei die niederwertigen Bits r und die höherwertigen Bits s entsprechen. Ein Addierer 425 summiert eine Nullenanzahl, zi, und 1 mit rsi-1, um einen versuchsweisen Wert rSi zu erzeugen. Die Divisionsoperation, um k und s zu separieren, muss tatsächlich keine Division erfordern, sondern kann stattdessen mittels einer laufenden Divisionstechnik ausgeführt werden. Bei jedem Schritt kann bei der Berechnung der laufenden Summe der versuchsweise Wert rsi mit rsmax = rmax*smax verglichen werden. Wenn die Summe größer oder gleich dem Wert rsmax ist, wird rsmax von dem versuchsweisen Wert rsi abgezogen und k wird inkrementiert. Die laufende Divisionstechnik kann eingesetzt werden, um r und s zu separieren, wenn rmax nicht auf die nächste Potenz von 2 aufgerundet ist.
  • Max Subtracts 455 subtrahiert rsmax von dem versuchsweisen Wert rsi, welcher durch den Addierer 425 ausgegeben wird, und bestimmt, ob das Ergebnis positiv ist, wie es durch das Signal pos angezeigt wird, welches durch den Max Subtract 445 ausgegeben wird. Wenn das Ergebnis positiv ist, wird das Ergebnis der Subtraktion gehalten und für eine Ausgabe als rsi durch einen Multiplexer 460 ausgewählt. Wenn das Ergebnis nicht positiv ist, hält der Multiplexer 460 den versuchsweisen Wert rsi zur Ausgabe als rsi. Ein Inkrementierer 455 empfängt ki-1 und inkrementiert ki-1, um die Ausgabe ki zu aktualisieren, wenn das Ergebnis positiv ist. Es sei angemerkt, dass, wenn rsmax kleiner als die maximale Nullanzahl ist, es notwendig sein kann, gegen 2*rsmax und andere Mehrfache zu vergleichen. Wenn jedoch rsmax klein ist, kann rsmax bei einer Ausführungsform auf die nächste Potenz von 2 aufgerundet werden und eine laufende Summe sollte auf ein kombiniertes Feld krs berechnet werden.
  • Bei einer Ausführungsform ist die Codierung für die Eingabeaktivierungen dieselbe wie für die Gewichte, außer dass die Koordinaten (r, s) durch die Koordinaten (x, y) ersetzt werden und die Koordinate k weggelassen wird. Die Größe einer Eingabeaktivierungsscheibe kann jedoch merklich größer sein. Für eine (High Definition) HD-Bildgröße von 1920×1080 Pixel, welche in eine 8 × 8-Anordnung von PEs 210 aufgeteilt sind, hält jedes PE 210 eine Scheibe von 240 × 135. Bei einem anderen Extrem kann eine tiefe Faltungsschicht nur 14 × 14 mit einem xmax von nur 1 oder 2 aufweisen. Wenn große Größen zu groß sind, um auf Potenzen von 2 aufgerundet zu werden, können bei Eingabeaktivierungen laufende Divisionstechniken „running divide technique”) eingesetzt werden, um x, y und k zu separieren.
  • 4G stellt ein Blockdiagramm 470 zur Bestimmung der Eingabeaktivierungskoordinaten (x, y) gemäß einer Ausführungsform dar. Die Berechnung, welche für die Eingabeaktivierungskoordinaten eingesetzt wird, ist ähnlich der Berechnung der Gewichtskoordinaten, außer dass: (1) es kein Feld k gibt und die Positionen alle von demselben Eingabekanal c stammen; und (2) die x-Koordinate bei jedem Schritt mit xmax verglichen wird und, wenn es erforderlich ist, xmax subtrahiert wird. Für Eingabeaktivierungen kann xmax groß werden, wodurch es kostspielig ist, es auf die nächste Potenz von 2 aufzurunden.
  • Ein Addierer 475 summiert eine Nullanzahl, ti, und 1 mit xi-1, um einen versuchsweisen Wert xi zu erzeugen. Ein Max Subtract 485 subtrahiert xmax von dem versuchsweisen Wert xi, welcher durch den Addierer 475 ausgegeben wird, und bestimmt, ob das Ergebnis positiv ist, wie es durch das Signal pos, welches durch den Max Subtract 485 ausgegeben wird, angezeigt wird. Wenn das Ergebnis positiv ist, wird das Ergebnis der Subtraktion beibehalten und für eine Ausgabe als xi durch einen Multiplexer 480 ausgewählt. Wenn das Ergebnis nicht positiv ist, wählt der Multiplexer 480 den versuchsweisen Wert xi für eine Ausgabe als xi. Ein Inkrementierer 490 empfängt yi-1 und inkrementiert yi-1, um die Ausgabe yi zu aktualisieren, wenn das Ergebnis positiv ist.
  • Es sei angemerkt, dass das Eingabeaktivierungskoordinatensystem mit dem Halo verknüpft ist, so dass für einen 3 × 3-Faltungskern die aktuelle Eingabeaktivierung bei (1, 1) beginnt. Wenn einmal die Positionen (r, s, k) der Gewichte berechnet sind und die Positionen (x, y) der Eingabeaktivierungen durch die Zielberechnungseinheit 330 berechnet sind, werden die Koordinaten r und x summiert und die Koordinaten s und y werden durch die Zielberechnungseinheit 330 summiert, um die Ausgabeaktivierungspositionen in der Form (x, y, k) zu berechnen. Die Zielberechnungseinheit 330 wandelt dann die Ausgabeaktivierungspositionen in eine lineare Akkumulatoradresse um, gemäß: addressi = x + y*xmax_halo + k*xmax_halo*ymax_halo
  • Es sei angemerkt dass xmax_halo und ymax_halo die Abmessungen des Halo betreffen und (x, y, k) die Ausgabeaktivierungsposition ist. Die Werte, welche mit y und k multipliziert werden, können aufgerundet werden, wenn es erforderlich ist, um die Kosten des Multiplizierens zu verringern. Das Aufrunden kann jedoch die Kosten der Akkumulatoren hinsichtlich zusätzlicher Operationen, welche nicht erforderlich sind, erhöhen.
  • 5A stellt ein nichtlineares Codierungsschema 505 für Eingabeaktivierungs-Nullanzahlwerte gemäß einer Ausführungsform dar. Eine Technik zur Verringerung der Kosten eines Aufrundens von xmax (oder xymax) zu der nächsten Potenz von 2 ist, die Nullanzahlsymbole nichtlinear zu verteilen. Die erste Reihe des Codierungsschemas 505 ist der 4-Bit-Codewert und die zweite Reihe ist der entsprechende Nullanzahlwert. Die ersten 8 Codewerte codieren die Nullanzahlen von 0 bis 7 linear, wie es in Zusammenhang mit 4C beschrieben wurde. Die nächsten 8 Codewerte codieren jedoch die Nullanzahlwerte (z. B. 12, 18, 16, 24, 32, 48, 64, 96 und 128) größer und nichtlinear, um in dem großen leeren Bereich, welcher erzeugt wird, indem xmax aufgerundet wird, „herum zu springen”. Wenn zum Beispiel xmax 129 ist und auf 256 aufgerundet ist, kann es erforderlich sein, um 128 zu springen.
  • 5B stellt ein anderes Codierungsschema 510 für Eingabeaktivierungs-Nullanzahlwerte gemäß einer Ausführungsform dar. Das Codierungsschema 510 ermöglicht, dass die Nullanzahl spezifiziert, dass die x-Koordinate auf den spezifizierten Wert gesetzt werden sollte und dass die y-Koordinate inkrementiert werden sollte. Wie bei dem Codierungsschema 505 spezifizieren die ersten acht Codewerte die Nullanzahlen 0 bis 7. Die nächsten acht Codewerte der Form Yn weisen die Zielberechnungseinheit 330 an, die y-Koordinate zu inkrementieren und die x-Koordinate auf x = n zu setzen. Mit dieser Form einer Codierung besteht keine Notwendigkeit, zuerst in einen linearen Index zu wandeln. Die Nullanzahl-Codewerte können direkt in (x, y) gewandelt werden.
  • 5C stellt ein anderes Codierungsschema 515 für Eingabeaktivierungs-Nullanzahlwerte gemäß einer Ausführungsform dar. Da in den meisten Fällen Y nicht inkrementiert wird, macht es Sinn, mehr „normale” Codewerte als „Y-Inkrementierungs”-Codewerte zu haben. Daher weist das Codierungsschema 510 11 Codewerte auf, welche der Nullanzahl ermöglichen, zu spezifizieren, dass die x-Koordinate auf den spezifizierten Wert eingestellt werden soll, und weist 5 Codewerte auf, um die y-Koordinate zu inkrementieren.
  • 5D stellt ein anderes Codierungsschema 520 für Gewichts-Nullanzahlwerte gemäß einer Ausführungsform dar. Für Gewichte sind die Werte ungleich Null in einem dreidimensionalen Raum r, s, k codiert, so dass rmax auf die nächste Potenz von 2 aufgerundet werden kann und zu dem nächsten Kanal k springt, wobei mit verschiedenen Nullanzahlwerten codiert wird. Das Codierungsschema 520 erlaubt, dass die Nullanzahl spezifiziert, dass die r-Koordinate auf den angegebenen Wert gesetzt wird und dass die k-Koordinate inkrementiert werden sollte. Die ersten 14 Codewerte spezifizieren Nullanzahlen von 0 bis 13. Die letzten beiden Codewerte der Form Kn weisen die Zielberechnungseinheit 330 an, rs auf 0 zu setzen und zu dem nächsten Ausgabekanal k zu springen.
  • 5E stellt ein anderes Codierungsschema 525 für die Gewichts-Nullanzahlwerte gemäß einer Ausführungsform dar. Das Codierungsschema 525 ermöglicht, dass die Nullanzahl spezifiziert, dass die r-Koordinate auf den angegebenen Wert gesetzt werden sollte und dass entweder die s-Koordinate oder die k-Koordinate inkrementiert werden sollte. Die ersten 10 Codewerte spezifizieren Nullanzahlen von 0 bis 9. Die nächsten drei Codewerte der Form Sn weisen die Zielberechnungseinheit 330 an, r auf Null zu setzen und s zu inkrementieren. Die letzten beiden Codewerte der Form Kn weisen die Zielberechnungseinheit 330 an, r und s auf Null zu setzen und k zu inkrementieren.
  • Wie in 5A5E dargestellt ist, kann das komprimierte-dünnbesetzte Format die Gewichte und Eingabeaktivierungen ungleich Null als dichte Vektoren von Werten zusammen mit einem Sprung-codierten (d. h. nichtlinearen) Vektor von Codewerten codieren, welche die Position darstellen, wobei z der Wert ist. Bei einer Ausführungsform kann einer oder können mehrere Codewerte eines spezifizieren aus (i) addiere z + 1 zu der letzten Koordinate, umbrechen in r, s und/oder k wie angemessen (r = r + z + 1, Umbruch), (ii) springe zu der nächsten Reihe (s = s + 1, x = z, Umbruch) oder (iii) springe zu dem nächsten Kanal (k = k + 1, s = 0, r = z, Umbruch).
  • Die vorher beschriebenen Bemühungen, um die Seltenheit bzw. Dünnbesetztheit bei CNN-Beschleunigern auszunutzen, haben sich auf eine Reduzierung von Energie oder ein Einsparen von Zeit konzentriert, wodurch immer auch Energie eingespart wird. Ein Vermeiden der Multiplikation, wenn ein Eingabeoperand Null ist, durch Ausblenden einer Operandeneingabe zu einem Multiplizierer, ist eine natürliche Möglichkeit, um Energie zu sparen. Ein Ausblenden eines Operanden spart Energie, ohne aber dabei die Anzahl der Verarbeitungszyklen zu verringern. Der SCNN-Beschleuniger 200 spart auch Energie, indem all die unnötigen Multiplikation vermieden werden, und wenn irgendein Eingabeoperand Null ist, wird die Schaltung noch nicht einmal vorbereitet, um eine Multiplikationsoperation durchzuführen, wodurch ebenfalls Zeit eingespart wird.
  • Ein weiterer Ansatz, um Energie zu verringern, ist Datenübertragungskosten zu verringern, wenn die Daten dünnbesetzt sind. Die Eingabeaktivierungen können zur Übertragung zu und von dem DRAM komprimiert werden, um Energie (und Zeit) einzusparen, indem die Anzahl der DRAM-Zugriffe verringert wird. Jedoch expandieren herkömmliche Systeme die komprimierten Eingabeaktivierungen, bevor die Eingabeaktivierungen in einen On-Chip-Puffer geladen werden, so dass die Eingabeaktivierungen in einer expandierten Form gespeichert werden. Daher existieren keine Einsparungen bei Übertragungen von einem internen Puffer zu einem anderen internen Puffer oder zu den Multiplizierern. Im Gegensatz dazu setzt der SCNN-Beschleuniger 200 eine komprimierte Darstellung für alle Daten ein, welche vom DRAM kommen und behält die komprimierte Darstellung bei den On-Die-Puffern bei. Im Gegensatz dazu hält der SCNN-Beschleuniger 200 sowohl die Gewichte als auch die Aktivierungen in einer komprimierten Form sowohl in dem DRAM als auch in den internen Puffern. Dies spart Datenübertragungszeit und Energie bei allen Datenübertragungen und ermöglicht dem Chip, größere Modelle für einen vorgegebenen Umfang an internem Speicher zu halten.
  • Der SCNN-Beschleuniger 200 nutzt die Seltenheit bzw. Dünnbesetztheit sowohl bezüglich der Gewichte als auch bezüglich der Aktivierungen mittels des PTIS-sparse-Datenflusses (dünnbesetzten in der Ebene in Kacheln aufgeteilten bezüglich der Eingabe konstanten Datenflusses) aus. Der PTIS-sparse-Datenfluss ermöglicht dem SCNN-Beschleuniger 200, eine neue auf einem kartesischen Produkt basierende Rechenarchitektur zu verwenden, welche eine Wiederverwendung von Gewichten und Eingabeaktivierungen in einer Gruppe von verteilten PEs 210 maximiert. Darüber hinaus ermöglicht der PTIS-sparse-Datenfluss den Einsatz einer dichten komprimierten-dünnbesetzten Codierung sowohl für die Gewichte als auch für die Aktivierungen, welche nahezu ausschließlich während des gesamten Bearbeitungsstroms eingesetzt wird. Der Umfang von Daten, welche in dem SCNN-Beschleuniger 200 übertragen werden, wird verringert und der Umfang der On-Die-Speicherkapazität wird effektiv erhöht. Ergebnisse zeigen, dass für eine äquivalente Fläche, die Architektur des SCNN-Beschleunigers 200 eine höhere Energieeffizienz im Vergleich mit einer energieoptimierten dichten Architektur erzielt, wenn die Gewichte und Aktivierungen jeweils weniger als 85% dicht sind. Auf drei heutigen Netzen erzielte die Architektur des SCNN-Beschleunigers 200 Leistungsverbesserungen gegenüber der dichten Architektur um einen Faktor von 2,6, während sie noch um den Faktor 2,5 Energie-effizienter war.
  • Beispielhaftes System
  • 6 stellt ein beispielhaftes System 600 dar, in welchem die verschiedenen Architekturen und/oder Funktionalitäten der verschiedenen vorherigen Ausführungsformen implementiert werden können. Wie dargestellt ist, ist ein System 600 vorhanden, welches mindestens einen SCNN-Beschleuniger 200 aufweist, welcher mit einem Kommunikationsbus 602 verbunden ist. Der Kommunikationsbus 602 kann mittels jedes verfügbaren Protokolls, wie z. B. PCI („Peripheral Component Interconnect”), PCI-Express, AGP („Accelerated Graphics Port”), HyperTransport oder jedem anderen Bus- oder Punkt-zu-Punkt-Kommunikations-Protokoll implementiert werden. Das System 600 weist auch einen Hauptspeicher 604 auf. Die Steuerlogik (Software) und Daten werden in dem Hauptspeicher 604 gespeichert, welcher die Form eines Direktzugriffspeichers (RAM) aufweisen kann.
  • Das System 600 weist auch einen Zentralprozessor 601 (z. B. eine CPU), Eingabeeinrichtungen 612, einen Grafikprozessor 606 und eine Anzeige 608, d. h. eine herkömmliche CRT (Kathodenstrahlröhre), LCD (Flüssigkeitskristallanzeige), LED (Licht emittierende Diode), Plasmaanzeige oder Ähnliches, auf. Eine Benutzereingabe kann von den Eingabevorrichtungen 612, z. B. einer Tastatur, einer Maus, einem Touchpad, einem Mikrofon und Ähnlichem, erfasst werden. Bei einer Ausführungsform kann der Grafikprozessors 606 eine Mehrzahl von Schattenmodulen, Rastergrafikmodulen, usw., aufweisen. Jedes der vorher genannten Module kann auf einer einzigen Halbleiterplattform angeordnet sein, um eine Grafikverarbeitungseinheit (GPU) auszubilden.
  • In der vorliegenden Beschreibung kann eine einzelne Halbleiterplattform eine einzige einheitliche halbleiterbasierte integrierte Schaltung oder einen entsprechenden Chip bezeichnen. Es sei angemerkt, dass sich die Bezeichnung einzelne Halbleiterplattform auch auf Module mit mehreren Chips mit erhöhter Anschlussfähigkeit beziehen, welche eine On-Chip-Operation simulieren und wesentliche Verbesserungen gegenüber dem Einsatz einer herkömmlichen CPU- und Busimplementierung aufweisen. Natürlich können die verschiedenen Module getrennt oder in verschiedenen Kombinationen von Halbleiterplattformen nach den Wünschen des Benutzers angeordnet sein.
  • Das System 600 kann auch einen sekundären Speicher 610 aufweisen. Der sekundäre Speicher 610 weist zum Beispiel ein Festplattenlaufwerk und/oder ein entfernbares Speicherlaufwerk, welches ein Floppydisklaufwerk, ein Magnetbandlaufwerk, ein CD-Plattenlaufwerk, ein DVD-Laufwerk, eine Aufnahmevorrichtung, ein USB-Flashspeicher repräsentiert, aufweist. Das entfernbare Speicherlaufwerk liest von und/oder schreibt zu einer entfernbaren Speichereinheit auf eine gut bekannten Weise.
  • Computerprogramme oder Computersteuerlogikalgorithmen, Eingabedaten für den SCNN-Beschleuniger 200, Ausgabedaten, welche durch den SCNN-Beschleuniger 200 erzeugt werden, und Ähnliches können in dem Hauptspeicher 604 und/oder dem sekundären Speicher 610 gespeichert werden. Solche Computerprogramme ermöglichen, wenn sie ausgeführt werden, dass das System 600 verschiedene Funktionen ausführt. Der Speicher 604, der Speicher 610 und/oder jeder andere Speicher sind mögliche Beispiele von computerlesbaren Medien.
  • Bei einer Ausführungsform können die Architektur und/oder die Funktionalität der verschiedenen vorherigen Figuren im Zusammenhang mit dem SCNN-Beschleuniger 200, dem Zentralprozessor 601, dem Grafikprozessors 606, einer integrierten Schaltung (nicht dargestellt), welche in der Lage ist, zumindest einen Teil der Funktionen des einen oder der mehreren aus dem SCNN-Beschleuniger 200, dem Zentralprozessor 601 und dem Grafikprozessor 606, einem Chipsatz (d. h. einer Gruppe von integrierten Schaltungen, welche entworfen sind, um als eine Einheit zu arbeiten und verkauft zu werden, um entsprechende Funktionen auszuführen, usw.) und/oder jeder anderen integrierten Schaltung für diesen Zweck, implementiert werden.
  • Des Weiteren kann die Architektur und/oder die Funktionalität der verschiedenen vorherigen Figuren im Zusammenhang mit einem allgemeinen Computersystem, einem Platinensystem, einem Spielekonsolesystem, welches für Unterhaltungszwecke bestimmt ist, einem anwenderspezifischen System und/oder jedem anderen erwünschten System, implementiert werden. Zum Beispiel kann das System 600 die Ausgestaltung eines Desktopcomputers, eines Laptopcomputers, eines Servers, einer Workstations, von Spielekonsolen, eines eingebetteten Systems und/oder jedes anderen Typs einer Logik, aufweisen. Darüber hinaus kann das System 600 die Ausgestaltung von verschiedenen anderen Vorrichtungen aufweisen, was einen Minicomputer (PDA), ein Mobiltelefon, einen Fernseher, usw., einschließt.
  • Darüber hinaus kann das System, während es nicht dargestellt ist, mit einem Netz (z. B. einem Telekommunikationsnetz, einem lokalen Netz (LAN), einem Funknetz, einem weiträumigen Netz (WAN), wie z. B. dem Internet, einem Peer-to-Peer-Netz, einem Kabelnetz oder Ähnlichem) für Kommunikationszwecke gekoppelt sein.
  • Obwohl verschiedene Ausführungsformen oben beschrieben wurden, sollte man verstehen, dass sie nur beispielhaft und nicht als Einschränkung dargestellt wurden. Daher sollte die Breite und der Umfang einer bevorzugten Ausführungsform nicht durch eine der oben beschriebenen beispielhaften Ausführungsformen eingeschränkt werden, sondern nur in Übereinstimmung mit den nachstehenden Ansprüchen und ihren Entsprechungen definiert werden.

Claims (25)

  1. Verfahren umfassend: Erfassen eines ersten Vektors, welcher nur Gewichtswerte ungleich Null und erste zugehörige Positionen der Gewichtswerte ungleich Null in einem ersten Raum umfasst; Erfassen eines zweiten Vektors, welcher nur Eingabeaktivierungswerte ungleich Null und zweite zugehörige Positionen in einem zweiten Raum umfasst; Multiplizieren in einer Multipliziereranordnung der Gewichtswerte ungleich Null mit den Eingabeaktivierungswerten ungleich Null, um einen dritten Vektor von Produkten zu erzeugen; Kombinieren der ersten zugehörigen Positionen mit den zweiten zugehörigen Positionen, um einen vierten Vektor von Positionen zu erzeugen, wobei jede Position in dem vierten Vektor einem entsprechenden Produkt in dem dritten Vektor zugeordnet ist; und Übertragen des dritten Vektors zu einer Akkumulatoranordnung, wobei jedes Produkt in dem dritten Vektor zu einem Addierer in der Akkumulatoranordnung übertragen wird, welcher ausgestaltet ist, um einen Ausgabeaktivierungswert an der Position, welche dem Produkt zugeordnet ist, zu erzeugen.
  2. Verfahren nach Anspruch 1, darüber hinaus umfassend: Erfassen eines fünften Vektors, welcher nur zusätzliche Gewichtswerte ungleich Null und fünfte zugehörige Positionen der zusätzlichen Gewichtswerte ungleich Null in dem ersten Raum umfasst; Multiplizieren in der Multipliziereranordnung der zusätzlichen Gewichtswerte ungleich Null mit den Aktivierungswerten ungleich Null, um einen siebten Vektor von Produkten zu erzeugen; Erzeugen eines achten Vektors von Positionen, wobei jede Position in dem achten Vektor einem entsprechenden Produkt in dem siebten Vektor von Produkten zugeordnet ist; und für jede übereinstimmende Position in dem vierten Vektor und dem achten Vektor Summieren der entsprechenden Produkte in dem dritten Vektor und dem siebten Vektor durch die Akkumulatoranordnung, um Teilsummen zu erzeugen.
  3. Verfahren nach Anspruch 1 oder 2, wobei der erste Raum ein dreidimensionaler Raum ist und wobei der zweite Raum ein zweidimensionaler Raum ist.
  4. Verfahren nach einem der Ansprüche 1 bis 3, darüber hinaus umfassend ein Übertragen des dritten Vektors durch eine Anordnung von Puffern in der Akkumulatoranordnung, wobei jeder der Puffer mit einem Eingang von einem der Addierer in der Akkumulatoranordnung gekoppelt ist.
  5. Verfahren nach einem der Ansprüche 1 bis 4, darüber hinaus umfassend ein Komprimieren der Ausgabeaktivierungswerte, um eine Gruppe von Vektoren zu erzeugen, welche Ausgabeaktivierungswerte ungleich Null umfassen, die nur die Ausgabeaktivierungswerte aufweisen, welche nicht gleich Null sind.
  6. Verfahren nach Anspruch 5, wobei die Gruppe von Vektoren darüber hinaus Positionen umfasst, welche den Ausgabeaktivierungswerten ungleich Null zugeordnet sind.
  7. Verfahren nach Anspruch 2, wobei der zweite Vektor während einer Bearbeitung einer ersten Schicht eines neuronalen Netzes erzeugt wurde und wobei der siebte Vektor von Produkten während einer Bearbeitung einer zweiten Schicht des neuronalen Netzes erzeugt wird.
  8. Verfahren nach einem der Ansprüche 1 bis 7, darüber hinaus umfassend ein Übertragen eines ersten Produktes in dem dritten Vektor von einem ersten Akkumulatoreingang in der Akkumulatoranordnung zu einem ersten Addierer in der Akkumulatoranordnung, wobei das erste Produkt einer ersten Position bei einem Rand des zweiten Raumes zugeordnet ist.
  9. Verfahren nach einem der Ansprüche 1 bis 8, wobei das Kombinieren ein Ausführen einer Vektoraddition umfasst, um Koordinaten der ersten zugehörigen Positionen mit Koordinaten der zweiten zugehörigen Positionen zu addieren, um den vierten Vektor von Positionen zu erzeugen, wobei jede Position in dem vierten Vektor einem entsprechenden Produkt in dem dritten Vektor zugeordnet ist.
  10. Verfahren nach einem der Ansprüche 1 bis 9, wobei der zweite Raum in zweidimensionale Kacheln unterteilt ist und wobei die Multipliziereranordnung Produkte für eine der zweidimensionalen Kacheln parallel mit zusätzlichen Multipliziereranordnungen erzeugt, welche zusätzliche Produkte für die verbleibenden zweidimensionalen Kacheln erzeugen.
  11. Verfahren nach Anspruch 10, wobei jede der zusätzlichen Multipliziereranordnungen einen zusätzlichen Vektor erfasst, welcher nur Eingabeaktivierungswerte ungleich Null und zusätzliche zugehörige Positionen in einer anderen Kachel des zweiten Raums umfasst.
  12. Verfahren nach Anspruch 10 oder 11, wobei die Kachel für eine Anzahl von Eingabekanälen in eine weitere Dimension des ersten Raums und des zweiten Raums erweitert wird, und darüber hinaus umfassend ein Erfassen von zusätzlichen Vektoren, welche nur Gewichtswerte ungleich Null und zusätzliche zugehörige Positionen der Gewichtswerte ungleich Null für jeden aus der Anzahl der Eingabekanäle umfassen.
  13. Beschleuniger für ein faltendes neuronales Netz, umfassend: eine Anordnung von Verarbeitungselementen, wobei jedes Verarbeitungselement eine Multipliziereranordnung umfasst, welche ausgestaltet ist, um einen ersten Vektor zu erfassen, welcher nur Gewichtswerte ungleich Null und erste zugehörige Positionen der Gewichtswerte ungleich Null in einem ersten Raum umfasst; einen zweiten Vektor zu erfassen, welcher nur Eingabeaktivierungswerte ungleich Null und zweite zugehörige Positionen in einem zweiten Raum umfasst; Multiplizieren der Gewichtswerte ungleich Null mit den Aktivierungswerten ungleich Null, um einen dritten Vektor von Produkten zu erzeugen; um die ersten zugehörigen Positionen mit den zweiten zugehörigen Positionen zu kombinieren, um einen vierten Vektor von Positionen zu erzeugen, wobei jede Position in dem vierten Vektor einem entsprechenden Produkt in dem dritten Vektor zugeordnet ist; und um den dritten Vektor zu einer Akkumulatoranordnung zu übertragen, wobei jedes Produkt in dem dritten Vektor zu einem Addierer in der Akkumulatoranordnung übertragen wird, welcher ausgestaltet ist, um einen Ausgabeaktivierungswert an der Position, welche dem Produkt zugeordnet ist, zu erzeugen.
  14. Beschleuniger für ein faltendes neuronales Netz nach Anspruch 13, wobei die Multipliziereranordnung darüber hinaus ausgestaltet ist, um einen fünften Vektor zu erfassen, welcher nur zusätzliche Gewichtswerte ungleich Null und fünfte zugehörige Positionen der zusätzlichen Gewichtswerte ungleich Null in dem ersten Raum umfasst; Multiplizieren in der Multipliziereranordnung der zusätzlichen Gewichtswerte ungleich Null mit den Eingabeaktivierungswerten ungleich Null, um einen siebten Vektor von Produkten zu erzeugen; Erzeugen eines achten Vektors von Positionen, wobei jede Position in dem achten Vektor einem entsprechenden Produkt in dem siebten Vektor von Produkten zugeordnet ist; und um für jede übereinstimmende Position in dem vierten Vektor und dem achten Vektor die entsprechenden Produkte in dem dritten Vektor und dem siebten Vektor durch die Akkumulatoranordnung aufzusummieren, um Teilsummen zu erzeugen.
  15. Beschleuniger für ein faltendes neuronales Netz nach Anspruch 13 oder 14, wobei der erste Raum ein dreidimensionaler Raum und der zweite Raum ein zweidimensionaler Raum ist.
  16. Beschleuniger für ein faltendes neuronales Netz nach einem der Ansprüche 13 bis 15, wobei der erste Vektor an jedes Verarbeitungselement in der Anordnung von Verarbeitungselementen übertragen wird.
  17. Beschleuniger für ein faltendes neuronales Netz nach einem der Ansprüche 13 bis 16, wobei der zweite Raum in zweidimensionale Kacheln unterteilt ist und wobei die Multipliziereranordnung Produkte für eine der zweidimensionalen Kacheln parallel mit zusätzlichen Multipliziereranordnungen erzeugt, welche zusätzliche Produkte für die restlichen zweidimensionalen Kacheln erzeugen.
  18. Beschleuniger für ein faltendes neuronales Netz nach Anspruch 17, wobei jede der zusätzlichen Multipliziereranordnungen einen zusätzlichen Vektor erfasst, welcher nur Eingabeaktivierungswerte ungleich Null und zusätzliche zugehörige Positionen in einer anderen Kachel des zweiten Raums umfasst.
  19. Beschleuniger für ein faltendes neuronales Netz nach Anspruch 17 oder 18, wobei die Kachel für eine Anzahl von Eingabekanäle in eine zusätzliche Dimension des ersten Raums und des zweiten Raums erweitert wird, und darüber hinaus umfassend ein Erfassen von zusätzlichen Vektoren, welche nur Gewichtswerte ungleich Null und zusätzliche zugehörige Positionen der Gewichtswerte ungleich Null für jeden aus der Anzahl der Eingabekanäle umfassen.
  20. System umfassend: einen Speicher, welcher Vektoren speichert, welche nur Gewichtswerte ungleich Null und erste zugehörige Positionen der Gewichtswerte ungleich Null in einem ersten Raum umfassen; und einen Beschleuniger für ein faltendes neuronales Netz, welcher mit dem Speicher gekoppelt ist, und umfasst: eine Anordnung von Verarbeitungselementen, wobei jedes Verarbeitungselement eine Multipliziereranordnung umfasst, welche ausgestaltet ist, um von dem Speicher einen ersten Vektor der Vektoren zu erfassen; um einen zweiten Vektor zu erfassen, welcher nur Eingabeaktivierungswerte und zweite zugehörige Positionen in einem zweiten Raum umfasst; Multiplizieren der Gewichtswerte ungleich Null mit den Eingabeaktivierungswerten ungleich Null, um einen dritten Vektor von Produkten zu erzeugen; um die ersten zugehörigen Positionen mit den zweiten zugehörigen Positionen zu kombinieren, um einen vierten Vektor von Positionen zu erzeugen, wobei jede Position in dem vierten Vektor einem entsprechenden Produkt in dem dritten Vektor zugeordnet ist; und um den dritten Vektor zu einer Akkumulatoranordnung zu übertragen, wobei jedes der Produkte in dem dritten Vektor zu einem Addierer in der Akkumulatoranordnung übertragen wird, welcher ausgestaltet ist, um einen Ausgabeaktivierungswert an der Position zu erzeugen, welche dem Produkt zugeordnet ist.
  21. Verfahren nach Anspruch 5 oder 6, wobei die Gruppe von Vektoren einen Datenvektor mit den Ausgabeaktivierungswerten ungleich Null und einen entsprechenden Indexvektor umfasst, und wobei jedes Element in dem Indexvektor einer Anzahl von Nullwerten entspricht, welche vor dem entsprechenden Element in dem Datenvektor stehen.
  22. Verfahren nach Anspruch 21, wobei die Anzahl von Nullwerten zwischen zwei Elementen des Datenvektors auf eine vorbestimmte Anzahl beschränkt ist, und wobei, wenn die Anzahl von Nullwerten zwischen zwei Elementen des Datenvektors, welcher Werte ungleich Null aufweist, größer als die vorbestimmte Anzahl ist, ein Nullwert-Platzhalter in dem Datenvektor eingefügt wird.
  23. Verfahren nach Anspruch 21 oder 22, wobei der Indexvektor einen N-Bit-Code einsetzt, welcher die Anzahl von Nullwerten codiert, wobei der N-Bit-Code nicht linear ist, um zu ermöglichen, dass eine größere Anzahl von Nullwerten dem entsprechenden Element in dem Datenvektor voransteht.
  24. Beschleuniger für ein faltendes neuronales Netz nach einem der Ansprüche 13–19, wobei der Beschleuniger für ein faltendes neuronales Netz ausgestaltet ist, um das Verfahren nach einem der Ansprüche 1–12 oder 21–23 auszuführen.
  25. System nach Anspruch 20, wobei das System ausgestaltet ist, um das Verfahren nach einem der Ansprüche 1–12 oder 21–23 auszuführen.
DE102017117381.1A 2016-08-11 2017-08-01 Beschleuniger für dünnbesetzte faltende neuronale Netze Pending DE102017117381A1 (de)

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
US201662373919P 2016-08-11 2016-08-11
US62/373,919 2016-08-11
US15/458,799 US10528864B2 (en) 2016-08-11 2017-03-14 Sparse convolutional neural network accelerator
US15/458,799 2017-03-14

Publications (1)

Publication Number Publication Date
DE102017117381A1 true DE102017117381A1 (de) 2018-02-15

Family

ID=61018586

Family Applications (1)

Application Number Title Priority Date Filing Date
DE102017117381.1A Pending DE102017117381A1 (de) 2016-08-11 2017-08-01 Beschleuniger für dünnbesetzte faltende neuronale Netze

Country Status (1)

Country Link
DE (1) DE102017117381A1 (de)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110880034A (zh) * 2018-09-06 2020-03-13 三星电子株式会社 使用卷积神经网络的计算装置及其操作方法
CN111028512A (zh) * 2019-12-31 2020-04-17 福建工程学院 一种基于稀疏bp神经网络的实时交通预测方法及装置
CN112632459A (zh) * 2020-12-22 2021-04-09 无锡江南计算技术研究所 深度卷积的在线计算部件
US11740687B2 (en) 2020-04-21 2023-08-29 Western Digital Technologies, Inc. Variable power mode inferencing

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110880034A (zh) * 2018-09-06 2020-03-13 三星电子株式会社 使用卷积神经网络的计算装置及其操作方法
CN111028512A (zh) * 2019-12-31 2020-04-17 福建工程学院 一种基于稀疏bp神经网络的实时交通预测方法及装置
US11740687B2 (en) 2020-04-21 2023-08-29 Western Digital Technologies, Inc. Variable power mode inferencing
CN112632459A (zh) * 2020-12-22 2021-04-09 无锡江南计算技术研究所 深度卷积的在线计算部件
CN112632459B (zh) * 2020-12-22 2023-07-07 无锡江南计算技术研究所 深度卷积的在线计算部件

Similar Documents

Publication Publication Date Title
CN107844828B (zh) 神经网络中的卷积计算方法和电子设备
EP3469520B1 (de) Superpixelverfahren für neurale faltungsnetzwerke
DE112020003128T5 (de) Dilatierte faltung mit systolischem array
CN108108811B (zh) 神经网络中的卷积计算方法和电子设备
DE102019133028A1 (de) Für neuronale netzwerke geeignetes effizientes matrixformat
DE112020004625T5 (de) Transponierte faltung mit systolischem array
DE102021120605A1 (de) Effiziente softmax-berechnung
DE202016107446U1 (de) Rotation von Daten für Berechnungen in neuronalen Netzwerken
DE102017117381A1 (de) Beschleuniger für dünnbesetzte faltende neuronale Netze
DE112019003529T5 (de) Datendarstellung für dynamische Genauigkeit in Kernen neuronaler Netze
DE112009004320T5 (de) Speicher-Untersystem
DE102019102009A1 (de) Reduzierung des rauschens während des renderings durch parallele path-space-filterung unter verwendung von hashing
US11763131B1 (en) Systems and methods for reducing power consumption of convolution operations for artificial neural networks
DE102020114310A1 (de) Beschleuniger für neuronale netze mit logarithmischbasierter arithmetik
DE102018110607A1 (de) Verallgemeinerte Beschleunigung von Matrix-Multiplikations-und-Akkumulations-Operationen
DE102019126719A1 (de) Energieeffiziente Speichersysteme und Verfahren
CN112529165A (zh) 深度神经网络剪枝方法、装置、终端及存储介质
DE102022103358A1 (de) Training für maschinelles lernen im logarithmischen zahlensystem
DE69009067T2 (de) Verfahren zur herstellung von digitalsignalprozessoren unter verwendung eines programmierten kompilators.
DE102019106996A1 (de) Darstellen eines neuronalen netzwerks unter verwendung von pfaden innerhalb des netzwerks zum verbessern der leistung des neuronalen netzwerks
DE102019103319A1 (de) Stochastisches runden von zahlenwerten
DE102019133699A1 (de) Anweisungssatz für hybrid-cpu und analogen speicherinternen künstliche-intelligenz-prozessor
EP3663938B1 (de) Signalverarbeitungsverfahren und -vorrichtung
DE112020005789T5 (de) Hierarchische partitionierung von operatoren
DE102021107510A1 (de) Training eines neuronalen netzwerks unter speicherbeschränkung

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R016 Response to examination communication