DE102020121601A1 - Persistenter Notizblockspeicher zum Datenaustausch zwischen Programmen - Google Patents

Persistenter Notizblockspeicher zum Datenaustausch zwischen Programmen Download PDF

Info

Publication number
DE102020121601A1
DE102020121601A1 DE102020121601.7A DE102020121601A DE102020121601A1 DE 102020121601 A1 DE102020121601 A1 DE 102020121601A1 DE 102020121601 A DE102020121601 A DE 102020121601A DE 102020121601 A1 DE102020121601 A1 DE 102020121601A1
Authority
DE
Germany
Prior art keywords
notepad
kernel
data
memory
processing unit
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
DE102020121601.7A
Other languages
English (en)
Inventor
Rajballav Dash
Jack H. Choquette
Ming Liang Milton Lei
Stephen Jones
Christopher Frederick Lamb
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
Application filed by Nvidia Corp filed Critical Nvidia Corp
Publication of DE102020121601A1 publication Critical patent/DE102020121601A1/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/22Microcontrol or microprogram arrangements
    • G06F9/24Loading of the microprogram
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/16Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
    • G06F15/163Interprocessor communication
    • G06F15/167Interprocessor communication using a common memory, e.g. mailbox
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/543Local

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

Techniken werden offenbart zur gemeinsamen Nutzung eines Datenaustausches zwischen Kernels (jeweils eines Satzes von Anweisungen), die auf einem System mit mehreren Verarbeitungseinheiten ausgeführt werden. In einer Ausführungsform umfasst jede Verarbeitungseinheit einen On-Chip-Notizblockspeicher, auf den durch die Kernels zugegriffen werden kann, die auf der Verarbeitungseinheit ausgeführt werden. Der gesamte oder ein Abschnitt des Notizblockspeichers kann beispielsweise allokiert und konfiguriert sein, so dass der Notizblock für mehrere Kernels parallel, für ein oder mehrere Kernels seriell oder für eine Kombination von beiden zugreifbar ist.

Description

  • TECHNISCHES GEBIET
  • Die vorliegende Offenbarung betrifft die gemeinsame Nutzung eines Speichers zwischen Programmen und genauer gesagt eines persistenten Notizblockspeichers zum Datenaustausch zwischen Programmen.
  • HINTERGRUND
  • Herkömmlicherweise wird eine On-Chip-Notizblockspeichermenge (z.B., 16KB, 32KB oder 64KB an Größe) aus einem Pool eines Notizblockspeichers allokiert und einem Satz von einem oder mehreren Ausführungskontexten („SEC“) zugewiesen (z.B., wobei ein Ausführungskontext ein Thread oder ein Prozess ist), die einen Kernel seriell und/oder parallel ausführen, wobei ein Kernel ein Satz von Anweisungen ist, wie beispielsweise ein Programm. In einem Beispiel ist ein Satz von einem oder mehreren Ausführungskontexten ein kooperatives Thread-Array (Cooperative Thread Array; CTA). Der einem SEC allokierte Notizblockspeicher ist für den SEC privat und die in dem Notizblockspeicher gespeicherten Daten sind nicht persistent, sobald der SEC die Ausführung des Kernels beendet. Es gibt ebenfalls keinen automatischen Hintergrundspeicher für den Notizblockspeicher. Daher werden in einem herkömmlichen System die in dem Notizblockspeicher gespeicherten Daten zwischen unterschiedlichen Kernels ausgetauscht, indem jeder SEC, der einen Kernel ausführt, die Daten von seinem allokierten Notizblock in den globalen Speicher explizit kopiert und jeder SEC, der einen anderen Kernel ausführt, die Daten explizit aus dem globalen Speicher abruft.
  • Um den globalen Speicher (z.B., einen DRAM oder Cache) zu erreichen, wird typischerweise eine Speicherhierarchie von Caches (z.B., L1, L2, etc.) durchlaufen, so dass die Daten durch eine oder mehrere Ebenen an Zwischenspeicherung transferiert werden. Im Vergleich mit der Latenzzeit des Zugreifens auf den Notizblockspeicher kann das Austauschen von Daten durch den globalen Speicher mindestens eine Größenordnung langsamer sein. Des Weiteren müssen, weil der Notizblockspeicher zu jedem SEC privat ist, unterschiedliche SECs, die den gleichen Kernel ausführen, ebenfalls Daten durch den globalen Speicher austauschen. Folglich existiert ein Bedarf, SECs und/oder Kernels zu erlauben, Daten schneller als durch herkömmliche Vorgehensweisen auszutauschen.
  • ZUSAMMENFASSUNG
  • Schnelle On-Chip-Speicher (z.B., ein Notizblock) können zwischen unterschiedlichen Kernels gemeinsam benutzt werden, die auf der gleichen Verarbeitungseinheit durch einen oder mehrere Threads oder Prozesse ausgeführt werden, wobei jede Verarbeitungseinheit ihren eigenen Pool eines privaten Notizblockspeichers aufweist. Im Kontext der folgenden Beschreibung ist ein Thread (z.B., ein Ausführungsthread) eine Instanziierung eines Satzes von Anweisungen, die auszuführen sind. Ein Kernel kann durch einen oder mehrere SECs ausgeführt werden. Der schnelle On-Chip-Speicher kann ebenfalls zwischen unterschiedlichen SECs gemeinsam benutzt werden, die den gleichen Kernel auf der gleichen Verarbeitungseinheit ausführen. Die gemeinsame Nutzung des Notizblockspeichers verringert die Latenzzeit zum Transferieren von Daten zwischen Kernels oder zwischen unterschiedliche SECs im Vergleich mit dem Transferieren der Daten durch eine Speicherhierarchie, die eine oder mehrere Ebenen an Zwischenspeicherung zu dem globalen Speicher umfassen kann. Die gemeinsame Nutzung des Notizblockspeichers verringert ebenfalls die Latenzzeit für Synchronisierungsoperationen zwischen unterschiedlichen SECs und unterschiedlichen Kernels im Vergleich mit der Synchronisierung durch die Speicherhierarchie.
  • Ein Verfahren und ein System werden für mehrere Verarbeitungseinheiten offenbart, die eine erste Verarbeitungseinheit umfasst, die einen ersten Notizblock und eine erste Registerdatei umfasst, wobei die erste Verarbeitungseinheit imstande ist, einen ersten Kernel und einen zweiten Kernel auszuführen. Die mehreren Verarbeitungseinheiten umfassen ebenfalls eine zweite Verarbeitungseinheit, die einen zweiten Notizblock und eine zweite Registerdatei umfasst, wobei die zweite Verarbeitungseinheit imstande ist, einen dritten Kernel auszuführen. Eine Planerlogik, die mit den mehreren Verarbeitungseinheiten gekoppelt ist, wobei die Planerschaltungen Kernels zuweisen, die durch die mehreren Verarbeitungseinheiten auszuführen sind, und ein Speicher mit den mehreren Verarbeitungseinheiten gekoppelt ist. Das Parallelverarbeitungssystem ist konfiguriert, so dass das Speichern der ersten Daten entweder in dem ersten Notizblock oder dem zweiten Notizblock nicht bewirkt, dass die ersten Daten in dem Speicher gespeichert werden, wobei der erste Notizblock konfiguriert ist, um einem solchen ersten Kernel zu erlauben, zweite Daten in dem ersten Notizblock zu speichern, um einem solchen zweiten Kernel zu erlauben, zweiten Daten aus dem ersten Notizblock zu laden, und einem solchen dritten Kernel zu verbieten, die zweiten Daten aus dem ersten Notizblock zu speichern oder zu laden. Der zweite Notizblock ist konfiguriert, um einem solchen dritten Kernel zu erlauben, dritte Daten in dem zweiten Notizblock zu speichern, und solchen ersten und zweiten Kernels zu verbieten, die dritten Daten aus dem zweiten Notizblock zu laden.
  • Figurenliste
    • 1A ist ein Konzeptdiagramm, das eine räumliche Pipeline zur Ausführung von Kernels A, B und C veranschaulicht, gemäß einer Ausführungsform.
    • 1B ist ein Konzeptdiagramm, das eine zeitliche Pipeline zur Ausführung von Kernels A, B und C veranschaulicht, gemäß einer Ausführungsform.
    • 2 veranschaulicht ein Ablaufdiagramm eines Verfahrens für mehrere Kernels, um Daten durch einen gemeinsam benutzten und persistenten Speicher auszutauschen, gemäß einer Ausführungsform.
    • 3 veranschaulicht eine parallele Verarbeitungseinheit gemäß einer Ausführungsform.
    • 4A veranschaulicht einen allgemeinen Verarbeitungscluster innerhalb der Parallelverarbeitungseinheit von 3, gemäß einer Ausführungsform.
    • 4B veranschaulicht eine Speicherpartitions-Einheit der Parallelverarbeitungseinheit von 3, gemäß einer Ausführungsform.
    • 5A veranschaulicht den Streaming-Multiprozessor von 4A, gemäß einer Ausführungsform.
    • 5B ist ein Konzeptdiagramm, das eine Verarbeitung-Pipeline zur Ausführung von Kernels A, B und C veranschaulicht, gemäß einer Ausführungsform.
    • 5C veranschaulicht ein Ablaufdiagramm eines Verfahrens zum Konfigurieren des Pools des gemeinsam benutzten Notizblockspeichers in einer Verarbeitungseinheit, um SECs zu erlauben, Daten durch einen gemeinsam benutzten und persistenten Speicher auszutauschen, gemäß einer Ausführungsform.
    • 6A ist ein Konzeptdiagramm eines Verarbeitungssystems, das unter Verwendung der PPU von 3 implementiert ist, gemäß einer Ausführungsform.
    • 6B veranschaulicht ein beispielhaftes System, bei dem die verschiedene Architektur und/oder Funktionalität der verschiedener vorherigen Ausführungsformen implementiert werden kann.
  • AUSFÜHRLICHE BESCHREIBUNG
  • Ein hochparalleler Prozessor, wie beispielsweise eine Graphikverarbeitungseinheit (GPU), ist eine Rechenvorrichtung, die imstande ist, eine sehr große Anzahl von Threads parallel auszuführen. Im Kontext der folgenden Beschreibung ist ein Thread ein Prozess oder ein Ausführungskontext. In einer Ausführungsform arbeitet ein hochparalleler Prozessor als ein Coprozessor zu der zentralen Hauptverarbeitungseinheit (CPU) oder dem Host: Mit anderen Worten werden datenparallele rechenintensive Abschnitte von Anwendungen, die auf dem Host laufen, auf die Coprozessorvorichtung entladen.
  • Genauer gesagt kann ein Abschnitt einer Anwendung, die viele Male, jedoch unabhängig, an unterschiedlichen Daten ausgeführt wird, in einer Kernelfunktion isoliert werden, die auf dem hochparallelen Prozessor als viele unterschiedliche Threads ausgeführt wird. Dahingehend ist eine solche Funktion in einem Anweisungssatz der Parallel-Thread-Ausführung (Parallel Thread Execution; PTX) kompiliert und der resultierende Kernel wird zur Installierungszeit in den Zielanweisungssatz des hochparallelen Prozessors übersetzt.
  • Der Batch von Threads, der einen Kernel ausführt, ist als ein Gitter von SECs (z.B., CTAs) organisiert. In einer Ausführungsform implementieren SECs CUDA® (Compute Unified Device Architektur) Thread-Blöcke, wobei CUDA® eine parallele Rechenplattform und Programmiermodell ist. Das PTX-Programmiermodell ist explizit parallel: ein PTX-Programm spezifiziert die Ausführung eines gegebenen Thread einer parallelen Thread-Anordnung.
  • Threads innerhalb eines SEC führen den gleichen Kernel nebenläufig aus und können miteinander kommunizieren. Um die Kommunikation der Threads innerhalb des SEC zu koordinieren, werden Synchronisierungspunkte spezifiziert, bei denen Threads warten, bis alle Threads in dem SEC an einer bestimmten Anweisung angekommen sind. Jeder Thread weist eine eindeutige Thread-Kennung innerhalb des SEC auf. Programme verwenden eine datenparallele Zerlegung, um Eingaben, Arbeit und Ergebnisse über die Threads des SEC zu partitionieren.
  • Jeder SEC-Thread verwendet seine Thread-Kennung, um seine zugewiesene Rolle zu definieren, spezifische Eingangs- und Ausgangspositionen zuzuweisen, Adressen zu berechnen und durchzuführende Arbeiten auszuwählen. In einer Ausführungsform ist die Thread-Kennung ein Vektor tid mit drei Elementen (mit Elementen tid.x, tid.y und tid.z), der die Position des Thread innerhalb eines ein-, zwei- oder dreidimensionalen SEC spezifiziert. In einer Ausführungsform reicht jede Thread-Kennungskomponente von Null bis zu der Anzahl von Thread-ids in der entsprechenden SEC-Dimension. In einer Ausführungsform weist jeder SEC eine ein-, zwei- oder drei-dimensionale Form auf, die durch einen Vektor ntid mit drei Elementen (mit Elementen ntid.x, ntid.y und ntid.z) spezifiziert wird. In einer Ausführungsform spezifiziert der Vektor ntid die Anzahl von Threads in jeder SEC-Dimension.
  • Threads innerhalb eines SEC werden auf eine Single-Instruction-Multiple-Thread (SIMT) Art und Weise in Gruppen genannt Warps ausgeführt. Ein Warp ist ein maximaler Teilsatz von Threads von einem einzigen SEC, so dass die Threads die gleichen Anweisungen zur gleichen Zeit ausführen. Threads innerhalb eines Warp sind sequenziell nummeriert. Die Warp-Größe ist eine maschinenabhängige Konstante. In einer Ausführungsform weist ein Warp 32 Threads auf. Einige Anwendungen können imstande sein, die Leistung mit Kenntnis der Warp-Größe zu maximieren, so dass die PTX eine unmittelbare Laufzeitkonstante, WARP SZ, umfasst, die in jeder Anweisung verwendet werden kann, bei der ein unmittelbarer Operand erlaubt ist.
  • Es gibt eine maximale Anzahl von Threads, die ein SEC enthalten kann, wie durch die Prozessorlogik begrenzt. SECs, die den gleichen Kernel ausführen, können jedoch zusammen in einem Gitter von SECs aneinandergefügt (batched) werden, das unabhängig ausgeführt wird, so dass die Gesamtzahl von Threads, die in einem einzigen Kernelaufruf gestartet werden können, sehr groß ist. In einem herkömmlichen hochparallelen Prozessor geht das Organisieren von SECs in einem Gitter jedoch auf Kosten von verringerter Thread-Kommunikation und Synchronisierung, weil Threads in unterschiedliche SECs nicht miteinander kommunizieren und synchronisieren können. Mehrere SECs können nebenläufig und parallel oder sequenziell (nacheinander) abhängig von der Plattform ausgeführt werden.
  • Jeder SEC weist eine eindeutige SEC-Kennung (ctaid) innerhalb eines Gitters von SECs auf. Jedes Gitter von SECs weist eine ein-, zwei- oder dreidimensionale Form auf, die durch den Parameter nctaid spezifiziert wird. Jedes Gitter weist ebenfalls eine eindeutige zeitliche Gitterkennung (gridid) auf. In einer Ausführungsform können Threads die Kennung und Parameterwerte durch vordefinierte, schreibgeschützte spezielle Register %tid, %ntid, %ctaid, %nctaid und %gridid lesen und verwenden.
  • Der Host gibt eine Folge von Kernelaufrufe an die hochparallele Verarbeitungsvorrichtung aus. Jeder Kernel wird als ein Batch von Threads ausgeführt, die als ein Gitter von SECs organisiert sind. Ein Pipeline-basiertes Programmiermodell ermöglicht die Steuerung der Nebenläufigkeit und Abhängigkeiten zwischen unterschiedlichen Kernels während der Ausführung durch den hochparallelen Prozessor. In einer Ausführungsform umfasst der hochparallele Prozessor mehrere Verarbeitungseinheiten, wobei jede Verarbeitungseinheit einen fest zugeordneten privaten Pool eines Notizblockspeichers aufweist. Das Pipeline-basierte Programmiermodell erlaubt, dass unterschiedliche Kernels durch eine einzige Verarbeitungseinheit entweder seriell oder parallel ausgeführt werden, um den Notizblockspeicher gemeinsam zu benutzen, der aus dem privaten Pool der einzigen Verarbeitungseinheit des Notizblockspeichers allokiert wurde.
  • 1A ist ein Konzeptdiagramm, das eine räumliche Pipeline 100 zur Ausführung von Kernels A, B und C veranschaulicht, gemäß einer Ausführungsform. Ein hochparalleler Prozessor 105 umfasst mehrere Verarbeitungseinheiten 110, wobei lediglich eine von diesen in 1A gezeigt ist. Der hochparallele Prozessor 105 ist mit einem globalen Speicher 120 durch eine Speicherhierarchie gekoppelt, die eine oder mehrere Speicheradressabbildung-, Übersetzung- und/oder Cache-Einheiten (nicht gezeigt) umfasst. Im Gegensatz zum Laden und Speichern von Daten von und zu dem globalen Speicher 120 durch die Speicherhierarchie, ist das Transferieren von Daten zu und/oder von einem gemeinsam benutzten Notizblockspeicher 115 innerhalb der Verarbeitungseinheit 110 schnell, wobei ein Datentransfer mit niedrigen Latenzzeiten bereitgestellt wird, ohne die Daten zwischen unterschiedlichen Ebenen der Speicherhierarchie zu kopieren oder zu bewegen. Der einzelne gemeinsam benutzte Notizblockspeicher 115 wird dem privaten Pool des Notizblockspeichers innerhalb der Verarbeitungseinheit 110 allokiert.
  • Das Pipeline-basierte Programmiermodell spezifiziert, dass die Kernels A, B und C nebenläufig auszuführen sind, die Daten durch den einzigen gemeinsam benutzten Notizblockspeicher 115 austauschen, wenn die Kernels A, B und C ausgeführt werden. Jeder der Kernels wird durch einen oder mehrere SECs basierend auf den Verarbeitungsressourcen zugewiesen, die von dem Kernel benötigt werden. Beispielsweise erzeugt und speichert der Kernel A Daten in dem gemeinsam benutzten Notizblockspeicher 115, die aus dem gemeinsam benutzten Notizblockspeicher 115 geladen und durch den Kernel B und/oder den Kernel C konsumiert werden. In einer Ausführungsform wird die Ausführung des Kernels B und/oder des Kernels C mit dem Kernel A synchronisiert, bevor der Kernel B und/oder der Kernel C die Daten lädt, die durch den Kernel A erzeugt und gespeichert wurden.
  • Der Kernel B kann die durch Kernel A erzeugten Daten verarbeiten, die aus dem gemeinsam benutzten Notizblockspeicher 115 geladen wurden, und kann die verarbeiteten Daten zurück in dem gemeinsam benutzten Notizblockspeicher 115 speichern. Die verarbeiteten Daten können dann aus dem gemeinsam benutzten Notizblockspeicher 115 durch den Kernel C und/oder den Kernel A zur weiteren Verarbeitung geladen werden. Schließlich können weitere verarbeitete Daten, die in dem gemeinsamen benutzten Notizblockspeicher 115 durch den Kernel C gespeichert sind, aus dem gemeinsam benutzten Notizblockspeicher 115 durch den Kernel A und/oder den Kernel B geladen werden. Eine beispielhafte Anwendung, die eine räumliche Pipeline 100 spezifizieren kann, umfasst eine hochparallele Paketverarbeitung zur Vernetzung. Wenn die Ausführung der Kernels A, B und C abgeschlossen ist, kann der gemeinsam benutzte Notizblockspeicher 115 deallokiert werden und der eine oder mehrere SECs können neu zugewiesen werden.
  • Zusätzlich zum Ermöglichen des Austauschs mit niedriger Latenzzeit von Daten zwischen unterschiedlichen Kernels erlaubt der gemeinsam benutzte Notizblockspeicher 115 ebenfalls den Austausch mit niedriger Latenzzeit von Daten zwischen unterschiedlichen SECs, die dem gleichen Kernel zugewiesen sind, für die innerhalb jeder Verarbeitungseinheit 110 ausgeführten SECs. Eine beispielhafte Anwendung, die eine verbesserte Leistung durch den Datenaustausch mit niedriger Latenzzeit zwischen SECs innerhalb den gleichen Verarbeitungseinheit 110 aufweisen kann, umfasst Pooling-Operationen für neuronale Netzwerke und/oder Reduktion-Operationen.
  • Veranschaulichendere Informationen werden nun hinsichtlich verschiedener optionaler Architekturen und Merkmale dargelegt, mit denen das vorangehende Rahmenwerk gemäß den Wünschen des Benutzers implementiert werden kann. Es sei eindringlich bemerkt, dass die folgenden Informationen für veranschaulichende Zwecke dargelegt werden und nicht als in irgendeiner Art und Weise begrenzend ausgelegt werden sollten. Jedes der folgenden Merkmale kann optional mit oder ohne den Ausschluss von anderen beschriebenen Merkmalen integriert sein.
  • 1B ist ein Konzeptdiagramm, das eine zeitliche Pipeline 130 zur Ausführung von Kernels A, B und C veranschaulicht, gemäß einer Ausführungsform. Gegenüber 1A wird der gemeinsam benutzte Notizblockspeicher 115 innerhalb der Verarbeitungseinheit 110 mit dem gemeinsam benutzten und persistenten Notizblockspeicher 125 ersetzt. Auf ähnliche Weise wie der gemeinsam benutzte Notizblockspeicher 115 stellt der gemeinsam benutzte und persistente Notizblockspeicher 125 ebenfalls einen Datentransfer mit niedrigen Latenzzeiten zwischen Kernels und/oder zwischen SECs bereit, ohne die Daten zwischen unterschiedlichen Ebenen der Speicherhierarchie zu kopieren oder zu bewegen. Der einzelne gemeinsam benutzte und persistente Notizblockspeicher 125 wird dem privaten Pool von Notizblockspeichern innerhalb der Verarbeitungseinheit 110 allokiert.
  • Das Pipeline-basierte Programmiermodell spezifiziert, dass die Kernels A, B und C seriell auszuführen sind, die Daten durch den einzigen gemeinsam benutzten und persistenten Notizblockspeicher 125 austauschen, wenn die Kernels A, B und C ausgeführt werden. Jeder der Kernels wird einem oder mehreren SECs basierend auf den durch den Kernel erforderlichen Verarbeitungsressourcen zugewiesen. Beispielsweise erzeugt der Kernel A Daten und speichert diese in dem gemeinsam benutzten und persistenten Notizblockspeicher 125. Die Daten werden dann aus dem gemeinsam benutzten und persistenten Notizblockspeicher 125 geladen und durch den Kernel B konsumiert. Die Daten, die in dem gemeinsam benutzten und persistenten Notizblockspeicher 125 durch den Kernel gespeichert werden, werden beibehalten, sogar nachdem die Ausführung des Kernels A abgeschlossen ist, weil die Kernels B und C die Ausführung nicht abgeschlossen haben. Daher wird der gemeinsam benutzte Speicher nicht nur gemeinsam benutzt, sondern ist auch persistent. Wenn die Ausführung des Kernels A abgeschlossen ist, können der eine oder mehrere SECs, die dem Kernel A zugewiesen sind, neu zugewiesen werden.
  • Jeder SEC, der auf der Verarbeitungseinheit 110 ausgeführt wird, kann auf den gemeinsam benutzten und persistenten Notizblockspeicher 125 zugreifen. In einer Ausführungsform kann ein SEC, der auf einer zweiten Verarbeitungseinheit 110 innerhalb des hochparallelen Prozessors 105 ausgeführt wird, jedoch nicht auf den gemeinsam benutzten und persistenten Notizblockspeicher 125 innerhalb der Verarbeitungseinheit 110 zugreifen.
  • Nachdem die Ausführung des Kernels A abgeschlossen ist, verarbeitet der Kernel B die durch den Kernel A erzeugten Daten und speichert die verarbeiteten Daten in den gemeinsam benutzten und persistenten Notizblockspeicher 125. Die Daten, die in dem gemeinsam benutzten und persistenten Notizblockspeicher 125 durch der Kernel B gespeichert werden, werden sogar beibehalten, nachdem die Ausführung des Kernels B abgeschlossen ist, weil der Kernel C die Ausführung nicht abgeschlossen hat. Wenn die Ausführung des Kernels B abgeschlossen ist, können jedoch der eine oder mehrere SECs, die dem Kernel B zugewiesen sind, neu zugewiesen werden.
  • Die durch den Kernel B gespeicherten verarbeiteten Daten können aus dem gemeinsam benutzten und persistenten Notizblockspeicher 125 durch den Kernel C zur weiteren Verarbeitung geladen werden. Wenn die Ausführung des Kernels C abgeschlossen ist, kann der gemeinsam benutzte und persistente Notizblockspeicher 125 deallokiert werden, und der eine oder mehrere SECs, die dem Kernel C zugewiesen sind, können neu zugewiesen werden. Eine beispielhafte Anwendung, die eine zeitliche Pipeline 130 spezifizieren kann, umfasst Deep-Learning-Inferenzierung, die mehrere in Folge durchgeführte hochparallele Operationen umfasst.
  • 2 veranschaulicht ein Ablaufdiagramm eines Verfahrens 200 für mehrere Kernels, um Daten durch einen gemeinsam benutzten und persistenten Speicher auszutauschen, gemäß einer Ausführungsform. In einer Ausführungsform kann das Verfahren 200 verwendet werden, um Daten durch den gemeinsam benutzten Notizblockspeicher 115 und den gemeinsam benutzten und persistenten Notizblockspeicher 125 auszutauschen, wie in 1A bzw. 1B gezeigt.
  • Bei Schritt 205 empfängt die Verarbeitungseinheit 110 mehrere Kernels zur Ausführung gemäß einer räumlichen Pipeline, wie beispielsweise der räumlichen Pipeline 100. In einer Ausführungsform kann die räumliche Pipeline 100 unter Verwendung einer graphenbasierten Definition ausgedrückt werden, um nebenläufige Ausführungsbeschränkungen und Abhängigkeiten anzugeben. Eine solche graphenbasierte Definition kann in einen oder mehrere Kernels umgewandelt werden, die räumliche und/oder zeitliche Pipelines umfassen.
  • Bei Schritt 210 bestimmt die Verarbeitungseinheit Verarbeitungsressourcen, die für jeden Kernel spezifiziert sind. Die Verarbeitungsressourcen können eine oder mehrere Funktionen oder Operationen, Register, einen privaten Speicher pro Thread und eine gemeinsam benutzte Speichermenge umfassen. In einer herkömmlichen Verarbeitungseinheit sind die Verarbeitungsressourcen für beliebige Kernels, die dem gleichen SEC zugewiesen sind, gleich. Im Gegensatz dazu kann die Verarbeitungseinheit 110 konfiguriert sein, um unterschiedliche Mengen von Verarbeitungsressourcen unterschiedlichen Kernels zu allokieren, die dem gleichen SEC zugewiesen sind.
  • Bei Schritt 215 werden die Verarbeitungsressourcen für jeden Kernel allokiert und SECs werden zugewiesen, um Datenaustauschbeschränkungen zu genügen, die durch die räumlichen und/oder zeitlichen Pipelines definiert sind. In einer Ausführungsform erhält die Verarbeitungseinheit 110 eine Größe der gemeinsam benutzten Speicherressource, die für jeden Kernel spezifiziert ist. In einer Ausführungsform ist eine Größe des gemeinsam benutzten Notizblockspeichers 115, der einem oder mehreren Kernels allokiert ist, gleich einer größten gemeinsam benutzten Speicherressource, die für den einen oder mehrere Kernels spezifiziert ist. In einer Ausführungsform ist eine Größe des gemeinsam benutzten Notizblockspeichers 115, der einem oder mehreren Kernels allokiert ist, gleich einer Summe der gemeinsam benutzten Speicherressourcen, die für den einen oder mehrere Kernels spezifiziert ist. Bei Schritt 220 werden die den Kernels zugewiesenen SECs gestartet.
  • Wenn die Verarbeitungseinheit 110 bei Schritt 225 bestimmt, dass die Ausführung der Kernels abgeschlossen ist, dann werden bei Schritt 230 die Verarbeitungsressourcen deallokiert und die SECs können anderen Kernels zugewiesen werden. In einer Ausführungsform wird der gemeinsam benutzte Notizblockspeicher 115 deallokiert, der dem einem oder mehreren Kernels allokiert ist, wenn die Ausführung aller der Kernels abgeschlossen ist, die den Notizblockspeicher 115 gemeinsam nutzen.
  • Die Anzahl von SECs, die eine Verarbeitungseinheit 110 nebenläufig verarbeiten kann, hängt von der Anzahl von Registern, die pro Thread benötigt werden, und der Größe des gemeinsam benutzten Notizblockspeichers pro SEC ab, der für einen gegebenen Kernel erforderlich ist, da die Verarbeitungsressourcen innerhalb der Verarbeitungseinheit 110 (z.B., Register und privater Pool des Notizblockspeichers) unter allen den Threads aufgeteilt werden, die dem Kernel zugewiesen sind. Wenn es nicht genug Register und/oder gemeinsam benutzten Speicher gibt, die pro Verarbeitungseinheit 110 verfügbar sind, um mindestens einen SEC zu verarbeiten, wird der Start des Kernels fehlschlagen. In einer Ausführungsform kann der Notizblockspeicher in einer Vielfalt von Größen (z.B., 16KB, 32KB, 64KB, etc.) allokiert werden.
  • Obwohl das Verfahren 200 im Kontext eines Prozessors beschrieben ist, kann das Verfahren 200 ebenfalls von einem Programm, einer kundenspezifischen Logik oder Schaltungen oder durch eine Kombination von kundenspezifische Schaltungen und einem Programm durchgeführt werden. Beispielsweise kann das Verfahren 200 durch eine GPU oder CPU oder eine beliebige Logikvorrichtung oder Prozessor ausgeführt werden, die/der imstande ist, einen gemeinsam benutzten Notizblockspeicher bereitzustellen. Des Weiteren werden Fachleute verstehen, dass jedes System, welches das Verfahren 200 durchführt, innerhalb des Umfangs und Wesens von Ausführungsformen der vorliegenden Offenbarung ist.
  • Zusätzlich zu dem gemeinsam benutzten Notizblockspeicher 115 und/oder dem gemeinsam benutzten und persistenten Notizblockspeicher 125 weist jeder Thread auch einen privaten lokalen Speicher auf. Herkömmlicherweise benutzen die Threads, die in einem einzigen SEC enthalten sind, einen Abschnitt des Speichers gemeinsam, der aus dem privaten Pool von Notizblockspeichern innerhalb der Verarbeitungseinheit 110 allokiert ist. Herkömmlicherweise wird der Abschnitt des Speichers deallokiert, der von dem privaten Pool von Notizblockspeicher allokiert ist, wenn der SEC die Ausführung abschließt. Bedeutender Weise ist der Abschnitt des Speichers für Threads in anderen SECs nicht sichtbar, und weil der Abschnitt des Speicher nicht persistent ist, kann er nicht zwischen unterschiedlichen SECs gemeinsam benutzt werden, die der Reihe nach ausgeführt werden. Daher tauschen in der herkömmlichen Speicherhierarchie Threads in unterschiedlichen SECs Daten unter Verwendung des Pfades mit hoher Latenzzeit durch den globalen Speicher 120 aus, der durch Speicher- und Ladeoperationen bereitgestellt wird.
  • In einer Ausführungsform sind zusätzliche Speicherräume durch alle Threads zugänglich: konstanter Speicher-, Texturspeicher- und Oberflächenspeicherräume. Der konstante Speicher und der Texturspeicher sind schreibgeschützt; der Oberflächenspeicher ist jedoch lesbar und beschreibbar. Der globale Speicher 120, der konstante Speicher, der Texturspeicher und Oberflächenspeicherräume sind für unterschiedliche Speichernutzungen optimiert. Beispielsweise bietet der Texturspeicher unterschiedliche Adressierungsmoden sowie auch Datenfilterung für spezifische Datenformate an. Es sei bemerkt, dass der Texturspeicher und Oberflächenspeicher zwischengespeichert werden und innerhalb des gleichen Kernelaufrufs der Cache nicht kohärent mit Bezug auf globale Speicherschreibvorgänge und Oberflächenspeicherschreibvorgänge gehalten wird, so dass jeder Texturholvorgang oder Oberflächenlesevorgang zu einer Adresse, die über einen globalen Schreibvorgang oder einen Oberflächenschreibvorgang in dem gleichen Kernelaufruf geschrieben wurde, undefinierte Daten zurückgibt. Mit anderen Worten kann ein Thread einen Texturspeicher- oder Oberflächenspeicherplatz nur sicher lesen, wenn der Speicherplatz durch einen vorherigen Kernelaufruf oder eine Speicherkopie aktualisiert wurde, jedoch nicht sicher lesen, wenn er zuvor durch den gleichen Thread oder einen anderen Thread des gleichen Kernelaufrufs aktualisiert wurde.
  • Der gemeinsam benutzte Notizblockspeicher 115 und der gemeinsam benutzte und persistente Notizblockspeicher 125 werden nicht zwischengespeichert. Daten, die in dem gemeinsam benutzten Notizblockspeicher 115 und dem gemeinsam benutzten und persistenten Notizblockspeicher 125 gespeichert sind, werden nicht in einen Hintergrundspeicher bewegt oder kopiert. Aus einem Blickpunkt des Thread ist das Zugreifen auf den gemeinsam benutzten Notizblockspeicher 115 und den gemeinsam benutzten und persistenten Notizblockspeicher 125 ähnlich dem Zugreifen auf den globalen Speicher 120, jedoch viel schneller.
  • In einer Ausführungsform wird die Architektur des hochparallelen Prozessors 105 um eine skalierbare Anordnung von Verarbeitungseinheiten 110 aufgebaut, wobei jede Verarbeitungseinheit 110 ein Multithread-Streaming-Multiprozessor (SM) ist. Wenn ein Host-Programm ein Kernelgitter aufruft, werden die SECs des Gitters gezählt und an Verarbeitungseinheiten 110 mit verfügbarer Ausführungskapazität verteilt. Die Threads eines SEC werden nebenläufig auf einer Verarbeitungseinheit 110 ausgeführt. Wenn SECs enden, werden neue Blöcke auf den geräumten Verarbeitungseinheiten 110 gestartet.
  • Eine Verarbeitungseinheit 110 umfasst mehrere Skalarprozessorkerne, eine Multithread-Anweisungseinheit und einen privaten On-Chip-Pool eines Notizblockspeichers. Die Verarbeitungseinheit 110 erzeugt, verwaltet und führt nebenläufige Threads in Hardware mit Null Planung-Overhead aus. Sie implementiert eine Einzelanweisung-Barrierensynchronisierung. Eine schnelle Barrierensynchronisierung unterstützt zusammen mit der Erzeugung eines leichtgewichtigen Thread und Null Overhead-Thread-Scheduling effizient eine sehr feingranulierte Parallelität, was beispielsweise eine niedrige Granularitätsdekomposition von Problemen durch Zuweisen eines Thread zu jedem Datenelement erlaubt (wie beispielsweise ein Pixel in einem Bild, ein Voxel in einem Volumen, eine Zelle in einer gitterbasierten Berechnung).
  • Um Hunderte von Threads zu verwalten, die auf mehreren unterschiedlichen Programmen laufen, benutzt die Verarbeitungseinheit 110 eine Architektur, die als SIMT (Single Instruction, Multiple Thread) bezeichnet wird. Die Verarbeitungseinheit 110 bildet jeden Thread auf einen skalaren Prozessorkern ab und jeder skalare Thread wird unabhängig mit seiner eigenen Anweisungsadresse und Registerzustand ausgeführt. Die Multiprozessor-Planereinheit erzeugt, verwaltet, plant und führt Threads in Gruppen von parallelen Threads genannt Warps aus. (Dieser Begriff stammt vom Weben, der ersten parallelen Thread-Technologie.) Einzelne Threads, die einen SIMT-Warp zusammensetzen, starten zusammen an der gleichen Programmadresse, sind jedoch anderenfalls frei, unabhängig verzweigt und ausgeführt zu werden.
  • Wenn eine bestimmte Verarbeitungseinheit 110 einem oder mehreren Thread-Blöcke zur Ausführung gegeben wird, teilt die Verarbeitungseinheit 110 die Thread-Blöcke in Warps auf, die durch die Planereinheit geplant werden. Die Weise, in der ein Block in Warps aufgeteilt wird, ist immer die Gleiche; jeder Warp enthält Threads von aufeinanderfolgenden, zunehmenden Thread-IDs, wobei der erste Warp Thread 0 enthält.
  • Bei jeder Anweisungsausgabezeit wählt die Planereinheit einen Warp aus, der zur Ausführung bereit ist, und gibt die nächste Anweisung an die aktiven Threads des Warp aus. Ein Warp führt eine gemeinsame Anweisung zu einer Zeit aus, so dass volle Effizienz verwirklicht wird, wenn alle Threads eines Warp hinsichtlich ihres Ausführungspfads übereinstimmen. Wenn Threads eines Warp über eine datenabhängige bedingte Verzweigung divergieren, führt der Warp seriell jeden genommenen Verzweigungspfad aus, wobei Threads deaktiviert werden, die nicht auf diesem Pfad sind, und wenn alle Pfade abgeschlossen sind, konvergieren die Threads zurück zu dem gleichen Ausführungspfad. Eine Verzweigungsdivergenz tritt nur innerhalb eines Warp auf; unterschiedliche Warps werden ungeachtet dessen, ob die Warps gemeinsame oder zusammenhanglose Code-Pfade ausführen, unabhängig ausgeführt.
  • SIMT-Architektur ist dadurch einer Einzelanweisung-Mehrfachdaten (Single Instruction Multiple Data; SIMD)-Vektororganisationen ähnlich, dass eine Einzelanweisung mehrere Verarbeitungselemente steuert. Ein entscheidender Unterschied ist, dass die SIMD-Vektororganisationen die SIMD-Breite der Software exponieren, wohingegen SIMT-Anweisungen die Ausführung und das Verzweigungsverhalten eines einzelnen Threads spezifizieren. Im Gegensatz zu SIMD-Vektormaschinen ermöglicht SIMT Programmierern, einen parallelen Code auf Thread-Ebene für unabhängige skalare Threads sowie auch einen datenparallelen Code für koordinierte Threads zu schreiben. Der Korrektheit halber kann der Programmierer im Wesentlichen das SIMT-Verhalten ignorieren; wesentliche Leistungsverbesserungen können jedoch verwirklicht werden, indem Sorge getragen wird, dass der Code selten verlangt, dass Threads in einem Warp divergieren. In der Praxis ist dies analog zu der Rolle von Cache-Zeilen in einem herkömmlichen Code: die Cache-Zeilengröße kann bei der Gestaltung für Korrektheit sicher ignoriert werden, muss jedoch in der Codestruktur bei der Gestaltung für Spitzenleistung berücksichtigt werden. Vektorarchitekturen verlangen andererseits, dass die Software Lasten in Vektoren koalesziert und Divergenz manuell verwaltet. Eine Ausführungsform der SIMT-Architektur wird nachstehend ausführlicher beschrieben.
  • Parallelverarbeitungsarchitektur
  • 3 veranschaulicht eine Parallelverarbeitungseinheit (PPU) 300 gemäß einer Ausführungsform. In einer Ausführungsform ist die PPU 300 ein Multi-Threaded-Prozessor, der auf einer oder mehreren integrierten Schaltungsvorrichtungen implementiert ist. In einer Ausführungsform ist der hochparallele Prozessor 105 eine PPU 300. Die PPU 300 ist eine Latenzzeit-verbergende Architektur, die ausgestaltet ist, um viele Threads parallel auszuführen. In einer Ausführungsform ist die PPU 300 eine Graphikverarbeitungseinheit (GPU), die konfiguriert ist, um eine Graphik-Rendering-Pipeline zur Verarbeitung von dreidimensionalen (3D) Graphikdaten zu implementieren, um zweidimensionale (2D) Bilddaten zur Anzeige auf einer Anzeigevorrichtung, wie beispielsweise einer Flüssigkristallanzeige(LCD)-Vorrichtung, zu erzeugen. In anderen Ausführungsformen kann die PPU 300 zum Durchführen von Allzweckberechnungen benutzt werden. Während ein beispielhafter paralleler Prozessor hier für veranschaulichende Zwecke bereitgestellt wird, sei nachdrücklich bemerkt, dass ein derartiger Prozessor lediglich für veranschaulichende Zwecke dargelegt wird und dass ein beliebiger Prozessor benutzt werden kann, um dasselbe zu ergänzen und/oder zu ersetzen.
  • Eine oder mehrere PPUs 300 können konfiguriert sein, um Tausende von HPC(High Performing Computing)-, Datenzentrum- und Maschinenlern-Anwendungen zu beschleunigen. Die PPU 300 kann konfiguriert sein, um zahlreiche Systeme und Anwendungen für tiefgehendes Lernen zu beschleunigen, die autonome Fahrzeugplattformen, tiefgehendes Lernen, hochgenaue Sprache, Bild- und Texterkennungssysteme, intelligente Videoanalyse, molekulare Simulationen, Wirkstoffentdeckung, Krankheitsdiagnose, Wettervorhersage, Analyse großer Datenmengen, Astronomie, Molekulardynamiksimulation, Finanzmodellierung, Robotertechnik, Fabrikautomation, Sprachübersetzung in Echtzeit, Online-Suchoptimierungen und personalisierte Benutzerempfehlungen und dergleichen umfassen.
  • Wie in 3 gezeigt, umfasst die PPU 300 eine Eingabe/Ausgabe(E/A)-Einheit 305, eine Frontend-Einheit 315, eine Planer-Einheit 320, eine Arbeitsverteilungs-Einheit 325, einen Hub 330, eine Kreuzschiene (XBar) 370, einen oder mehrere allgemeine Verarbeitungscluster (GPCs) 350 und eine oder mehrere Partitions-Einheiten 380. Die PPU 300 kann mit einem Host-Prozessor oder anderen Peripheriegeräten über einen Interconnect 302 verbunden sein. Die PPU 300 kann ebenfalls mit einem Host-Prozessor oder anderen peripheren Vorrichtungen über einen Interconnect 302 verbunden sein. Die PPU 300 kann ebenfalls mit einem lokalen Speicher 304 verbunden sein, der eine Anzahl von Speichervorrichtungen umfasst. In einer Ausführungsform ist der lokale Speicher 304 der globale Speicher 120. In einer Ausführungsform kann der lokale Speicher eine Anzahl von Direktzugriffsspeicher(DRAM)-Vorrichtungen umfassen. Die DRAM-Vorrichtungen können als ein HBM(Speicher mit hoher Bandbreite)-Subsystem konfiguriert sein, wobei mehrere DRAM-Dies innerhalb jeder Vorrichtung gestapelt sind.
  • Der Interconnect des NVLink 310 ermöglicht Systemen, eine oder mehrere PPUs 300 zu skalieren und zu umfassen, die mit einer oder mehreren CPUs kombiniert sind, unterstützt Cache-Kohärenz zwischen den PPUs 300 und CPUs sowie CPU-Mastering. Daten und/oder Befehle können mittels des NVLink 310 durch den Hub 330 an/von anderen Einheiten der PPU 300, wie beispielsweise eine oder mehrere Kopiermaschinen, einen Videocodierer, einen Videodecodierer, eine Leistungsverwaltungseinheit usw. (nicht explizit gezeigt) übertragen werden. Das NVLink 310 wird ausführlicher in Verbindung mit 5B beschrieben.
  • Die E/A-Einheit 305 ist konfiguriert, um Kommunikationen (d.h. Befehle, Daten usw.) von einem Host-Prozessor (nicht gezeigt) über den Interconnect 302 zu übertragen und zu empfangen. Die E/A-Einheit 305 kann mit dem Host-Prozessor direkt über den Interconnect 302 oder durch eine oder mehrere Zwischenvorrichtungen, wie beispielsweise eine Speicherbrücke, kommunizieren. In einer Ausführungsform kann die E/A-Einheit 305 mit einem oder mehreren anderen Prozessoren, wie beispielsweise eine oder mehrere der PPUs, über den Interconnect 302 kommunizieren. In einer Ausführungsformen implementiert die E/A-Einheit 305 eine PCIe(Peripheral Component Interconnect Express)-Schnittstelle für Kommunikationen über einen PCIe-Bus und der Interconnect 302 ist ein PCIe-Bus. In alternativen Ausführungsformen kann die E/A-Einheit 305 andere Typen von wohlbekannten Schnittstellen zum Kommunizieren mit externen Vorrichtungen umfassen.
  • Die E/A-Einheit 305 decodiert Pakete, die über den Interconnect 302 empfangen werden. In einer Ausführungsform stellen die Pakete Befehle dar, die konfiguriert sind, um die PPU 300 zu veranlassen, verschiedene Operationen durchzuführen. Die E/A-Einheit 305 überträgt die decodierten Befehle an verschiedene andere Einheiten der PPU 300, wie es die Befehle spezifizieren können. Beispielsweise können einige Befehle an die Frontend-Einheit 315 übertragen werden. Andere Befehle können an den Hub 330 oder andere Einheiten der PPU 300, wie beispielsweise eine oder mehrere Kopiermaschinen, einen Video-Codierer, einen Video-Decodierer, eine Leistungsverwaltungseinheit usw. (nicht explizit gezeigt) übertragen werden. Mit anderen Worten ist die E/A-Einheit 305 konfiguriert, um Kommunikationen zwischen und unter den verschiedenen logischen Einheiten der PPU 300 weiterzuleiten.
  • In einer Ausführungsform codiert ein Programm oder Kernel, das von dem Host-Prozessor ausgeführt wird, einen Befehlsstrom in einem Puffer, welcher der PPU 300 Arbeitslasten zur Verarbeitung bereitstellt. Eine Arbeitslast kann mehrere Anweisungen und Daten umfassen, die von diesen Anweisungen zu verarbeiten sind. Der Puffer ist eine Region in einem Speicher, der von sowohl dem Host-Prozessor als auch der PPU 300 zugänglich ist (d.h. Lesen/Schreiben). Beispielsweise kann die Host-Schnittstelleneinheit 305 konfiguriert sein, um auf den Puffer in einem Systemspeicher, der mit dem Interconnect 302 verbunden ist, über Speicheranfragen, die über den Interconnect 302 übertragen werden, zuzugreifen. In einer Ausführungsform schreibt der Host-Prozessor den Befehlsstrom in den Puffer und überträgt dann einen Zeiger zu dem Start des Befehlsstroms an die PPU 300. Die Frontend-Einheit 315 empfängt Zeiger auf einen oder mehrere Befehlsströme. Die Frontend-Einheit 315 verwaltet den einen oder mehrere Ströme, wobei Befehle aus den Strömen gelesen und Befehle an die verschiedenen Einheiten der PPU 300 weitergeleitet werden.
  • Die Frontend-Einheit 315 ist mit einer Planer-Einheit 320 gekoppelt, welche die verschiedenen GPCs 350 konfiguriert, um Aufgaben zu verarbeiten, die durch den einen oder mehrere Ströme definiert sind. Die Planer-Einheit 320 ist konfiguriert, um Zustandsinformation zu verfolgen, die verschiedene Aufgaben betrifft, die von der Planer-Einheit 320 verwaltet werden. Der Zustand kann angeben, welchem GPC 350 eine Aufgabe zugewiesen ist, ob die Aufgabe aktiv oder inaktiv ist, ob ein Prioritätsniveau der Aufgabe zugeordnet ist und so weiter. Die Planer-Einheit 320 verwaltet die Ausführung einer Mehrzahl von Aufgaben auf dem einen oder mehreren GPCs 350.
  • Die Planer-Einheit 320 ist mit einer Arbeitsverteilungs-Einheit 325 gekoppelt, die konfiguriert ist, um Aufgaben zur Ausführung auf den GPCs 350 zu versenden. Die Arbeitsverteilungs-Einheit 325 kann eine Anzahl von eingeplanten Aufgaben verfolgen, die von der Planer-Einheit 320 empfangen werden. In einer Ausführungsform verwaltet die Arbeitsverteilungs-Einheit 325 einen Pool für anstehende Aufgaben und einen Pool für aktive Aufgaben für jeden der GPCs 350. Der Pool für anstehende Aufgaben kann eine Anzahl von Slots (z.B. 32 Slots) umfassen, die Aufgaben enthalten, die zugewiesen sind, um von einem bestimmten GPC 350 verarbeitet zu werden. Der Pool für aktive Aufgaben kann eine Anzahl von Slots (z.B. 4 Slots) für Aufgaben umfassen, die von den GPCs 350 aktiv verarbeitet werden. Wenn ein GPC 350 die Ausführung einer Aufgabe abschließt, wird diese Aufgabe aus dem Pool für aktive Aufgaben für den GPC 350 geräumt und eine der anderen Aufgaben wird aus dem Pool für anstehende Aufgaben ausgewählt und zur Ausführung auf dem GPC 350 eingeplant. Wenn eine aktive Aufgabe auf dem GPC 350 inaktiv war, wie beispielsweise während darauf gewartet wird, dass eine Datenabhängigkeit behoben wird, dann kann die aktive Aufgabe aus dem GPC 350 geräumt und zu dem Pool für anstehende Aufgaben zurückgeführt werden, während eine weitere Aufgabe in dem Pool für anstehende Aufgaben ausgewählt und zur Ausführung auf dem GPC 350 eingeplant wird.
  • Die Arbeitsverteilungs-Einheit 325 kommuniziert mit dem einen oder mehreren GPCs 350 über eine Kreuzschiene bzw. XBar 370. Die XBar 370 ist ein Interconnect-Netzwerk, das viele der Einheiten der PPU 300 mit anderen Einheiten der PPU 300 koppelt. Beispielsweise kann die XBar 370 konfiguriert sein, um die Arbeitsverteilungs-Einheit 325 mit einem bestimmten GPC 350 zu koppeln. Obwohl nicht explizit gezeigt, kann eine oder mehrere andere Einheiten der PPU 300 ebenfalls mit der XBar 370 über den Hub 330 verbunden sein.
  • Die Aufgaben werden von der Planer-Einheit 320 verwaltet und an einen GPC 350 durch die Arbeitsverteilungs-Einheit 325 versandt. Der GPC 350 ist konfiguriert, um die Aufgabe zu verarbeiten und Ergebnisse zu erzeugen. Die Ergebnisse können von anderen Aufgaben innerhalb des GPC 350 konsumiert werden, an einen unterschiedlichen GPC 350 über die XBar 370 weitergeleitet oder im Speicher 304 gespeichert werden. Die Ergebnisse können in den Speicher 304 über die Partitions-Einheiten 380 geschrieben werden, die eine Speicherschnittstelle zum Lesen und Schreiben von Daten in/aus dem Speicher 304 implementieren. In einer Ausführungsform umfasst die PPU 300 eine Anzahl U von Speicherpartitions-Einheiten 380, die gleich der Anzahl von getrennten und unterschiedlichen Speichervorrichtungen 304 ist, die mit der PPU 300 gekoppelt sind. Eine Speicherpartitions-Einheit 380 wird nachstehend ausführlicher in Verbindung mit 4B beschrieben.
  • In einer Ausführungsform führt ein Host-Prozessor einen Treiber-Kernel aus, der eine Anwendungsprogrammmier-Schnittstelle (API) implementiert, die einer oder mehreren Anwendungen ermöglicht, die auf dem Host-Prozessor ausgeführt werden, Operationen zur Ausführung auf der PPU 300 einzuplanen. In einer Ausführungsform werden mehrere Rechenanwendungen gleichzeitig von der PPU 300 ausgeführt und die PPU 300 stellt Isolierung, Dienstequalität (QoS) und unabhängige Adressräume für die mehreren Rechenanwendungen bereit. Eine Anwendung kann Anweisungen (d.h. API-Aufrufe) erzeugen, welche den Treiberkernel veranlassen, eine oder mehrere Aufgaben zur Ausführung durch die PPU 300 zu erzeugen. Der Treiberkernel gibt Aufgaben an einen oder mehrere Streams aus, die von der PPU 300 verarbeitet werden. Jede Aufgabe kann eine oder mehrere Gruppen von in Beziehung stehender Threads umfassen, die hier als ein Warp bezeichnet werden. In einer Ausführungsform umfasst ein Warp 32 in Beziehung stehende Threads, die parallel ausgeführt werden können.
  • 4A veranschaulicht einen GPC 350 der PPU 300 von 3 gemäß einer Ausführungsform. Wie in 4A gezeigt, umfasst jeder GPC 350 eine Anzahl von Hardwareeinheiten zur Verarbeitung von Aufgaben. In einer Ausführungsform umfasst jeder GPC 350 einen Pipeline-Manager 410, eine Vor-Raster-Operationen-Einheit (PROP) 415, eine Raster-Engine 425, eine Arbeitsverteilungs-Kreuzschiene (WDX) 480, eine Speicherverwaltungseinheit (MMU) 490 und einen oder mehrere Datenverarbeitungscluster (DPCs) 420. Es wird anerkannt, dass der GPC 350 von 4A andere Hardwareeinheiten anstelle von oder zusätzlich zu den in 4A gezeigten Einheiten umfassen kann.
  • In einer Ausführungsform wird der Betrieb des GPC 350 durch den Pipeline-Manager 410 gesteuert. Der Pipeline-Manager 410 verwaltet die Konfiguration des einen oder mehrerer DPCs 420 zur Verarbeitung von Aufgaben, die dem GPC 350 zugeteilt sind. In einer Ausführungsform kann der Pipeline-Manager 410 mindestens einen des einen oder mehreren DPCs 420 konfigurieren, um mindestens einen Abschnitt einer Graphik-Rendering-Pipeline zu implementieren. Beispielsweise kann ein DPC 420 konfiguriert sein, um ein Vertex-Shader-Programm auf dem programmierbaren Streaming-Multiprozessor (SM) 440 auszuführen. Der Pipeline-Manager 410 kann ebenfalls konfiguriert sein, um Pakete, die von der Arbeitsverteilungs-Einheit 325 empfangen werden, an die geeigneten logischen Einheiten innerhalb des GPC 350 weiterzuleiten. Beispielsweise können einige Pakete an Festfunktions-Hardwareeinheiten in der PROP 415 und/oder der Raster-Engine 425 weitergeleitet werden, während andere Pakete an die DPCs 420 zur Verarbeitung durch die Primitiven-Engine 435 oder den SM 440 weitergeleitet werden können. In einer Ausführungsform kann der Pipeline-Manager 410 mindestens einen des einen oder der mehreren DPCs konfigurieren, um ein neuronales Netzwerkmodell und/oder eine Rechen-Pipeline zu implementieren.
  • Die PROP-Einheit 415 ist konfiguriert, um Daten, die von der Raster-Engine 425 und den DPCs 420 erzeugt werden, an eine Raster-Operationen-Einheit (ROP-Einheit) weiterzuleiten, die nachstehend ausführlicher in Verbindung mit 4B beschrieben wird. Die PROP-Einheit 415 kann ebenfalls konfiguriert sein, um Optimierungen zur Farbenmischung durchzuführen, Pixeldaten zu organisieren, Adressenübersetzungen und dergleichen durchzuführen.
  • Die Raster-Engine 425 umfasst eine Anzahl von Festfunktions-Hardwareeinheiten, die konfiguriert sind, um verschiedene Raster-Operationen durchzuführen. In einer Ausführungsform umfasst die Raster-Engine 425 eine Setup-Engine, eine Grobraster-Engine, eine Aussonderungs-Engine, eine Abschneide-Engine, eine Feinraster-Engine und eine Kachelverschmelzende Engine. Die Setup-Engine empfängt transformierte Vertices und erzeugt Ebenengleichungen, die den geometrischen Primitiven zugeordnet sind, die durch die Vertices definiert werden. Die Ebenengleichungen werden an die Grobraster-Engine übertragen, um Abdeckungsinformation (z.B. eine (x,y)-Abdeckungsmaske für eine Kachel) für die Primitive zu erzeugen. Die Ausgabe der Grobraster-Engine wird an die Aussonderungs-Engine übertragen, wo Fragmente, die der Primitiven zugeordnet sind, die einen z-Test nicht bestehen, ausgesondert und an eine Abschneide-Engine übertragen werden, wo Fragmente, die außerhalb eines Betrachtungsstumpfes liegen, abgeschnitten werden. Diejenigen Fragmente, welche die Abschneidung und Aussonderung überleben, können an eine Feinraster-Engine weitergeben werden, um Attribute für die Pixelfragmente basierend auf den Ebenengleichungen zu erzeugen, die durch die Setup-Engine erzeugt werden. Die Ausgabe der Raster-Engine 425 umfasst Fragmente, die beispielsweise von einem Fragment-Shader zu verarbeiten sind, der innerhalb eines DPC 420 implementiert ist.
  • Jeder DPC 420, der in dem GPC 350 enthalten ist, umfasst einen M-Pipe-Controller (MPC) 430, eine Primitiven-Engine 435 und einen oder mehrere SMs 440. Der MPC 430 steuert den Betrieb des DPC 420, wobei von dem Pipeline-Manager 410 empfangene Pakete an die geeigneten Einheiten im DPC 420 weiterleitet werden. Beispielsweise können einem Vertex zugeordnete Pakete an die Primitiven-Engine 435 weitergeleitet werden, die konfiguriert ist, um der Vertexzugeordnete Vertexattribute aus dem Speicher 304 abzurufen. Im Gegensatz dazu können einem Shader-Programm zugeordnete Pakete an den SM 440 übertragen werden.
  • Der SM 440 umfasst einen programmierbaren Streaming-Prozessor, der konfiguriert ist, um Aufgaben zu verarbeiten, die durch eine Anzahl von Threads dargestellt werden. Jeder SM 440 umfasst mehrere Threads (ist multi-threaded) und ist konfiguriert, um mehrere Threads (z.B. 32 Threads) von einer bestimmten Gruppe von Threads nebenläufig auszuführen. In einer Ausführungsform implementiert der SM 440 eine SIMD(Einzelne-Anweisung, Mehrere-Daten)-Architektur, wobei jeder Thread in einer Gruppe von Threads (d.h. einem Warp) konfiguriert ist, um einen unterschiedlichen Satz von Daten basierend auf dem gleichen Satz von Anweisungen zu verarbeiten. Alle Threads in der Gruppe von Threads führen die gleichen Anweisungen aus. In einer anderen Ausführungsform implementiert der SM 440 eine SIMT(Einzelne Anweisung, Mehrere Threads)-Architektur, wobei jeder Thread in einer Gruppe von Threads konfiguriert ist, um einen unterschiedlichen Satz von Daten basierend auf dem gleichen Satz von Anweisungen zu verarbeiten, wobei jedoch einzelnen Threads in der Gruppe von Threads ermöglicht wird, während der Ausführung zu divergieren. In einer Ausführungsform wird ein Programmzähler, ein Aufrufstapel und ein Ausführungszustand für jeden Warp beibehalten, was eine Nebenläufigkeit zwischen Warps und eine serielle Ausführung innerhalb Warps ermöglicht, wenn Threads innerhalb des Warps divergieren. In einer weiteren Ausführungsform wird ein Programmzähler, ein Aufrufstapel und ein Ausführungszustand für jeden einzelnen Thread beibehalten, was eine gleiche Nebenläufigkeit zwischen allen Threads, innerhalb und zwischen Warps ermöglicht. Wenn der Ausführungszustand für jeden einzelnen Thread beibehalten wird, können Threads, welche die gleichen Anweisungen ausführen, konvergiert und für maximale Effizienz parallel ausgeführt werden. Der SM 440 wird ausführlicher nachstehend in Verbindung mit 5A beschrieben.
  • Die MMU 490 stellt eine Schnittstelle zwischen dem GPC 350 und der Partitions-Einheit 380 bereit. Die MMU 490 kann eine Übersetzung von virtuellen Adressen in physische Adressen, einen Speicherschutz und eine Arbitrierung von Speicheranfragen bereitstellen. In einer Ausführungsform stellt die MMU 490 einen oder mehrere Adressenübersetzungspuffer (TLBs = translation lookaside buffers) zum Durchführen der Übersetzung von virtuellen Adressen in physische Adressen in dem Speicher 304 bereit.
  • 4B veranschaulicht eine Speicherpartitions-Einheit 380 der PPU 300 von 3 gemäß einer Ausführungsform. Wie in 4B gezeigt, umfasst die Partitions-Einheit 380 eine Raster-Operationen(ROP)-Einheit 450, einen L2-Cache-Speicher 460 und eine Speicherschnittstelle 470. Die Speicherschnittstelle 470 ist mit dem Speicher 304 gekoppelt. Die Speicherschnittstelle 470 kann 32-, 64-, 38-, 1024-Bit-Datenbusse oder dergleichen für Hochgeschwindigkeits-Datentransfer implementieren. In einer Ausführungsform umfasst die PPU 300 U Speicherschnittstellen 470, eine Speicherschnittstelle 470 pro Paar von Speicherpartitions-Einheiten 380, wobei jedes Paar von Speicherpartitions-Einheiten 380 mit einer entsprechenden Speichervorrichtung 304 verbunden ist. Beispielsweise kann die PPU 300 mit bis zu Y Speichervorrichtungen 304, wie beispielsweise Speicherstapel mit hoher Bandbreite oder Graphikdoppeldatenraten, Version 5 SDRAM oder andere Typen von persistenter Speicherung verbunden sein.
  • In einer Ausführungsform implementiert die Speicherschnittstelle 470 eine HBM2-Speicherschnittstelle und Y ist gleich einem halben U. In einer Ausführungsform unterstützt der Speicher 304 Fehlerkorrekturcode (ECC) mit Einzelfehlerkorrektur und Doppelfehlerdetektion (SECDED), um Daten zu schützen. Der ECC stellt eine höhere Zuverlässigkeit für Rechenanwendungen bereit, die gegen Datenverfälschung empfindlich sind. Zuverlässigkeit ist besonders wichtig in großen Cluster-Rechenumgebungen, wo PPUs 300 sehr große Datensätze verarbeiten und/oder Anwendungen für längere Zeiträume ausführen.
  • In einer Ausführungsform implementiert die PPU 300 eine Mehrebenen-Speicherhierarchie. In einer Ausführungsform unterstützt die Speicherpartitions-Einheit 380 einen vereinheitlichten Speicher, um einen einzigen vereinheitlichten virtuellen Adressraum für den Speicher der CPU und den Speicher der PPU 300 bereitzustellen, der gemeinsame Datennutzung zwischen virtuellen Speichersystemen ermöglicht. In einer Ausführungsform wird die Häufigkeit von Zugriffen durch eine PPU 300 auf einen Speicher verfolgt, der auf anderen Prozessoren lokalisiert ist, um sicherzustellen, dass Speicherseiten in den physischen Speicher der PPU 300 bewegt werden, die häufiger auf die Seiten zugreift. In einer Ausführungsform unterstützt das NVLink 310 Adressenübersetzungsdienste, die der PPU 300 erlauben, auf Seitentabellen einer CPU direkt zuzugreifen und einen vollen Zugriff auf den CPU-Speicher durch die PPU 300 bereitstellen.
  • In einer Ausführungsform transferieren Kopiermaschinen Daten zwischen mehreren PPUs 300 oder zwischen PPUs 300 und CPUs. Die Kopiermaschinen können Seitenfehler für Adressen erzeugen, die nicht in den Seitentabellen abgebildet werden. Die Speicherpartitions-Einheit 380 kann dann die Seitenfehler bedienen, wobei die Adressen in der Seitentabelle abgebildet werden, nachdem die Kopiermaschine den Transfer durchführen kann. In einem herkömmlichen System ist der Speicher für mehrere Kopiermaschinenoperationen zwischen mehreren Prozessoren gesperrt (d.h. nicht auslagerbar), was den verfügbaren Speicher wesentlich verringert. Mit Hardware-Seiten-Faulting können Adressen an die Kopiermaschinen weitergeleitet werden, ohne sich Sorgen zu machen, ob die Speicherseiten resident sind und das Kopierverfahren transparent ist.
  • Daten können aus dem Speicher 304 oder einem anderen Systemspeicher von der Speicherpartitions-Einheit 380 abgerufen und in dem L2-Cache-Speicher 460 gespeichert werden, der On-Chip lokalisiert ist und zwischen den verschiedenen GPCs 350 gemeinsam benutzt wird. Wie gezeigt, umfasst jede Speicherpartitions-Einheit 380 einen Bereich des L2-Cache-Speichers 460, der einer entsprechenden Speichervorrichtung 304 zugeordnet ist. Cache-Speicher niedrigerer Ebene können dann in verschiedenen Einheiten innerhalb der GPCs 350 implementiert werden. Beispielsweise kann jeder der SMs 440 einen L1-Cache-Speicher implementieren. Der L1-Cache-Speicher ist ein privater Speicher, der einem bestimmten SM 440 fest zugeordnet ist. Daten von dem L2-Cache-Speicher 460 können abgerufen und in jedem der L1-Cache-Speicher zur Verarbeitung in den Funktionseinheiten der SMs 440 gespeichert werden. Der L2-Cache-Speicher 460 ist mit der Speicherschnittstelle 470 und der XBar 370 gekoppelt.
  • Die ROP-Einheit 450 führt Graphik-Raster-Operationen durch, welche die Pixelfarbe betreffen, wie beispielsweise Farbenkomprimierung, Pixelmischung und dergleichen. Die ROP-Einheit 450 implementiert ebenfalls Tiefentesten in Verbindung mit der Raster-Engine 425, wobei eine Tiefe für einen Abtastort, der einem Pixelfragment zugeordnet ist, von der Aussonderungs-Engine der Raster-Engine 425 empfangen wird. Die Tiefe wird gegen eine entsprechende Tiefe in einem Tiefenpuffer für einen Abtastort geprüft, der dem Fragment zugeordnet ist. Wenn das Fragment den Tiefentest für den Abtastort besteht, dann aktualisiert die ROP-Einheit 450 den Tiefenpuffer und überträgt ein Ergebnis des Tiefentests an die Raster-Engine 425. Es wird anerkannt, dass sich die Anzahl von Speicherpartitions-Einheiten 380 von der Anzahl von GPCs 350 unterscheiden kann, und daher kann jede ROP-Einheit 450 mit jedem der GPCs 350 gekoppelt werden. Die ROP-Einheit 450 verfolgt Pakete, die von den unterschiedlichen GPCs 350 empfangen werden, und bestimmt, zu welchem GPC 350 ein durch die ROP-Einheit 450 erzeugtes Ergebnis durch die Xbar 470 weitergeleitet wird. Obwohl die ROP-Einheit 450 innerhalb der Speicherpartitions-Einheit 380 in 4B enthalten ist, kann die ROP-Einheit 450 außerhalb der Speicherpartitions-Einheit 380 sein. Beispielsweise kann die ROP-Einheit 450 in dem GPC 350 oder einer anderen Einheit liegen.
  • 5A veranschaulicht den Streaming-Multiprozessor 440 von 4A gemäß einer Ausführungsform. Wie in 5A gezeigt, umfasst der SM 440 einen Anweisungs-Cache-Speicher 505, eine oder mehrere Planer-Einheiten 510, eine Registerdatei 520, einen oder mehrere Verarbeitungskerne 550, eine oder mehrere Spezialfunktionseinheiten (SFUs) 552, eine oder mehrere Lade/Speicher-Einheiten (LSUs) 554, ein Interconnect-Netzwerk 580, einen Pool von Notizblockspeicher 525 und einen L1-Cache-Speicher 570. Der gemeinsam benutzte Notizblockspeicher 115 und oder der gemeinsam benutzte und persistente Notizblockspeicher 125 werden von dem Notizblockspeicher 125 allokiert.
  • Wie oben beschrieben, versendet die Arbeitsverteilungs-Einheit 325 Aufgaben zur Ausführung auf den GPCs 350 der PPU 300. Die Aufgaben sind einem bestimmten DPC 420 innerhalb eines GPC 350 zugeteilt, und wenn die Aufgabe einem Shader-Programm zugeordnet ist, kann die Aufgabe einem SM 440 zugeteilt werden. Die Planer-Einheit 510 empfängt die Aufgaben von der Arbeitsverteilungs-Einheit 325 und verwaltet die Anweisungs-Planung (instruction scheduling) für einen oder mehrere Thread-Blöcke, die dem SM 440 zugewiesen sind. Die Planer-Einheit 510 plant Thread-Blöcke zur Ausführung als Warps von parallelen Threads, wobei jeder Thread-Block mindestens einem Warp zugeordnet ist. In einer Ausführungsform führt jeder Warp 32 Threads aus. Die Planer-Einheit 510 kann mehrere unterschiedlichen Thread-Blöcke verwalten, welche die Warps den unterschiedlichen Thread-Blöcken allokiert und dann Anweisungen von den mehreren unterschiedlichen SECs an die verschiedenen Funktionseinheiten (d.h. Kerne 550, SFUs 552 und LSUs 554) während jedes Taktzyklus versendet.
  • SECs ist ein Programmiermodell zum Organisieren von Gruppen von kommunizierenden Threads, die Entwicklern ermöglicht, die Granularität auszudrücken, bei der Threads kommunizieren, wobei der Ausdruck von reicheren, effizienten Parallelzerlegungen ermöglicht wird. Cooperative-Start-APIs unterstützen die Synchronisierung unter Thread-Blöcken für die Ausführung von parallelen Algorithmen. Herkömmliche Programmiermodelle stellen einen einzelnen, einfachen Aufbau zum Synchronisieren von kooperierenden Threads bereit: eine Barriere über alle Threads eines Threadblocks (d.h. die Funktion syncthreads( )). Programmierer würden jedoch häufig gerne Gruppen von Threads bei kleineren als Thread-Block-Granularitäten definieren und innerhalb der definierten Gruppen synchronisieren, um größere Leistung, Gestaltungsflexibilität und Software-Wiederverwendung in der Form von kollektiven gruppenweiten Funktionsschnittstellen zu ermöglichen.
  • SECs ermöglichen Programmierern, Gruppen von Threads explizit bei Sub-Block(d.h. so klein wie ein einziger Thread)- und Multiblock-Granularitäten zu definieren und kollektive Operationen, wie beispielsweise Synchronisierung, an den Threads in einer kooperativen Gruppe durchzuführen. Das Programmiermodell unterstützt eine saubere Zusammensetzung über Softwaregrenzen, so dass Bibliotheken und Hilfsfunktionen innerhalb ihres lokalen Kontexts sicher synchronisieren können, ohne Annahmen über Konvergenz machen zu müssen. SEC-Primitive ermöglichen neue Muster von kooperativer Parallelität, die Erzeuger-Verbraucher Parallelität, opportunistische Parallelität und globale Synchronisierung über ein gesamtes Gitter von Threadblöcken umfassen.
  • Wenn Kernels annotiert sind, um Nebenläufigkeit zwischen unterschiedlichen Kernels oder Abhängigkeiten zwischen unterschiedlichen Kernels anzugeben, werden die SECs, die zugewiesen sind, die Kernels auszuführen, demgemäß dem gemeinsam genutzten Notizblockspeicher 115 oder dem gemeinsam genutzten und persistenten Notizblockspeicher 125 allokiert. Auf ähnliche Weise werden, wenn ein einzelner Kernel, der annotiert ist, um Nebenläufigkeit und/oder Abhängigkeiten anzugeben, mehreren SECs zugewiesen ist, die mehreren SECs, die zugewiesen sind, die Kernel auszuführen, demgemäß dem gemeinsam genutzten Notizblockspeicher 115 oder dem gemeinsam genutzten und persistenten Notizblockspeicher 125 allokiert.
  • Wenn zwei Kernels, die Daten austauschen, mehreren SECs in zwei oder mehreren Verarbeitungseinheiten 110 zugewiesen sind, können die SECs in einer ersten Verarbeitungseinheit 110 Daten nicht mit den SECs in einer zweiten Verarbeitungseinheit 110 durch den gemeinsam genutzten Notizblockspeicher innerhalb entweder der ersten oder zweiten Verarbeitungseinheit 110 austauschen. Daher können die Kernels SECs in einer scheibenartigen Weise zugewiesen werden, so dass Threads, die unterschiedlichen Kernels zugewiesen sind, die Daten austauschen, innerhalb der gleichen Verarbeitungseinheit 110 ausgeführt werden. Beispielsweise wird, unter der Annahme, dass vier SECs innerhalb jeder Verarbeitungseinheit 110 ausgeführt werden, ein erstes Paar der SECs, das in der ersten Verarbeitungseinheit 110 ausgeführt werden, einem ersten Kernel zugewiesen, und das verbleibende zweite Paar von SECs, das in der ersten Verarbeitungseinheit 110 ausgeführt wird, wird einem zweiten Kernel zugewiesen. Das erste Paar von SECs, das den ersten Kernel ausführt, ist imstande, Daten mit dem zweiten Paar von SECs auszutauschen, das den zweiten Kernel ausführt.
  • Eine Versandeinheit 515 ist konfiguriert, um Anweisungen an eine oder mehrere der Funktionseinheiten zu übertragen. In der Ausführungsform umfasst die Planer-Einheit 510 zwei Versandeinheiten 515, die ermöglichen, dass zwei unterschiedliche Anweisungen von dem gleichen Warp während jedes Taktzyklus versandt werden. In alternativen Ausführungsformen kann jede Planer-Einheit 510 eine einzelne Versandeinheit 515 oder zusätzliche Versandeinheiten 515 umfassen.
  • Jeder SM 440 umfasst eine Registerdatei 520, die einen Satz von Registern für die Funktionseinheiten des SM 440 bereitstellt. In einer Ausführungsform ist die Registerdatei 520 zwischen jeder der Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein zugehöriger Abschnitt der Registerdatei 520 zugeteilt ist. In einer anderen Ausführungsform ist die Registerdatei 520 zwischen den unterschiedlichen Warps aufgeteilt, die von dem SM 440 ausgeführt werden. Die Registerdatei 520 stellt eine temporäre Speicherung für Operanden bereit, die mit den Datenpfaden der Funktionseinheiten verbunden sind.
  • Jeder SM 440 umfasst L Verarbeitungskerne 550. In einer Ausführungsform umfasst der SM 440 eine große Anzahl (z.B., 128 usw.) von unterschiedlichen Verarbeitungskernen 550. Jeder Kern 550 kann eine vollständig in einer Pipeline angeordnete (fully-pipelined) Einfach-Präzisions-Verarbeitungseinheit umfassen, die eine Gleitkommaarithmetik-Logikeinheit und eine Ganzzahlarithmetik-Logikeinheit umfasst. In einer Ausführungsform implementieren die Gleitkommaarithmetik-Logikeinheiten den IEEE 754-3008 Standard für Gleitkommaarithmetik. In einer Ausführungsform umfassen die Kerne 550 64 Einfach-Präzisions-(32-Bit)-Gleitkommakerne, 64 Integer-Kerne, 32 Doppel-Präzisions-(64-Bit)-Gleitkommakerne und acht Tensorkerne.
  • Tensorkerne sind konfiguriert, um Matrix-Operationen durchzuführen, und in einer Ausführungsform sind ein oder mehrere Tensorkerne in den Kernen 550 enthalten. Insbesondere sind die Tensorkerne konfiguriert, um tiefgehende Lern-Matrix-Arithmetik, wie beispielsweise Faltungsoperationen für neuronales Netzwerktraining und Inferenzieren, durchzuführen. In einer Ausführungsform arbeitet jeder Tensorkern an einer 4x4 Matrix und führt eine Matrix-Multiplikation- und Akkumulation-Operation D=A×B+C durch, wobei A, B, C und D 4x4 Matrizen sind.
  • In einer Ausführungsform sind die Matrix-Multiplikationseingaben A und B 16-Bit-Gleitkomma-Matrizen, während die Akkumulationsmatrizen C und D 16-Bit-Gleitkomma- oder 32-Bit-Gleitkomma-Matrizen sein können. Tensorkerne arbeiten an 16-Bit-Gleitkomma-Eingabedaten mit 32-Bit-Gleitkomma-Akkumulation. Die 16-Bit-Gleitkomma-Multiplikation erfordert 64 Operationen und ergibt ein Produkt mit voller Präzision, das dann unter Verwendung einer 32-Bit-Gleitkomma-Addition mit den anderen Zwischenprodukten für eine 4x4x4-Matrix-Multiplikation akkumuliert wird. In der Praxis werden Tensorkerne verwendet, um viel größere zweidimensionale oder höherdimensionale Matrixoperationen durchzuführen, die aus diesen kleineren Elementen aufgebaut sind. Eine API, wie beispielsweise die CUDA 9 C++ API, stellt spezialisierte Matrix-Lade-, Matrix-Multiplikations- und Matrix-Akkumulations- und Matrix-Speicher-Operationen bereit, um Tensorkerne von einem CUDA-C++ Programm effizient zu verwenden. Auf der CUDA-Ebene nimmt die Schnittstelle der Warp-Ebene 16x16 große Matrizen an, die alle 32 Threads des Warps überspannen.
  • Jeder SM 440 umfasst ebenfalls M SFUs 552, die Sonderfunktionen durchführen (z.B. Attributauswertung, reziproke Quadratwurzel und dergleichen). In einer Ausführungsform können die SFUs 552 eine Baumtraversierungseinheit umfassen, die konfiguriert ist, um eine hierarchische Baumdatenstruktur zu durchlaufen. In einer Ausführungsform können die SFUs 552 eine Textureinheit umfassen, die konfiguriert ist, um Texturkarten-Filteroperationen durchzuführen. In einer Ausführungsform sind die Textureinheiten konfiguriert, um Texturkarten (z.B. eine 2D-Anordnung von Texeln) aus dem Speicher 304 zu laden und die Texturkarten abzutasten, um abgetastete Texturwerte zum Gebrauch in Shader-Programmen zu erzeugen, die durch den SM 440 ausgeführt werden. In einer Ausführungsform werden die Texturkarten in dem gemeinsam benutzten Speicher/L1-Cache-Speicher 470 gespeichert. Die Textureinheiten implementieren Texturoperationen, wie beispielsweise Filteroperationen, unter Verwendung von Mip-Maps (d.h. Texturkarten von veränderlichem Detaillierungsgrad). In einer Ausführungsform umfasst jeder SM 340 zwei Textureinheiten.
  • Jeder SM 440 umfasst ebenfalls N LSUs 554, die Lade- und Speicheroperationen zwischen dem gemeinsam benutzten Speicher/L1-Cache-Speicher 570 und der Registerdatei 520 implementieren. Jeder SM 440 umfasst ein Interconnect-Netzwerk 580, das jede der Funktionseinheiten mit der Registerdatei 520 und die LSU 554 mit der Registerdatei 520, dem gemeinsam benutzten Speicher/L1-Cache-Speicher 570 verbindet. In einer Ausführungsform ist das Interconnect-Netzwerk 580 eine Kreuzschiene, die konfiguriert sein kann, um jede der Funktionseinheiten mit jedem der Register in der Registerdatei 520 und die LSUs 554 mit der Registerdatei und Speicherplätzen im gemeinsam benutzten Speicher/L1-Cache-Speicher 570 zu verbinden.
  • Der gemeinsam benutzte Speicher/L1-Cache-Speicher 570 ist eine On-Chip-Speicheranordnung, die Datenspeicherung und Kommunikation zwischen dem SM 440 und der Primitiven-Engine 435 und zwischen Threads in dem SM 440 ermöglicht. In einer Ausführungsform umfasst der gemeinsam benutzte Speicher/L1-Cache-Speicher 570 eine Speicherkapazität von 38KB und ist in dem Pfad von dem SM 440 zu der Partitions-Einheit 380. Der gemeinsam benutzte Speicher/L1-Cache-Speicher 570 kann verwendet werden, um Lese- und Schreibvorgänge zwischenzuspeichern. Einer oder mehrere des gemeinsam benutzten Speicher/Ll-Cache-Speichers 570, L2-Cache-Speichers 460 und des Speichers 304 sind Hintergrundspeicher.
  • Das Kombinieren von Daten-Cache- und gemeinsam benutzter Speicher-Funktionalität in einem einzigen Speicherblock stellt die beste Gesamtleistung für beide Arten von Speicherzugriffen bereit. Die Kapazität ist als ein Cache-Speicher von Programmen benutzbar, die den gemeinsam benutzten Speicher nicht verwenden. Wenn der gemeinsam benutzte Speicher beispielsweise konfiguriert ist, um die Hälfte der Kapazität zu verwenden, können Textur- und Lade/Speicher-Operationen die verbleibende Kapazität verwenden. Die Integration innerhalb des gemeinsam benutzten Speichers/Ll-Cache-Speichers 570 ermöglicht dem gemeinsam benutzten Speicher/L1-Cache-Speicher 570 als Leitung mit hohem Durchsatz zum Streamen von Daten zu arbeiten, während gleichzeitig eine höhere Bandbreite und ein latenzarmer Zugriff auf häufig wiederverwendete Daten bereitgestellt werden.
  • Wenn für Allzweck-Parallelberechnung konfiguriert ist, kann im Vergleich zur Graphikverarbeitung eine einfachere Konfiguration verwendet werden. Im Einzelnen werden die in 3 gezeigten Festfunktions-Graphikverarbeitungseinheiten umgangen, wobei ein viel einfacheres Programmiermodell erzeugt wird. In der Allzweck-Parallelberechnungs-Konfiguration werden Blöcke von Threads von der Arbeitsverteilungs-Einheit 325 den DPCs 420 direkt zugewiesen und verteilt. Die Threads in einem Block führen dasselbe Programm unter Verwendung einer eindeutigen Thread-ID in der Berechnung, um sicherzustellen, dass jeder Thread eindeutige Ergebnisse erzeugt, unter Verwendung des SM 440, um das Programm auszuführen und Berechnungen durchzuführen, eines gemeinsam benutzten Speicher/L1-Cache-Speichers 570, um zwischen Threads zu kommunizieren, und der LSU 554 aus, um globalen Speicher durch den gemeinsam benutzten Speicher/L1-Cache-Speicher 570 und die Speicherpartitions-Einheit 380 zu lesen und zu beschreiben. Wenn für Allzweck-Parallelberechnung konfiguriert, kann der SM 440 ebenfalls Befehle schreiben, welche die Planer-Einheit 320 verwenden kann, um neue Arbeit auf den DPCs 420 zu starten.
  • Die PPU 300 kann in einem Desktop-Computer, einem Laptop-Computer, einem Tablet-Computer, einem Smartphone (z.B. einer drahtlosen handgehaltenen Vorrichtung), einem persönlichen digitalen Assistenten (PDA), einer Digitalkamera, einer handgehaltenen elektronischen Vorrichtung und dergleichen enthalten sein. In einer Ausführungsform ist die PPU 300 auf einem einzigen Halbleitersubstrat verkörpert. In einer anderen Ausführungsform ist die PPU 300 in einem System-On-Chip (SoC) zusammen mit einer oder mehreren anderen Vorrichtungen wie beispielsweise zusätzlichen PPUs 300, dem Speicher 304, einem Rechner-mit-reduziertem-Befehlssatz(RISC)-CPU, einer Speicherverwaltungseinheit (MMU), einem Digital/AnalogWandler (DAC) und dergleichen enthalten.
  • In einer Ausführungsform kann die PPU 300 auf einer Graphikkarte enthalten sein, die eine oder mehrere Speichervorrichtungen 304 umfasst. Die Graphikkarte kann konfiguriert sein, um sich mit einem PCIe-Steckplatz auf einer Hauptplatine eines Tischcomputers schnittstellenmäßig zu verbinden. In noch einer anderen Ausführungsform kann die PPU 300 eine integrierte Graphikverarbeitungseinheit (iGPU) oder ein Parallelprozessor sein, der in dem Chipsatz der Hauptplatine umfasst ist.
  • Gemeinsam benutzter und persistenter Notizblockspeicher
  • 5B ist ein Konzeptdiagramm, das eine Verarbeitung-Pipeline zur Ausführung von Kernels A, B und C veranschaulicht, gemäß einer Ausführungsform. Der Kernel A ist annotiert, um anzugeben, dass Kernel A nebenläufig mit Kernels B und C ausgeführt werden sollte. Kernels B und C sind annotiert, um anzugeben, dass Kernel C nach Kernel B ausgeführt werden sollte, und dass Kernel C die durch Kernel A erzeugten Daten konsumieren wird, wobei die durch Kernel A erzeugten Daten mindestens teilweise basierend auf Daten erzeugt werden, die von Kernel B empfangen werden. Daher werden Kernels A, B und C SECs innerhalb der gleichen Verarbeitungseinheit 440 zugewiesen und die gemeinsam benutzten und persistenten Notizblockspeicher 526 und 527 werden zum Ausführen der SECs allokiert.
  • Im Einzelnen wird SEC1 Kernel A zugewiesen, SEC2 Kernel B zugewiesen und SEC3 Kernel C zugewiesen. Der gemeinsam benutzte und persistente Notizblockspeicher 526 ist allokiert für und wird durch den SEC1 und SEC2 gemeinsam benutzt. Der gemeinsam benutzte und persistente Notizblockspeicher 527 ist allokiert für und wird durch den SEC1 und SEC3 gemeinsam benutzt. Daten, die in dem gemeinsam benutzten und persistenten Notizblockspeicher 526 durch den SEC2 gespeichert sind, sind persistent, sogar nachdem SEC2 die Ausführung des Kernels B abgeschlossen ist. Daher kann der SEC1 Daten basierend auf den Daten laden und erzeugen, die durch SEC2 nebenläufig mit der Ausführung von SEC3 erzeugt wurden. Bedeutender Weise kann der SEC3 nicht auf den gemeinsam benutzten und persistenten Notizblockspeicher 526 zugreifen und die durch den SEC2 gespeicherten Daten überschreiben. Des Weiteren ist die Speichermenge aus dem privaten Pool des Notizblockspeichers innerhalb der Verarbeitungseinheit 110, die allokiert wird, um die gemeinsam benutzten und persistenten Notizblockspeicher 526 und 527 bereitzustellen, nicht notwendigerweise gleich. Es sei bemerkt, dass ein SEC, wie beispielsweise der SEC1, auf mehrere gemeinsam benutzte und persistente Notizblockspeicher zugreifen kann.
  • Ähnlich wie der gemeinsam benutzte Notizblockspeicher 115 stellt der gemeinsam benutzte und persistente Notizblockspeicher 125 ebenfalls einen Datentransfer mit niedrigen Latenzzeiten zwischen Kernels und/oder zwischen SECs bereit, die auf der Verarbeitungseinheit 440 ausgeführt werden, ohne die Daten zwischen unterschiedlichen Ebenen der Speicherhierarchie zu kopieren oder zu bewegen. Außerdem können mehrere Kernels, die jeweils unterschiedliche Verarbeitungsressourcenanforderungen aufweisen, einem oder mehreren gemeinsam benutzten und persistenten Notizblockspeichern für den Transfer von Daten zwischeneinander und/oder innerhalb eines Kernels allokiert werden, der zwei oder mehreren SECs allokiert ist.
  • Sobald der Kernel A und Kernel B gestartet werden, sind sie imstande, Daten frei auszutauschen, bis die Ausführung beider Kernels abgeschlossen ist. Weil die Daten, die in dem gemeinsam benutzten und persistenten Notizblockspeicher 526 durch den Kernel B gespeichert sind, sogar beibehalten werden, nachdem die Ausführung des Kernels B abgeschlossen ist, können Kernel-Start-Overheads verringert werden. In einer zeitlichen Pipeline (bei der C beispielsweise B folgt, wie in 5B gezeigt) können, wenn ein Kernel Daten als Ergebnis seiner Ausführung erzeugt, die Daten an einen Nachfolgerkernel über das Speichersystem geleitet werden. Um die Daten zu transferieren, führt der Produzent (B) einen „Schreib“-Vorgang durch. Auf einem „Schreib“-Vorgang folgt ein „Lese“-Vorgang während des Startup des Konsumenten (C). In einem herkömmlichen System wird das Schreiben-dann-Lesen den Latenzzeiten der gesamten Speichersystemhierarchie und nicht der schnellen Latenzzeit des persistenten Notizblockspeichers 526 ausgesetzt. Wenn der persistente Notizblockspeicher 526 verfügbar ist, kann der Produzent jedoch die Daten in dem persistenten Notizblockspeicher 526 lassen und der Verbraucher wird die Daten in dem persistenten Notizblockspeicher 526 einfach beim Startup finden. Das persistente Merkmal des persistenten Notizblockspeichers 526 kann sowohl den Shutdown-Overhead von B als auch den Startup-Overhead von C verringern.
  • 5C veranschaulicht ein Ablaufdiagramm eines Verfahrens 500 zum Konfigurieren des Pools des gemeinsam benutzten Speichers in einer Verarbeitungseinheit 440, um SECs zu erlauben, Daten durch einen gemeinsam benutzten und persistenten Notizblockspeicher auszutauschen, gemäß einer Ausführungsform. In einer Ausführungsform kann das Verfahren 500 verwendet werden, um Daten durch die gemeinsam benutzten und persistenten Notizblockspeicher 125, 526 und/oder 527 auszutauschen.
  • Bei Schritt 510 empfängt die Verarbeitungseinheit 440 einen Kernel zur Ausführung. Die Verarbeitungseinheit 110 kann konfiguriert sein, um in einem von zwei Notizblockspeichermoden zu arbeiten. Beim Arbeiten in einem privaten Notizblockspeichermodus werden separate Abschnitte des Notizblockspeichers 525 für Zugriff nur durch jede einzelne SEC allokiert, die zugewiesen ist, einen Kernel innerhalb der Verarbeitungseinheit 440 auszuführen. Mit anderen Worten ist der private Notizblockspeichermodus mit dem herkömmlichen Betrieb des pro-SEC-Notizblockspeichers kompatibel. Beim Arbeiten in einem gemeinsam benutzten Notizblockmodus wird ein Abschnitt des Notizblockspeichers 525 für den Zugriff durch einen oder mehrere SECs allokiert, die dem gleichen Kernel zugewiesen sind und in der Verarbeitungseinheit 440 und/oder SECs ausgeführt werden, die unterschiedlichen Kernels zugewiesen sind und in der Verarbeitungseinheit 440 ausgeführt werden.
  • Bei Schritt 530 bestimmt die Planereinheit 510, ob dem Kernel zugeordnete Annotationen angeben, dass der Kernel in einem gemeinsam benutzten Notizblockspeichermodus oder einem privaten Notizblockspeichermodus arbeitet. Wenn der durch den Kernel spezifizierte Modus gleich dem aktuellen Betriebsmodus des Notizblockspeichers 525 innerhalb der Verarbeitungseinheit 440 ist, dann geht die Planereinheit 510 zu Schritt 210 weiter. Anderenfalls kann der Betriebsmodus des Notizblockspeichers 525 die Datenaustauschbeschränkungen nicht erfüllen, die für den Kernel spezifiziert sind, und bei Schritt 535 wartet die Planereinheit 530 auf die Verarbeitungseinheit 440, um inaktiv zu werden, und ändert dann den Notizblockspeichermodus. Schritte 210, 215, 220, 225 und 230 werden abgeschlossen, wie zuvor in Verbindung mit 2 beschrieben.
  • In einer Ausführungsform können unterschiedliche Kernels, die innerhalb der Verarbeitungseinheit 440 ausgeführt werden, unterschiedliche Betriebsmoden für unterschiedliche Abschnitte des Notizblockspeichers 525 verwenden, so dass der Betriebsmodus für jeden allokierten Abschnitt des Notizblockspeichers 525 definiert ist und von der Planereinheit 530 verfolgt wird. Wenn pro allokiertem Abschnitt Betriebsmoden durch die Planereinheit 530 unterstützt werden, werden Schritte 530 und 535 weggelassen.
  • Wenn der Notizblockspeicher 525 im gemeinsam benutzten Modus konfiguriert ist, kann ein Abschnitt des Notizblockspeichers 525, der zuvor für einen einzigen SEC verfügbar war, der einen einzigen Kernel auf einer einzigen Verarbeitungseinheit 440 ausführt, nun zwischen mehreren SECs gemeinsam benutzt werden, die den gleichen oder unterschiedliche Kernels ausführen, wobei die SECs die Kernels entweder parallel oder seriell ausführen. Die Latenzzeit des Datenaustausches durch den Notizblockspeicher 525 wird im Vergleich mit dem Austauschen von Daten durch den Speicher 304 verringert. Eine Synchronisierung von Threads kann über die mehreren SECs durchgeführt werden, die den gleichen Abschnitt des Notizblockspeichers 525 gemeinsam nutzen, wobei Synchronisierungslatenzzeit verringert wird. In einer Ausführungsform wird Synchronisierungslogik bereitgestellt, um Synchronisierungssignale innerhalb der Verarbeitungseinheit 440 zu übertragen, während Daten durch den Notizblockspeicher 525 ausgetauscht werden. In einer Ausführungsform wird Synchronisierungslogik bereitgestellt, um Synchronisierungssignale zwischen Verarbeitungseinheiten 440 zu übertragen, während Daten durch den globalen Speicher 120 ausgetauscht werden.
  • Des Weiteren können, wenn der Notizblockspeicher 525 im gemeinsam benutzten Modus konfiguriert ist, im Notizblockspeicher 525 gespeicherte Daten, die zuvor nur während der Ausführung eines einzigen Kernels verfügbar waren, zwischen Ausführungen des gleichen oder unterschiedlicher Kernels persistieren, die seriell innerhalb der gleichen Verarbeitungseinheit 440 ausgeführt werden. Daher werden Kernel-Start-Overheads verringert, weil Daten zwischen unterschiedlichen Kernels ausgetauscht werden können, die seriell ausgeführt werden oder innerhalb eines einzigen Kernels durch mehrere SECs ausgeführt werden.
  • Beispielhaftes Rechensystem
  • Systeme mit mehrere GPUs und CPUs werden in einer Vielfalt von Industrien verwendet, weil Entwickler mehr Parallelität in Anwendungen, wie beispielsweise Rechnen für künstliche Intelligenz, freilegen und wirksam einsetzen. Hochleistungs-GPU-beschleunigte Systeme mit zehn bis vielen Tausenden von Rechenknoten werden in Datenzentren, Forschungsanlagen und Supercomputern eingesetzt, um immer größere Probleme zu lösen. Weil die Anzahl von Verarbeitungsvorrichtungen innerhalb der Hochleistungssysteme zunimmt, müssen die Kommunikations- und Datentransfermechanismen angepasst werden, um die erhöhte Bandbreite zu unterstützen.
  • 6A ist ein Konzeptdiagramm eines Verarbeitungssystems 600, das unter Verwendung der PPU 300 von 3 implementiert wird, gemäß einer Ausführungsform. Das beispielhafte Verarbeitungssystem 600 kann konfiguriert sein, um das in 2 gezeigte Verfahren 200 und/oder das in 5C gezeigte Verfahren 500 zu implementieren. Das Verarbeitungssystem 600 umfasst eine CPU 630, einen Schalter 610 und mehrere PPUs 300 und jeweilige Speicher 304. Das NVLink 310 stellt Hochgeschwindigkeits-Kommunikationslinks zwischen jeder der PPUs 300 bereit. Obwohl eine bestimmte Anzahl von Verbindungen des NVLink 310 und des Interconnect 302 in 6A veranschaulicht werden, kann die Anzahl von Verbindungen zu jeder PPU 300 und der CPU 630 variieren. Der Schalter 610 ist schnittstellenmäßig zwischen dem Interconnect 302 und der CPU 630 verbunden. Die PPUs 300, die Speicher 304 und die NVLinks 310 können auf einer einzigen Halbleiterplattform gelegen sein, um ein Parallelverarbeitungsmodul 625 zu bilden. In einer Ausführungsform unterstützt der Schalter 610 zwei oder mehrere Protokolle, um sich schnittstellenmäßig zwischen verschiedenen unterschiedlichen Verbindungen und/oder Links zu verbinden.
  • In einer anderen Ausführungsform (nicht gezeigt) stellt das NVLink 310 ein oder mehrere Hochgeschwindigkeits-Kommunikationslinks zwischen jeder der PPUs 300 und der CPU 630 bereit und der Schalter 610 ist schnittstellenmäßig zwischen dem Interconnect 302 und jeder der PPUs 300 verbunden. Die PPUs 300, die Speicher 304 und der Interconnect 302 können auf einer einzigen Halbleiterplattform situiert sein, um ein Parallelverarbeitungsmodul 625 zu bilden. In noch einer anderen Ausführungsform (nicht gezeigt) stellt der Interconnect 302 ein oder mehrere Kommunikationslinks zwischen jeder der PPUs 300 und der CPU 630 bereit und der Schalter 610 ist schnittstellenmäßig zwischen jeder der PPUs 300 unter Verwendung des NVLink 310 verbunden, um ein oder mehrere Hochgeschwindigkeits-Kommunikationslinks zwischen den PPUs 300 bereitzustellen. In einer anderen Ausführungsform (nicht gezeigt) stellt das NVLink 310 ein oder mehrere Hochgeschwindigkeits-Kommunikationslinks zwischen den PPUs 300 und der CPU 630 durch den Schalter 610 bereit. In noch einer anderen Ausführungsform (nicht gezeigt) stellt der Interconnect 302 ein oder mehrere Hochgeschwindigkeits-Kommunikationslinks zwischen jeder der PPUs 300 direkt bereit. Ein oder mehrere der Hochgeschwindigkeits-Kommunikationslinks des NVLink 310 können als ein physischer NVLink-Interconnect oder entweder als ein On-Chip- oder On-Die-Interconnect unter Verwendung des gleichen Protokolls wie das NVLink 310 implementiert werden.
  • Im Kontext der vorliegenden Beschreibung kann sich eine einzige Halbleiterplattform auf eine einzelne unitäre Halbleiter-basierte integrierte Schaltung beziehen, die auf einem Die oder Chip angefertigt ist. Es sei bemerkt, dass sich der Begriff einzige Halbleiterplattform ebenfalls auf Multi-Chip-Module mit erhöhter Konnektivität beziehen kann, die eine On-Chip-Operation simulieren und die wesentlichen Verbesserungen gegenüber der Benutzung einer herkömmlichen Busimplementierung vornehmen. Natürlich können die verschiedenen Schaltungen oder Vorrichtungen ebenfalls getrennt oder in verschiedenen Kombinationen von Halbleiterplattformen gemäß den Wünschen des Benutzers situiert sein. Alternativ kann das Parallelverarbeitungsmodul 625 als ein Leiterplattensubstrat implementiert sein und jede der PPUs 300 und/oder Speicher 304 können verpackte Vorrichtungen sein. In einer Ausführungsform sind die CPU 630, der Schalter 610 und das Parallelverarbeitungsmodul 625 auf einer einzigen Halbleiterplattform situiert.
  • In einer Ausführungsform ist die Signalrate jedes NVLink 310 gleich 20 bis 25 Gigabit/Sekunde und jede PPU 300 umfasst sechs NVLink 310 Schnittstellen (wie in 6A gezeigt, sind fünf NVLink 310 Schnittstellen für jede PPU 300 enthalten). Jedes NVLink 310 stellt eine Datentransferrate von 25 Gigabyte/Sekunde in jeder Richtung bereit, wobei sechs Verknüpfungen 300 Gigabyte/Sekunde bereitstellen. Die NVLinks 310 können exklusiv für PPU-zu-PPU Kommunikation, wie in 6A gezeigt, oder einer Kombination aus PPU-zu-PPU und PPU-zu-CPU verwendet werden, wenn die CPU 630 ebenfalls eine oder mehrere NVLink 310 Schnittstellen umfasst.
  • In einer Ausführungsform ermöglicht das NVLink 310 einen direkten Lade-/Speicher-/atomaren Zugriff von der CPU 630 auf jeden Speicher 304 der PPU 300. In einer Ausführungsform unterstützt das NVLink 310 Kohärenzoperationen, die ermöglichen, das aus dem Speicher 304 gelesene Daten in der Cache-Hierarchie der CPU 630 gespeichert werden können, was die Cachezugriffslatenz für die CPU 630 verringert. In einer Ausführungsform umfasst das NVLink 310 Unterstützung für Adress-Übersetzungsdienste (Address Translation Services; ATS), was der PPU 300 ermöglicht, auf Seitentabellen innerhalb der CPU 630 direkt zuzugreifen. Eines oder mehrere der NVLinks 310 können ebenfalls konfiguriert sein, um in einem Niedrigleistungsmodus zu arbeiten.
  • 6B veranschaulicht ein beispielhaftes System 665, bei dem die verschiedene Architektur und/oder Funktionalität der verschiedenen vorherigen Ausführungsformen implementiert werden kann. Das beispielhafte System 665 kann konfiguriert sein, um das in 2 gezeigte Verfahren 200 und/oder das in 5C gezeigte Verfahren 500 zu implementieren. Wie gezeigt, wird ein System 665 bereitgestellt, das mindestens eine zentrale Verarbeitungseinheit 630 umfasst, die mit einem Kommunikationsbus 575 verbunden ist. Der Kommunikationsbus 575 kann unter Verwendung jedes geeigneten Protokolls, wie beispielsweise PCI (Peripheral Component Interconnect), PCI-Express, AGP (Accelerated Graphics Port), Hyper-Transport oder jedem anderen Bus- oder Punkt-zu-Punkt-Kommunikationsprotokoll(en), implementiert sein. Das System 665 umfasst ebenfalls einen Hauptspeicher 640. Steuerlogik (Software) und Daten werden in dem Hauptspeicher 640 gespeichert, der die Form eines Direktzugriffspeichers (RAM) annehmen kann.
  • Das System 665 umfasst ebenfalls Eingabevorrichtungen 560, das Parallelverarbeitungssystem 625 und Anzeigevorrichtungen 545, z.B. eine herkömmliche CRT (Kathodenstrahlröhre), eine LCD (Flüssigkristallanzeige), eine LED (lichtemittierende Diode), eine Plasmaanzeige oder dergleichen. Eine Benutzereingabe kann von den Eingabevorrichtungen 560, z.B. Tastatur, Maus, Berührfeld, Mikrophon und dergleichen, empfangen werden. Jedes der vorhergehenden Module und/oder Vorrichtungen kann sogar auf einer einzigen Halbleiterplattform situiert sein, um das System 665 zu bilden. Alternativ können die verschiedenen Module auch getrennt oder in verschiedenen Kombinationen von Halbleiterplattformen gemäß den Wünschen des Benutzers situiert sein.
  • Ferner kann das System 665 mit einem Netzwerk (z.B. einem Telekommunikationsnetzwerk, Lokalbereichsnetzwerk (LAN), drahtlosen Netzwerk, Weitbereichsnetzwerk (WAN), wie beispielsweise dem Internet, Peer-zu-Peer-Netzwerk, Kabelnetzwerk oder dergleichen) durch eine Netzwerkschnittstelle 535 für Kommunikationszwecke gekoppelt sein.
  • Das System 665 kann ebenfalls einen Sekundärspeicher (nicht gezeigt) umfassen. Der Sekundärspeicher umfasst beispielsweise ein Festplattenlaufwerk und/oder ein entfernbares Speicherlaufwerk, das ein Diskettenlaufwerk darstellt, ein Magnetbandlaufwerk, ein Kompaktdisklaufwerk, ein DVD(digitale versatile disk)-Laufwerk, eine Aufzeichnungsvorrichtung und einen Universal-Serial-Bus(USB)-Flash-Speicher. Das entfernbare Speicherlaufwerk liest aus und/oder schreibt auf eine entfernbare Speichereinheit auf eine bekannte Art und Weise.
  • Computerprogramme oder Computersteuerlogik-Algorithmen können im Hauptspeicher 640 und/oder im Sekundärspeicher gespeichert sein. Derartige Computerprogramme, wenn ausgeführt, ermöglichen dem System 665, verschiedene Funktionen durchzuführen. Der Speicher 640, die Speicherung und/oder jede andere Speicherung sind mögliche Beispiele von computerlesbaren Medien.
  • Die Architektur und/oder Funktionalität der verschiedener vorherigen Figuren kann im Kontext eines allgemeinen Computersystems, eines Schaltungsplatinensystems, eines Unterhaltungszwecken fest zugeordneten Spielkonsolensystems, eines anwendungsspezifischen Systems und/oder jedem anderen gewünschten System implementiert sein. Beispielsweise kann das System 665 die Form eines Desktop-Computers, eines Laptop-Computers, eines Tablet-Computers, von Servern, von Supercomputern, eines Smartphones (z.B. einer drahtlosen handgehaltenen Vorrichtung), eines persönlichen digitalen Assistenten (PDA), einer Digitalkamera, eines Fahrzeugs, einer am Kopf angebrachten Anzeige, einer handgehaltenen elektronischen Vorrichtung, eines mobilen Telefongeräts, eines Fernsehers, einer Arbeitsstation, einer Spielkonsole, eines eingebetteten Systems und/oder von jedem anderen Typ von Logik annehmen.
  • Während verschiedene Ausführungsformen oben beschrieben wurden, sei zu verstehen, dass sie lediglich beispielhaft und nicht einschränkend präsentiert wurden. Somit sollte die Breite und der Umfang einer bevorzugten Ausführungsform nicht durch eines der oben beschriebenen beispielhaften Ausführungsformen begrenzt werden, sondern sollte nur durch die folgenden Ansprüche und ihrer Äquivalente definiert sein.
  • Maschinenlernen
  • Tiefe neuronale Netzwerke (DNNs), die auf Prozessoren wie beispielsweise der PPU 300 entwickelt wurden, wurden für diverse Verwendungsfälle, von selbstfahrenden Autos bis schnellerer Wirkstoffentwicklung, von automatischer Bildbeschriftung in Online-Bilddatenbanken bis intelligenter Echtzeit-Sprachenübersetzung in Video-Chat-Anwendungen verwendet. Tiefgehendes Lernen ist eine Technik, welche das neuronale Lernverfahren des menschlichen Gehirns modelliert, kontinuierlich lernt, kontinuierlich immer intelligenter wird und im Laufe der Zeit schnellere und genauere Ergebnisse liefert. Ein Kind wird anfangs von einem Erwachsenen unterrichtet, verschiedene Formen korrekt zu identifizieren und zu klassifizieren, um schließlich imstande zu sein, Formen ohne irgendeine Nachhilfe zu identifizieren. Auf ähnliche Weise muss ein System für tiefgehendes Lernen oder ein System für neuronales Lernen in Objekterkennung und Objektklassifizierung trainiert werden, damit es intelligenter und effizienter beim Identifizieren von Grundobjekten, verdeckten Objekte usw. wird, während ebenfalls Objekten Kontext zugewiesen wird.
  • Auf der einfachsten Ebene schauen Neuronen im menschlichen Gehirn auf verschiedene Eingaben, die empfangen werden, wobei jeder dieser Eingaben Bedeutungsgrade zugewiesen werden, und eine Ausgabe an andere Neuronen weitergeleitet wird, um auf diese zu wirken. Ein künstliches Neuron oder Perzeptron ist das grundlegendste Modell eines neuronalen Netzwerks. In einem Beispiel kann ein Perzeptron eine oder mehrere Eingaben empfangen, die verschiedene Merkmale eines Objekts darstellen, für die das Perzeptron trainiert wird, zu erkennen und zu klassifizieren, und jedem dieser Merkmale wird ein bestimmtes Gewicht basierend auf der Bedeutung des Merkmals beim Definieren der Gestalt eines Objekts zugewiesen.
  • Ein Modell eines tiefen neuronalen Netzwerks (DNN) umfasst mehrere Schichten von vielen verbundenen Knoten (z.B. Perzeptronen, Boltzmann-Maschinen, radiale Basisfunktionen, Faltungsschichten usw.), die mit enormen Mengen an Eingabedaten trainiert werden können, um komplexe Probleme mit hoher Genauigkeit schnell zu lösen. In einem Beispiel gliedert eine erste Schicht des DNN-Modells ein Eingabebild eines Automobils in verschiedene Abschnitte auf und sucht nach Grundmustern, wie beispielsweise Linien und Winkel.
  • Die zweite Schicht setzt die Linien zusammen, um nach Mustern höherer Ebene, wie beispielsweise Rädern, Windschutzscheiben und Spiegeln, zu suchen. Die nächste Schicht kennzeichnet den Typ des Fahrzeugs und die letzten paar Schichten erzeugen ein Kennzeichen für das Eingabebild, welches das Modell einer speziellen Automobilmarke kennzeichnet.
  • Sobald das DNN trainiert ist, kann das DNN eingesetzt und verwendet werden, um Objekte oder Muster in einem als Inferenz bekannten Prozess zu identifizieren und zu klassifizieren. Beispiele von Inferenz (der Prozess, durch den ein DNN nützliche Information aus einer gegebenen Eingabe extrahiert) umfassen ein Identifizieren handgeschriebener Zahlen auf Schecks, die in Geldausgabe-Maschinen eingezahlt werden, ein Identifizieren von Bildern von Freunden in Photos, Liefern von Filmempfehlungen an über fünfzig Millionen Nutzern, Identifizieren und Klassifizieren unterschiedlicher Typen von Automobilen, Fußgängern und Straßengefahren in fahrerlosen Autos oder Übersetzen von menschlicher Sprache in Echtzeit.
  • Während des Trainings strömen Daten durch das DNN in einer Vorwärtspropagierungsphase, bis eine Vorhersage erzeugt wird, die ein Kennzeichen angibt, das der Eingabe entspricht. Wenn das neuronale Netzwerk die Eingabe nicht korrekt kennzeichnet, dann werden Fehler zwischen dem korrekten Kennzeichen und dem vorhergesagten Kennzeichen analysiert und die Gewichte werden für jedes Merkmal während einer Rückwärtspropagierungsphase eingestellt, bis das DNN die Eingabe und andere Eingaben in einem Trainingsdatensatz korrekt kennzeichnet. Das Training komplexer neuronaler Netzwerke erfordert enorme Mengen an paralleler Rechenleistung, die Gleitkomma-Multiplikationen und Gleitkomma-Additionen umfassen, die von der PPU 300 unterstützt werden. Inferenzieren ist weniger rechenintensiv als Training, das ein Latenz-empfindliches Verfahren ist, wobei ein trainiertes neuronales Netzwerk auf neue Eingaben angewandt wird, die es zuvor nicht gesehen hat, um Bilder zu klassifizieren, Sprache zu übersetzen und im Allgemeinen neue Informationen abzuleiten.
  • Neuronale Netzwerke stützen sich sehr auf Matrixrechenoperationen und komplexe mehrschichtige Netzwerke erfordern enorme Mengen an Gleitkomma-Leistung und Bandbreite sowohl für Effizienz als auch Geschwindigkeit. Mit Tausenden von Verarbeitungskernen, die für Matrixrechenoperationen optimiert sind und von zehn bis hunderten von TFLOPS von Leistung liefern, ist die PPU 300 eine Rechenplattform, die imstande ist, Leistung zu liefern, die für tiefe neuronale Netzwerk-basierte künstliche Intelligenz und Maschinenlernanwendungen erforderlich ist.
  • Es wird angemerkt, dass die hier beschriebenen Techniken in ausführbaren Anweisungen verkörpert sein können, die in einem computerlesbaren Medium zur Verwendung durch oder in Verbindung mit einer prozessorbasierten Anweisungsausführungsmaschine, einem System, einer Vorrichtung oder einem Gerät gespeichert sind. Für den Fachmann versteht sich, dass für einige Ausführungsbeispiele verschiedene Arten von computerlesbaren Medien zur Speicherung von Daten beinhaltet sein können. Ein „computerlesbarer Datenträger“, wie hier verwendet, beinhaltet ein oder mehrere beliebige geeignete Medien zur Speicherung der ausführbaren Befehle eines Computerprogramms derart, so dass die Anweisungsausführungsmaschine, das System, die Vorrichtung oder das Gerät die Befehle von dem computerlesbaren Datenträger lesen (oder abrufen) und die Anweisungen zur Durchführung der beschriebenen Ausführungsbeispiele ausführen kann. Geeignete Speicherformate beinhalten ein oder mehrere eines elektronischen, magnetischen, optischen und elektromagnetischen Formats. Eine nicht erschöpfende Liste konventioneller beispielhafter computerlesbarer Datenträger beinhaltet: eine tragbare Computerdiskette; einen Direktzugriffsspeicher (RAM); einen Nur-Lese-Speicher (ROM); einen löschbaren programmierbaren Nur-Lese-Speicher (EPROM); eine Flash-Speichervorrichtung; und optische Speichervorrichtungen, einschließlich einer tragbaren Compact Disc (CD), einer tragbaren digitalen Videodisc (DVD) und dergleichen.
  • Es versteht sich, dass die in den beigefügten Figuren dargestellte Anordnung von Komponenten zu Veranschaulichungszwecken dient und dass andere Anordnungen möglich sind. Beispielsweise können ein oder mehrere der hier beschriebenen Elemente ganz oder teilweise als eine elektronische Hardwarekomponente realisiert sein. Andere Elemente können in Software, Hardware oder einer Kombination aus Software und Hardware implementiert sein. Außerdem können einige oder alle dieser anderen Elemente kombiniert werden, einige können ganz weggelassen werden und zusätzliche Komponenten können hinzugefügt werden, während die hier beschriebene Funktionalität noch immer erreicht wird. Folglich kann der hier beschriebene Gegenstand in vielen verschiedenen Variationen verkörpert sein und es wird davon ausgegangen, dass alle solche Variationen in den Geltungsbereich der Ansprüche fallen.
  • Um das Verständnis des hier beschriebenen Gegenstands zu erleichtern, sind viele Aspekte im Hinblick auf Sequenzen von Aktionen beschrieben. Es versteht sich für den Fachmann, dass die verschiedenen Aktionen durch spezialisierte Schaltungen oder Schaltkreise, durch Programmanweisungen, die von einem oder mehreren Prozessoren ausgeführt werden, oder durch eine Kombination von beidem ausgeführt werden können. Die hier dargelegte Beschreibung einer beliebigen Sequenz von Aktionen soll nicht implizieren, dass der für die Ausführung dieser Sequenz beschriebenen spezifischen Reihenfolge gefolgt werden muss. Alle hier beschriebenen Verfahren können in jeder beliebigen geeigneten Reihenfolge durchgeführt werden, sofern es hier nicht anders angegeben ist oder anderweitig durch den Kontext klar widersprochen wird.
  • Die Verwendung der Begriffe „ein“ und „der“ und ähnliche Bezugnahmen im Kontext der Beschreibung des Gegenstands (insbesondere im Kontext der folgenden Ansprüche) sind so auszulegen, dass sie sowohl den Singular als auch den Plural abdecken, sofern dies hier nicht anders angegeben ist oder durch Kontext eindeutig im Widerspruch steht. Die Verwendung des Begriffs „zumindest ein“, gefolgt von einer Liste eines oder mehrerer Elemente (z. B. „zumindest einer von A und B“) ist so auszulegen, dass eines der aufgelisteten Elemente (A oder B) oder eine beliebige Kombination zweier oder mehrerer der aufgelisteten Elemente (A und B) ausgewählt wird, sofern dies hier nicht anders angegeben ist oder durch den Kontext klar widersprochen wird. Ferner dient die vorangehende Beschreibung lediglich der Zweck der Veranschaulichung und nicht dem Zweck der Beschränkung dient, da der angestrebte Schutzumfang durch die nachstehenden Ansprüche und deren Äquivalente definiert wird. Die Verwendung beliebiger und aller Beispiele, oder hier bereitgestellter beispielhafter Formulierungen (z.B. „wie beispielsweise“), dient lediglich der besseren Veranschaulichung des Gegenstands und stellt keine Beschränkung des Schutzumfangs des Gegenstands dar, sofern dies nicht anders beansprucht wird. Die Verwendung des Begriffs „basierend auf“ und anderer ähnlicher Ausdrücke, die eine Bedingung für die Herbeiführung eines Ergebnisses angeben, sowohl in den Ansprüchen als auch in der schriftlichen Beschreibung, soll keine wie auch immer anderen Bedingungen ausschließen, die dieses Ergebnis herbeiführen. Keine Formulierung in der Spezifikation sollte so ausgelegt werden, dass sie ein beliebiges nicht beanspruchtes Element als wesentlich für die praktische Umsetzung der beanspruchten Erfindung anzeigt.

Claims (20)

  1. Parallelverarbeitungssystem, umfassend: mehrere Verarbeitungseinheiten, beinhaltend: eine erste Verarbeitungseinheit, die einen ersten Notizblock und eine erste Registerdatei umfasst, wobei die erste Verarbeitungseinheit imstande ist, einen ersten Kernel und einen zweiten Kernel auszuführen, und eine zweite Verarbeitungseinheit, die einen zweiten Notizblock und eine zweite Registerdatei umfasst, wobei die zweite Verarbeitungseinheit imstande ist, einen dritten Kernel auszuführen; Planerlogik, die mit den mehreren Verarbeitungseinheiten gekoppelt ist, wobei die Planerschaltungen Kernels bestimmten Verarbeitungseinheiten in den mehreren Verarbeitungseinheiten zuweisen, um ausgeführt zu werden; und einen Speicher, der mit den mehreren Verarbeitungseinheiten gekoppelt ist, wobei das Parallelverarbeitungssystem konfiguriert ist, so dass das Speichern erster Daten in entweder dem ersten Notizblock oder dem zweiten Notizblock nicht veranlasst, dass die ersten Daten in dem Speicher gespeichert werden; wobei der erste Notizblock konfiguriert ist, um einem solchen ersten Kernel zu erlauben, zweite Daten in dem ersten Notizblock zu speichern, um einem solchen zweiten Kernel zu erlauben, die zweiten Daten aus dem ersten Notizblock zu laden, und einem solchen dritten Kernel zu verbieten, die zweiten Daten aus dem ersten Notizblock zu speichern oder zu laden, und wobei der zweite Notizblock konfiguriert ist, um einem solchen dritten Kernel zu erlauben, dritte Daten in dem zweiten Notizblock zu speichern, und solchen ersten und zweiten Kernels zu verbieten, die dritten Daten aus dem zweiten Notizblock zu laden.
  2. Parallelverarbeitungssystem gemäß Anspruch 1, wobei der erste Kernel einem oder mehreren Threads zugeordnet ist.
  3. Parallelverarbeitungssystem gemäß Anspruch 1 oder 2, wobei solche ersten und zweiten Kernels nebenläufig für mindestens eine Zeitdauer auf der ersten Verarbeitungseinheit ausgeführt werden.
  4. Parallelverarbeitungssystem gemäß Anspruch 3, wobei während der ersten Zeitdauer die Ausführung des ersten Kernels und des zweiten Kernels durch den ersten Notizblock synchronisiert wird.
  5. Parallelverarbeitungssystem gemäß einem der vorangehenden Ansprüche, wobei solche ersten und zweiten Kernels nacheinander auf der ersten Verarbeitungseinheit ausgeführt werden.
  6. Parallelverarbeitungssystem gemäß einem der vorangehenden Ansprüche, wobei die erste Verarbeitungseinheit einen dritten Notizblock umfasst, der konfiguriert ist, um durch einem solchen ersten Kernel zugänglich zu sein, und einen vierten Kernel umfasst, der auf der ersten Verarbeitungseinheit ausgeführt wird, wobei der dritte Notizblock konfiguriert ist, um einem solchen ersten Kernel zu erlauben, fünfte Daten in dem dritten Notizblock zu speichern, um einem solchen vierten Kernel zu erlauben, die fünften Daten aus dem dritten Notizblock zu laden, und solchen zweiten und dritten Kernels zu verbieten, die fünften Daten aus dem dritten Notizblock zu speichern oder zu laden.
  7. Parallelverarbeitungssystem gemäß einem der vorangehenden Ansprüche, wobei das Parallelverarbeitungssystem den ersten Notizblock aus einem Pool des Notizblockspeichers allokiert, der innerhalb der ersten Verarbeitungseinheit enthalten ist.
  8. Parallelverarbeitungssystem gemäß Anspruch 7, wobei das Parallelverarbeitungssystem den ersten Notizblock nach Ausführung von solchen ersten und zweiten Kernels deallokiert, um dadurch den ersten Notizblock dem Pool des Notizblockspeichers zurückzugeben.
  9. Parallelverarbeitungssystem gemäß Anspruch 8, wobei das Parallelverarbeitungssystem eine Größe für den ersten Notizblock erhält und veranlasst, dass der ersten Notizblock ausreichende Speicherplätze für die erhaltene Größe aufweist.
  10. Parallelverarbeitungssystem gemäß Anspruch 9, wobei die Größe gleich 4KB, 8KB, 16KB, 32KB, 64KB oder 128KB ist.
  11. Parallelverarbeitungssystem gemäß einem der vorangehenden Ansprüche, wobei die erste Verarbeitungseinheit konfiguriert ist, um in einem ersten Modus und einem zweiten Modus ausgeführt zu werden, wobei während des ersten Modus nur ein einzelner Kernel auf den ersten Notizblock zugreifen kann, und wobei während des zweiten Modus mehrere Kernel, die parallel oder seriell ausgeführt werden, auf den ersten Notizblock zugreifen können.
  12. Parallelverarbeitungssystem gemäß Anspruch 11, wobei das Parallelverarbeitungssystem bewirkt, dass der einzige Kernel das Ausführen im ersten Modus vor einem Betrieb im zweiten Modus abschließt.
  13. Parallelverarbeitungssystem gemäß Anspruch 11 oder 12, wobei der erste Modus ein privater Modus und der zweite Modus ein gemeinsam benutzter Modus ist.
  14. Parallelverarbeitungssystem gemäß einem der vorangehenden Ansprüche, ferner umfassend eine dritte Verarbeitungseinheit, die einen dritten Notizblock und eine dritte Registerdatei umfasst, wobei die dritte Verarbeitungseinheit imstande ist, den ersten Kernel und den zweiten Kernel auszuführen, und die Planerlogik: einen ersten Satz von einem oder mehreren Ausführungskontexten zuweist, um den ersten Kernel auf der dritten Verarbeitungseinheit auszuführen; und einen zweiten Satz von einem oder mehreren Ausführungskontexten zuweist, um den zweiten Kernel auf der dritten Verarbeitungseinheit auszuführen, wobei der erste Satz aus einem oder mehreren Ausführungskontexten Daten mit dem zweiten Satz von einem oder mehreren Ausführungskontexten durch den dritten Notizblock austauscht und die Ausführung ohne Zugreifen auf den ersten Notizblock abschließt.
  15. Parallelverarbeitungssystem gemäß einem der vorangehenden Ansprüche, wobei, vor dem Laden der zweiten Daten, die Ausführung des ersten Kernels und des zweiten Kernels durch den ersten Notizblock synchronisiert werden.
  16. Computerimplementiertes Verfahren, umfassend: Zuweisen eines ersten Kernels und eines zweiten Kernels zur Ausführung durch eine erste Verarbeitungseinheit von einer Mehrzahl von Verarbeitungseinheiten, die mit einem Speicher gekoppelt sind, wobei die erste Verarbeitungseinheit einen ersten Notizblock und eine erste Registerdatei umfasst, wobei die erste Verarbeitungseinheit imstande ist, den ersten Kernel und den zweiten Kernel auszuführen; Zuweisen eines dritten Kernels zur Ausführung durch eine zweiten Verarbeitungseinheit der Mehrzahl von Verarbeitungseinheiten, wobei die zweite Verarbeitungseinheit einen zweiten Notizblock und eine zweite Registerdatei umfasst, wobei die zweite Verarbeitungseinheit imstande ist, den dritten Kernel auszuführen, wobei das Speichern von ersten Daten in entweder dem ersten Notizblock oder dem zweiten Notizblock nicht veranlasst, dass die ersten Daten in dem Speicher zu speichern sind; Konfigurieren des ersten Notizblocks, um einem solchen ersten Kernel zu erlauben, zweite Daten in dem ersten Notizblock zu speichern, um einem solchen zweiten Kernel zu erlauben, die zweiten Daten aus dem ersten Notizblock zu laden, und einem solchen dritten Kernel zu verbieten, die zweiten Daten aus dem ersten Notizblock zu speichern oder zu laden; und Konfigurieren des zweiten Notizblocks, um einem solchen dritten Kernel zu erlauben, dritte Daten in dem zweiten Notizblock zu speichern, und solchen ersten und zweiten Kernels zu verbieten, die dritten Daten aus dem zweiten Notizblock zu laden.
  17. Computerimplementiertes Verfahren gemäß Anspruch 16, wobei solche ersten und zweiten Kernels nebenläufig für mindestens eine Zeitdauer auf der ersten Verarbeitungseinheit ausgeführt werden.
  18. Computerimplementiertes Verfahren gemäß Anspruch 16 oder 17, wobei solche ersten und zweiten Kernels nacheinander auf der ersten Verarbeitungseinheit ausgeführt werden.
  19. Computerimplementiertes Verfahren gemäß Anspruch 18, wobei das Parallelverarbeitungssystem veranlasst, dass der einzelne Kernel die Ausführung im ersten Modus vor einem Betrieb im zweiten Modus abschließt.
  20. Nichttransitorische computerlesbare Medien, die Computeranweisungen speichern, die, wenn durch einen oder mehrere Prozessoren ausgeführt, den einen oder mehrere Prozessoren veranlassen, die Schritte eines Verfahrens durchzuführen, wie in den Ansprüchen 16 bis 19 erwähnt.
DE102020121601.7A 2019-11-07 2020-08-18 Persistenter Notizblockspeicher zum Datenaustausch zwischen Programmen Pending DE102020121601A1 (de)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US16/677,503 2019-11-07
US16/677,503 US10725837B1 (en) 2019-11-07 2019-11-07 Persistent scratchpad memory for data exchange between programs

Publications (1)

Publication Number Publication Date
DE102020121601A1 true DE102020121601A1 (de) 2021-05-12

Family

ID=71783409

Family Applications (1)

Application Number Title Priority Date Filing Date
DE102020121601.7A Pending DE102020121601A1 (de) 2019-11-07 2020-08-18 Persistenter Notizblockspeicher zum Datenaustausch zwischen Programmen

Country Status (3)

Country Link
US (1) US10725837B1 (de)
CN (1) CN112783554A (de)
DE (1) DE102020121601A1 (de)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11429524B2 (en) * 2020-02-10 2022-08-30 International Business Machines Corporation Optimized hierarchical scratchpads for enhanced artificial intelligence accelerator core utilization
KR20220033329A (ko) * 2020-09-09 2022-03-16 삼성전자주식회사 뉴럴 네트워크를 위한 컴파일링 방법 및 장치
CN113256171B (zh) * 2021-06-29 2021-09-24 湖北亿咖通科技有限公司 一种业务计划生成方法和系统
CN116302504A (zh) * 2023-02-23 2023-06-23 海光信息技术股份有限公司 线程块的处理系统、方法及相关设备
CN117311988B (zh) * 2023-11-27 2024-03-12 沐曦集成电路(南京)有限公司 一种带掩码的规约操作优化方法、装置、设备及介质
CN117707625B (zh) * 2024-02-05 2024-05-10 上海登临科技有限公司 支持指令多发的计算单元、方法及相应图形处理器

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10649914B1 (en) * 2016-07-01 2020-05-12 The Board Of Trustees Of The University Of Illinois Scratchpad-based operating system for multi-core embedded systems
EP3306479A1 (de) * 2016-10-06 2018-04-11 Stichting IMEC Nederland Speicherstruktur mit notizblockspeicher

Also Published As

Publication number Publication date
CN112783554A (zh) 2021-05-11
US10725837B1 (en) 2020-07-28

Similar Documents

Publication Publication Date Title
DE102019102279A1 (de) Erzeugung von synthetischen Bildern zum Trainieren eines Neuronal-Netzwerkmodells
DE102018132069A1 (de) Äquivariante Orientierungspunkt-Transformation für Orientierungspunkt-Lokalisierung
DE102018117813A1 (de) Zeitlich stabile Datenrekonstruktion mit einem externen rekurrenten neuronalen Netzwerk
DE102018126670A1 (de) Fortschreitende Modifizierung von generativen adversativen neuronalen Netzen
DE102020121601A1 (de) Persistenter Notizblockspeicher zum Datenaustausch zwischen Programmen
DE102018108324A1 (de) System und Verfahren zur Schätzung eines optischen Flusses
DE102019103310A1 (de) Schätzer for einen optimalen betriebspunkt für hardware, die unter einer beschränkung der gemeinsam genutzten leistung/wärme arbeitet
DE102020104637A1 (de) Techniken zur effizienten partitionierung von speicher
DE102020124932A1 (de) Vorrichtung und Verfahren zur Echtzeit-Grafikverarbeitung mittels lokaler und cloudbasierter Grafikverarbeitungsbetriebsmittel
DE102018121282A1 (de) Differenzierbare rendering-pipeline für inverse graphik
DE102019102009A1 (de) Reduzierung des rauschens während des renderings durch parallele path-space-filterung unter verwendung von hashing
DE102019106123A1 (de) Dreidimensionale (3D) Posenschätzung von Seiten einer monokularen Kamera
DE102021120605A1 (de) Effiziente softmax-berechnung
DE102021102589A1 (de) Berechnungsgraph-optimierung
DE102020132377A1 (de) Vorrichtung und Verfahren zur Drosselung einer Raytracing-Pipeline
DE102019130311A1 (de) Transponierte schwachbesetzte matrix multipliziert mit dichtbesetzter matrix für ein training neuronaler netzwerke
DE102018124211A1 (de) Lernbasierte Kameraposenschätzung von Bildern einer Umgebung
DE112020005020T5 (de) Stellungsbestimmung unter verwendung eines oder mehrerer neuronaler netze
DE102021105249A1 (de) Mikrotraining zur iterativen verfeinerung eines neuronalen netzes mit wenigen anpassungen
DE112020000865T5 (de) Speicherverwaltungssystem
DE102020118860A1 (de) Techniken zum vorladen von texturen beim rendering von graphik
DE102019134020A1 (de) Dekompprimierungstechniken zur verarbeitung komprimierter daten, die für künstliche neuronale netzwerke geeignet sind
DE102019103319A1 (de) Stochastisches runden von zahlenwerten
DE112019001978T5 (de) Verbesserung des realismus von szenen mit wasseroberflächen beim rendern
DE102021111335A1 (de) Techniken zum dynamischen komprimieren von speicherregionen, die einen einheitlichen wert haben

Legal Events

Date Code Title Description
R012 Request for examination validly filed