DE102022132008A1 - Asynchrone speicherdeallokation - Google Patents

Asynchrone speicherdeallokation Download PDF

Info

Publication number
DE102022132008A1
DE102022132008A1 DE102022132008.1A DE102022132008A DE102022132008A1 DE 102022132008 A1 DE102022132008 A1 DE 102022132008A1 DE 102022132008 A DE102022132008 A DE 102022132008A DE 102022132008 A1 DE102022132008 A1 DE 102022132008A1
Authority
DE
Germany
Prior art keywords
memory
processor
asynchronously
graphics
processors
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
DE102022132008.1A
Other languages
English (en)
Inventor
Vivek Belve Kini
Steven Arthur Gurfinkel
Fnu Vishnuswaroop Ramesh
Houston Thompson Hoffman
Michael Christopher Delorme
Alicia Xiao Hu
Stephen Anthony Bernard Jones
Vladislav Zhurba
William Young Fiser
Reza MOKHTARI
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 DE102022132008A1 publication Critical patent/DE102022132008A1/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/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
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0893Caches characterised by their organisation or structure
    • G06F12/0897Caches characterised by their organisation or structure with two or more cache hierarchy levels
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/084Multiuser, multiprocessor or multiprocessing cache systems with a shared cache
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/10Address translation
    • G06F12/1081Address translation for peripheral access to main memory, e.g. direct memory access [DMA]
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/10Address translation
    • G06F12/1027Address translation using associative or pseudo-associative address translation means, e.g. translation look-aside buffer [TLB]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/15Use in a specific computing environment
    • G06F2212/152Virtualized environment, e.g. logically partitioned system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/65Details of virtual memory and virtual address translation
    • G06F2212/657Virtual address space management

Abstract

Vorrichtungen, Systeme und Techniken zum Allozieren von Prozessorspeicher. In mindestens einer Ausführungsform wird eine Anwendungsprogrammierschnittstelle verwendet, um Befehle zum asynchronen Deallozieren von Speicherplätzen von Prozessoren auszuführen.

Description

  • GEBIET
  • Mindestens eine Ausführungsform bezieht sich auf Verarbeitungsressourcen, die zur Ausführung eines oder mehrerer CUDA-Programme verwendet werden. Zum Beispiel bezieht sich mindestens eine Ausführungsform auf Prozessoren oder Rechensysteme, die zur Ausführung eines oder mehrerer CUDA-Programme verwendet werden, die eine asynchrone Allozierung und Deallozierung von Speicher implementieren.
  • HINTERGRUND
  • Für Stream-geordnete Rechenoperationen wird von einem Betriebssystem Speicher bereitgestellt. Ein synchrones Bereitstellen von Speicher für Stream-geordnete Rechenoperationen kann zu erheblichen Verzögerungen führen, die die Systemleistung verringern, und kann eine Speicherfragmentierung verursachen, die die Speichernutzung erhöht. Eine Menge an Speicher, Zeit und Rechenressourcen, die zur Durchführung von Stream-geordneten Rechenoperationen und anderen Rechenoperationen verwendet werden, kann verbessert werden.
  • Figurenliste
    • 1 veranschaulicht ein Beispiel eines Computersystems, bei dem Speicher asynchron alloziert wird, gemäß mindestens einer Ausführungsform;
    • 2 veranschaulicht ein Beispiel eines Computersystems, bei dem Speicher asynchron aus einem Speicherpool alloziert wird, gemäß mindestens einer Ausführungsform;
    • 3 veranschaulicht ein Beispiel eines Computersystems, bei dem Speicher für einen Stream-geordneten Ausführungsthread asynchron aus einem Speicherpool alloziert wird, gemäß mindestens einer Ausführungsform;
    • 4 veranschaulicht ein Beispiel eines Computersystems, bei dem der Speicher für einen Stream-geordneten Ausführungsthread asynchron dealloziert und an einen Speicherpool zurückgegeben wird, gemäß mindestens einer Ausführungsform;
    • 5 veranschaulicht einen Beispielprozess zum Durchführen von Operationen zum asynchronen Allozieren von Speicher, gemäß mindestens einer Ausführungsform;
    • 6 veranschaulicht einen Beispielprozess zum Durchführen von Operationen zum asynchronen Allozieren von Speicher, gemäß mindestens einer Ausführungsform;
    • 7 veranschaulicht einen Beispielprozess zum Durchführen von Speicherverwaltungsoperationen zum asynchronen Deallozieren von Speicher, gemäß mindestens einer Ausführungsform;
    • 8 veranschaulicht einen beispielhaften Datenfluss, bei dem der Speicher synchron alloziert wird, gemäß mindestens einer Ausführungsform;
    • 9 veranschaulicht einen beispielhaften ersten Teil eines Datenflusses, bei dem Speicher asynchron alloziert und dealloziert wird, gemäß mindestens einer Ausführungsform;
    • 10 veranschaulicht einen beispielhaften zweiten Teil eines Datenflusses, bei dem Speicher asynchron alloziert und dealloziert wird, gemäß mindestens einer Ausführungsform;
    • 11 veranschaulicht einen beispielhaften dritten Teil eines Datenflusses, bei dem Speicher asynchron alloziert und dealloziert wird, gemäß mindestens einer Ausführungsform;
    • 12 veranschaulicht einen beispielhaften vierten Teil eines Datenflusses, bei dem Speicher asynchron alloziert und dealloziert wird, gemäß mindestens einer Ausführungsform;
    • 13 veranschaulicht einen Beispielprozess zum Durchführen von Speicherverwaltungsoperationen zum asynchronen Allozieren von Speicher unter Verwendung eines Speicherpools, gemäß mindestens einer Ausführungsform;
    • 14 veranschaulicht ein Beispiel eines Computersystems, bei dem Speicherverwaltungsoperationen zum asynchronen Allozieren von Speicher unter Verwendung eines Speicherpools für einen einzelnen Ausführungsstream durchgeführt werden, gemäß mindestens einer Ausführungsform;
    • 15 veranschaulicht ein Beispiel eines Computersystems, bei dem Speicherverwaltungsoperationen zum asynchronen Allozieren von Speicher unter Verwendung eines Speicherpools für eine Vielzahl von Ausführungsströmen durchgeführt werden, gemäß mindestens einer Ausführungsform;
    • 16 veranschaulicht einen Beispielprozess zum Durchführen von Speicherverwaltungsoperationen zum Wiederverwenden von asynchron alloziertem Speicher aus einem Speicherpool, gemäß mindestens einer Ausführungsform;
    • 17 veranschaulicht ein Beispiel eines Computersystems, bei dem Speicherverwaltungsoperationen zum Wiederverwenden von asynchron alloziertem Speicher aus einem Speicherpool für eine Vielzahl von synchronisierten Ausführungsströmen durchgeführt werden, gemäß mindestens einer Ausführungsform;
    • 18 veranschaulicht einen Beispielprozess zum Durchführen von Speicherverwaltungsoperationen zum Wiederverwenden von asynchron alloziertem Speicher aus einem Speicherpool für eine Vielzahl von synchronisierten Ausführungsströmen, gemäß mindestens einer Ausführungsform;
    • 19 veranschaulicht ein beispielhaftes Rechenzentrum, gemäß mindestens einer Ausführungsform;
    • 20 veranschaulicht ein Verarbeitungssystem, gemäß mindestens einer Ausführungsform;
    • 21 veranschaulicht ein Computersystem, gemäß mindestens einer Ausführungsform;
    • 22 veranschaulicht ein System, gemäß mindestens einer Ausführungsform;
    • 23 veranschaulicht eine beispielhafte integrierte Schaltung, gemäß mindestens einer Ausführungsform;
    • 24 veranschaulicht ein Rechensystem, gemäß mindestens einer Ausführungsform;
    • 25 veranschaulicht eine APU, gemäß mindestens einer Ausführungsform;
    • 26 veranschaulicht eine CPU, gemäß mindestens einer Ausführungsform;
    • 27 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice, gemäß mindestens einer Ausführungsform;
    • 28A-28B veranschaulichen beispielhafte Grafikprozessoren, gemäß mindestens einer Ausführungsform;
    • 29A veranschaulicht einen Grafikkern, gemäß mindestens einer Ausführungsform;
    • 29B veranschaulicht eine GPGPU, gemäß mindestens einer Ausführungsform;
    • 30A veranschaulicht einen Parallelprozessor, gemäß mindestens einer Ausführungsform;
    • 30B veranschaulicht einen Verarbeitungscluster, gemäß mindestens einer Ausführungsform;
    • 30C veranschaulicht einen Grafik-Multiprozessor, gemäß mindestens einer Ausführungsform;
    • 31 veranschaulicht einen Grafikprozessor, gemäß mindestens einer Ausführungsform;
    • 32 veranschaulicht einen Prozessor, gemäß mindestens einer Ausführungsform;
    • 33 veranschaulicht einen Prozessor, gemäß mindestens einer Ausführungsform;
    • 34 veranschaulicht einen Grafikprozessorkern, gemäß mindestens einer Ausführungsform;
    • 35 veranschaulicht eine PPU, gemäß mindestens einer Ausführungsform;
    • 36 veranschaulicht einen GPC, gemäß mindestens einer Ausführungsform;
    • 37 veranschaulicht einen Streaming-Multiprozessor, gemäß mindestens einer Ausführungsform;
    • 38 veranschaulicht einen Software-Stack einer Programmierplattform, gemäß mindestens einer Ausführungsform;
    • 39 veranschaulicht eine CUDA-Implementierung eines Software-Stacks aus 38, gemäß mindestens einer Ausführungsform;
    • 40 veranschaulicht eine ROCm-Implementierung eines Software-Stacks aus 38, gemäß mindestens einer Ausführungsform;
    • 41 veranschaulicht eine OpenCL-Implementierung eines Software-Stacks aus 38, gemäß mindestens einer Ausführungsform;
    • 42 veranschaulicht eine Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform;
    • 43 veranschaulicht die Kompilierung von Code zur Ausführung auf den Programmierplattformen von 38 - 41, gemäß mindestens einer Ausführungsform;
    • 44 veranschaulicht ausführlicher die Kompilierung von Code zur Ausführung auf den Programmierplattformen von 38 - 41, gemäß mindestens einer Ausführungsform;
    • 45 veranschaulicht die Übersetzung von Quellcode vor der Kompilierung des Quellcodes, gemäß mindestens einer Ausführungsform;
    • 46A veranschaulicht ein System, das zum Kompilieren und Ausführen von CUDA-Quellcode unter Verwendung verschiedener Typen von Verarbeitungseinheiten konfiguriert ist, gemäß mindestens einer Ausführungsform;
    • 46B veranschaulicht ein System, das zum Kompilieren und Ausführen des CUDA-Quellcodes von 46A unter Verwendung einer CPU und eines CUDA-fähigen Grafikprozessors konfiguriert ist, gemäß mindestens einer Ausführungsform;
    • 46C veranschaulicht ein System, das zum Kompilieren und Ausführen von CUDA-Quellcode aus 46A unter Verwendung einer CPU und einer nicht-CUDA-fähigen GPU konfiguriert ist, gemäß mindestens einer Ausführungsform;
    • 47 veranschaulicht einen beispielhaften Kernel, der durch das CUDA-zu-HIP-Übersetzungswerkzeug von 46C übersetzt wurde, gemäß mindestens einer Ausführungsform;
    • 48 veranschaulicht die nicht-CUDA-fähige GPU von 46C in größerem Detail, gemäß mindestens einer Ausführungsform;
    • 49 veranschaulicht, wie Threads eines beispielhaften CUDA-Grids auf verschiedene Recheneinheiten von 48 abgebildet werden, gemäß mindestens einer Ausführungsform; und
    • 50 veranschaulicht die Migration von bestehendem CUDA-Code zu Data Parallel C++-Code gemäß mindestens einer Ausführungsform.
  • DETAILLIERTE BESCHREIBUNG
  • 1 veranschaulicht ein Beispiel für ein Computersystem 100, bei dem der Speicher in Übereinstimmung mit mindestens einer Ausführungsform asynchron alloziert bzw. zugewiesen wird. In mindestens einer Ausführungsform kann ein Prozessor 102 mit einem Grafikprozessor 108 verbunden sein. In mindestens einer Ausführungsform ist der Prozessor 102 ein Single-Core-Prozessor. In mindestens einer Ausführungsform ist der Prozessor 102 ein Multi-Core-Prozessor. In mindestens einer Ausführungsform sind ein oder mehrere zusätzliche Prozessoren, die nicht dargestellt sind, mit dem Prozessor 102 verbunden. In mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Verarbeitungssystems wie dem hierin beschriebenen Verarbeitungssystem 2000. In mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Computersystems, wie das hierin beschriebene Computersystem 2100. In mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Systems, wie das hierin beschriebene System 2200. In mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Computersystems, wie das hierin beschriebene Computersystem 2400. In mindestens einer Ausführungsform ist der Prozessor 102 ein Element einer Recheneinheit, wie der hierin beschriebenen Recheneinheit 4840.
  • In mindestens einer Ausführungsform ist ein Systemspeicher 112 ein Speicher des Computersystems 100, der unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen instanziiert und/oder auf einem Computersystem, wie dem Computersystem 100, gespeichert werden kann. In mindestens einer Ausführungsform enthält das Computersystem 100 eine Funktionalität zum Erzeugen einer virtuellen Adresse für den Systemspeicher 112, bei dem es sich um einen asynchron zugewiesenen Speicher handelt, der unter Verwendung von Systemen und Verfahren, wie den hierin beschriebenen, asynchron alloziert bzw. zugewiesen und/oder dealloziert bzw. freigegeben werden kann. In mindestens einer Ausführungsform verwendet das Computersystem 100 einen Speichermanager 106 zur Verwaltung des Systemspeichers 112. In mindestens einer Ausführungsform enthält das Computersystem 100 eine Funktionalität, um dem Speicher eine virtuelle Adresse zuzuordnen, die dem Grafikprozessorspeicher 104 zur Verwendung durch den Grafikprozessor 108 bereitgestellt werden kann.
  • In mindestens einer Ausführungsform wird der Speicher asynchron zugewiesen, indem einem aufrufenden Prozess ein virtueller Speicherzeiger bzw. Virtuellspeicherzeiger bereitgestellt wird. In mindestens einer Ausführungsform wird einem aufrufenden Prozess ein Virtuellspeicherzeiger bereitgestellt, wenn ein aufrufender Prozess asynchron zugewiesenen Speicher unter Verwendung von Systemen und Verfahren, wie den hierin beschriebenen, anfordert. In mindestens einer Ausführungsform wird der einem Virtuellspeicherzeiger zugeordnete Sicherungsspeicher zu einem späteren Zeitpunkt bereitgestellt, z.B. bevor ein Kernel ausgeführt wird, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform wird asynchron zugewiesener Speicher asynchron freigegeben, z.B. nach Abschluss der Kernelausführung, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform wird der asynchron zugewiesene Speicher asynchron freigegeben, indem der Speicher an einen Speicherpool zurückgegeben und ein Virtuellspeicherzeiger freigegeben wird, der dem freigegebenen Speicher zugeordnet ist, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform umfasst der Prozessor 102 einen oder mehrere Schaltungen bzw. Schaltkreise zum Durchführen einer Anwendungsprogrammierschnittstelle („API“), um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zugewiesen werden. In mindestens einer Ausführungsform umfasst der Prozessor 102 eine oder mehrere Schaltungen zum Durchführen einer Anwendungsprogrammierschnittstelle („API“), um einen oder mehrere Speicherplätze asynchron einem oder mehreren Prozessen zuzuweisen, die auf einem oder mehreren Prozessoren, wie den hierin beschriebenen, ausgeführt werden. In mindestens einer Ausführungsform enthält der Prozessor 102 Anweisungen, die, wenn sie ausgeführt werden, eine API ausführen, um zu veranlassen, dass eine virtuelle Speicheradresse bzw. Virtuellspeicheradresse asynchron zugewiesenen Speicherplätzen zugeordnet wird. In mindestens einer Ausführungsform enthält der Prozessor 102 Befehle, die bei ihrer Ausführung eine API ausführen, um zu veranlassen, dass physischer Speicher zugewiesen und einer Virtuellspeicheradresse zugeordnet wird. In mindestens einer Ausführungsform sind Anweisungen für den Prozessor 102, die bei ihrer Ausführung veranlassen, dass einem oder mehreren Prozessoren ein oder mehrere Speicherplätze asynchron zugewiesen werden, im Prozessorspeicher (in 1 nicht dargestellt) gespeichert, der dem Prozessor 102 zugeordnet ist. In mindestens einer Ausführungsform werden Anweisungen für den Prozessor 102, die bei ihrer Ausführung die asynchrone Zuweisung eines oder mehrerer Speicherplätze an einen oder mehrere Prozessoren veranlassen, in einem Systemspeicher 112 gespeichert. In mindestens einer Ausführungsform ist eine API zum asynchronen Zuweisen von Speicher eine Treiber-API. In mindestens einer Ausführungsform ist eine API für die asynchrone Zuweisung von Speicher eine Laufzeit-API.
  • In mindestens einer Ausführungsform umfasst der Prozessor 102 eine oder mehrere Schaltungen zum Durchführen einer Anwendungsprogrammierschnittstelle („API“), um zu veranlassen, dass ein oder mehrerer Speicherplätze von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform umfasst der Prozessor 102 eine oder mehrere Schaltungen, die eine Anwendungsprogrammierschnittstelle („API“) ausführen, um zu veranlassen, dass ein oder mehrere Speicherplätze von einem oder mehreren Prozessen, die auf einem oder mehreren Prozessoren, wie den hierin beschriebenen, ausgeführt werden, asynchron freigegeben werden. In mindestens einer Ausführungsform enthält der Prozessor 102 Anweisungen, die bei ihrer Ausführung eine API ausführen, um eine Virtuellspeicheradresse asynchron freigegebenen Speicherplätzen zuzuordnen. In mindestens einer Ausführungsform sind in dem Prozessor 102 Anweisungen enthalten, die bei ihrer Ausführung eine API ausführen, um zu veranlassen, dass physischer Speicher freigegeben und von einer Virtuellspeicheradresse gelöst bzw. getrennt wird. In mindestens einer Ausführungsform sind Anweisungen für den Prozessor 102, die bei ihrer Ausführung veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden, im Prozessorspeicher (in 1 nicht dargestellt) gespeichert, der dem Prozessor 102 zugeordnet ist. In mindestens einer Ausführungsform werden Anweisungen für den Prozessor 102, die bei ihrer Ausführung die asynchrone Freigabe eines oder mehrerer Speicherplätze von einem oder mehreren Prozessoren veranlassen, in dem Systemspeicher 112 gespeichert. In mindestens einer Ausführungsform ist eine API zum asynchronen Freigeben von Speicherplatz eine Treiber-API. In mindestens einer Ausführungsform ist eine API zum asynchronen Freigeben von Speicher eine Laufzeit-AP I.
  • In mindestens einer Ausführungsform umfasst der Prozessor 102 eine oder mehrere Schaltungen, die eine Anwendungsprogrammierschnittstelle („API“) ausführen, um zu veranlassen, dass ein oder mehrere Speicherplätze einem oder mehreren Prozessoren asynchron zugewiesen und von einem oder mehreren Prozessoren asynchron freigegeben werden. In mindestens einer Ausführungsform umfasst der Prozessor 102 eine oder mehrere Schaltungen zum Durchführen einer Anwendungsprogrammierschnittstelle („API“), um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron einem oder mehreren Prozessen zugewiesen und asynchron von einem oder mehreren Prozessen freigegeben werden, die auf einem oder mehreren Prozessoren, wie den hierin beschriebenen, ablaufen. In mindestens einer Ausführungsform werden Anweisungen für den Prozessor 102, die bei ihrer Ausführung veranlassen, dass ein oder mehrere Speicherplätze einem oder mehreren Prozessoren asynchron zugewiesen und von einem oder mehreren Prozessoren asynchron freigegeben werden, im Prozessorspeicher (in 1 nicht dargestellt) gespeichert, der dem Prozessor 102 zugeordnet ist. In mindestens einer Ausführungsform werden Anweisungen für den Prozessor 102, die bei ihrer Ausführung veranlassen, dass ein oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zugewiesen und asynchron von einem oder mehreren Prozessoren freigegeben werden, in dem Systemspeicher 112 gespeichert. In mindestens einer Ausführungsform ist eine API für die asynchrone Zuweisung und die asynchrone Freigabe von Speicher eine Treiber-API. In mindestens einer Ausführungsform ist eine API zum asynchronen Zuweisen und zum asynchronen Freigeben von Speicher eine Laufzeit-API.
  • In mindestens einer Ausführungsform führt der Speichermanager 106 einen oder mehrere Befehle aus, um Speicher zu erstellen, zu zerstören, zu kopieren, zuzuordnen und/oder die Zuordnung aufzuheben. In mindestens einer Ausführungsform führt der Speichermanager 106 einen oder mehrere Befehle aus, um den Systemspeicher 112 zu erstellen, zu zerstören, zu kopieren, zuzuordnen und/oder die Zuordnung aufzuheben. In mindestens einer Ausführungsform führt der Speichermanager 106 einen oder mehrere Befehle aus, um den Grafikprozessorspeicher 104 zu erstellen, zu zerstören, zu kopieren, zuzuordnen und/oder die Zuordnung aufzuheben. In mindestens einer Ausführungsform ist der Speichermanager 106 eine Softwarekomponente, die auf dem Prozessor 102 ausgeführt wird. In mindestens einer Ausführungsform ist der Speichermanager 106 eine Softwarekomponente, die auf einem anderen, in 1 nicht dargestellten Prozessor ausgeführt wird. In mindestens einer Ausführungsform ist der Speichermanager 106 eine Softwarekomponente, die auf einem Prozessor oder einer Verarbeitungseinheit ausgeführt wird, der bzw. die dem Computersystem 100 zugeordnet ist.
  • In mindestens einer Ausführungsform empfängt der Speichermanager 106 einen oder mehrere Befehle von dem Prozessor 102 zum Durchführen von Operationen in Speicher, beispielsweise in dem Systemspeicher 112 und/oder in dem Grafikprozessorspeicher 104. In mindestens einer Ausführungsform sendet der Prozessor 102 API-Befehle an den Speichermanager 106, die veranlassen, dass der Speichermanager 106 Operationen in Speicher wie dem Systemspeicher 112 und/oder dem Grafikprozessorspeicher 104 durchführt. In mindestens einer Ausführungsform führt der Prozessor 102 einen oder mehrere Befehle aus, die den Speichermanager 106 veranlassen, Operationen in Speicher auszuführen. In mindestens einer Ausführungsform empfängt der Speichermanager 106 einen oder mehrere Befehle vom Grafikprozessor 108, der Operationen im Speicher durchführt. In mindestens einer Ausführungsform sendet der Grafikprozessor 108 API-Anweisungen an den Speichermanager 106, die den Speichermanager 106 veranlassen, Operationen in Speicher durchzuführen. In mindestens einer Ausführungsform führt der Grafikprozessor 108 einen oder mehrere Befehle aus, die den Speichermanager 106 veranlassen, Operationen in Speicher durchzuführen.
  • In mindestens einer Ausführungsform sind eine oder mehrere Speicherseiten des Speichers dem Grafikprozessor 108 zugeordnet und können von dem Grafikprozessor 108 genutzt werden. In mindestens einer Ausführungsform werden eine oder mehrere Speicherseiten von der Speicherverwaltung 106 für einen Prozessor wie den Prozessor 102 und/oder einen Grafikprozessor wie den Grafikprozessor 108 bereitgestellt. In mindestens einer Ausführungsform verwendet ein Prozessor wie der Prozessor 102 und/oder ein Grafikprozessor wie der Grafikprozessor 108 eine oder mehrere Speicherseiten, die von dem Speichermanager 106 bereitgestellt werden, um Anweisungen zu speichern, Berechnungen durchzuführen, Ergebnisse von Berechnungen zu speichern, Zwischenergebnisse zu speichern und/oder andere derartige Speicheroperationen durchzuführen. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Single-Core-Prozessor. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Multi-Core-Prozessor. In mindestens einer Ausführungsform sind ein oder mehrere zusätzliche Prozessoren mit dem dem Grafikprozessor 108 zugeordneten Speicher verbunden. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Element eines Verarbeitungssystems wie dem hierin beschriebenen Verarbeitungssystem 2000. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Element eines Computersystems, wie z.B. des hierin beschriebenen Computersystems 2100. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Element eines Systems wie dem hierin beschriebenen System 2200. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Element einer integrierten Schaltung, wie die hierin beschriebene integrierte Schaltung 2300. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Element eines Computersystems, wie das hierin beschriebene Computersystem 2400. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Grafikprozessor, wie der hierin beschriebene Grafikprozessor 2810. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Grafikprozessor, wie der hierin beschriebene Grafikprozessor 2840. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Grafikprozessor wie der hierin beschriebene Grafik-Multiprozessor 3034. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Grafikprozessor wie der hierin beschriebene Grafikprozessor 3100. In mindestens einer Ausführungsform ist der Grafikprozessor 108 ein Grafikprozessor wie der hierin beschriebene Grafikprozessor 3308. In mindestens einer Ausführungsform ist der Grafikprozessor 108 eine GPU, wie die hierin beschriebene GPU 4692.
  • In mindestens einer Ausführungsform führt ein Steuerthread 114, der auf dem Prozessor 102 ausgeführt wird, einen oder mehrere Befehle aus, um Kernel, wie z.B. einen Kernel 116 und/oder ausstehende Kernel 120, an den Grafikprozessor 108 zu senden, wie hierin beschrieben. In mindestens einer Ausführungsform führt der Steuerthread 114 einen oder mehrere Befehle aus, um Kernel zu verwalten, wie hierin beschrieben. In mindestens einer Ausführungsform führt der Steuerthread 114 einen oder mehrere Befehle aus, um Kernel zu verwalten, wobei er eine Streamreihenfolge verwendet (in 1 nicht dargestellt), die eine Operationsreihenfolge für die Weiterleitung von Kerneln an den Grafikprozessor 108 angibt.
  • In mindestens einer Ausführungsform führt ein Betriebssystem 110, das auf dem Prozessor 102 ausgeführt wird, einen oder mehrere Befehle aus, um ein Computersystem wie das Computersystem 100 zu steuern. In mindestens einer Ausführungsform führt der Steuerthread 114 einen oder mehrere API-Aufrufe aus, um das Betriebssystem 110 zu veranlassen, ein Computersystem, wie das Computersystem 100, zu steuern.
  • In mindestens einer Ausführungsform führt der Prozessor 102 eine API aus, um den Speichermanager 106 zu veranlassen, einen oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zuzuweisen. In mindestens einer Ausführungsform führt der Prozessor 102 eine API aus, um den Speichermanager 106 zu veranlassen, einen oder mehrere Speicherplätze von einem oder mehreren Prozessoren asynchron freizugeben.
  • In mindestens einer Ausführungsform führt der Steuerthread 114, der auf dem Prozessor 102 ausgeführt wird, eine API aus, um den Speichermanager 106 zu veranlassen, einen oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zuzuweisen. In mindestens einer Ausführungsform führt der auf dem Prozessor 102 ausgeführte Steuerthread 114 eine API aus, um den Speichermanager 106 zu veranlassen, einen oder mehrere Speicherplätze von einem oder mehreren Prozessoren asynchron freizugeben.
  • In mindestens einer Ausführungsform führt das Betriebssystem 110, das auf dem Prozessor 102 ausgeführt wird, eine API aus, um den Speichermanager 106 zu veranlassen, einen oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zuzuweisen. In mindestens einer Ausführungsform führt das Betriebssystem 110, das auf dem Prozessor 102 ausgeführt wird, eine API aus, um den Speichermanager 106 zu veranlassen, einen oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freizugeben.
  • In mindestens einer Ausführungsform wird der Grafikprozessorspeicher 104 verwendet, wenn eine API ausgeführt wird, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Grafikprozessorspeicher 104 verwendet, wenn eine API ausgeführt wird, zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden.
  • In mindestens einer Ausführungsform wird der Systemspeicher 112 verwendet, wenn eine API ausgeführt wird, zu veranlassen, dass ein oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Systemspeicher 112 verwendet, wenn eine API ausgeführt wird, um zu veranlassen, dass ein oder mehrere Speicherplätze von einem oder mehreren Prozessoren asynchron freigegeben werden.
  • In mindestens einer Ausführungsform wird ein Kernel 116 auf dem Grafikprozessor 108 ausgeführt. In mindestens einer Ausführungsform ist der Kernel 116 ein Rechenkern, der aus einer Reihe von Anweisungen besteht, die unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen kompiliert werden, so dass sie auf einem Prozessor wie dem Grafikprozessor 108 ausgeführt werden können. In mindestens einer Ausführungsform ist der Kernel 116 ein GPU-Kernel. In mindestens einer Ausführungsform ist der Kernel 116 ein Shader. In mindestens einer Ausführungsform ist der Kern 116 ein Vertex-Shader. In mindestens einer Ausführungsform ist der Kernel 116 ein Pixel-Shader. In mindestens einer Ausführungsform wird ein Satz von Anweisungen für den Kernel 116 unter Verwendung einer Shader-Programmiersprache (wie OpenCL C, OpenGL, C++AMP, CUDA, Vulkan usw.) ausgedrückt.
  • In mindestens einer Ausführungsform hat der Kernel 116 einen zugehörigen asynchron zugewiesenen Speicherplatz 118. In mindestens einer Ausführungsform wird der asynchron zugewiesene Speicherplatz 118, der mit der Ausführung des Kernels 116 verbunden ist, asynchron erstellt, indem eine Virtuellspeicheradresse bereitgestellt wird, die dem Kernel 116 zuzuordnen ist, wie hierin beschrieben (z.B. wenn eine asynchrone Speicherzuweisungs-API aufgerufen wird, wird eine Virtuellspeicheradresse zurückgegeben). In mindestens einer Ausführungsform wird der asynchron zugewiesene Speicherplatz 118, der der Ausführung von Kernel 116 zugeordnet ist, asynchron erstellt, indem Speicher zugewiesen wird, der einer Virtuellspeicheradresse von Kernel 116 zuzuordnen ist, und zugewiesener Speicher einer zugehörigen Virtuellspeicheradresse zugeordnet wird. In mindestens einer Ausführungsform, die in 1 nicht dargestellt ist, kann der asynchron zugewiesene Speicherplatz 118 später vom Kernel 116 freigegeben werden, wenn z. B. die Ausführung des Kernels 116 beendet wird. In mindestens einer Ausführungsform kann der asynchron zugewiesene Speicherplatz 118 später vom Kernel 116 freigegeben werden, indem zunächst der zugewiesene Speicher vom asynchron zugewiesenen Speicherplatz 118 getrennt wird, wie hierin beschrieben. In mindestens einer Ausführungsform wird der asynchron zugewiesene Speicherplatz 118, der der Ausführung des Kernels 116 zugeordnet ist, vom Speichermanager 106 bereitgestellt. In mindestens einer Ausführungsform wird der asynchron zugewiesene Speicherplatz 118, der dem ausführenden Kernel 116 zugeordnet ist, bereitgestellt, wenn der Steuerthread 114 einen Speicherplatz von dem Speichermanager 106 anfordert, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform wird der asynchron zugewiesene Speicherplatz 118, der mit dem ausführenden Kernel 116 verbunden ist, wie hierin beschrieben freigegeben oder zur Wiederverwendung freigegeben, wenn der Steuerthread 114 eine Anforderung zum Freigeben von Speicher an den Speichermanager 106 sendet, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform ist ein ausstehender [engl.: pending] Kernel 120 für die Ausführung auf dem Grafikprozessor 108 vorbereitet, wird aber noch nicht ausgeführt. In mindestens einer Ausführungsform verfügt der ausstehende Kernel 120 über einen asynchron zugewiesenen Speicherplatz 122 mit einer Virtuellspeicheradresse. In mindestens einer Ausführungsform kann der zugewiesene Speicher noch nicht dem asynchron zugewiesenen Speicherplatz 122 zugeordnet sein, da der ausstehende Kernel 120 noch nicht ausgeführt wird. In mindestens einer in 1 nicht dargestellten Ausführungsform kann der zugewiesene Speicher vor Beginn der Ausführung des ausstehenden Kernels 120 dem asynchron zugewiesenen Speicherplatz 122 zugeordnet werden (z.B. bevor die Ausführung des ausstehenden Kernels 120 beginnt). In mindestens einer Ausführungsform, die in 1 nicht dargestellt ist, kann der asynchron zugewiesene Speicherplatz 122 später vom ausstehenden Kernel 120 freigegeben werden, z.B. nachdem die Ausführung des ausstehenden Kernels 120 beendet wurde. In mindestens einer Ausführungsform kann die Zuweisung des asynchron zugewiesenen Speicherplatzes 122 vom ausstehenden Kernel 120 später aufgehoben werden, indem zunächst der zugewiesene Speicher vom asynchron zugewiesenen Speicherplatz 122 getrennt wird, wie hierin beschrieben.
  • 2 veranschaulicht ein Beispiel für ein Computersystem 200, in dem Speicher asynchron aus einem Speicherpool zugewiesen wird, in Übereinstimmung mit mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird ein Steuerthread 204 auf einem Prozessor 202 ausgeführt. In mindestens einer Ausführungsform ist der Prozessor 202 ein Prozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Prozessor 102. In mindestens einer Ausführungsform ist der Steuerthread 204 ein Steuerthread wie der hierin zumindest in Verbindung mit 1 beschriebene Steuerthread 114. In mindestens einer Ausführungsform führt der Steuerthread 204 eine API aus, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron einem oder mehreren Prozessoren zugewiesen werden.
  • In mindestens einer Ausführungsform führt der Steuerthread 204 eine API aus, um asynchron Speicher 206 für einen Grafikprozessorkernel (z.B. für Grafikprozessor-Kernel eins 220) zuzuweisen. In einer Ausführungsform führt der Steuerthread 204 eine API aus, um einen Speichermanager 208 zu veranlassen, Speicher 206 für einen Grafikprozessorkernel asynchron zuzuweisen. In mindestens einer Ausführungsform ist der Speichermanager 208 ein Speichermanager wie der Speichermanager 106, der hierin zumindest in Verbindung mit 1 beschrieben ist. In mindestens einer Ausführungsform führt der Steuerthread 204 eine API aus, um die Speicherverwaltung 208 zu veranlassen, den Speicher 206 asynchron zuzuweisen, indem er einen oder mehrere Befehle an die Speicherverwaltung 208 sendet. In mindestens einer Ausführungsform, die in 2 nicht dargestellt ist, führt der Steuerthread 204 eine API aus, um den Speichermanager 208 zu veranlassen, Speicher 206 asynchron zuzuweisen, indem er einen oder mehrere Befehle an den Speichermanager 208 über ein Betriebssystem wie das hierin zumindest in Verbindung mit 1 beschriebene Betriebssystem 110 sendet.
  • In mindestens einer Ausführungsform erstellt der Speichermanager 208 im Ansprechen auf den Empfang eines oder mehrerer Befehle vom Steuerthread 204 einen Virtuellspeicherzeiger 210 unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform stellt der Speichermanager 208 den Virtuellspeicherzeiger 210 dem Steuerthread 204 bereit. In mindestens einer Ausführungsform wird dem Steuerthread 204 ein Virtuellspeicherzeiger 224 im Speicherpool 218 bereitgestellt. In mindestens einer Ausführungsform ist der Virtuellspeicherzeiger 224 im Speicherpool 218 eine Adresse im Speicher, die keinen entsprechenden Backing- bzw. Sicherungsspeicher im Speicherpool 218 hat. In mindestens einer Ausführungsform ist der Virtuellspeicherzeiger 224 im Speicherpool 218 eine Adresse im Speicher, die einen entsprechenden Sicherungsspeicher im Speicherpool 218 hat, wenn Kernel eins 220 mit der Ausführung beginnt.
  • In mindestens einer Ausführungsform bestimmt der Speichermanager 208 im Ansprechen auf den Empfang eines oder mehrerer Befehle vom Steuerthread 204, ob ein Speicherpool 218 existiert. Wenn der Speichermanager 208 bestimmt, dass der Speicherpool 218 nicht existiert, erstellt der Speichermanager 208 in mindestens einer Ausführungsform den Speicherpool 218. In mindestens einer Ausführungsform erstellt der Speichermanager 208 im Ansprechen auf den Empfang eines oder mehrerer Befehle von dem Steuerthread 204 einen Virtuellspeicherzeiger 210, der einem Speicherplatz im Speicherpool 218 entspricht, der für die Verwendung durch den Kernel eins 220 verfügbar ist, bevor der Kernel eins 220 mit der Ausführung beginnt.
  • In mindestens einer Ausführungsform veranlasst der Steuerthread 204, dass der Kernels eins 212 auf dem Grafikprozessor 216 gestartet wird. In mindestens einer Ausführungsform ist der Grafikprozessor 216 ein Grafikprozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Grafikprozessor 108. In mindestens einer Ausführungsform startet der Steuerthread 204 den Kernel eins, nachdem der Steuerthread 204 eine API ausführt, um einen Speichermanager 208 zu veranlassen, asynchron Speicher 206 für einen Grafikprozessorkernel zuzuweisen. In mindestens einer Ausführungsform startet der Steuerthread 204 den Kernel eins, nachdem der Steuerthread 204 einen Virtuellspeicherzeiger 210 von dem Speichermanager 208 empfängt. In mindestens einer Ausführungsform führt der Steuerthread 204 eine API aus, um einen Kernel zu starten, und verwendet dabei Systeme und Verfahren, wie sie hierin beschrieben sind.
  • In mindestens einer Ausführungsform stellt der Speichermanager 208 nach dem Vorhandensein eines Speicherpools 218, wie oben beschrieben, Sicherungsspeicher 222 für Kernel eins 220 bereit, unter Verwendung von Systemen und Verfahren wie die hierin beschriebenen. In mindestens einer Ausführungsform wird, wenn der Speichermanager 208 den Sicherungsspeicher 222 für den Kernel eins bereitstellt, ein Virtuellspeicherzeiger 224, der dem Sicherungsspeicher entspricht, wenn der Speichermanager 208 den Sicherungsspeicher 222 für den Kernel eins 220 bereitstellt, zu einem Speicherzeiger 226, der dem Sicherungsspeicher in dem Speicherpool 218 entspricht. In mindestens einer Ausführungsform sind der Virtuellspeicherzeiger 224 und der Speicherzeiger 226 identisch.
  • In mindestens einer Ausführungsform führt der Steuerthread 204 eine API aus, um einen Speichermanager 208 zu veranlassen, Speicher von Kernel eins 228 freizugeben. In mindestens einer Ausführungsform führt der Steuerthread 204 eine API aus, um den Speichermanager 208 zu veranlassen, Speicher aus dem Kernel eins 228 zu deallozieren, nachdem der Steuerthread 204 den Kernel eins startet. In mindestens einer Ausführungsform veranlasst der Speichermanager 208 im Ansprechen auf eine API, die den Speichermanager 208 veranlasst, Speicher von dem Kernel 228 zu deallozieren, dass der Speicher 226, der dem Sicherungsspeicher im Speicherpool 218 entspricht, unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen an den Speicherpool 218 zurückgegeben wird. In mindestens einer Ausführungsform wird, wenn der Steuerthread 204 eine API ausführt, um den Speichermanager 208 zu veranlassen, Speicher von dem Kernel 228 zu deallozieren, der Speicher 226, der an den Speicherpool 218 zurückgegeben wird 230, für die Verwendung durch andere Prozesse, wie die hierin beschriebenen, verfügbar gemacht. In mindestens einer Ausführungsform wird dem Speicherpool 218 zugeordneter Speicher nicht an ein Betriebssystem wie das hierin zumindest in Verbindung mit 1 beschriebene Betriebssystem 110 zurückgegeben, bis alle Grafikprozesse beenden. In mindestens einer Ausführungsform wird dem Speicherpool 218 zugeordneter Speicher an ein Betriebssystem wie das hierin zumindest in Verbindung mit 1 beschriebene Betriebssystem 110 zurückgegeben, wenn eine (in 2 nicht dargestellte) Synchronisationsoperation von einem Betriebssystem durchgeführt wird, oder von einem Steuerthread durchgeführt wird, oder von einem Grafikprozessor durchgeführt wird.
  • In mindestens einer Ausführungsform führt eine Streamausführungsreihenfolge (in 2 nicht dargestellt) des Steuerthreads 204 eine API aus, um einen Speichermanager 208 zu veranlassen, asynchron Speicher 206 für einen Grafikprozessorkern zuzuweisen, startet dann 212 Kernel eins auf dem Grafikprozessor 216 und führt dann eine API aus, um einen Speichermanager 208 zu veranlassen, Speicher von Kernel eins 228 freizugeben. In mindestens einer Ausführungsform führt der Speichermanager 208 Befehle aus, um einen Virtuellspeicherzeiger 210 zu erstellen, einen Virtuellspeicherzeiger bereitzustellen, einen Speicherpool 214 zu erstellen, einen Sicherungsspeicher 222 bereitzustellen und/oder zu veranlassen, dass für den Kernel eins 220 verfügbarer Speicher 230 asynchron an den Speicherpool 218 zurückgegeben wird, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • 3 veranschaulicht ein Beispiel für ein Computersystem 300, bei dem Speicher für einen Stream-geordneten Ausführungsthread asynchron aus einem Speicherpool zugewiesen wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird ein Kernel eins 316 auf einem Grafikprozessor 312 ausgeführt, und verfügt Kernel eins 316 über einen Sicherungsspeicher 318, wie hierin zumindest in Verbindung mit 2 beschrieben. In mindestens einer Ausführungsform ist der Grafikprozessor 312 ein Grafikprozessor wie der hierin zumindest im Zusammenhang mit 1 beschriebene Grafikprozessor 108. In mindestens einer Ausführungsform ist der Sicherungsspeicher 318 ein Sicherungsspeicher wie der hierin zumindest in Verbindung mit 2 beschriebene Sicherungsspeicher 222.
  • In mindestens einer Ausführungsform wird ein Steuerthread 304 auf dem Prozessor 302 ausgeführt. In mindestens einer Ausführungsform ist der Prozessor 302 ein Prozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Prozessor 102. In mindestens einer Ausführungsform ist der Steuerthread 304 ein Steuerthread, wie der hierin zumindest im Zusammenhang mit 1 beschriebene Steuerthread 114. In mindestens einer Ausführungsform führt der Steuerthread 304 eine API aus, um zu veranlassen, dass Speicher für einen Stream-geordneten Ausführungsthread asynchron aus einem Speicherpool zugewiesen wird.
  • In mindestens einer Ausführungsform führt der Steuerthread 304 eine API aus, um asynchron Speicher 306 für einen Kernel (z.B. den Grafikprozessor-Kernel zwei 322) zuzuweisen, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In einer Ausführungsform führt der Steuerthread 304 eine API aus, um einen Speichermanager 308 zu veranlassen, Speicher 306 für einen Kernel asynchron zuzuweisen. In mindestens einer Ausführungsform ist der Speichermanager 308 ein Speichermanager wie der Speichermanager 106, der hierin zumindest in Verbindung mit 1 beschrieben ist. In mindestens einer Ausführungsform führt der Steuerthread 304 eine API aus, um den Speichermanager 308 zu veranlassen, asynchron Speicher 306 zuzuweisen, indem er einen oder mehrere Befehle an den Speichermanager 308 sendet. In mindestens einer Ausführungsform, die in 3 nicht dargestellt ist, führt der Steuerthread 304 eine API aus, um den Speichermanager 308 zu veranlassen, Speicher 306 asynchron zuzuweisen, indem er einen oder mehrere Befehle an den Speichermanager 308 über ein Betriebssystem wie das hierin zumindest in Verbindung mit 1 beschriebene Betriebssystem 110 sendet.
  • In mindestens einer Ausführungsform erstellt der Speichermanager 308 im Ansprechen auf den Empfang eines oder mehrerer Befehle vom Steuerthread 304 einen Virtuellspeicherzeiger 310 unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform stellt der Speichermanager 308 dem Steuerthread 304 einen Virtuellspeicherzeiger 310 bereit, wobei er ebenfalls Systeme und Verfahren wie die hierin beschriebenen verwendet.
  • In mindestens einer Ausführungsform veranlasst der Steuerthread 304 den Start von Kernel zwei 320 auf dem Grafikprozessor 312. In mindestens einer Ausführungsform startet der Steuerthread 304 den zweiten Kernel, nachdem der Steuerthread 304 eine API ausführt, um einen Speichermanager 308 zu veranlassen, asynchron Speicher 306 für Kernel zwei zuzuweisen. In mindestens einer Ausführungsform startet der Steuerthread 304 den Kernel zwei, nachdem der Steuerthread 304 einen Virtuellspeicherzeiger 310 vom Speichermanager 308 empfängt hat. In mindestens einer Ausführungsform führt der Steuerthread 304 eine API zum Starten von Kernel zwei aus, wobei er Systeme und Verfahren wie die hierin beschriebenen verwendet.
  • In mindestens einer Ausführungsform stellt der Speichermanager 308, bevor der Steuerthread 304 den Kernel zwei startet, einen Sicherungsspeicher 324 für Kernel zwei bereit, unter Verwendung von Systemen und Verfahren wie die hierin beschriebenen. In mindestens einer Ausführungsform wird der Virtuellspeicherzeiger 326, der dem Sicherungsspeicher 324 für Kernel zwei entspricht, wenn der Speichermanager 308 den Sicherungsspeicher 324 für Kernel zwei bereitstellt, zu einem Speicher 328, der dem Sicherungsspeicher im Speicherpool 314 entspricht. In mindestens einer Ausführungsform sind der Virtuellspeicherzeiger 326 und der Zeiger auf den Speicher 328 identisch. In mindestens einer Ausführungsform wird Kernel zwei 322 ausgeführt, während Kernel eins 316 ausgeführt wird, und unterscheidet sich der für Kernel eins 316 verfügbare Speicher 318 von dem für Kernel zwei 322 verfügbaren Speicher 328. In mindestens einer Ausführungsform kann beispielsweise der für Kernel eins 316 verfügbare Speicher 318 eine andere Adresse im Speicherpool 314 haben als der für Kernel zwei 322 verfügbare Speicher 328. In mindestens einer Ausführungsform, die in 3 nicht dargestellt ist, wird Kernel zwei 322 nicht ausgeführt, während Kernel eins 316 ausgeführt wird, und hat der für Kernel zwei 322 verfügbare Speicher 328 dieselbe Adresse im Speicherpool 314 wie der für Kernel eins 316 verfügbare Speicher 318. In mindestens einer Ausführungsform kann beispielsweise der für Kernel eins 316 verfügbare Speicher 318 wiederverwendet werden und eine identische Adresse im Speicherpool 314 haben wie der für Kernel zwei 322 verfügbare Speicher 328.
  • In mindestens einer Ausführungsform führt der Steuerthread 304 eine API aus, um einen Speichermanager 308 zu veranlassen, Speicher von Kernel zwei 330 freizugeben. In mindestens einer Ausführungsform führt der Steuerthread 304 eine API aus, um den Speichermanager 308 zu veranlassen, Speicher von Kernel zwei 330 freizugeben, nachdem der Steuerthread 304 den Kernel zwei startet. In mindestens einer Ausführungsform veranlasst der Speichermanager 308 im Ansprechen auf eine API, die den Speichermanager 308 veranlasst, Speicher von Kernel zwei 330 freizugeben, dass Speicher 328 im Speicherpool 314, der für Kernel zwei verfügbar ist, an den Speicherpool 314 zurückgegeben wird, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform wird, wenn der Steuerthread 304 eine API ausführt, um den Speichermanager 308 zu veranlassen, Speicher von Kernel zwei 330 freizugeben, der Speicher 328, der an den Speicherpool 314 zurückgegeben wird, für die Verwendung durch andere Prozesse verfügbar gemacht, wie hierin beschrieben. In mindestens einer Ausführungsform führt eine Streamausführungsreihenfolge (in 3 nicht dargestellt) des Steuerthreads 304 eine API aus, um einen Speichermanager 308 zu veranlassen, asynchron Speicher 306 für einen Grafikprozessorkern zuzuweisen, startet dann 320 Kernel zwei auf dem Grafikprozessor 312 und führt dann eine API aus, um einen Speichermanager 308 zu veranlassen, Speicher von Kernel zwei 330 freizugeben. In mindestens einer Ausführungsform führt der Speichermanager 308 Befehle aus, um einen Virtuellspeicherzeiger 310 zu erstellen, einen Virtuellspeicherzeiger bereitzustellen, einen Sicherungsspeicher 324 bereitzustellen und/oder zu veranlassen, dass für den zweiten Kern 322 verfügbarer Speicher asynchron an den Speicherpool 314 zurückgegeben wird, unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind.
  • 4 veranschaulicht ein Beispiel für ein Computersystem 400, bei dem Speicher für einen Stream-geordneten Ausführungsthread asynchron freigegeben und an einen Speicherpool zurückgegeben wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird ein Kernel 406 auf einem Grafikprozessor 416 ausgeführt. In mindestens einer Ausführungsform ist der Grafikprozessor 416 ein Grafikprozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Grafikprozessor 108. In mindestens einer Ausführungsform verfügt der Kernel 406 über einen Sicherungsspeicher 420 in einem Speicherpool 418, der unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, bereitgestellt wird.
  • In mindestens einer Ausführungsform führt ein Steuerthread 404, der auf dem Prozessor 402 ausgeführt wird, eine API aus, um asynchron Speicher für Kernel eins 406 asynchron freizugeben 408, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform wird, wenn der Steuerthread 404 eine API ausführt, um den Speichermanager 412 zu veranlassen, Speicher für den Kernel 406 freizugeben 408, Speicher 420, der an den Speicherpool 418 zurückgegeben wird, für die Verwendung durch andere Prozesse, wie die hierin beschriebenen, verfügbar gemacht. In mindestens einer Ausführungsform ist der Steuerthread 404 ein Steuerthread wie der hierin zumindest in Verbindung mit 1 beschriebene Steuerthread 114. In mindestens einer Ausführungsform ist der Prozessor 402 ein Prozessor wie der hierin zumindest im Zusammenhang mit 1 beschriebene Prozessor 102.
  • In mindestens einer Ausführungsform gibt ein Speichermanager 412, wenn der Steuerthread 404 eine API zum asynchronen Freigeben von Speicher 408 für Kernel eins 406 ausführt, den Speicher 414 asynchron an den Speicherpool 418 zurück, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform ist der Speichermanager 412 ein Speichermanager wie der Speichermanager 106, der hierin zumindest in Verbindung mit 1 beschrieben ist. In mindestens einer Ausführungsform ist der Speicherpool 418 ein Speicherpool wie der hierin zumindest im Zusammenhang mit 2 beschriebene Speicherpool 218. In mindestens einer Ausführungsform führt der Steuerthread 404 eine API aus, um die Speicherverwaltung 412 zu veranlassen, den Speicher 408 für den Kernel 406 asynchron freizugeben, indem er einen oder mehrere Befehle an die Speicherverwaltung 412 sendet. In mindestens einer Ausführungsform, die in 4 nicht dargestellt ist, führt der Steuerthread 404 eine API aus, um den Speichermanager 412 zu veranlassen, den Speicher asynchron freizugeben, indem er einen oder mehrere Befehle an den Speichermanager 412 über ein Betriebssystem wie das hierin zumindest in Verbindung mit 1 beschriebene Betriebssystem 110 sendet.
  • In mindestens einer Ausführungsform führt der Speichermanager 412 im Ansprechen auf den Empfang eines oder mehrerer Befehle von dem Steuerthread 404 Befehle zur Rückgabe von Speicher 414 an einen Speicherpool 418 unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, aus. In mindestens einer Ausführungsform, wenn der Speichermanager 412 Befehle zur Rückgabe des Speichers 414 an einen Speicherpool 418 ausführt, wird der Speicher 420, der zuvor dem Speicher im Speicherpool 418 für den Kernel 406 zugeordnet war, zu einem Speicher 426, der nicht mehr dem Speicher im Speicherpool 418 zugeordnet ist.
  • In mindestens einer Ausführungsform führt der Steuerthread 404 eine API zum asynchronen Zuweisen von Speicher 410 für Kernel zwei 422 zu einem Zeitpunkt aus, nachdem der Steuerthread 404 eine API zum asynchronen Freigeben von Speicher 408 für Kernel eins 406 ausführt. In mindestens einer Ausführungsform, wenn der Steuerthread 404 eine API zum asynchronen Zuweisen von Speicher 410 für Kernel zwei 422 durchführt, stellt der Speichermanager 412 Sicherungsspeicher für Kernel zwei 428 bereit, wie hierin beschrieben. In mindestens einer Ausführungsform kann der Speicher 426, der nicht mehr dem Speicher im Speicherpool 418 für Kernel eins 406 zugeordnet ist, für den zweiten Kernel 422 unter Verwendung einer Virtuellspeicheradresse verfügbar sein, wie hierin beschrieben, wenn der Speichermanager 412 einen Sicherungsspeicher für den zweiten Kernel 428 bereitstellt. In mindestens einer Ausführungsform kann eine virtuelle Adresse, die dem Speicher 426 zugeordnet ist, der nicht mehr dem Speicher im Speicherpool 418 für Kernel eins 406 zugeordnet ist, wiederverwendet werden, um zu Speicher 424 zu werden, der für Kernel zwei 422 verfügbar ist, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • 5 veranschaulicht einen Beispielprozess 500 zum Durchführen von Operationen zum asynchronen Allozieren bzw. Zuweisen von Speicher, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Prozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Prozessor 102 Anweisungen aus, um den in 5 dargestellten Beispielprozess 500 durchzuführen.
  • In mindestens einer Ausführungsform wird in Schritt 502 des Beispielprozesses 500 eine Anforderung für asynchron zugewiesenen Speicher erzeugt. In mindestens einer Ausführungsform wird eine erzeugte Anforderung für asynchron zugewiesenen Speicher an einen Speichermanager wie den hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 gesendet. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher über eine API gesendet. In mindestens einer Ausführungsform ist eine Anforderung für asynchron zugewiesenen Speicher ein Befehl. In mindestens einer Ausführungsform ist eine Anforderung für asynchron zugewiesenen Speicher ein ausführbarer Befehl. In mindestens einer Ausführungsform ist eine Anforderung für asynchron zugewiesenen Speicher eine Anweisung. In mindestens einer Ausführungsform ist eine Anforderung für asynchron zugewiesenen Speicher eine ausführbare Anweisung. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher unter Verwendung einer API gesendet, die einen Ort, der verwendet wird, um eine Adresse für asynchron zugewiesenen Speicher zurückzugeben, eine Größe des angeforderten Speichers und einen Ausführungsstream, der zumindest eine Streamreihenfolge angibt, angibt. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher unter Verwendung einer API gesendet, die einen Speicherpool angibt, aus dem asynchron zugewiesener Speicher zugewiesen werden kann. In mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, wird eine Antwort auf eine Anforderung für asynchron zugewiesenen Speicher empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine Anforderung von asynchron zugewiesenem Speicher von einem Speichermanager wie dem hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine Anforderung von asynchron zugewiesenem Speicher über eine API empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine Anforderung von asynchron zugewiesenem Speicher unter Verwendung einer API empfangen, die ein Fehlerergebnis angibt. In mindestens einer Ausführungsform schreitet nach Schritt 502 die Ausführung des Beispielprozesses 500 zu Schritt 504 fort.
  • In mindestens einer Ausführungsform wird in Schritt 504 des Beispielprozesses 500 eine Virtuellspeicheradresse bzw. Virtuellspeicheradresse empfangen. In mindestens einer Ausführungsform ist eine Virtuellspeicheradresse ein Zeiger auf eine Adresse in virtuellem Speicher. In mindestens einer Ausführungsform wird ein Virtuellspeicherzeiger im Ansprechen auf eine Anforderung von asynchron zugewiesenem Speicher empfangen, wie in Verbindung mit Schritt 502 beschrieben. In mindestens einer Ausführungsform wird eine Virtuellspeicheradresse von einem Speichermanager, wie z.B. dem hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106, empfangen. In mindestens einer Ausführungsform wird eine Virtuellspeicheradresse über eine API empfangen. In mindestens einer Ausführungsform wird eine Virtuellspeicheradresse unter Verwendung einer API empfangen, die einen Speicherplatz für eine Virtuellspeicheradresse angibt. In mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, wird eine Antwort auf den Empfang einer Virtuellspeicheradresse erzeugt. In mindestens einer Ausführungsform wird eine Antwort auf den Empfang einer Virtuellspeicheradresse unter Verwendung einer API generiert. In mindestens einer Ausführungsform schreitet nach Schritt 504 die Ausführung des Beispielprozesses 500 zu Schritt 506 fort.
  • In mindestens einer Ausführungsform wird in Schritt 506 des Beispielprozesses 500 eine Anforderung zur Ausführung eines Kernels unter Verwendung einer bereitgestellten Virtuellspeicheradresse, wie einer in Schritt 504 zurückgegebenen Virtuellspeicheradresse, erzeugt. In mindestens einer Ausführungsform wird eine Anforderung zur Ausführung eines Kernels an einen Speichermanager wie den hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 gesendet, wobei Systeme und Verfahren wie die in Verbindung mit Schritt 502 beschriebenen verwendet werden. In mindestens einer Ausführungsform wird eine Anforderung zur Ausführung eines Kernels an einen Grafikprozessor wie den hierin zumindest in Verbindung mit 1 beschriebenen Grafikprozessor 108 gesendet, wobei Systeme und Verfahren wie die in Verbindung mit Schritt 502 beschriebenen verwendet werden. In mindestens einer Ausführungsform wird eine Anforderung zur Ausführung eines Kerns gesendet, indem eine Anforderung zur Ausführung eines Kernels in eine Ausführungswarteschlange beispielsweise eines Grafikprozessors wie des hierin zumindest in Verbindung mit 1 beschriebenen Grafikprozessors 108 eingefügt wird. In mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, wird eine Anforderung zur Ausführung eines Kernels an einen Grafikprozessor unter Verwendung eines Speichermanagers gesendet. In mindestens einer Ausführungsform, die ebenfalls nicht in 5 dargestellt ist, erzeugt eine Anforderung zur Ausführung eines Kernels eine Anforderung zur Zuweisung von Speicher unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform erzeugt beispielsweise eine Anforderung zur Ausführung eines Kernels eine Anforderung zur automatischen Speicherzuweisung. In mindestens einer Ausführungsform wird eine Anforderung zur Speicherzuweisung, die mit einer Anforderung zur Ausführung eines Kernels verbunden ist, unter Verwendung von Systemen und Verfahren gesendet, wie sie hierin in Verbindung mit 502 beschrieben sind. In mindestens einer Ausführungsform schreitet nach Schritt 506 die Ausführung des Beispielprozesses 500 zu Schritt 508 fort.
  • In mindestens einer Ausführungsform wird in Schritt 508 des Beispielprozesses 500 eine Anforderung zum Deallozieren bzw. Freigeben von asynchron zugewiesenem Speicher erzeugt. In mindestens einer Ausführungsform wird eine erzeugte Anforderung zum Aufheben der Zuweisung von asynchron zugewiesenem Speicher an einen Speichermanager wie den hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 gesendet. In mindestens einer Ausführungsform wird eine Anforderung zum Freigeben von asynchron zugewiesenem Speicher über eine API gesendet. In mindestens einer Ausführungsform wird eine Anforderung zur Freigabe von asynchron zugewiesenem Speicher in Form eines Befehls erzeugt. In mindestens einer Ausführungsform ist eine Anforderung zur Freigabe von asynchron zugewiesenem Speicher ein ausführbarer Befehl. In mindestens einer Ausführungsform ist eine Anforderung zur Freigabe von asynchron zugewiesenem Speicher eine Anweisung. In mindestens einer Ausführungsform ist eine Anforderung zur Freigabe von asynchron zugewiesenem Speicher eine ausführbare Anweisung. In mindestens einer Ausführungsform wird eine Anforderung zum Aufheben der Zuweisung von asynchron zugewiesenem Speicher unter Verwendung einer API gesendet, die einen Speicherort einer zuvor asynchron zugewiesenen Speicheradresse und einen Ausführungsstream angibt, der zumindest eine Streamreihenfolge angibt. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher unter Verwendung einer API gesendet, die einen asynchron zugewiesenem Speicher zugeordneten Speicherpool angibt. In mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, wird eine Antwort auf eine erzeugte Anforderung für asynchron zugewiesenen Speicher empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine Anforderung, asynchron zugewiesenen Speicher freizugeben, von einem Speichermanager wie dem hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine Anforderung, asynchron zugewiesenen Speicher freizugeben, unter Verwendung einer API empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine Anforderung, asynchron zugewiesenen Speicher freizugeben, unter Verwendung einer API empfangen, die ein Fehlerergebnis angibt. In mindestens einer Ausführungsform wird der Beispielprozess 500 nach Schritt 508 beendet. In mindestens einer Ausführungsform kehrt der Beispielprozess 500 nach Schritt 508 zu Schritt 502 zurück, um eine neue Anforderung für asynchron zugewiesenen Speicher zu erzeugen.
  • In mindestens einer Ausführungsform werden die Operationen des in 5 dargestellten Beispielprozesses 500 in einer anderen Reihenfolge als in 5 angegeben durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 5 dargestellten Beispielprozesses 500 gleichzeitig und/oder parallel durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 5 dargestellten Beispielprozesses 500 von einer Vielzahl von Threads durchgeführt, die auf einem Prozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102 ausgeführt werden.
  • 6 veranschaulicht einen Beispielprozess 600 zum Durchführen von Operationen zum asynchronen Zuweisen von Speicher, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Prozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Prozessor 102 Anweisungen aus, um den in 6 dargestellten Beispielprozess 600 durchzuführen.
  • In mindestens einer Ausführungsform wird in Schritt 602 des Beispielprozesses 600 eine Anforderung zum asynchronen Zuweisen von Speicher empfangen. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Zuweisen von Speicher von einem Steuerthread empfangen. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Zuweisen von Speicher von einem Steuerthread wie dem hierin zumindest in Verbindung mit 1 beschriebenen Steuerthread 114 empfangen. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Zuweisen von Speicher von einem Steuerthread empfangen, der einen Prozess wie den in 5 dargestellten Beispielprozess 500 ausführt. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Zuweisen von Speicher von einem Steuerthread empfangen, der Schritt 502 des Beispielprozesses 500 ausführt, wie hierin zumindest in Verbindung mit 5 beschrieben. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Zuweisen von Speicher über eine API gesendet. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Zuweisen von Speicher ein Befehl. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Zuweisen von Speicher ein ausführbarer Befehl. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Zuweisen von Speicher eine Anweisung. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Zuweisen von Speicher ein ausführbarer Befehl. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Zuweisen von Speicher unter Verwendung einer API gesendet, wie hierin zumindest in Verbindung mit 5 beschrieben.
  • In mindestens einer Ausführungsform, die in 6 nicht dargestellt ist, wird eine Antwort auf eine empfangene Anforderung zum asynchronen Zuweisen von Speicher erzeugt. In mindestens einer Ausführungsform wird eine Antwort auf eine empfangene Anforderung zum asynchronen Zuweisen von Speicher an einen Steuerthread wie den hierin zumindest in Verbindung mit 1 beschriebenen Steuerthread 114 gesendet. In mindestens einer Ausführungsform wird eine Antwort auf eine empfangene Anforderung zum asynchronen Zuweisen von Speicher über eine API gesendet. In mindestens einer Ausführungsform wird eine Antwort auf eine empfangene Anforderung zum asynchronen Zuweisen von Speicher unter Verwendung einer API gesendet, die ein Fehlerergebnis angibt. In mindestens einer Ausführungsform schreitet nach Schritt 602 die Ausführung des Beispielprozesses 600 zu Schritt 604 fort.
  • In mindestens einer Ausführungsform wird in Schritt 604 des Beispielprozesses 600 bestimmt, ob ein Speicherpool existiert, der zur Bereitstellung von asynchron zugewiesenem Speicher verwendet werden kann, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform schreitet in Schritt 604, wenn bestimmt wird, dass ein Speicherpool existiert („JA“-Verzweigung), die Ausführung des Beispielprozesses 600 zu Schritt 608 fort. In mindestens einer Ausführungsform schreitet in Schritt 604, wenn bestimmt wird, dass ein Speicherpool nicht existiert („NEIN“-Zweig), die Ausführung des Beispielprozesses 600 zu Schritt 606 fort.
  • In mindestens einer Ausführungsform wird in Schritt 606 des Beispielprozesses 600 Speicher für einen neuen Speicherpool zugewiesen. In mindestens einer Ausführungsform schreitet nach Schritt 606 die Ausführung des Beispielprozesses 600 zu Schritt 608 fort.
  • In mindestens einer Ausführungsform bestimmt ein Speichermanager in Schritt 608 des Beispielprozesses 600, wann Speicher für eine Anforderung von asynchron zugewiesenem Speicher benötigt wird. In mindestens einer Ausführungsform kann ein Speichermanager bestimmen, wann Speicher für eine Anforderung von asynchron zugewiesenem Speicher benötigt wird, der zumindest teilweise auf einer oder mehreren anderen Speicheranforderungen basiert. In mindestens einer Ausführungsform kann z.B., wenn eine zugehörige Arbeit, wie z.B. ein Kernel, ausgeführt wird, aber die Ausführung beendet sein wird, bevor Speicher für eine Anforderung von asynchron zugewiesenem Speicher benötigt wird, dieser Speicher verwendet werden, um eine Anforderung von asynchron zugewiesenem Speicher zu erfüllen, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform schreitet nach Schritt 608 die Ausführung des Beispielprozesses 600 zu Schritt 610 fort.
  • In mindestens einer Ausführungsform wird in Schritt 610 des Beispielprozesses 600 bestimmt, ob ein ausreichend dimensionierter Speicherpool vorhanden ist. In mindestens einer Ausführungsform schreitet, wenn bestimmt wird, dass ein ausreichend dimensionierter Speicherpool vorhanden ist („JA“-Zweig), die Ausführung des Beispielprozesses zu Schritt 614 fort. In mindestens einer Ausführungsform schreitet die Ausführung des Beispielprozesses zu Schritt 612 fort, wenn bestimmt wird, dass kein ausreichend dimensionierter Speicherpool vorhanden ist („NEIN“-Zweig). In mindestens einer Ausführungsform, die in 6 nicht dargestellt ist, können Schritt 604 und Schritt 610 kombiniert sein, so dass z.B. ein Speichermanager gleichzeitig bestimmt, ob ein ausreichend dimensionierter Speicherpool vorhanden ist, und, falls dies nicht der Fall ist, neuen und/oder zusätzlichen Speicher für einen Speicherpool zuweist. In mindestens einer Ausführungsform wird beispielsweise Speicher für einen neuen Speicherpool zugewiesen, wenn kein Speicherpool vorhanden ist, und wird zusätzlicher Speicher für einen Speicherpool zugewiesen, wenn ein Speicherpool vorhanden ist, aber bestimmt wird, dass die Speichermenge in einem vorhandenen Speicherpool nicht ausreicht, um asynchron zugewiesenen Speicher für eine Speicheranforderung bereitzustellen.
  • In mindestens einer Ausführungsform wird in Schritt 612 des Beispielprozesses 600 zusätzlicher Speicher für einen bestehenden Speicherpool unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, zugewiesen. In mindestens einer Ausführungsform schreitet nach Schritt 612 die Ausführung des Beispielprozesses 600 zu Schritt 614 fort.
  • In mindestens einer Ausführungsform erzeugt ein Speichermanager in Schritt 614 des Beispielprozesses 600 einen Virtuellspeicherzeiger, der einem Speicher entspricht, der bei Bedarf für eine asynchrone Anforderung verwendet wird. In mindestens einer Ausführungsform gibt ein Speichermanager einen Virtuellspeicherzeiger an einen Steuerthread zurück, wie z.B. den hierin zumindest in Verbindung mit 1 beschriebenen Steuerthread 114. In mindestens einer Ausführungsform gibt der Speichermanager einen Virtuellspeicherzeiger an einen Steuerthread zurück, der einen Prozess wie den in 5 dargestellten Beispielprozess 500 ausführt. In mindestens einer Ausführungsform gibt der Speichermanager einen Virtuellspeicherzeiger an einen Steuerthread zurück, der den Schritt 504 des hierin zumindest in Verbindung mit 5 beschriebenen Beispielprozesses 500 ausführt. In mindestens einer Ausführungsform schreitet nach Schritt 614 die Ausführung des Beispielprozesses 600 zu Schritt 616 fort.
  • In mindestens einer Ausführungsform wartet ein Speichermanager in Schritt 616 des Beispielprozesses 600 auf eine nächste Anforderung. In mindestens einer Ausführungsform schreitet der Beispielprozess 600 nach Schritt 616 zu Schritt 502 des Beispielprozesses 500 fort, um auf eine nächste Anforderung zu warten. In mindestens einer Ausführungsform schreitet der Beispielprozess 600 nach Schritt 616 zu Schritt 602 fort, um eine neue Anforderung zum asynchronen Zuweisen von Speicher zu empfangen. In mindestens einer Ausführungsform schreitet der Beispielprozess 600 nach Schritt 616 zu Schritt 702 des Beispielprozesses 700 fort, der hierin zumindest in Verbindung mit 7 beschrieben wird, um eine Anforderung zum asynchronen Freigeben von Speicher zu empfangen. In mindestens einer Ausführungsform endet der Beispielprozess 600 nach Schritt 616.
  • In mindestens einer Ausführungsform werden die Operationen des in 6 dargestellten Beispielprozesses 600 in einer anderen Reihenfolge als in 6 angegeben durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 6 dargestellten Beispielprozesses 600 gleichzeitig und/oder parallel durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 6 dargestellten Beispielprozesses 600 von einer Vielzahl von Threads durchgeführt, die auf einem Prozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102 ausgeführt werden.
  • 7 veranschaulicht einen Beispielprozess 700 zum Durchführen von Speicherverwaltungsoperationen zum asynchronen Deallozieren bzw. Freigeben von Speicher, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106 Anweisungen aus, um den in 7 dargestellten Beispielprozess 700 durchzuführen.
  • In mindestens einer Ausführungsform wird in Schritt 702 des Beispielprozesses 700 eine Anforderung zum asynchronen Freigeben von Speicher empfangen. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Freigeben von Speicher von einem Steuerthread empfangen. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Freigeben von Speicher von einem Steuerthread wie dem hierin zumindest in Verbindung mit 1 beschriebenen Steuerthread 114 empfangen. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Freigeben von Speicher von einem Steuerthread empfangen, der einen Prozess wie den in 5 dargestellten Beispielprozess 500 ausführt. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Freigeben von Speicher von einem Steuerthread empfangen, der Schritt 508 des Beispielprozesses 500 ausführt, wie hierin zumindest in Verbindung mit 5 beschrieben. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Freigeben von Speicher über eine API gesendet. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Freigeben von Speicher ein Befehl. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Freigeben von Speicher ein ausführbarer Befehl. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Freigeben von Speicher eine Anweisung. In mindestens einer Ausführungsform ist eine empfangene Anforderung zum asynchronen Freigeben von Speicher eine ausführbare Anweisung. In mindestens einer Ausführungsform wird eine empfangene Anforderung zum asynchronen Freigeben von Speicher unter Verwendung einer API gesendet, wie hierin zumindest in Verbindung mit 5 beschrieben. In mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, wird eine Antwort auf eine empfangene Anforderung zum asynchronen Freigeben von Speicher erzeugt. In mindestens einer Ausführungsform wird eine Antwort auf eine empfangene Anforderung zum asynchronen Freigeben von Speicher an einen Steuerthread wie den hierin zumindest in Verbindung mit 1 beschriebenen Steuerthread 114 gesendet. In mindestens einer Ausführungsform wird eine Antwort auf eine empfangene Anforderung zum asynchronen Freigeben von Speicher über eine API gesendet. In mindestens einer Ausführungsform wird eine Antwort auf eine empfangene Anforderung zum asynchronen Freigeben von Speicher unter Verwendung einer API gesendet, die ein Fehlerergebnis angibt. In mindestens einer Ausführungsform schreitet nach Schritt 702 die Ausführung des Beispielprozesses 700 zu Schritt 704 fort.
  • In mindestens einer Ausführungsform bestimmt ein Speichermanager in Schritt 704 des Beispielprozesses 700, wann asynchron zugewiesener Speicher für die Wiederverwendung verfügbar werden wird, unter Verwendung von Systemen und Verfahren wie die hierin beschriebenen. In mindestens einer Ausführungsform schreitet nach Schritt 704 die Ausführung des Beispielprozesses 700 zu Schritt 706 fort.
  • In mindestens einer Ausführungsform schreitet in Schritt 706 des Beispielprozesses 700, wenn in Schritt 704 bestimmt wird, dass asynchron zugewiesener Speicher zur Wiederverwendung verfügbar ist („JA“-Verzweigung), die Ausführung des Beispielprozesses 700 zu Schritt 708 fort. In mindestens einer Ausführungsform schreitet in Schritt 706, wenn in Schritt 704 bestimmt wird, dass asynchron zugewiesener Speicher noch nicht für die Wiederverwendung verfügbar ist („NEIN“-Verzweigung), die Ausführung des Beispielprozesses 700 zu Schritt 704 fort, um zu warten, bis asynchron zugewiesener Speicher für die Wiederverwendung verfügbar wird. In mindestens einer Ausführungsform, die in 7 nicht dargestellt ist, kann ein Speichermanager andere Aktionen durchführen, während er darauf wartet, dass asynchron zugewiesener Speicher für die Wiederverwendung verfügbar wird.
  • In mindestens einer Ausführungsform gibt ein Speichermanager in Schritt 708 des Beispielprozesses 700 asynchron zugewiesenen Speicher an einen Speicherpool zurück, unter Verwendung von Systemen und Verfahren wie die hierin beschriebenen. In mindestens einer Ausführungsform schreitet nach Schritt 708 die Ausführung des Beispielprozesses 700 zu Schritt 710 fort.
  • In mindestens einer Ausführungsform kann ein Speichermanager in Schritt 710 des Beispielprozesses 700 eine oder mehrere Operationen durchführen, um asynchron zugewiesenen Speicher als für die Wiederverwendung verfügbar zu markieren. In mindestens einer Ausführungsform schreitet nach Schritt 710 die Ausführung des Beispielprozesses 700 zu Schritt 712 fort.
  • In mindestens einer Ausführungsform wartet in Schritt 712 des Beispielprozesses 700 ein Speichermanager auf eine nächste Anforderung. In mindestens einer Ausführungsform schreitet der Beispielprozess 700 nach Schritt 712 zu Schritt 502 des Beispielprozesses 500 fort, um auf eine nächste Anforderung zu warten. In mindestens einer Ausführungsform schreitet der Beispielprozess 700 nach Schritt 712 zu Schritt 602 des Beispielprozesses 600 fort, um eine neue Anforderung zum asynchronen Zuweisen von Speicher zu empfangen. In mindestens einer Ausführungsform schreitet der Beispielprozess 700 nach Schritt 712 zu Schritt 702 fort, um eine Anforderung zum asynchronen Freigeben von Speicher zu empfangen. In mindestens einer Ausführungsform endet der Beispielprozess 700 nach Schritt 712.
  • In mindestens einer Ausführungsform werden die Operationen des in 7 dargestellten Beispielprozesses 700 in einer anderen Reihenfolge als in 7 angegeben durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 7 dargestellten Beispielprozesses 700 gleichzeitig und/oder parallel durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 7 dargestellten Beispielprozesses 700 von einer Vielzahl von Threads ausgeführt, die auf einem Speichermanager wie dem hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 ausgeführt werden.
  • 8 veranschaulicht einen beispielhaften Datenfluss 800, bei dem Speicher synchron zugewiesen wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Prozessor 802 Operationen aus, um Speicher 804 von einem Speichermanager 806 anzufordern. In mindestens einer Ausführungsform ist der Prozessor 802 ein Prozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Prozessor 102. In mindestens einer Ausführungsform ist der Speichermanager 806 ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106.
  • In mindestens einer Ausführungsform weist der Speichermanager 806 den Speicher 808 zu, und da der Beispieldatenfluss 800 nicht asynchron ist, wartet 810 der Prozessor 802, bis der Speichermanager 806 die Zuweisung des Speichers 808 abgeschlossen hat. In mindestens einer Ausführungsform startet der Speichermanager 806 dann den Kernel eins 812 des Grafikprozessors 814. In mindestens einer Ausführungsform ist der Grafikprozessor 814 ein Grafikprozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Grafikprozessor 108. In mindestens einer Ausführungsform, in der der Beispieldatenfluss 800 nicht asynchron ist, kann der Prozessor 802 dann warten 818, während Kernel eins auf dem Grafikprozessor 814 ausgeführt wird. In mindestens einer Ausführungsform, die in 8 nicht dargestellt ist, kann der Prozessor 802 andere Aktionen durchführen, während Kernel eins auf dem Grafikprozessor 814 ausgeführt wird 816.
  • In mindestens einer Ausführungsform kann der Prozessor 802 nach Beendigung der Ausführung von Kernel eins den Speicher freigeben 820, indem er den Speichermanager 806 veranlasst, den Speicher freizugeben 822. In mindestens einer Ausführungsform wird der Speicher im Grafikprozessorspeicher 826 von einem Zeitpunkt, zu dem der Speichermanager 806 den Speicher zuweist 808, bis zu einem Zeitpunkt, zu dem der Speichermanager 806 den Speicher freigibt 822, zugewiesen 828. In mindestens einer Ausführungsform ist der Grafikprozessorspeicher 826 ein Grafikprozessorspeicher wie der Grafikprozessorspeicher 104, der hierin zumindest in Verbindung mit 1 beschrieben ist. In mindestens einer Ausführungsform kann der Speichermanager 806 den Speicher löschen 824, bevor er wieder verwendet werden kann. In mindestens einer Ausführungsform kann der Prozessor 802, da der Beispieldatenfluss 800 nicht asynchron ist, warten 830, bis nachdem der Speichermanager 806 den Speicher löscht 824, bevor der Prozessor 802 den Speicherwiederverwenden kann 832.
  • 9 veranschaulicht einen beispielhaften ersten Teil eines Datenflusses 900, bei dem Speicher asynchron alloziert bzw. zugewiesen und dealloziert bzw. freigegeben wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform fordert ein Prozessor 902 Speicher 904 von einer Speicherverwaltung 906 an. In mindestens einer Ausführungsform ist der Prozessor 902 ein Prozessor wie der hierin zumindest in Verbindung mit 1 beschriebene Prozessor 102. In mindestens einer Ausführungsform ist der Speichermanager 906 ein Speichermanager wie der hierin zumindest im Zusammenhang mit 1 beschriebene Speichermanager 106. In mindestens einer Ausführungsform kann der Speichermanager 906 zunächst bestimmen, ob ein Speicherpool zur Verwendung verfügbar ist. In mindestens einer Ausführungsform weist der Speichermanager 906, wenn kein Speicherpool verfügbar ist, einen Speicherpool 908 zu, um einen Grafikprozessorspeicherpool 912 zu erstellen. In mindestens einer Ausführungsform ist der Grafikprozessorspeicherpool 912 identisch mit dem Speicherpool 218, der hierin zumindest in Verbindung mit 2 beschrieben ist.
  • In mindestens einer Ausführungsform bestimmt ein Speichermanager 906, nachdem ein Grafikprozessorspeicherpool 912 für die Zuweisung von Sicherungsspeicher verfügbar ist, einen Speicherplatz 910 in dem Grafikprozessorspeicherpool 912 zu, unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform gibt der Speichermanager 906 einen Virtuellspeicherzeiger 916 an den Prozessor 902 zurück, wie hierin beschrieben. In mindestens einer Ausführungsform gibt der Speichermanager 906 den Virtuellspeicherzeiger 916 asynchron an den Prozessor 902 zurück, indem, wie hierin beschrieben, ein Zeiger auf den virtuellen Speicher im Ansprechen auf eine Speicheranforderung an einen Prozessor zurückgegeben wird, bevor der Sicherungsspeicher von einem Ausführungsstream verwendet wird.
  • In mindestens einer Ausführungsform führt der Prozessor 902 einen Befehl zum Starten von Kernel eins 918 mit einem bereitgestellten Virtuellspeicherzeiger aus. In mindestens einer Ausführungsform führt ein Grafikprozessor 924 den Kernel eins 926 aus. In mindestens einer Ausführungsform ist der Grafikprozessor 924 ein Grafikprozessor wie der Grafikprozessor 108, der hierin zumindest in Verbindung mit 1 beschrieben ist. In mindestens einer Ausführungsform wird, wenn der Speichermanager 906 einen Speicherplatz 910 in dem Grafikprozessorspeicherpool 912 bestimmt, Speicher für die Verwendung 914 reserviert. In mindestens einer Ausführungsform wird der Speicher für die Verwendung 914 reserviert, damit der Speicher für die Verwendung durch den Kernel eins zur Verfügung steht, wenn der Grafikprozessor 924 den Kernel eins 926 ausführt.
  • In mindestens einer Ausführungsform führt der Prozessor 902 einen Befehl aus, um mit Kernel eins verbundenen Speicher 920 freizugeben. In mindestens einer Ausführungsform gibt der Speichermanager 906 nach Beendigung von Kernel eins den Sicherungsspeicher 930 zur späteren Wiederverwendung frei, wie hierin beschrieben. In mindestens einer Ausführungsform gibt der Speichermanager 906 den Sicherungsspeicher 930 frei, indem er den Sicherungsspeicher an einen Speicherpool zurückgibt. In mindestens einer Ausführungsform gibt der Speichermanager 906 den Sicherungsspeicher 930 frei, indem er den Sicherungsspeicher an einen Speicherpool zurückgibt, indem er den Sicherungsspeicher für die Verwendung oder Wiederverwendung verfügbar macht. In mindestens einer Ausführungsform gibt der Speichermanager 906 den Sicherungsspeicher 930 frei, indem er den Sicherungsspeicher an einen Speicherpool zurückgibt, indem er den Virtuellspeicherzeiger zur Wiederverwendung freigibt. In mindestens einer Ausführungsform ist der Speicher im Grafikprozessorspeicherpool 912 in Verwendung 928, während der Grafikprozessor 924 den Kernel eins 926 ausführt. In mindestens einer Ausführungsform steht der Speicher im Grafikprozessorspeicherpool 912 für die Wiederverwendung 932 zur Verfügung, nachdem Kernel eins abgeschlossen ist und nachdem der Speichermanager 906 den Sicherungsspeicher 930 zur späteren Wiederverwendung freigibt.
  • In mindestens einer Ausführungsform kann der Prozessor 902 dann eine Anforderung zum Zuweisen von Speicher 934 für Kernel zwei, zum Starten von Kernel zwei 936 und zum Freigeben von Speicher 938 stellen, die alle hierin in Verbindung mit 10-12 beschrieben werden, z.B. eine Anforderung zum Zuweisen von Speicher 1034 für Kernel zwei, zum Starten von Kernel zwei 1036, eine Anforderung zum Freigeben von Speicher 1038, eine Anforderung zum Zuweisen von Speicher 1234 für Kernel zwei, zum Starten von Kernel zwei 1236, eine Anforderung zum Freigeben von Speicher 1238, usw.
  • 10 veranschaulicht einen beispielhaften zweiten Teil eines Datenflusses 1000, bei dem Speicher asynchron zugewiesen und freigegeben wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform setzt der beispielhafte zweite Teil eines Datenflusses 1000 den beispielhaften ersten Teil eines Datenflusses 900 fort, der in Verbindung mit 9 beschrieben wurde.
  • In mindestens einer Ausführungsform fordert ein Prozessor 1002 Speicher 1034 von einem Speichermanager 1006 an. In mindestens einer Ausführungsform ist der Prozessor 1002 identisch mit dem in Verbindung mit 9 beschriebenen Prozessor 902. In mindestens einer Ausführungsform ist der Speichermanager 1006 identisch mit dem in Verbindung mit 9 beschriebenen Speichermanager 906. In mindestens einer Ausführungsform bestimmt der Speichermanager 1006 einen Speicherplatz 1040 im Grafikprozessorspeicherpool 1012 unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform ist der Grafikprozessorspeicherpool 1012 identisch mit dem Grafikprozessorspeicherpool 912, der in Verbindung mit 9 beschrieben ist. In mindestens einer Ausführungsform gibt der Speichermanager 1006 einen Virtuellspeicherzeiger 1044 an den Prozessor 1002 zurück, wie hierin beschrieben. In mindestens einer Ausführungsform gibt der Speichermanager 1006 den Zeiger auf den virtuellen Speicher 1044 asynchron an den Prozessor 1002 zurück, indem, wie hierin beschrieben, ein Zeiger auf den virtuellen Speicher im Ansprechen auf eine Speicheranforderung an einen Prozessor zurückgegeben wird, bevor der Speicher von einem Ausführungsstream verwendet wird.
  • In mindestens einer Ausführungsform führt der Prozessor 1002 einen Befehl aus, um Kernel zwei 1036 mit einem bereitgestellten Virtuellspeicherzeiger zu starten. In mindestens einer Ausführungsform führt ein Grafikprozessor 1024 den zweiten Kernel 1048 aus. In mindestens einer Ausführungsform ist der Grafikprozessor 1024 identisch mit dem in Verbindung mit 9 beschriebenen Grafikprozessor 924. In mindestens einer Ausführungsform wird, wenn der Speichermanager 1006 einen Speicherplatz 1040 im Grafikprozessorspeicherpool 1012 bestimmt, Speicher für die Verwendung 1042 reserviert. In mindestens einer Ausführungsform wird der Speicher für die Verwendung 1042 reserviert, damit der Speicher für die Verwendung durch den zweiten Kernel verfügbar ist, wenn der Grafikprozessor 1024 den zweiten Kernel 1048 ausführt.
  • In mindestens einer Ausführungsform führt der Prozessor 1002 einen Befehl aus, um den mit Kernel zwei verbundenen Speicher 1038 freizugeben. In mindestens einer Ausführungsform gibt die Speicherverwaltung 1006 nach Beendigung von Kernel zwei den Sicherungsspeicher 1052 zur späteren Wiederverwendung frei, wie hierin beschrieben. In mindestens einer Ausführungsform gibt der Speichermanager 1006 den Sicherungsspeicher 1052 frei, indem er den Sicherungsspeicher an einen Speicherpool zurückgibt und/oder den Sicherungsspeicher zur Verwendung oder Wiederverwendung bereitstellt und den Virtuellspeicherzeiger zur Wiederverwendung freigibt, wie hierin beschrieben. In mindestens einer Ausführungsform ist der Speicher im Grafikprozessorspeicherpool 1012 in Verwendung 1050, während der Grafikprozessor 1024 den Kernel zwei 1048 ausführt. In mindestens einer Ausführungsform ist der Speicher im Grafikprozessorspeicherpool 1012 für die Wiederverwendung 1054 verfügbar, nachdem der zweite Kernel abgeschlossen ist und der Speichermanager 1006 den Sicherungsspeicher 1052 für eine spätere Wiederverwendung freigibt.
  • 11 veranschaulicht einen beispielhaften dritten Teil eines Datenflusses 1100, bei dem Speicher asynchron zugewiesen und freigegeben wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform setzt der beispielhafte dritte Teil eines Datenflusses 1100 den zweiten Teil eines Datenflusses 1000 fort, der in Verbindung mit 10 beschrieben wurde. In mindestens einer Ausführungsform sind die Aktionen eines Speichermanagers 1106 (der identisch ist mit dem hierin zumindest in Verbindung mit 9 beschriebenen Speichermanager 906 und der identisch ist mit dem hierin zumindest in Verbindung mit 10 beschriebenen Speichermanager 1006) identisch mit den Aktionen des Speichermanagers 906 und/oder sind identisch mit den hierin beschriebenen Aktionen des Speichermanagers 1006, und solche Aktionen sind in 11 aus Gründen der Klarheit nicht dargestellt.
  • In mindestens einer Ausführungsform fordert der Prozessor 1102 Speicher 1104 an, führt einen Befehl zum Starten von Kernel eins 1118 aus und führt einen Befehl zum Freigeben von Speicher 1120 aus, alles wie hierin zumindest in Verbindung mit 9 beschrieben (wo der Prozessor 902 Speicher 904 anfordert, einen Befehl zum Starten von Kernel eins 918 ausführt und einen Befehl zum Freigeben von Speicher 920 ausführt). In mindestens einer Ausführungsform ist der Prozessor 1102 identisch mit dem hierin im Zusammenhang mit 10 beschriebenen Prozessor 1002.
  • In mindestens einer Ausführungsform wird bei der Anforderung von Speicher 1104 durch den Prozessor 1102 Speicher für die Verwendung 1114 reserviert. In mindestens einer Ausführungsform wird, während der Grafikprozessor 1124 den Kernel 1126 ausführt, der Speicher 1128 im Grafikprozessorspeicherpool 1112 verwendet. In mindestens einer Ausführungsform ist der Grafikprozessor 1124 identisch mit dem hierin in Verbindung mit 10 beschriebenen Grafikprozessor 1024. In mindestens einer Ausführungsform ist der Grafikprozessorspeicherpool 1112 identisch mit dem hierin in Verbindung mit 10 beschriebenen Grafikprozessorspeicherpool 1012. In mindestens einer Ausführungsform wird, wenn der Prozessor 1102 einen Befehl zum Freigeben von Speicher 1120 ausführt, der Kernel eins zugeordnet ist, und wenn Kernel eins abgeschlossen ist, Speicher, der 1128 im Grafikprozessorspeicherpool 1112 verwendet wurde, wie hierin beschrieben verfügbar 1132.
  • In mindestens einer Ausführungsform fordert der Prozessor 1102 Speicher 1134 an, führt einen Befehl zum Starten von Kernel zwei 1136 aus und führt einen Befehl zum Freigeben von Speicher 1138 aus, wie hierin mindestens in Verbindung mit 10 beschrieben, z.B. wenn der Prozessor 1002 Speicher 1034 anfordert, einen Befehl zum Starten von Kernel zwei 1036 ausführt und einen Befehl zum Freigeben von Speicher 1038 ausführt. In mindestens einer Ausführungsform bestimmt der Speichermanager 1106, wenn der Prozessor 1102 Speicher 1134 für Kernel zwei anfordert, dass Speicher, der 1128 im Grafikprozessorspeicherpool 1112 in Verwendung war, 1132 verfügbar wird, bevor er von Kernel zwei verwendet wird. In mindestens einer Ausführungsform reserviert der Speichermanager den Speicher 1142 unter Verwendung des Speichers, der 1132 für die Verwendung durch Kernel zwei verfügbar werden wird.
  • In mindestens einer Ausführungsform führt der Prozessor 1102 einen Befehl aus, um Kernel zwei 1136 mit einem bereitgestellten Virtuellspeicherzeiger aus dem frei werdenden Speicher 1132 zu starten. In mindestens einer Ausführungsform führt ein Grafikprozessor 1124 Kernel zwei 1148 aus. In mindestens einer Ausführungsform ist der Grafikprozessor 1124 identisch mit dem im Zusammenhang mit 10 beschriebenen Grafikprozessor 1024. In mindestens einer Ausführungsform wird, wenn der Speichermanager 1106, wie oben beschrieben, einen Speicherplatz im Speicherpool des Grafikprozessors bestimmt, Speicher für die Verwendung 1142 aus dem Speicher reserviert, der dann verfügbar wird 1132. In mindestens einer Ausführungsform wird der Speicher für die Verwendung 1142 reserviert, so dass der Speicher für die Verwendung durch Kernel zwei verfügbar ist, wenn der Grafikprozessor 1124 Kernel zwei 1148 ausführt.
  • In mindestens einer Ausführungsform führt der Prozessor 1102 einen Befehl zum Freigeben von Speicher 1138 aus, der Kernel zwei zugeordnet ist. In mindestens einer Ausführungsform gibt der Speichermanager 1106 nach Beendigung von Kernel zwei den Sicherungsspeicher zur späteren Wiederverwendung frei, wie hierin beschrieben. In mindestens einer Ausführungsform gibt der Speichermanager 1106 den Sicherungsspeicher frei, indem er den Sicherungsspeicher an einen Speicherpool zurückgibt und/oder den Sicherungsspeicher für die Verwendung oder Wiederverwendung verfügbar macht, und indem er den Virtuellspeicherzeiger zur Wiederverwendung freigibt, wie hierin beschrieben. In mindestens einer Ausführungsform ist der Speicher im Grafikprozessorspeicherpool 1112 in Verwendung 1150, während der Grafikprozessor 1124 Kernel zwei 1148 ausführt. In mindestens einer Ausführungsform ist der Speicher im Grafikprozessorspeicherpool 1112 für die Wiederverwendung 1154 verfügbar, nachdem Kernel zwei abgeschlossen ist und der Speichermanager 1106 den Sicherungsspeicher für eine spätere Wiederverwendung freigibt.
  • 12 veranschaulicht einen beispielhaften vierten Teil eines Datenflusses 1200, bei dem Speicher asynchron zugewiesen und freigegeben wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform setzt der beispielhafte vierte Teil eines Datenflusses 1200 den zweiten Teil eines Datenflusses 1000 fort, der in Verbindung mit 10 beschrieben wurde, und ist eine Alternative zum dritten Teil eines Datenflusses 1100, der hierin in Verbindung mit 10 beschrieben wurde. In mindestens einer Ausführungsform sind die Aktionen eines Speichermanagers 1206 (der identisch ist mit dem Speichermanager 906, der hierin zumindest in Verbindung mit 9 beschrieben ist, der identisch ist mit dem Speichermanager 1006, der hierin zumindest in Verbindung mit 10 beschrieben ist, und der identisch ist mit dem Speichermanager 1106, der hierin zumindest in Verbindung mit 11 beschrieben ist) identisch mit den Aktionen des Speichermanagers 906 und/oder sind identisch mit den Aktionen des Speichermanagers 1006, wie hierin beschrieben, und solche Aktionen sind in 12 aus Gründen der Klarheit nicht dargestellt.
  • In mindestens einer Ausführungsform fordert der Prozessor 1202 Speicher 1204 an, führt einen Befehl zum Starten von Kernel eins 1218 aus und führt einen Befehl zum Freigeben von Speicher 1220 aus, wie hierin mindestens in Verbindung mit 9 beschrieben, z.B. wenn der Prozessor 902 Speicher 904 anfordert, einen Befehl zum Starten von Kernel eins 918 ausführt und einen Befehl zum Freigeben von Speicher 920 ausführt. In mindestens einer Ausführungsform ist der Prozessor 1202 identisch mit dem hierin im Zusammenhang mit 10 beschriebenen Prozessor 1002.
  • In mindestens einer Ausführungsform wird der Speicher für die Verwendung 1214 reserviert, wenn der Prozessor 1202 den Speicher 1204 anfordert. In mindestens einer Ausführungsform wird, während der Grafikprozessor 1224 den Kernel 1226 ausführt, der Speicher 1228 im Grafikprozessorspeicherpool 1212 verwendet. In mindestens einer Ausführungsform ist der Grafikprozessor 1224 identisch mit dem hierin in Verbindung mit 10 beschriebenen Grafikprozessor 1024. In mindestens einer Ausführungsform ist der Grafikprozessorspeicherpool 1212 identisch mit dem hierin in Verbindung mit 10 beschriebenen Grafikprozessorspeicherpool 1012. In mindestens einer Ausführungsform wird, wenn der Prozessor 1202 einen Befehl zum Freigeben von Speicher 1220 ausführt, der Kernel eins zugeordnet ist, und wenn Kernel eins abgeschlossen ist, Speicher, der 1228 im Grafikprozessorspeicherpool 1212 verwendet wurde, verfügbar 1232, wie hierin beschrieben.
  • In mindestens einer Ausführungsform fordert der Prozessor 1202 Speicher 1234 an, führt einen Befehl zum Starten von Kernel zwei 1236 aus und führt einen Befehl zum Freigeben von Speicher 1238 aus, wie hierin mindestens in Verbindung mit 10 beschrieben, z.B. wenn der Prozessor 1002 Speicher 1034 anfordert, einen Befehl zum Starten von Kernel zwei 1036 ausführt und einen Befehl zum Freigeben von Speicher 1038 ausführt. In mindestens einer Ausführungsform bestimmt der Speichermanager 1206, wenn der Prozessor 1202 Speicher 1234 für Kernel zwei anfordert, dass der Speicher, der 1228 im Grafikprozessorspeicherpool 1212 verwendet wurde, nicht verfügbar 1232 wird, bevor er von Kernel zwei verwendet wird, wenn z. B. Kernel eins noch ausgeführt wird. In mindestens einer Ausführungsform reserviert der Speichermanager den Speicher 1242 unter Verwendung eines anderen Speichers als desjenigen, der 1232 verfügbar werden wird.
  • In mindestens einer Ausführungsform führt der Prozessor 1202 einen Befehl aus, um Kernel zwei 1236 mit einem bereitgestellten Virtuellspeicherzeiger aus dem reservierten Speicher 1242 zu starten. In mindestens einer Ausführungsform führt ein Grafikprozessor 1224 Kernel zwei 1248 aus. In mindestens einer Ausführungsform ist der Grafikprozessor 1224 identisch mit dem im Zusammenhang mit 10 beschriebenen Grafikprozessor 1024. In mindestens einer Ausführungsform wird, wenn der Speichermanager 1206, wie oben beschrieben, einen Speicherplatz im Speicherpool des Grafikprozessors bestimmt, Speicher für die Verwendung 1242 aus einem Speicher reserviert, der kein Speicher ist, der verfügbar wird 1232. In mindestens einer Ausführungsform wird der Speicher für die Verwendung 1242 reserviert, so dass der Speicher für die Verwendung durch den zweiten Kernel verfügbar ist, wenn der Grafikprozessor 1224 Kernel zwei 1248 ausführt.
  • In mindestens einer Ausführungsform führt der Prozessor 1202 einen Befehl aus, um den mit Kernel zwei verbundenen Speicher 1238 freizugeben. In mindestens einer Ausführungsform gibt der Speichermanager 1206 nach Beendigung von Kernel zwei den Sicherungsspeicher zur späteren Wiederverwendung frei, wie hierin beschrieben. In mindestens einer Ausführungsform gibt der Speichermanager 1206 den Sicherungsspeicher frei, indem er den Sicherungsspeicher an einen Speicherpool zurückgibt und/oder indem er den Sicherungsspeicher zur Verwendung oder Wiederverwendung bereitstellt und indem er den Virtuellspeicherzeiger zur Wiederverwendung freigibt, wie hierin beschrieben. In mindestens einer Ausführungsform ist der Speicher im Grafikprozessorspeicherpool 1212 in Verwendung 1250, während der Grafikprozessor 1224 Kernel zwei 1248 ausführt. In mindestens einer Ausführungsform ist der Speicher im Grafikprozessorspeicherpool 1212 für die Wiederverwendung 1254 verfügbar, nachdem Kernel zwei abgeschlossen ist und der Speichermanager 1206 den Sicherungsspeicher für eine spätere Wiederverwendung freigibt.
  • 13 veranschaulicht einen Beispielprozess 1300 zum Durchführen von Speicherverwaltungsoperationen zum asynchronen Zuweisen von Speicher unter Verwendung eines Speicherpools, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106 Anweisungen aus, um den in 13 dargestellten Beispielprozess 1300 durchzuführen.
  • In mindestens einer Ausführungsform wird in Schritt 1302 des Beispielprozesses 1300 eine Anforderung für asynchron zugewiesenen Speicher, der einem Kernel zugeordnet ist, unter Verwendung von Systemen und Verfahren, wie den hierin beschriebenen, empfangen. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher mit einer zugehörigen Virtuellspeicheradresse, die zur Ausführung eines Kernels verwendet werden kann, von einem Prozess wie dem Beispielprozess 500 empfangen, der auf einem Prozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102 ausgeführt wird. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher mit einer zugehörigen Virtuellspeicheradresse, die zum Ausführen eines Kernels verwendet werden kann, unter Verwendung einer API empfangen. In mindestens einer Ausführungsform, die in 13 nicht dargestellt ist, wird eine Antwort auf eine Anforderung von asynchron zugewiesenem Speicher mit einer zugehörigen Virtuellspeicheradresse, die zum Ausführen eines Kernels verwendet werden kann, erzeugt. In mindestens einer Ausführungsform wird eine Antwort auf den Empfang einer Anforderung für asynchron zugewiesenen Speicher mit einer zugehörigen Virtuellspeicheradresse, die zur Ausführung eines Kernels verwendet werden kann, unter Verwendung einer API generiert. In mindestens einer Ausführungsform schreitet nach Schritt 1302 die Ausführung des Beispielprozesses 1300 zu Schritt 1304 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1304 des Beispielprozesses 1300 bestimmt, ob ein zuvor zugewiesener Speicherpool existiert, wie z.B. ein Speicher, der zuvor wie hierin beschrieben erstellt wurde. In mindestens einer Ausführungsform schreitet in Schritt 1304, wenn bestimmt wird, dass ein zuvor zugewiesener Speicherpool existiert („JA“-Verzweigung), die Ausführung des Beispielprozesses zu Schritt 1310 fort. In mindestens einer Ausführungsform schreitet in Schritt 1304, wenn bestimmt wird, dass ein zuvor zugewiesener Speicherpool nicht existiert („NEIN“-Zweig), die Ausführung des Beispielprozesses zu Schritt 1306 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1306 des Beispielprozesses 1300 ein Speicherpool durch Zuweisung von Speicher für einen Speicherpool unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, erstellt. In mindestens einer Ausführungsform schreitet nach Schritt 1306 die Ausführung des Beispielprozesses 1300 zu Schritt 1308 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1308 des Beispielprozesses 1300 bestimmt, ob ein Speicherpool erfolgreich erstellt wurde. In mindestens einer Ausführungsform schreitet in Schritt 1308, wenn bestimmt wird, dass ein Speicherpool erfolgreich erstellt wurde („JA“-Verzweigung), die Ausführung des Beispielprozesses zu Schritt 1310 fort. In mindestens einer Ausführungsform schreitet in Schritt 1308, wenn bestimmt wird, dass ein Speicherpool nicht erfolgreich erstellt wurde („NEIN“-Zweig), die Ausführung des Beispielprozesses zu Schritt 1314 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1310 des Beispielprozesses 1300 Speicher aus einem Speicherpool unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, zugewiesen. In mindestens einer Ausführungsform schreitet nach Schritt 1310 die Ausführung des Beispielprozesses 1300 zu Schritt 1312 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1312 des Beispielprozesses 1300 bestimmt, ob Speicher erfolgreich aus einem Speicherpool zugewiesen wurde. In mindestens einer Ausführungsform schreitet in Schritt 1312, wenn bestimmt wird, dass Speicher erfolgreich aus einem Speicherpool zugewiesen wurde („JA“-Zweig), die Ausführung des Beispielprozesses zu Schritt 1316 fort. In mindestens einer Ausführungsform schreitet in Schritt 1312, wenn bestimmt wird, dass Speicher nicht erfolgreich aus einem Speicherpool zugewiesen wurde („NEIN“-Zweig), die Ausführung des Beispielprozesses zu Schritt 1314 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1314 des Beispielprozesses 1300 als ein Ergebnis des Bestimmens, dass Speicher nicht erfolgreich aus einem Speicherpool zugewiesen wurde (in Schritt 1310), eine Fehleranzeige zurückgegeben. In mindestens einer Ausführungsform wird eine Fehlermeldung an einen anfordernden Prozess zurückgegeben. In mindestens einer Ausführungsform wird eine Fehleranzeige an einen anfordernden Prozess, wie z. B. den Beispielprozess 500, der auf einem Prozessor, wie z.B. dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102, ausgeführt wird, zurückgegeben. In mindestens einer Ausführungsform wird eine Fehleranzeige über eine API zurückgegeben. In mindestens einer Ausführungsform wird eine Fehleranzeige unter Verwendung eines Signals an einen aufrufenden Prozess zurückgegeben. In mindestens einer Ausführungsform wird eine Fehlermeldung an einen aufrufenden Prozess unter Verwendung einer Semaphore zurückgegeben. In mindestens einer Ausführungsform, die in 13 nicht dargestellt ist, wird eine Antwort auf eine Fehleranzeige empfangen. In mindestens einer Ausführungsform wird der Beispielprozess 1300 nach Schritt 1314 beendet. In mindestens einer Ausführungsform kehrt der Beispielprozess 1300 nach dem Schritt 1314 zu Schritt 1302 zurück, um eine neue Anforderung zur Ausführung eines Kernels mit einer zugehörigen Virtuellspeicheradresse zu empfangen.
  • In mindestens einer Ausführungsform wird in Schritt 1316 des Beispielprozesses 1300 aus einem Speicherpool zugewiesener Speicher einer Virtuellspeicheradresse zugeordnet, wie z.B. einer Virtuellspeicheradresse, die in Schritt 1302 empfangen wurde, unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform schreitet nach Schritt 1316 die Ausführung des Beispielprozesses 1300 zu Schritt 1318 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1318 des Beispielprozesses 1300 als ein Ergebnis der Feststellung, dass Speicher nicht erfolgreich aus einem Speicherpool zugewiesen wurde (in Schritt 1310), eine Fehleranzeige unter Verwendung von Systemen und Verfahren, wie sie in Verbindung mit Schritt 1314 beschrieben wurden, unter Verwendung einer API, unter Verwendung eines Signals und/oder unter Verwendung eines Semaphors zurückgegeben. In mindestens einer Ausführungsform endet der Beispielprozess 1300 nach Schritt 1318. In mindestens einer Ausführungsform kehrt der Beispielprozess 1300 nach Schritt 1318 zu Schritt 1302 zurück, um eine neue Anforderung zur Ausführung eines Kernels mit einer zugeordneten Virtuellspeicheradresse zu empfangen.
  • In mindestens einer Ausführungsform werden die Operationen des in 13 dargestellten Beispielprozesses 1300 in einer anderen Reihenfolge als in 13 angegeben durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 13 dargestellten Beispielprozesses 1300 gleichzeitig und/oder parallel durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 13 dargestellten Beispielprozesses 1300 von einer Vielzahl von Threads ausgeführt, die auf einem Speichermanager wie dem hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 laufen.
  • 14 veranschaulicht ein Beispiel für ein Computersystem 1400, in dem Speicherverwaltungsoperationen zum asynchronen Zuweisen von Speicher unter Verwendung eines Speicherpools für einen einzelnen Ausführungsstream durchgeführt werden, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform gibt ein Ausführungsstream 1402 eine Streamreihenfolge für Operationen an, die einen oder mehrere Speicherplätze in asynchron zugewiesenem Speicher verwenden, der aus einem Speicherpool zugewiesen wurde. In mindestens einer Ausführungsform gibt der Ausführungsstream 1402 geordnete Operationen an, um Speicher für Kernel eins 1404 zuzuweisen, Kernel eins 1410 auszuführen, Kernel-eins-Speicher 1412 freizugeben, Speicher für Kernel zwei 1416 zuzuweisen, Kernel zwei 1420 auszuführen und Kernel-zwei-Speicher 1422 freizugeben.
  • In mindestens einer Ausführungsform können die in dem Ausführungsstream 1402 angegebenen Operationen implizit sein. In mindestens einer Ausführungsform kann beispielsweise eine geordnete Operation zur Zuweisung von Speicher für Kernel eins 1404 automatisch ausgeführt werden, wenn eine geordnete Operation zur Ausführung von Kernel eins 1410 ausgeführt wird, und eine geordnete Operation zur Freigabe von Kernel-eins-Speicher 1412 kann automatisch ausgeführt werden, wenn eine geordnete Operation zur Ausführung von Kernel eins 1410 abgeschlossen ist. In mindestens einer Ausführungsform können die in dem Ausführungsstream 1402 spezifizierten Operationen explizit aufgerufen werden, z.B. durch eine API unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind.
  • In mindestens einer Ausführungsform, wenn der Ausführungsstream 1402 die Ausführung einer geordneten Operation zur Zuweisung von Speicher für den Kernel 1404 angibt, stellt ein Speichermanager 1406 (der ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106 ist) Sicherungsspeicher 1408 aus einem Speicherpool unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen bereit. In mindestens einer Ausführungsform kann der Speichermanager 1406 beispielsweise Sicherungsspeicher aus einem Speicherpool an einer Adresse 0X1000 bereitstellen.
  • In mindestens einer Ausführungsform kann der Speichermanager 1406, wenn der Ausführungsstream 1402 die Ausführung einer geordneten Operation zur Freigabe des Kernel-eins-Speichers 1412 angibt, eine oder mehrere Operationen durchführen, um den Sicherungsspeicher an einen Speicherpool 1414 zurückzugeben, eine oder mehrere Operationen durchführen, um den Sicherungsspeicher als wiederverwendbar zu markieren, und/oder eine oder mehrere Operationen durchführen, um einen Virtuellspeicherzeiger freizugeben, der dem Sicherungsspeicher zugeordnet ist, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform, wenn der Ausführungsstream 1402 die Ausführung einer geordneten Operation angibt, um Speicher für Kernel zwei 1416 zuzuweisen, stellt der Speichermanager 1406 Sicherungsspeicher 1418 aus einem Speicherpool unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, bereit. In mindestens einer Ausführungsform verwendet der Speichermanager 1406 den Sicherungsspeicher an der Adresse 0X1000 wieder, weil der Speichermanager 1406 aufgrund der von dem Ausführungsstream 1402 festgelegten Reihenfolge der Operationen bestimmt, dass Kernel eins abgeschlossen wird, bevor Kernel zwei ausgeführt wird, und dementsprechend kann der für Kernel eins verfügbare Speicher von Kernel zwei wiederverwendet und beispielsweise für Kernel zwei verfügbar gemacht werden.)
  • In mindestens einer Ausführungsform kann der Speichermanager 1406, wenn der Ausführungsstream 1402 die Ausführung einer geordneten Operation zur Freigabe von zwei Kernspeichern 1422 angibt, eine oder mehrere Operationen durchführen, um den Sicherungsspeicher an einen Speicherpool 1424 zurückzugeben, eine oder mehrere Operationen durchführen, um den Sicherungsspeicher als wiederverwendbar zu markieren, und/oder eine oder mehrere Operationen durchführen, um einen Virtuellspeicherzeiger freizugeben, der dem Sicherungsspeicher zugeordnet ist, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • 15 veranschaulicht ein beispielhaftes Computersystem 1500, in dem Speicherverwaltungsoperationen zum asynchronen Zuweisen von Speicher unter Verwendung eines Speicherpools für eine Vielzahl von Ausführungsströmen durchgeführt werden, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform gibt ein Ausführungsstream eine Streamreihenfolge für Operationen an, die einen oder mehrere Speicherplätze in asynchron zugewiesenem Speicher verwenden, der aus einem Speicherpool zugewiesen wird. In mindestens einer Ausführungsform gibt ein erster Ausführungsstream 1502 geordnete Operationen an, um Speicher für Kernel eins 1504 zuzuweisen, Kernel eins 1510 auszuführen und Kernel-eins-Speicher 1512 freizugeben. In mindestens einer Ausführungsform gibt ein zweiter Ausführungsstream 1516 geordnete Operationen an, um Speicher für Kernel eins 1518 zuzuweisen, Kernel eins 1522 auszuführen, Kernel-eins-Speicher 1524 freizugeben, Speicher für Kernel zwei 1528 zuzuweisen, Kernel zwei 1532 auszuführen und Kernel-zwei-Speicher 1534 freizugeben. In mindestens einer Ausführungsform können die in dem ersten Ausführungsstream 1502 angegebenen Operationen implizit oder explizit sein und/oder von einer API aufgerufen werden, und können die in dem zweiten Ausführungsstream 1516 angegebenen Operationen ebenfalls implizit oder explizit sein und/oder von einer API aufgerufen werden.
  • In mindestens einer Ausführungsform, wenn der erste Ausführungsstream 1502 die Ausführung einer geordneten Operation zur Zuweisung von Speicher für den Kernel 1504 angibt, stellt ein Speichermanager 1506 (der ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106 ist) Sicherungsspeicher 1508 aus einem Speicherpool unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen bereit. In mindestens einer Ausführungsform kann der Speichermanager 1506 beispielsweise Sicherungsspeicher aus einem Speicherpool an der Adresse 0X1000 bereitstellen. In mindestens einer Ausführungsform kann der Speichermanager 1506, wenn der erste Ausführungsstream 1502 die Ausführung einer geordneten Operation zur Freigabe des Kernel-eins-Speichers 1512 angibt, eine oder mehrere Operationen durchführen, um Sicherungsspeicher an einen Speicherpool 1514 zurückzugeben, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform stellt der Speichermanager 1506, wenn der zweite Ausführungsstream 1516 die Ausführung einer geordneten Operation zur Zuweisung von Speicher für Kernel eins 1518 angibt, Sicherungsspeicher 1520 aus einem Speicherpool bereit, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform kann der Speichermanager 1506 zum Beispiel Sicherungsspeicher aus einem Speicherpool an der Adresse 0X2000 bereitstellen. In mindestens einer Ausführungsform kann der Speichermanager 1506 keinen Sicherungsspeicher aus einem Speicherpool an der Adresse 0X1000 bereitstellen (er kann den Speicher an der Adresse 0X1000 nicht wiederverwenden), weil die Ausführung des Kernels eins aus dem Ausführungsstream 1502 abgeschlossen sein kann oder nicht. In mindestens einer Ausführungsform kann der Speichermanager 1506, wenn der zweite Ausführungsstream 1516 die Ausführung einer geordneten Operation zur Freigabe des Kernel-eins-Speichers 1524 angibt, eine oder mehrere Operationen durchführen, um Sicherungsspeicher an einen Speicherpool 1526 zurückzugeben, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform stellt, wenn der zweite Ausführungsstream 1516 die Ausführung einer geordneten Operation zur Zuweisung von Speicher für den zweiten Kern 1518 angibt, der Speichermanager 1506 Sicherungsspeicher 1508 aus einem Speicherpool bereit, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform kann der Speichermanager 1506 den Sicherungsspeicher 1530 an der Adresse 0X2000 wiederverwenden, da der Speichermanager 1506 aufgrund einer durch den Ausführungsstream 1516 festgelegten Reihenfolge von Operationen bestimmt, dass Kernel eins abgeschlossen wird, bevor Kernel zwei ausgeführt wird, und dementsprechend kann der für Kernel eins verfügbare Speicher von Kernel zwei wiederverwendet werden. In mindestens einer Ausführungsform kann der Speichermanager 1506 immer noch keinen Sicherungsspeicher aus einem Speicherpool an der Adresse 0X1000 bereitstellen (er kann den Speicher an der Adresse 0X1000 nicht wiederverwenden), weil die Ausführung von Kernel eins aus dem Ausführungsstream 1502 noch nicht abgeschlossen sein kann. In mindestens einer Ausführungsform kann der Speichermanager 1506, wenn der zweite Ausführungsstream 1516 die Ausführung einer geordneten Operation zur Freigabe des Kernel-zwei-Speichers 1534 angibt, eine oder mehrere Operationen durchführen, um Sicherungsspeicher an einen Speicherpool 1536 zurückzugeben, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • 16 veranschaulicht einen Beispielprozess 1600 zum Durchführen von Speicherverwaltungsoperationen zur Wiederverwendung von asynchron zugewiesenem Speicher aus einem Speicherpool in Übereinstimmung mit mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106 Anweisungen aus, um den in 16 dargestellten Beispielprozess 1600 durchzuführen.
  • In mindestens einer Ausführungsform wird in Schritt 1602 des Beispielprozesses 1600 eine Anforderung für asynchron zugewiesenen Speicher empfangen. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher von einem Prozess, wie z.B. dem Beispielprozess 500, empfangen, der auf einem Prozessor, wie z.B. dem hierin zumindest in Verbindung mit 1 beschriebenen Pro- zessor 102, ausgeführt wird. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher über eine API empfangen, wie hierin mindestens in Verbindung mit 5 beschrieben. In mindestens einer Ausführungsform, die in 16 nicht dargestellt ist, wird eine Antwort auf den Empfang einer Anforderung für asynchron zugewiesenen Speicher erzeugt. In mindestens einer Ausführungsform wird eine Antwort auf den Empfang einer Anforderung für asynchron zugewiesenen Speicher unter Verwendung einer API generiert. In mindestens einer Ausführungsform schreitet nach Schritt 1602 die Ausführung des Beispielprozesses 1600 zu Schritt 1604 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1604 des Beispielprozesses 1600 bestimmt, ob zuvor verwendeter Poolspeicher vor der Ausführung von Arbeit, die einer Anforderung für asynchron zugewiesenen Speicher, wie z.B. einem Kernel, zugeordnet ist, verfügbar sein wird. In mindestens einer Ausführungsform wird bestimmt, ob zuvor verwendeter Poolspeicher vor der Ausführung von Arbeit, die einer Anforderung für asynchron zugewiesenen Speicher zugeordnet ist, verfügbar sein wird, zumindest teilweise auf der Grundlage einer Streamausführungsreihenfolge, wie hierin zumindest in Verbindung mit 14 und 15 beschrieben. In mindestens einer Ausführungsform schreitet die Ausführung des Beispielprozesses 1600 nach Schritt 1604 zu Schritt 1606 fort.
  • In mindestens einer Ausführungsform schreitet in Schritt 1606 des Beispielprozesses 1600, wenn bestimmt wird, dass zuvor verwendeter Poolspeicher vor der Ausführung von Arbeit, die einer Anforderung von asynchron zugewiesenem Speicher, wie in Schritt 1604 beschrieben, zugeordnet ist, verfügbar sein wird („JA“-Verzweigung), die Ausführung des Beispielprozesses zu Schritt 1610 fort. In mindestens einer Ausführungsform schreitet in Schritt 1606, wenn bestimmt wird, dass der zuvor verwendete Poolspeicher vor der Ausführung der Arbeit in Verbindung mit einer Anforderung von asynchron zugewiesenem Speicher, wie in Schritt 1604 beschrieben, nicht verfügbar sein wird („NEIN“-Zweig), die Ausführung des Beispielprozesses zu Schritt 1608 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1608 des Beispielprozesses 1600 eine neue, nicht wiederverwendete virtuelle Adresse unter Verwendung von Systemen und Verfahren, wie den hierin beschriebenen, bereitgestellt. In mindestens einer Ausführungsform wird eine neue virtuelle Adresse einem anfordernden Prozess, wie dem hierin beschriebenen Beispielprozess 500, bereitgestellt. In mindestens einer Ausführungsform wird eine neue virtuelle Adresse für einen anfordernden Prozess bereitgestellt, der auf einem Prozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102 ausgeführt wird. In mindestens einer Ausführungsform wird eine neue virtuelle Adresse unter Verwendung einer API bereitgestellt, wie hierin mindestens in Verbindung mit 5 beschrieben. In mindestens einer Ausführungsform, die in 16 nicht dargestellt ist, wird eine Antwort auf eine bereitgestellte neue Virtuellspeicheradresse empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine bereitgestellte neue Virtuellspeicheradresse von einem Prozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102 empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine bereitgestellte neue Virtuellspeicheradresse unter Verwendung einer API empfangen. In mindestens einer Ausführungsform schreitet nach Schritt 1608 die Ausführung des Beispielprozesses 1600 zu Schritt 1612 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1610 des Beispielprozesses 1600 eine wiederverwendete virtuelle Adresse, wie z.B. eine virtuelle Adresse, die zuvor verwendet wurde, wie hierin in Verbindung mit 14 und 15 beschrieben, unter Verwendung von Systemen und Verfahren, wie sie in Verbindung mit Schritt 1608 beschrieben sind, bereitgestellt. In mindestens einer Ausführungsform schreitet nach Schritt 1610 die Ausführung des Beispielprozesses 1600 zu Schritt 1612 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1612 des Beispielprozesses 1600 eine Anforderung zur Ausführung von Arbeit, die einer Virtuellspeicheradresse zugeordnet ist, unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, empfangen. In mindestens einer Ausführungsform wird eine Anforderung zur Ausführung von Arbeit, die einer Virtuellspeicheradresse zugeordnet ist, unter Verwendung von Systemen und Verfahren, wie sie in Verbindung mit Schritt 1602 beschrieben sind, empfangen, beispielsweise von einem aufrufenden Prozess und/oder unter Verwendung einer API. In mindestens einer Ausführungsform schreitet nach Schritt 1612 die Ausführung des Beispielprozesses 1600 zu Schritt 1614 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1614 des Beispielprozesses 1600 unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, eine Arbeit gestartet, die Speicher aus einem Speicherpool an einer in Schritt 1608 oder Schritt 1610 angegebenen Adresse verwendet. In mindestens einer Ausführungsform endet nach Schritt 1614 die Ausführung des Beispielprozesses 1600. In mindestens einer Ausführungsform kehrt der Beispielprozess 1600 nach Schritt 1614 zu Schritt 1602 zurück, um eine neue Anforderung für asynchron zugewiesenen Speicher zu empfangen.
  • In mindestens einer Ausführungsform werden die Operationen des in 16 dargestellten Beispielprozesses 1600 in einer anderen Reihenfolge als in 16 angegeben durchgeführt. In mindestens einer Ausführungsform werden Operationen des in 16 dargestellten Beispielprozesses 1600 gleichzeitig und/oder parallel durchgeführt. In mindestens einer Ausführungsform werden Operationen des in 16 dargestellten Beispielprozesses 1600 von einer Vielzahl von Threads ausgeführt, die auf einem Speichermanager wie dem hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 ausgeführt werden.
  • 17 veranschaulicht ein beispielhaftes Computersystem 1700, in dem Speicherverwaltungsoperationen zur Wiederverwendung von asynchron zugewiesenem Speicher aus einem Speicherpool für eine Vielzahl von synchronisierten Ausführungsstreams durchgeführt werden, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform gibt ein Ausführungsstream eine Streamreihenfolge für Operationen an, die einen oder mehrere Speicherplätze in asynchron zugewiesenem Speicher verwenden, der aus einem Speicherpool zugewiesen wurde. In mindestens einer Ausführungsform gibt ein erster Ausführungsstream 1702 geordnete Operationen an, um Speicher für Arbeit 1704, die asynchron zugewiesenem Speicher zugeordnet ist, zuzuweisen, zugehörige Arbeit 1710 auszuführen und Speicher 1712 freizugeben. In mindestens einer Ausführungsform gibt der erste Ausführungsstream 1702 eine geordnete Operation zur Synchronisierung 1716 mit einem zweiten Ausführungsstream 1718 an. In mindestens einer Ausführungsform können die in dem ersten Ausführungsstream 1702 angegebenen Operationen implizit oder explizit sein und/oder von einer API aufgerufen werden.
  • In mindestens einer Ausführungsform gibt der zweite Ausführungsstream 1718 geordnete Operationen zur Zuweisung von Speicher für Arbeit 1720 an, die asynchron zugewiesenem Speicher zugeordnet ist, zur Ausführung von Arbeit 1724, zur Freigabe von Speicher 1726 und zur Zuweisung von Speicher für Arbeit 1732. In mindestens einer Ausführungsform, die in 17 nicht dargestellt ist, kann der zweite Ausführungsstream 1718 auch geordnete Operationen zur Ausführung von Arbeit und Freigabe von zugewiesenem Speicher anzeigen. In mindestens einer Ausführungsform gibt der zweite Ausführungsstream 1718 eine geordnete Operation an, um 1730 auf eine Synchronisierung vom Ausführungsstream 1702 zu warten. In mindestens einer Ausführungsform können die in dem zweiten Ausführungsstream 1718 angegebenen Operationen auch implizit oder explizit sein und/oder von einer API aufgerufen werden.
  • In mindestens einer Ausführungsform, wenn der erste Ausführungsstream 1702 die Ausführung einer geordneten Operation zur Zuweisung von Speicher für die Arbeit 1704 angibt, stellt ein Speichermanager 1706 (der ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106 ist) Speicher 1708 aus einem Speicherpool an der Adresse 0X1000 unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen bereit. In mindestens einer Ausführungsform kann der Speichermanager 1706, wenn der erste Ausführungsstream 1702 die Ausführung einer geordneten Operation zur Freigabe von Speicher 1712 angibt, eine oder mehrere Operationen zur Rückgabe von Sicherungsspeicher an einen Speicherpool 1714 durchführen, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform stellt der Speichermanager 1706, wenn der zweite Ausführungsstream 1718 die Ausführung einer geordneten Operation zur Zuweisung von Speicher für die Arbeit 1720 angibt, Sicherungsspeicher 1722 aus einem Speicherpool an der Adresse 0X2000 bereit, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform kann der Speichermanager 1706 keinen Sicherungsspeicher aus einem Speicherpool an der Adresse 0X1000 bereitstellen (kann den Speicher an der Adresse 0X1000 nicht wiederverwenden), weil die Ausführung der Arbeit aus dem Ausführungsstream 1702 abgeschlossen sein kann oder nicht. In mindestens einer Ausführungsform kann der Speichermanager 1706, wenn der zweite Ausführungsstream 1718 die Ausführung einer geordneten Operation zur Freigabe von Speicher 1726 angibt, eine oder mehrere Operationen durchführen, um den Sicherungsspeicher an einen Speicherpool 1728 zurückzugeben, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform gibt der erste Ausführungsstream 1702 eine geordnete Operation an, um 1716 mit dem zweiten Ausführungsstream 1718 zu synchronisieren, und der zweite Ausführungsstream 1718 gibt eine geordnete Operation an, um 1730 auf eine Synchronisierung vom Ausführungsstream 1702 zu warten. In mindestens einer Ausführungsform, wenn der zweite Ausführungsstream 1718 die Ausführung einer geordneten Operation angibt, um Speicher für die Arbeit 1732 zuzuweisen, stellt der Speichermanager 1706 Sicherungsspeicher 1708 aus einem Speicherpool unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, bereit. In mindestens einer Ausführungsform kann der Speichermanager 1706 den Sicherungsspeicher 1734 an der Adresse 0X2000 wiederverwenden, da der Speichermanager 1706 aufgrund einer durch den zweiten Ausführungsstream 1718 festgelegten Reihenfolge von Operationen bestimmen kann, dass die Arbeit im Ausführungsstream 1718 abgeschlossen wird, bevor andere Arbeit ausgeführt wird, und dementsprechend der verfügbare Speicher wiederverwendet werden kann. In mindestens einer Ausführungsform verwendet der Speichermanager 1706 auch den Sicherungsspeicher 1734 aus einem Speicherpool an der Adresse 0X1000 wieder, weil die Ausführung der Arbeit aus dem ersten Ausführungsstream 1702 abgeschlossen sein wird, bevor die Ausführung zusätzlicher Arbeit aus dem zweiten Ausführungsstream 1718 aufgrund von Synchronisierungs- und Warteoperationen beginnt.
  • 18 veranschaulicht einen Beispielprozess 1800 zum Durchführen von Speicherverwaltungsoperationen zur Wiederverwendung von asynchron zugewiesenem Speicher aus einem Speicherpool für eine Vielzahl von synchronisierten Ausführungsströmen, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Speichermanager wie der hierin zumindest in Verbindung mit 1 beschriebene Speichermanager 106 Anweisungen aus, um den in 18 dargestellten Beispielprozess 1800 durchzuführen.
  • In mindestens einer Ausführungsform wird in Schritt 1802 des Beispielprozesses 1800 eine Anforderung für asynchron zugewiesenen Speicher für einen Ausführungsstream empfangen, wie hierin beschrieben. In mindestens einer Ausführungsform wird eine Anforderung für einen asynchron zugewiesenen Speicher von einem Prozess wie dem Prozess 500 empfangen, der hierin zumindest in Verbindung mit 5 beschrieben ist. In mindestens einer Ausführungsform wird eine Anforderung für einen asynchron zugewiesenen Speicher von einem Prozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102 empfangen. In mindestens einer Ausführungsform sendet ein Prozess eine Anforderung für asynchron zugewiesenen Speicher im Namen eines anderen Prozesses. In mindestens einer Ausführungsform wird eine Anforderung für asynchron zugewiesenen Speicher unter Verwendung einer API empfangen, wie hierin zumindest in Verbindung mit 5 beschrieben. In mindestens einer Ausführungsform, die in 18 nicht dargestellt ist, wird eine Antwort auf den Empfang einer Anforderung für asynchron zugewiesenen Speicher erzeugt. In mindestens einer Ausführungsform wird eine Antwort auf eine Anforderung von asynchron zugewiesenem Speicher unter Verwendung einer API generiert. In mindestens einer Ausführungsform schreitet nach Schritt 1802 die Ausführung des Beispielprozesses 1800 zu Schritt 1804 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1804 des Beispielprozesses 1800 bestimmt, ob ein Synchronisationsereignis zwischen einem ersten Ausführungsstream und einem zweiten Ausführungsstream vorliegt. In mindestens einer Ausführungsform kann ein Speichermanager einen Ausführungsstream untersuchen, um festzustellen, ob es ein Synchronisationsereignis zwischen einem ersten Ausführungsstream und einem zweiten Ausführungsstream gibt. In mindestens einer Ausführungsform kann ein Speichermanager eine Spezifikation für eine Streamreihenfolge eines Ausführungsstreams untersuchen, um festzustellen, ob es ein Synchronisationsereignis zwischen einem ersten Ausführungsstream und einem zweiten Ausführungsstream gibt. In mindestens einer Ausführungsform kann ein Speichermanager eine Spezifikation für einen Ausführungsgraphen eines Ausführungsstreams untersuchen, um festzustellen, ob es ein Synchronisationsereignis zwischen einem ersten Ausführungsstream und einem zweiten Ausführungsstream gibt. In mindestens einer Ausführungsform schreitet nach Schritt 1804 die Ausführung des Beispielprozesses 1800 zu Schritt 1806 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1806 des Beispielprozesses 1800, wenn (in Schritt 1806) bestimmt wird, dass ein Synchronisationsereignis zwischen einem ersten Ausführungsstream und einem zweiten Ausführungsstream vorliegt („JA“-Verzweigung), die Ausführung des Beispielprozesses zu Schritt 1808 fort. In mindestens einer Ausführungsform schreitet in Schritt 1806, wenn bestimmt wird (in Schritt 1806), dass es kein Synchronisationsereignis zwischen einem ersten Ausführungsstream und einem zweiten Ausführungsstream gibt („NEIN“-Zweig), die Ausführung des Beispielprozesses zu Schritt 1814 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1808 des Beispielprozesses 1800 bestimmt, ob in einem anderen Ausführungsstream wiederverwendbarer Speicher vorhanden ist und ob es ein Synchronisationsereignis zwischen einem ersten Ausführungsstream und einem zweiten Ausführungsstream gibt. In mindestens einer Ausführungsform schreitet nach Schritt 1808 die Ausführung des Beispielprozesses 1800 zu Schritt 1810 fort.
  • In mindestens einer Ausführungsform schreitet in Schritt 1810 des Beispielprozesses 1800, wenn (in Schritt 1808) bestimmt wird, dass in einem anderen Ausführungsstream wiederverwendbarer Speicher vorhanden ist, der vor einem Synchronisationsereignis freigegeben werden kann („JA“-Zweig), die Ausführung des Beispielprozesses zu Schritt 1812 fort. In mindestens einer Ausführungsform schreitet in Schritt 1810, wenn (in Schritt 1808) bestimmt wird, dass in einem anderen Ausführungsstream kein wiederverwendbarer Speicher vorhanden ist, der vor einem Synchronisationsereignis freigegeben werden kann („NEIN“-Verzweigung), die Ausführung des Beispielprozesses zu Schritt 1814 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1812 des Beispielprozesses 1800 eine wiederverwendbare virtuelle Adresse, die auf der Grundlage der Synchronisation bestimmt wurde, bereitgestellt. In mindestens einer Ausführungsform wird eine auf der Grundlage der Synchronisation ermittelte wiederverwendbare virtuelle Adresse einem Prozess wie dem Beispielprozess 500, der hierin zumindest in Verbindung mit 5 beschrieben ist, bereitgestellt. In mindestens einer Ausführungsform wird eine auf der Grundlage der Synchronisation ermittelte wiederverwendbare virtuelle Adresse einem Prozessor, wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102, bereitgestellt. In mindestens einer Ausführungsform wird eine auf der Grundlage der Synchronisation ermittelte wiederverwendbare virtuelle Adresse einem Grafikprozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Grafikprozessor 108 bereitgestellt. In mindestens einer Ausführungsform wird eine wiederverwendbare virtuelle Adresse, die auf der Grundlage der Synchronisation bestimmt wird, unter Verwendung einer API bereitgestellt, wie sie hierin zumindest in Verbindung mit 5 beschrieben ist.
  • In mindestens einer Ausführungsform, die in 18 nicht dargestellt ist, wird eine Antwort auf eine bereitgestellte wiederverwendbare virtuelle Adresse, die auf der Grundlage der Synchronisation bestimmt wurde, empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine bereitgestellte wiederverwendbare virtuelle Adresse, die auf der Grundlage der Synchronisation ermittelt wurde, von einem Prozess wie dem Beispielprozess 500 empfangen, der hierin zumindest in Verbindung mit 5 beschrieben wird. In mindestens einer Ausführungsform wird eine Antwort auf eine bereitgestellte wiederverwendbare virtuelle Adresse, die auf der Grundlage der Synchronisation bestimmt wurde, von einem Prozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Prozessor 102 empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine bereitgestellte wiederverwendbare virtuelle Adresse, die auf der Grundlage der Synchronisation bestimmt wird, von einem Grafikprozessor wie dem hierin zumindest in Verbindung mit 1 beschriebenen Grafikprozessor 108 empfangen. In mindestens einer Ausführungsform wird eine Antwort auf eine bereitgestellte wiederverwendbare virtuelle Adresse, die auf der Grundlage der Synchronisation bestimmt wurde, unter Verwendung einer API empfangen. In mindestens einer Ausführungsform schreitet nach Schritt 1812 die Ausführung des Beispielprozesses 1800 zu Schritt 1816 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1814 des Beispielprozesses 1800 eine neue oder eine wiederverwendbare virtuelle Adresse unter Verwendung von Systemen und Verfahren, wie sie hierin zumindest in Verbindung mit den 14-17 beschrieben sind, erzeugt und unter Verwendung von Systemen und Verfahren, wie sie in Verbindung mit Schritt 1812 beschrieben sind, bereitgestellt. In mindestens einer Ausführungsform schreitet nach Schritt 1814 die Ausführung des Beispielprozesses 1800 zu Schritt 1816 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1816 des Beispielprozesses 1800 eine Anforderung zur Ausführung von Arbeit empfangen, die einer Virtuellspeicheradresse zugeordnet ist, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform wird eine Anforderung zur Ausführung von Arbeit, die einer Virtuellspeicheradresse zugeordnet ist, unter Verwendung von Systemen und Verfahren, wie sie in Verbindung mit Schritt 1802 beschrieben sind, empfangen, beispielsweise von einem aufrufenden Prozess und/oder unter Verwendung einer API. In mindestens einer Ausführungsform schreitet nach Schritt 1816 die Ausführung des Beispielprozesses 1600 zu Schritt 1818 fort.
  • In mindestens einer Ausführungsform wird in Schritt 1818 des Beispielprozesses 1800 unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, eine Arbeit gestartet, die Speicher aus einem Speicherpool an einer in Schritt 1812 oder Schritt 1814 angegebenen Adresse verwendet. In mindestens einer Ausführungsform endet nach Schritt 1818 die Ausführung des Beispielprozesses 1800. In mindestens einer Ausführungsform kehrt der Beispielprozess 1800 nach Schritt 1818 zu Schritt 1802 zurück, um eine neue Anforderung für asynchron zugewiesenen Speicher zu empfangen.
  • In mindestens einer Ausführungsform werden die Operationen des in 18 dargestellten Beispielprozesses 1800 in einer anderen Reihenfolge als in 18 angegeben durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 18 dargestellten Beispielprozesses 1800 gleichzeitig und/oder parallel durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 18 dargestellten Beispielprozesses 1800 von einer Vielzahl von Threads ausgeführt, die auf einem Speichermanager wie dem hierin zumindest in Verbindung mit 1 beschriebenen Speichermanager 106 ausgeführt werden.
  • In der folgenden Beschreibung werden zahlreiche spezifische Details aufgeführt, um ein gründlicheres Verständnis mindestens einer Ausführungsform zu ermöglichen. Einem Fachmann wird jedoch klar sein, dass die erfindungsgemäßen Konzepte auch ohne eines oder mehrere dieser spezifischen Details praktizierbar sind.
  • Rechenzentrum
  • 19 veranschaulicht ein beispielhaftes Rechenzentrum 1900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Rechenzentrum 1900, ohne darauf beschränkt zu sein, eine Rechenzentrum-Infrastrukturschicht 1910, eine Frameworkschicht 1920, eine Softwareschicht 1930 und eine Anwendungsschicht 1940.
  • In mindestens einer Ausführungsform, wie in 19 gezeigt, kann die Rechenzentrum-Infrastrukturschicht 1910 einen Ressourcenorchestrator 1912, gruppierte Rechenressourcen 1914 und Knoten-Rechenressourcen („Knoten-C.R.s“) 1916(1)-1916(N) beinhalten, wobei „N“ eine beliebige ganze, positive Zahl darstellt. In mindestens einer Ausführungsform können die Knoten-C.R.s 1916(1)-1916(N), ohne darauf beschränkt zu sein, eine beliebige Anzahl von Zentralverarbeitungseinheiten („CPUs“) oder anderen Prozessoren (einschließlich Beschleunigern, feldprogrammierbaren Gate-Arrays („FPGAs“), Datenverarbeitungseinheiten („DPUs“) in Netzwerkvorrichtungen, Grafikprozessoren usw.), Speichervorrichtungen (z.B. dynamischer Festspeicher), Speichervorrichtungen (z.B. Solid-State- oder Festplattenlaufwerke), Netzwerk-Eingabe-/Ausgabe-Geräte („NW E/A“), Netzwerk-Switches, virtuelle Maschinen („VMs“), Leistungsmodule und Kühlmodule usw. beinhalten. In mindestens einer Ausführungsform können ein oder mehrere Knoten-C.R.s unter den Knoten-C.R.s 1916(1)-1916(N) ein Server mit einer oder mehreren der vorstehend erwähnten Rechenressourcen sein.
  • In mindestens einer Ausführungsform können die gruppierten Rechenressourcen 1914 separate Gruppierungen von Knoten-C.R.s beinhalten, die in einem oder mehreren Racks (nicht dargestellt) untergebracht sind, oder in vielen Racks, die in Rechenzentren an verschiedenen geografischen Standorten untergebracht sind (ebenfalls nicht dargestellt). Separate Gruppierungen von Knoten-C.R.s innerhalb der gruppierten Rechenressourcen 1914 können gruppierte Rechen-, Netzwerk-, Speicher- oder Speicherressourcen beinhalten, die zur Unterstützung einer oder mehrerer Arbeitslasten konfiguriert oder zugewiesen werden können. In mindestens einer Ausführungsform können mehrere Knoten-C.R.s mit CPUs oder Prozessoren in einem oder mehreren Racks gruppiert sein, um Rechenressourcen zur Unterstützung einer oder mehrerer Arbeitslasten bereitzustellen. In mindestens einer Ausführungsform können ein oder mehrere Racks auch eine beliebige Anzahl von Leistungs- bzw. Stromversorgungsmodulen, Kühlmodulen und Netzwerk-Switches in beliebiger Kombination beinhalten.
  • In mindestens einer Ausführungsform kann der Ressourcenorchestrator 1912 einen oder mehrere Knoten-CRs 1916(1)-1916(N) und/oder gruppierte Rechenressourcen 1914 konfigurieren oder anderweitig steuern. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 1912 eine Software-Design-Infrastruktur („SDI“)-Verwaltungseinheit für das Rechenzentrum 1900 beinhalten. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 1912 Hardware, Software oder eine Kombination davon umfassen.
  • In mindestens einer Ausführungsform, wie in 19 gezeigt, beinhaltet die Frameworkschicht 1920, ohne Beschränkung darauf, einen Job-Scheduler 1932, einen Konfigurationsmanager 1934, einen Ressourcenverwalter 1936 und ein verteiltes Dateisystem 1938. In mindestens einer Ausführungsform kann die Frameworkschicht 1920 ein Framework zur Unterstützung der Software 1952 der Softwareschicht 1930 und/oder einer oder mehrerer Anwendung(en) 1942 der Anwendungsschicht 1940 beinhalten. In mindestens einer Ausführungsform können die Software 1952 oder die Anwendung(en) 1942 jeweils webbasierte Dienstsoftware oder Anwendungen beinhalten, wie sie beispielsweise von Amazon Web Services, Google Cloud und Microsoft Azure bereitgestellt werden. In mindestens einer Ausführungsform kann die Frameworkschicht 1920 eine Art von freiem und quelloffenem Software-Webanwendungs-Framework wie Apache SparkTM (nachstehend „Spark“) sein, das ein verteiltes Dateisystem 1938 für die Verarbeitung großer Datenmengen (z.B. „Big Data“) verwenden kann, ist aber nicht darauf beschränkt. In mindestens einer Ausführungsform kann der Job-Scheduler 1932 einen Spark-Treiber enthalten, um die Planung von Arbeitslasten zu erleichtern, die von verschiedenen Schichten des Rechenzentrums 1900 unterstützt werden. In mindestens einer Ausführungsform kann der Konfigurationsmanager 1934 in der Lage sein, verschiedene Schichten zu konfigurieren, wie beispielsweise die Softwareschicht 1930 und die Frameworkschicht 1920, einschließlich Spark und das verteilte Dateisystem 1938 zur Unterstützung der Verarbeitung großer Datenmengen. In mindestens einer Ausführungsform kann der Ressourcenverwalter 1936 in der Lage sein, geclusterte oder gruppierte Rechenressourcen zu verwalten, die zur Unterstützung des verteilten Dateisystems 1938 und des Job-Schedulers 1932 gemappt oder zugeordnet sind. In mindestens einer Ausführungsform können geclusterte oder gruppierte Rechenressourcen die gruppierten Rechenressourcen 1914 auf der Rechenzentrums-Infrastrukturschicht 1910 umfassen. In mindestens einer Ausführungsform kann sich der Ressourcenverwalter 1936 mit dem Ressourcenorchestrator 1912 koordinieren, um diese gemappten oder zugeordneten Rechenressourcen zu verwalten.
  • In mindestens einer Ausführungsform kann die in der Softwareschicht 1930 enthaltene Software 1952 Software enthalten, die von mindestens Teilen der Knoten C.R.s 1916(1)-1916(N), den gruppierten Rechenressourcen 1914 und/oder dem verteilten Dateisystem 1938 der Frameworkschicht 1920 verwendet wird. Eine oder mehrere Arten von Software können Internet-Webseiten-Suchsoftware, E-Mail-Virenscan-Software, Datenbanksoftware und Software für Streaming-Videoinhalte umfassen, ohne darauf beschränkt zu sein.
  • In mindestens einer Ausführungsform kann (können) die in der Anwendungsschicht 1940 enthaltene(n) Anwendung(en) 1942 eine oder mehrere Arten von Anwendungen beinhalten, die von mindestens Teilen der Knoten C.R.s 1916(1)-1916(N), den gruppierten Rechenressourcen 1914 und/oder dem verteilten Dateisystem 1938 der Rahmenschicht 1920 verwendet werden. Mindestens eine oder mehrere Arten von Anwendungen können, ohne Beschränkung darauf, CUDA-Anwendungen beinhalten.
  • In mindestens einer Ausführungsform können der Konfigurationsmanager 1934, der Ressourcenverwalter 1936 und der Ressourcenorchestrator 1912 eine beliebige Anzahl und Art von selbstmodifizierenden Aktionen implementieren, die auf einer beliebigen Menge und Art von Daten basieren, die auf jede technisch mögliche Weise erfasst werden. In mindestens einer Ausführungsform können selbstmodifizierende Aktionen einen Rechenzentrumsbetreiber des Rechenzentrums 1900 davon entlasten, möglicherweise schlechte Konfigurationsentscheidungen zu treffen und möglicherweise nicht ausgelastete und/oder schlecht leistende Teile eines Rechenzentrums zu vermeiden.
  • In mindestens einer Ausführungsform wird mindestens eine in Bezug auf 19 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens eine der gruppierten Rechenressourcen 1914 und der Knoten C.R. 1916(1-N) verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens eines der gruppierten Rechenressourcen 1914 und der Knoten-C.R. 1916(1-N) verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens eine der gruppierten Rechenressourcen 1914 und der Knoten-C.R. 1916(1-N) verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens eines der gruppierten Rechenressourcen 1914 und der Knoten-C.R. 1916(1-N) verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens eines der gruppierten Rechenressourcen 1914 und der Knoten-C.R. 1916(1-N) verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • Rechnerbasierte Systeme
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte rechnerbasierte Systeme, die zur Implementierung mindestens einer Ausführungsform verwendet werden können.
  • 20 veranschaulicht ein Verarbeitungssystem 2000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Verarbeitungssystem 2000 einen oder mehrere Prozessoren 2002 und einen oder mehrere Grafikprozessoren 2008, und kann ein Einzelprozessor-Desktop-System, ein Multiprozessor-Workstation-System oder ein Serversystem mit einer großen Anzahl von Prozessoren 2002 oder Prozessorkernen 2007 sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 2000 eine Verarbeitungsplattform, die in eine integrierte Systemon-a-Chip („SoC“)-Schaltung zur Verwendung in mobilen, tragbaren oder eingebetteten Geräten integriert ist.
  • In mindestens einer Ausführungsform kann das Verarbeitungssystem 2000 eine serverbasierte Spielplattform, eine Spielkonsole, eine Medienkonsole, eine mobile Spielkonsole, eine Handheld-Spielkonsole oder eine Online-Spielkonsole beinhalten oder in diese integriert sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 2000 ein Mobiltelefon, ein Smartphone, ein Tablet-Computergerät oder ein mobiles Internetgerät. In mindestens einer Ausführungsform kann das Verarbeitungssystem 2000 auch ein Wearable-Gerät, wie z.B. ein Smart Watch-Wearable-Gerät, eine intelligente Brille, ein Augmented-Reality-Gerät oder ein Virtual-Reality-Gerät beinhalten, mit diesem gekoppelt oder in dieses integriert sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 2000 ein Fernseh- oder Set-Top-Box-Gerät mit einem oder mehreren Prozessoren 2002 und einer grafischen Oberfläche, die von einem oder mehreren Grafikprozessoren 2008 erzeugt wird.
  • In mindestens einer Ausführungsform enthalten ein oder mehrere Prozessoren 2002 jeweils einen oder mehrere Prozessorkerne 2007 zur Verarbeitung von Anweisungen, die bei ihrer Ausführung Operationen für System- und Anwendersoftware durchführen. In mindestens einer Ausführungsform ist jeder von einem oder mehreren Prozessorkernen 2007 so konfiguriert, dass er einen bestimmten Befehlssatz 2009 verarbeitet. In mindestens einer Ausführungsform kann der Befehlssatz 2009 Complex Instruction Set Computing („CISC“), Reduced Instruction Set Computing („RISC“) oder das Rechnen über Very Long Instruction Word („VLIW“) erleichtern. In mindestens einer Ausführungsform können die Prozessorkerne 2007 jeweils einen anderen Befehlssatz 2009 verarbeiten, der Anweisungen enthalten kann, um die Emulation anderer Befehlssätze zu erleichtern. In mindestens einer Ausführungsform kann der Prozessorkern 2007 auch andere Verarbeitungsvorrichtungen enthalten, wie z.B. einen digitalen Signalprozessor („DSP“).
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 2002 einen Cachespeicher („Cache“) 2004. In mindestens einer Ausführungsform kann der Prozessor 2002 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform wird der Cachespeicher von verschiedenen Komponenten des Prozessors 2002 gemeinsam genutzt. In mindestens einer Ausführungsform verwendet der Prozessor 2002 auch einen externen Cache (z.B. einen Level 3 („L3“)-Cache oder Last Level Cache („LLC“)) (nicht dargestellt), der von den Prozessorkernen 2007 unter Verwendung bekannter Cache-Kohärenztechniken gemeinsam genutzt werden kann. In mindestens einer Ausführungsform ist zusätzlich eine Registerdatei 2006 in dem Prozessor 2002 enthalten, die verschiedene Arten von Registern zum Speichern unterschiedlicher Datentypen (z.B. Ganzzahlregister, Gleitkommaregister, Statusregister und ein Befehlszeigerregister) enthalten kann. In mindestens einer Ausführungsform kann die Registerdatei 2006 Universalregister oder andere Register enthalten.
  • In mindestens einer Ausführungsform ist/sind ein oder mehrere Prozessor(en) 2002 mit einem oder mehreren Schnittstellenbus(en) 2010 gekoppelt, um Kommunikationssignale wie Adress-, Daten- oder Steuersignale zwischen dem Prozessor 2002 und anderen Komponenten in dem Verarbeitungssystem 2000 zu übertragen. In mindestens einer Ausführungsform kann der Schnittstellenbus 2010 ein Prozessorbus sein, wie z.B. eine Version eines Direct Media Interface („DMI“)-Busses. In mindestens einer Ausführungsform ist der Schnittstellenbus 2010 nicht auf einen DMI-Bus beschränkt und kann einen oder mehrere Peripheral Component Interconnect-Busse (z.B. „PCI“, PCI Express („PCIe“)), Speicherbusse oder andere Arten von Schnittstellenbussen beinhalten. In mindestens einer Ausführungsform beinhalten der/die Prozessor(en) 2002 einen integrierten Speichercontroller 2016 und einen Plattformcontroller-Hub 2030. In mindestens einer Ausführungsform erleichtert der Speichercontroller 2016 die Kommunikation zwischen einem Speichervorrichtung und anderen Komponenten des Verarbeitungssystems 2000, während der Plattformcontroller-Hub („PCH“) 2030 Verbindungen zu Eingabe/Ausgabe-Geräten („E/A“) über einen lokalen E/A-Bus bereitstellt.
  • In mindestens einer Ausführungsform kann die Speichervorrichtung 2020 eine dynamische Direktzugriffsspeicher („DRAM“)-Vorrichtung, eine statische Direktzugriffsspeicher („SRAM“)-Vorrichtung, eine Flash-Speicher-Vorrichtung, eine Phasenwechsel-Speicher-Vorrichtung oder eine andere Speichervorrichtung mit geeigneter Leistung sein, um als Prozessorspeicher zu dienen. In mindestens einer Ausführungsform kann die Speichervorrichtung 2020 als Systemspeicher für das Verarbeitungssystem 2000 arbeiten, um Daten 2022 und Anweisungen 2021 zur Verwendung zu speichern, wenn ein oder mehrere Prozessoren 2002 eine Anwendung oder einen Prozess ausführen. In mindestens einer Ausführungsform koppelt der Speichercontroller 2016 auch mit einem optionalen externen Grafikprozessor 2012, der mit einem oder mehreren Grafikprozessoren 2008 in den Prozessoren 2002 kommunizieren kann, um Grafik- und Medienoperationen durchzuführen. In mindestens einer Ausführungsform kann eine Anzeigevorrichtung 2011 mit dem/den Prozessor(en) 2002 verbunden sein. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 2011 eine oder mehrere interne Anzeigevorrichtungen, wie in einem mobilen elektronischen Gerät oder einem Laptop, oder eine externe Anzeigevorrichtung, die über eine Anzeigeschnittstelle (z.B. DisplayPort usw.) angeschlossen ist, beinhalten. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 2011 eine kopfmontierte Anzeige („HMD“), wie beispielsweise eine stereoskopische Anzeigevorrichtung zur Verwendung in Anwendungen der virtuellen Realität („VR“) oder der erweiterten Realität („AR“), beinhalten.
  • In mindestens einer Ausführungsform ermöglicht der Plattformcontroller-Hub 2030 die Verbindung von Peripheriegeräten mit der Speichervorrichtung 2020 und dem Prozessor 2002 über einen Hochgeschwindigkeits-E/A-Bus. In mindestens einer Ausführungsform beinhalten die E/A-Peripheriegeräte, ohne darauf beschränkt zu sein, einen Audiocontroller 2046, einen Netzwerkcontroller 2034, eine Firmware-Schnittstelle 2028, einen drahtlosen Transceiver 2026, Berührungssensoren 2025 und eine Datenspeichervorrichtung 2024 (z.B. ein Festplattenlaufwerk, einen Flash-Speicher usw.). In mindestens einer Ausführungsform kann die Datenspeichervorrichtung 2024 über eine Speicherschnittstelle (z.B. SATA) oder über einen Peripheriebus, wie PCI oder PCIe, verbunden sein. In mindestens einer Ausführungsform können die Berührungssensoren 2025 Touchscreen-Sensoren, Drucksensoren oder Fingerabdrucksensoren beinhalten. In mindestens einer Ausführungsform kann der drahtlose Transceiver 2026 ein Wi-Fi-Transceiver, ein Bluetooth-Transceiver oder ein Mobilfunk-Transceiver wie beispielsweise ein 3G-, 4G- oder Long Term Evolution („LTE“)-Transceiver sein. In mindestens einer Ausführungsform ermöglicht die Firmware-Schnittstelle 2028 eine Kommunikation mit System-Firmware und kann z.B. eine einheitliche erweiterbare Firmware-Schnittstelle („UEFI“) sein. In mindestens einer Ausführungsform kann der Netzwerkcontroller 2034 eine Netzwerkverbindung zu einem kabelgebundenen Netzwerk ermöglichen. In mindestens einer Ausführungsform koppelt ein Hochleistungs-Netzwerkcontroller (nicht dargestellt) mit dem Schnittstellenbus 2010. In mindestens einer Ausführungsform ist der Audiocontroller 2046 ein Mehrkanal-High-Definition-Audiocontroller. In mindestens einer Ausführungsform enthält das Verarbeitungssystem 2000 einen optionalen Legacy-E/A-Controller 2040 zur Kopplung von Legacy-Geräten (z.B. Personal System 2 („PS/2“)) mit dem Verarbeitungssystem 2000. In mindestens einer Ausführungsform kann der Plattformcontroller-Hub 2030 auch mit einem oder mehreren Universal Serial Bus („USB“)-Controllern 2042 verbinden, die Eingabevorrichtungen, wie z.B. Tastatur- und Mauskombinationen 2043, eine Kamera 2044 oder andere USB-Eingabevorrichtungen verbinden.
  • In mindestens einer Ausführungsform kann eine Instanz des Speichercontrollers 2016 und des Plattformcontroller-Hubs 2030 in einen diskreten externen Grafikprozessor, wie beispielsweise den externen Grafikprozessor 2012, integriert sein. In mindestens einer Ausführungsform können der Plattformcontroller-Hub 2030 und/oder der Speichercontroller 2016 extern zu einem oder mehreren Prozessor(en) 2002 sein. In mindestens einer Ausführungsform kann das Verarbeitungssystem 2000 beispielsweise einen externen Speichercontroller 2016 und einen Plattformcontroller-Hub 2030 enthalten, der als ein Speichercontroller-Hub und Peripheriecontroller-Hub innerhalb eines System-Chipsatzes konfiguriert sein kann, der mit dem/den Prozessor(en) 2002 in Verbindung steht.
  • In mindestens einer Ausführungsform wird mindestens eine in 20 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2002 oder eines externen Grafikprozessors 2012 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2002 oder eines externen Grafikprozessors 2012 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2002 oder eines externen Grafikprozessors 2012 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2002 oder eines externen Grafikprozessors 2012 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2002 oder eines externen Grafikprozessors 2012 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 21 veranschaulicht ein Computersystem 2100 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann das Computersystem 2100 ein System mit miteinander verbundenen Vorrichtungen und Komponenten, ein SOC oder eine Kombination davon sein. In mindestens einer Ausführungsform ist das Computersystem 2100 mit einem Prozessor 2102 ausgebildet, der Ausführungseinheiten zum Ausführen einer Anweisung enthalten kann. In mindestens einer Ausführungsform kann das Computersystem 2100, ohne Beschränkung darauf, eine Komponente, wie beispielsweise den Prozessor 2102, beinhalten, um Ausführungseinheiten einschließlich Logik zur Durchführung von Algorithmen zur Verarbeitung von Daten einzusetzen. In mindestens einer Ausführungsform kann das Computersystem 2100 Prozessoren beinhalten, wie z.B. die PENTIUMO-Prozessorfamilie, XeonTM, Itanium®, XScaleTM und/oder StrongARMTM, Intel® Core™ oder Intel® Nervana™-Mikroprozessoren, die von der Intel Corporation aus Santa Clara, Kalifornien, erhältlich sind, obwohl auch andere Systeme (einschließlich PCs mit anderen Mikroprozessoren, technische Workstations, Set-Top-Boxen und dergleichen) verwendet werden können. In mindestens einer Ausführungsform kann das Computersystem 2100 eine Version des Betriebssystems WINDOWS ausführen, das von der Microsoft Corporation in Redmond, Washington, erhältlich ist, obwohl auch andere Betriebssysteme (z.B. UNIX und Linux), eingebettete Software und/oder grafische Benutzeroberflächen verwendet werden können.
  • In mindestens einer Ausführungsform kann das Computersystem 2100 in anderen Vorrichtungen wie Handheld-Geräten und eingebetteten Anwendungen verwendet werden. Einige Beispiele für Handheld-Geräte sind Mobiltelefone, Internetprotokollgeräte, Digitalkameras, persönliche digitale Assistenten („PDAs“) und Handheld-PCs. In mindestens einer Ausführungsform können eingebettete Anwendungen einen Mikrocontroller, einen digitalen Signalprozessor (DSP), ein SoC, Netzwerkcomputer („NetPCs“), Set-Top-Boxen, Netzwerk-Hubs, Wide-Area-Network („WAN“)-Switches oder jedes andere System umfassen, das eine oder mehrere Anweisungen ausführen kann.
  • In mindestens einer Ausführungsform kann das Computersystem 2100, ohne Beschränkung darauf, einen Prozessor 2102 enthalten, der, ohne Beschränkung darauf, eine oder mehrere Ausführungseinheiten 2108 enthalten kann, die so konfiguriert sein können, dass sie ein Compute Unified Device Architecture („CUDA“)-Programm (CUDA® wird von der NVIDIA Corporation in Santa Clara, CA, entwickelt) ausführen. In mindestens einer Ausführungsform ist ein CUDA-Programm mindestens ein Teil einer Softwareanwendung, die in einer CUDA-Programmiersprache geschrieben ist. In mindestens einer Ausführungsform ist das Computersystem 2100 ein Einzelprozessor-Desktop- oder ein Serversystem. In mindestens einer Ausführungsform kann das Computersystem 2100 ein Multiprozessorsystem sein. In mindestens einer Ausführungsform kann der Prozessor 2102, ohne Beschränkung darauf, einen CISC-Mikroprozessor, einen RISC-Mikroprozessor, einen VLIW-Mikroprozessor, einen Prozessor, der eine Kombination von Befehlssätzen implementiert, oder eine beliebige andere Prozessoreinheit, wie z.B. einen digitalen Signalprozessor, beinhalten. In mindestens einer Ausführungsform kann der Prozessor 2102 mit einem Prozessorbus 2110 gekoppelt sein, der Datensignale zwischen dem Prozessor 2102 und anderen Komponenten in dem Computersystem 2100 übertragen kann.
  • In mindestens einer Ausführungsform kann der Prozessor 2102, ohne Beschränkung darauf, einen internen Level 1 („L1“)-Cachespeicher („Cache“) 2104 enthalten. In mindestens einer Ausführungsform kann der Prozessor 2102 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform kann sich der Cachespeicher außerhalb des Prozessors 2102 befinden. In mindestens einer Ausführungsform kann der Prozessor 2102 auch eine Kombination aus sowohl internen als auch externen Caches enthalten. In mindestens einer Ausführungsform kann eine Registerdatei 2106 verschiedene Arten von Daten in verschiedenen Registern, einschließlich, ohne Beschränkung darauf, Ganzzahlregister, Gleitkommaregister, Statusregister und Befehlszeigerregister, speichern.
  • In mindestens einer Ausführungsform befindet sich die Ausführungseinheit 2108, einschließlich, ohne Beschränkung darauf, von Logik zur Durchführung von Ganzzahl- und Gleitkommaoperationen, ebenfalls in dem Prozessor 2102. Der Prozessor 2102 kann auch einen Nur-Lese-Speicher („ROM“) für Mikrocode („ucode“) enthalten, der Mikrocode für bestimmte Makrobefehle speichert. In mindestens einer Ausführungsform kann die Ausführungseinheit 2108 Logik zur Verarbeitung eines gepackten Befehlssatzes 2109 enthalten. In mindestens einer Ausführungsform können durch Aufnahme des gepackten Befehlssatzes 2109 in einen Befehlssatz eines Universalprozessors 2102 zusammen mit zugehörigen Schaltkreisen zur Ausführung von Anweisungen Operationen, die von vielen Multimedia-Anwendungen verwendet werden, unter Verwendung gepackter Daten in einem Universalprozessor 2102 durchgeführt werden. In mindestens einer Ausführungsform können viele Multimedia-Anwendungen beschleunigt und effizienter ausgeführt werden, indem die volle Breite des Datenbusses eines Prozessors für die Ausführung von Operationen mit gepackten Daten genutzt wird, welches die Notwendigkeit eliminieren kann, kleinere Dateneinheiten über den Datenbus eines Prozessors zu übertragen, um eine oder mehrere Operationen auf bzw. mit einem Datenelement nach dem anderen durchzuführen.
  • n mindestens einer Ausführungsform kann die Ausführungseinheit 2108 auch in Mikrocontrollern, eingebetteten Prozessoren, Grafikvorrichtungen, DSPs und anderen Arten von Logikschaltungen verwendet werden. In mindestens einer Ausführungsform kann das Computersystem 2100, ohne Beschränkung darauf, einen Speicher 2120 enthalten. In mindestens einer Ausführungsform kann der Speicher 2120 als eine DRAM-Vorrichtung, eine SRAM-Vorrichtung, eine Flash-Speicher-Vorrichtung oder eine andere Speichervorrichtung implementiert sein. Der Speicher 2120 kann Anweisung(en) 2119 und/oder Daten 2121 speichern, die durch Datensignale repräsentiert werden, die von dem Prozessor 2102 ausgeführt werden können.
  • n mindestens einer Ausführungsform kann ein Systemlogikchip mit dem Prozessorbus 2110 und dem Speicher 2120 gekoppelt sein. In mindestens einer Ausführungsform kann der Systemlogikchip, ohne Beschränkung darauf, einen Speichercontroller-Hub („MCH“) 2116 enthalten, und kann der Prozessor 2102 mit dem MCH 2116 über den Prozessorbus 2110 kommunizieren. In mindestens einer Ausführungsform kann der MCH 2116 einen Speicherpfad 2118 mit hoher Bandbreite zu dem Speicher 2120 zur Befehls- und Datenspeicherung und zur Speicherung von Grafikbefehlen, Daten und Texturen bereitstellen. In mindestens einer Ausführungsform kann der MCH 2116 Datensignale zwischen dem Prozessor 2102, dem Speicher 2120 und anderen Komponenten in dem Computersystem 2100 leiten und Datensignale zwischen dem Prozessorbus 2110, dem Speicher 2120 und einer System-E/A2122 überbrücken. In mindestens einer Ausführungsform kann der Systemlogikchip einen Grafik-Port zur Kopplung mit einem Grafikcontroller bereitstellen. In mindestens einer Ausführungsform kann der MCH 2116 über einen Speicherpfad 2118 mit hoher Bandbreite mit dem Speicher 2120 gekoppelt sein, und kann die Grafik-/ Videokarte 2112 über eine Accelerated Graphics Port („AGP“)-Verbindung bzw. Zwischenverbindung bzw. Interconnect 2114 mit dem MCH 2116 gekoppelt sein.
  • In mindestens einer Ausführungsform kann das Computersystem 2100 einen System-E/A-Bus 2122 verwenden, der ein proprietärer Hub-Schnittstellenbus ist, um den MCH 2116 mit dem E/A-Controller-Hub („ICH“) 2130 zu koppeln. In mindestens einer Ausführungsform kann der ICH 2130 direkte Verbindungen zu einigen E/A-Geräten über einen lokalen E/A-Bus bereitstellen. In mindestens einer Ausführungsform kann der lokale E/A-Bus, ohne Beschränkung darauf, einen Hochgeschwindigkeits-E/A-Bus zur Verbindung von Peripheriegeräten mit dem Speicher 2120, einem Chipsatz und dem Prozessor 2102 umfassen. Beispiele können, ohne Beschränkung darauf, einen Audiocontroller 2129, einen Firmware-Hub („Flash-BIOS“) 2028, einen drahtlosen Transceiver 2126, einen Datenspeicher 2124, einen Legacy-E/A-Controller 2123, der eine Benutzereingabeschnittstelle 2125 und eine Tastaturschnittstelle enthält, einen seriellen Erweiterungs-Port 2127, wie z.B. ein USB, und einen Netzwerkcontroller 2134 beinhalten. Der Datenspeicher 2124 kann ein Festplattenlaufwerk, ein Diskettenlaufwerk, ein CD-ROM-Gerät, eine Flash-Speicher-Vorrichtung oder eine andere Massenspeichervorrichtung beinhalten.
  • In mindestens einer Ausführungsform veranschaulicht 21 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 21 ein beispielhaftes SoC veranschaulichen. In mindestens einer Ausführungsform können in 21 dargestellte Vorrichtungen mit proprietären Zwischenverbindungen bzw. Interconnects, standardisierten Interconnects (z.B. PCIe) oder einer Kombination davon verbunden sein. In mindestens einer Ausführungsform sind eine oder mehrere Komponenten des Systems 2100 unter Verwendung von Compute-Express-Link („CXL“)-Interconnects miteinander verbunden.
  • In mindestens einer Ausführungsform wird mindestens eine in 21 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird der Prozessor 2102 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird der Prozessor 2102 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 2102 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 2102 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird der Prozessor 2102 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 22 veranschaulicht ein System 2200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist das System 2200 eine elektronische Vorrichtung, das einen Prozessor 2210 verwendet. In mindestens einer Ausführungsform kann das System 2200 zum Beispiel, und ohne Beschränkung darauf, ein Notebook, ein Tower-Server, ein Rack-Server, ein Blade-Server, eine EDGE-Vorrichtung, kommunikativ gekoppelt an ein oder mehrere Dienstanbieter vor Ort oder in der Cloud, ein Laptop, ein Desktop, ein Tablet, eine mobile Vorrichtung, ein Telefon, ein eingebetteter Computer oder eine beliebige andere geeignete elektronische Vorrichtung sein.
  • In mindestens einer Ausführungsform kann das System 2200, ohne Beschränkung darauf, einen Prozessor 2210 enthalten, der mit einer beliebigen Anzahl oder Art von Komponenten, Peripheriegeräten, Modulen oder Geräten bzw. Vorrichtungen kommunikativ gekoppelt ist. In mindestens einer Ausführungsform ist der Prozessor 2210 unter Verwendung eines Busses oder einer Schnittstelle, wie z.B. ein I2C-Bus, ein System Management-Bus („SMBus“), ein Low Pin Count-Bus („LPC“), ein Serial Peripheral Interface („SPI“), ein High Definition Audio-Bus („HDA“), ein Serial Advance Technology Attachment-Bus („SATA“), ein USB-Bus (Versionen 1, 2, 3) oder ein Universal Asynchronous Receiver/Transmitter-Bus („UART“), gekoppelt. In mindestens einer Ausführungsform veranschaulicht 22 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 22 ein beispielhaftes SoC darstellen. In mindestens einer Ausführungsform können die in 22 dargestellten Vorrichtungen mit proprietären Interconnects, standardisierten Interconnects (z.B. PCIe) oder einer Kombination davon miteinander verbunden sein. In mindestens einer Ausführungsform sind eine oder mehrere Komponenten von 22 unter Verwendung von CXL-Interconnects miteinander verbunden.
  • In mindestens einer Ausführungsform kann 22 eine Anzeige 2224, einen Touchscreen 2225, ein Touchpad 2230, eine Near Field Communications („NFC“)-Einheit 2245, einen Sensor-Hub 2240, einen Wärmesensor 2246, einen Express-Chipsatz („EC“) 2235, ein Trusted Platform Module („TPM“) 2238, BIOS/Firmware/Flash-Speicher („BIOS, FW Flash“) 2222, einen DSP 2260, eine Solid State Disk („SSD“) oder eine Festplatte („HDD“) 2220, eine Wireless Local Area Network („WLAN“)-Einheit 2250, eine Bluetooth-Einheit 2252, eine Wireless Wide Area Network („WWAN“)-Einheit 2256, ein Global Positioning System („GPS“) 2255, eine Kamera („USB 3.0-Kamera“) 2254, wie z.B. eine USB 3.0-Kamera, oder eine Low Power Double Data Rate („LPDDR“)-Speichereinheit („LPDDR3“) 2215, die z.B. in dem LPDDR3-Standard implementiert ist, beinhalten. Jede dieser Komponenten kann in jeder geeigneten Weise implementiert sein.
  • In mindestens einer Ausführungsform können andere Komponenten über die vorstehend beschriebenen Komponenten kommunikativ mit dem Prozessor 2210 verbunden sein. In mindestens einer Ausführungsform können ein Beschleunigungsmesser 2241, ein Umgebungslichtsensor („ALS“) 2242, ein Kompass 2243 und ein Gyroskop 2244 kommunikativ mit dem Sensor-Hub 2240 gekoppelt sein. In mindestens einer Ausführungsform können ein Wärmesensor 1239, ein Lüfter 2237, eine Tastatur 2246 und ein Touchpad 2230 kommunikativ mit dem EC 2235 gekoppelt sein. In mindestens einer Ausführungsform können ein Lautsprecher 2263, ein Kopfhörer 2264 und ein Mikrofon („mic“) 2265 kommunikativ mit einer Audioeinheit („audio codec and dass d amp“) 2264 gekoppelt sein, die ihrerseits kommunikativ mit dem DSP 2260 gekoppelt sein kann. In mindestens einer Ausführungsform kann die Audioeinheit 2264 beispielsweise, und ohne Beschränkung darauf, einen Audio-Codierer/-Decodierer („codec“) und einen Verstärker der Klasse D beinhalten. In mindestens einer Ausführungsform kann eine SIM-Karte („SIM“) 2257 kommunikativ mit der WWAN-Einheit 2256 gekoppelt sein. In mindestens einer Ausführungsform können Komponenten wie beispielsweise die WLAN-Einheit 2250 und die Bluetooth-Einheit 2252 sowie die WWAN-Einheit 2256 in einem Next Generation Form Factor („NGFF“) implementiert sein.
  • In mindestens einer Ausführungsform wird mindestens eine in 22 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird der Prozessor 2210 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird der Prozessor 2210 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 2210 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 2210 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird der Prozessor 2210 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 23 veranschaulicht eine beispielhafte integrierte Schaltung 2300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die beispielhafte integrierte Schaltung 2300 ein SoC, das unter Verwendung eines oder mehrerer IP-Cores hergestellt sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 2300 einen oder mehrere Anwendungsprozessor(en) 2305 (z.B. CPUs), mindestens einen Grafikprozessor 2310 und kann zusätzlich einen Bildprozessor 2315 und/oder einen Videoprozessor 2320 enthalten, von denen jeder ein modularer IP-Kern sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 2300 eine Peripherie- oder Bus-Logik einschließlich eines USB-Controllers 2325, eines UART-Controllers 2330, eines SPI/SDIO-Controllers 2335 und eines I2S/I2C-Controllers 2340. In mindestens einer Ausführungsform kann die integrierte Schaltung 2300 eine Anzeigevorrichtung 2345 enthalten, die mit einem oder mehreren eines High-Definition Multimedia Interface („HDMI“)-Controllers 2350 und einer Mobile Industry Processor Interface („MIPI“)-Anzeigeschnittstelle 2355 verbunden ist. In mindestens einer Ausführungsform kann der Speicher durch ein Flash-Speicher-Subsystem 2360 mit Flash-Speicher und einem Flash-Speichercontroller bereitgestellt sein.
  • In mindestens einer Ausführungsform kann eine Speicherschnittstelle über einen Speichercontroller 2365 für den Zugriff auf SDRAM- oder SRAM-Speichervorrichtungen bereitgestellt sein. In mindestens einer Ausführungsform enthalten einige integrierte Schaltungen zusätzlich eine eingebettete Sicherheits-Engine 2370.
  • In mindestens einer Ausführungsform wird mindestens eine in 23 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens einer der folgenden Prozessoren verwendet: Anwendungsprozessor 2305, Grafikprozessor 2310, Bildprozessor 2315 oder Videoprozessor 2320, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren Anwendungsprozessor 2305, Grafikprozessor 2310, Bildprozessor 2315 oder Videoprozessor 2320 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Anwendungsprozessor 2305, ein Grafikprozessor 2310, ein Bildprozessor 2315 oder ein Videoprozessor 2320 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Anwendungsprozessor 2305, ein Grafikprozessor 2310, ein Bildprozessor 2315 oder ein Videoprozessor 2320 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron von einen oder mehrere Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren Anwendungsprozessor 2305, Grafikprozessor 2310, Bildprozessor 2315 oder Videoprozessor 2320 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das Beispiel-Computersystem 100, das Beispiel-Computersystem 200, das Beispiel-Computersystem 300, das Beispiel-Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800 und den Beispielprozess 100 beschrieben ist, Beispielprozess 700, Beispielprozess 800, Beispieldatenfluss 900, Beispiel erster Teil eines Datenflusses 1000, Beispiel zweiter Teil eines Datenflusses 1100, Beispiel dritter Teil eines Datenflusses 1200, Beispielprozess 1300, Beispielcomputersystem 1400, Beispielcomputersystem 1500, Beispielprozess 1600, Beispielcomputersystem 1700, und/oder Beispielprozess 1800.
  • 24 veranschaulicht ein Computer- bzw. Rechensystem 2400, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das Rechensystem 2400 ein Verarbeitungssubsystem 2401 mit einem oder mehreren Prozessor(en) 2402 und einem Systemspeicher 2404, der über einen Zwischenverbindungspfad bzw. Verbindungspfad kommuniziert, der einen Speicher-Hub 2405 enthalten kann. In mindestens einer Ausführungsform kann der Speicher-Hub 2405 eine separate Komponente innerhalb einer Chipsatzkomponente sein oder in einen oder mehrere Prozessor(en) 2402 integriert sein. In mindestens einer Ausführungsform ist der Speicher-Hub 2405 mit einem E/A-Subsystem 2411 über eine Kommunikationsverbindung 2406 gekoppelt. In mindestens einer Ausführungsform beinhaltet das E/A-Subsystem 2411 einen E/A-Hub 2407, der es dem Rechensystem 2400 ermöglichen kann, Eingaben von einer oder mehreren Eingabevorrichtung(en) 2408 zu empfangen. In mindestens einer Ausführungsform kann der E/A-Hub 2407 einen Anzeigecontroller, der in einem oder mehreren Prozessor(en) 2402 enthalten sein kann, in die Lage versetzen, Ausgaben an eine oder mehrere Anzeigevorrichtung(en) 2410A zu liefern. In mindestens einer Ausführungsform kann/können ein oder mehrere Anzeigevorrichtung(en) 2410A, die mit dem E/A-Hub 2407 gekoppelt sind, eine lokale, interne oder eingebettete Anzeigevorrichtung beinhalten.
  • In mindestens einer Ausführungsform beinhaltet das Verarbeitungssubsystem 2401 einen oder mehrere Parallelprozessor(en) 2412, der/die über einen Bus oder eine andere Kommunikationsverbindung 2413 mit dem Speicher-Hub 2405 verbunden ist/sind. In mindestens einer Ausführungsform kann die Kommunikationsverbindung 2413 eine einer beliebigen Anzahl von standardbasierten Kommunikationsverbindungstechnologien oder -protokollen sein, wie z.B., aber nicht beschränkt auf, PCIe, oder kann eine herstellerspezifische Kommunikationsschnittstelle oder eine Kommunikationsstruktur bzw. ein Kommunikations-Fabric sein. In mindestens einer Ausführungsform bilden ein oder mehrere Parallelprozessor(en) 2412 ein rechnerisch fokussiertes Parallel- oder Vektor-Verarbeitungssystem, das eine große Anzahl von Verarbeitungskernen und/oder Verarbeitungsclustern umfassen kann, wie z.B. einen Prozessor mit vielen integrierten Kernen. In mindestens einer Ausführungsform bilden ein oder mehrere Parallelprozessor(en) 2412 ein Grafikverarbeitungs-Subsystem, das Pixel an eine oder mehrere Anzeigevorrichtung(en) 2410A ausgeben kann, die über den E/A-Hub 2407 gekoppelt sind. In mindestens einer Ausführungsform können ein oder mehrere Parallelprozessor(en) 2412 auch einen Anzeigecontroller und eine Anzeigeschnittstelle (nicht dargestellt) enthalten, um eine direkte Verbindung zu einer oder mehreren Anzeigevorrichtung(en) 2410B zu ermöglichen.
  • In mindestens einer Ausführungsform kann eine Systemspeichereinheit 2414 mit dem E/A-Hub 2407 verbunden sein, um einen Speichermechanismus für das Rechensystem 2400 bereitzustellen. In mindestens einer Ausführungsform kann ein E/A-Switch 2416 verwendet werden, um einen Schnittstellenmechanismus bereitzustellen, der Verbindungen zwischen dem E/A-Hub 2407 und anderen Komponenten ermöglicht, wie z.B. einem Netzwerkadapter 2418 und/oder einem drahtlosen Netzwerkadapter 2419, der in eine Plattform integriert sein kann, und verschiedenen anderen Vorrichtungen, die über ein oder mehrere Add-in-Vorrichtungen 2420 hinzugefügt werden können. In mindestens einer Ausführungsform kann der Netzwerkadapter 2418 ein Ethernet-Adapter oder ein anderer kabelgebundener Netzwerkadapter sein. In mindestens einer Ausführungsform kann der drahtlose Netzwerkadapter 2419 ein oder mehrere Wi-Fi-, Bluetooth-, NFC- oder andere Netzwerkvorrichtungen umfassen, die ein oder mehrere drahtlose Funkvorrichtungen enthalten.
  • In mindestens einer Ausführungsform kann das Rechensystem 2400 weitere, nicht explizit dargestellte Komponenten enthalten, darunter USB- oder andere Portverbindungen, optische Speicherlaufwerke, Videoaufnahmevorrichtungen und dergleichen, die ebenfalls mit dem E/A-Hub 2407 verbunden sein können. In mindestens einer Ausführungsform können Kommunikationspfade, die verschiedene Komponenten in 24 miteinander verbinden, unter Verwendung beliebiger geeigneter Protokolle implementiert sein, wie z.B. PCI-basierte Protokolle (z.B. PCIe) oder andere Bus- oder Punktzu-Punkt-Kommunikationsschnittstellen und/oder Protokolle, wie z.B. ein NVLink-Hochgeschwindigkeits-Interconnect oder Interconnect-Protokolle.
  • In mindestens einer Ausführungsform integrieren ein oder mehrere Parallelprozessor(en) 2412 Schaltkreise, die für Grafik- und Videoverarbeitung optimiert sind, einschließlich z.B. Videoausgabeschaltungen, und bilden eine Grafikverarbeitungseinheit („GPU“). In mindestens einer Ausführungsform integrieren ein oder mehrere Parallelprozessoren) 2412 Schaltkreise, die für allgemeine Verarbeitung optimiert sind. In mindestens einer Ausführungsform können Komponenten des Rechensystems 2400 mit einem oder mehreren anderen Systemelementen auf einem einzigen integrierten Schaltkreis integriert sein. Zum Beispiel können in mindestens einer Ausführungsform ein oder mehrere Parallelprozessor(en) 2412, der Speicher-Hub 2405, der/die Prozessor(en) 2402 und der E/A-Hub 2407 in eine integrierte SoC-Schaltung integriert sein. In mindestens einer Ausführungsform können Komponenten des Rechensystems 2400 in ein einziges Gehäuse integriert sein, um eine System-in-Package-Konfiguration („SIP“) zu bilden. In mindestens einer Ausführungsform kann mindestens ein Teil der Komponenten des Rechensystems 2400 in ein Multi-Chip-Modul („MCM“) integriert sein, das mit anderen Multi-Chip-Modulen zu einem modularen Rechensystem zusammengeschaltet sein kann. In mindestens einer Ausführungsform sind das E/A-Subsystem 2411 und die Anzeigevorrichtungen 2410B nicht in dem Rechensystem 2400 enthalten.
  • In mindestens einer Ausführungsform wird mindestens eine in 24 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2402 oder Parallelprozessor(en) 2412 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2402 oder Parallelprozessor(en) 2412 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2402 oder Parallelprozessor(en) 2412 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2402 oder Parallelprozessor(en) 2412 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens einer von Prozessor(en) 2402 oder Parallelprozessor(en) 2412 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • Verarbeitungssysteme
  • Die folgenden Figuren stellen, ohne Beschränkung darauf, beispielhafte Verarbeitungssysteme dar, die zur Implementierung mindestens einer Ausführungsform verwendet werden können.
  • 25 veranschaulicht eine beschleunigte Verarbeitungseinheit („APU“) 2500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die APU 2500 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die APU 2500 so konfiguriert sein, dass sie ein Anwendungsprogramm, wie z.B. ein CUDA-Programm, ausführt. In mindestens einer Ausführungsform umfasst die APU 2500, ohne Beschränkung darauf, einen Kernkomplex 2510, einen Grafikkomplex 2540, eine Struktur bzw. ein Fabric 2560, E/A-Schnittstellen 2570, Speichercontroller 2580, einen Anzeigecontroller 2592 und eine Multimedia-Engine 2594. In mindestens einer Ausführungsform kann die APU 2500, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 2510, eine beliebige Anzahl von Grafikkomplexen 2550, eine beliebige Anzahl von Anzeigecontrollern 2592 und eine beliebige Anzahl von Multimedia-Engines 2594 in beliebiger Kombination enthalten. Zu Erklärungszwecken sind hierin mehrere Instanzen gleicher Objekte bedarfsweise mit Bezugszeichen bezeichnet, die das Objekt identifizieren, und mit Zahlen in Klammern, die die Instanz identifizieren.
  • In mindestens einer Ausführungsform ist der Kernkomplex 2510 eine CPU, ist der Grafikkomplex 2540 eine GPU und ist die APU 2500 eine Verarbeitungseinheit, die, ohne Beschränkung darauf, 2510 und 2540 auf einem einzigen Chip integriert. In mindestens einer Ausführungsform können einige Aufgaben dem Kernkomplex 2510 und andere Aufgaben dem Grafikkomplex 2540 zugewiesen werden. In mindestens einer Ausführungsform ist der Kernkomplex 2510 so konfiguriert, dass er eine Hauptsteuerungssoftware ausführt, die der APU 2500 zugeordnet ist, wie z.B. ein Betriebssystem. In mindestens einer Ausführungsform ist der Kernkomplex 2510 der Hauptprozessor der APU 2500, der Operationen bzw. Betriebsabläufe der anderen Prozessoren steuert und koordiniert. In mindestens einer Ausführungsform gibt der Kernkomplex 2510 Befehle aus, die den Betrieb des Grafikkomplexes 2540 steuern. In mindestens einer Ausführungsform kann der Kernkomplex 2510 so konfiguriert sein, dass er von dem CUDA-Quellcode abgeleiteten ausführbaren Host-Code ausführt, und kann der Grafikkomplex 2540 so konfiguriert sein, dass er von dem CUDA-Quellcode abgeleiteten ausführbaren Geräte-Code ausführt.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 2510, ohne Beschränkung darauf, Kerne 2520(1)-2520(4) und einen L3-Cache 2530. In mindestens einer Ausführungsform kann der Kernkomplex 2510, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 2520 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 2520 so konfiguriert, dass sie Anweisungen einer bestimmten Befehlssatzarchitektur („ISA“) ausführen. In mindestens einer Ausführungsform ist jeder Kern 2520 ein CPU-Kern.
  • In mindestens einer Ausführungsform enthält jeder Kern 2520, ohne Beschränkung darauf, eine Abhol-/Decodier-Einheit 2522, eine Ganzzahlausführungs-Engine 2524, eine Gleitkommaausführungs-Engine 2526 und einen L2-Cache 2528. In mindestens einer Ausführungsform holt die Abhol-/Decodier-Einheit 2522 Anweisungen ab, decodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungs-Engine 2524 und die Gleitkommaausführungs-Engine 2526. In mindestens einer Ausführungsform kann die Abhol-/Decodier-Einheit 2522 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungs-Engine 2524 und eine andere Mikroanweisung an die Gleitkommaausführungs-Engine 2526 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungs-Engine 2524, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkomma-Engine 2526, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Decodier-Einheit 2522 Mikroanweisungen an eine einzige Ausführungs-Engine, die sowohl die Ganzzahlausführungs-Engine 2524 als auch die Gleitkommaausführungs-Engine 2526 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 20(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 2520 repräsentiert, auf den L2-Cache 2528(i) zugreifen, der in dem Kern 2520(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 2510(j) enthaltene Kern 2520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2510 repräsentiert, mit anderen in dem Kernkomplex 2510(j) enthaltenen Kernen 2520 über den in dem Kernkomplex 2510(j) enthaltenen L3-Cache 2530(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 2510(j) enthaltenen Kerne 2520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2510 repräsentiert, auf den gesamten L3-Cache 2530(j) zugreifen, der in dem Kernkomplex 2510(j) enthalten ist. In mindestens einer Ausführungsform kann der L3-Cache 2530, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform kann der Grafikkomplex 2540 so konfiguriert sein, dass er Rechenoperationen hochparallel ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 2540 so konfiguriert, dass er Grafikpipelineoperationen wie beispielsweise Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen im Zusammenhang mit dem Rendern eines Bildes auf einer Anzeige ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 2540 so konfiguriert, dass er Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist der Grafikkomplex 2540 so konfiguriert, dass er sowohl grafikbezogene als auch grafikfremde Operationen ausführt.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 2540, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 2550 und einen L2-Cache 2542. In mindestens einer Ausführungsform teilen sich die Recheneinheiten 2550 den L2-Cache 2542. In mindestens einer Ausführungsform ist der L2-Cache 2542 partitioniert. In mindestens einer Ausführungsform umfasst der Grafikkomplex 2540, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 2550 und eine beliebige Anzahl (einschließlich Null) und Art von Caches. In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 2540, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 2550, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 2552 und einen gemeinsamen Speicher 2554. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 2552 eine SIMD-Architektur und ist für die parallele Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform kann jede Recheneinheit 2550 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 2550 ausgeführt. In mindestens einer Ausführungsform beinhaltet ein Thread-Block, ohne Beschränkung darauf, eine beliebige Anzahl von Ausführungs-Threads. In mindestens einer Ausführungsform ist eine Arbeitsgruppe bzw. eine Workgroup ein Thread-Block. In mindestens einer Ausführungsform führt jede SIMD-Einheit 2552 einen anderen Warp aus. In mindestens einer Ausführungsform ist ein Warp eine Gruppe von Threads (z.B. 16 Threads), wobei jeder Thread im Warp zu einem einzigen Thread-Block gehört und so konfiguriert ist, dass er einen anderen Datensatz auf der Grundlage eines einzigen Satzes von Anweisungen verarbeitet. In mindestens einer Ausführungsform kann eine Prädikation verwendet werden, um einen oder mehrere Threads in einem Warp zu deaktivieren. In mindestens einer Ausführungsform ist eine Spur bzw. eine Lane ein Thread. In mindestens einer Ausführungsform ist ein Arbeitselement bzw. Workitem ein Thread. In mindestens einer Ausführungsform ist eine Wellenfront ein Warp. In mindestens einer Ausführungsform können sich verschiedene Wellenfronten in einem Thread-Block miteinander synchronisieren und über den gemeinsamen Speicher 2554 kommunizieren.
  • In mindestens einer Ausführungsform ist das Fabric 2560 eine Systemverbindung bzw. ein System-Interconnect, die bzw. der Daten- und Steuerungs-Übertragungen zwischen dem Kernkomplex 2510, dem Grafikkomplex 2540, den E/A-Schnittstellen 2570, den Speichercontrollern 2580, dem Anzeigecontroller 2592 und der Multimedia-Engine 2594 ermöglicht. In mindestens einer Ausführungsform kann die APU 2500, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 2560 enthalten, die Daten- und Steuerungs-Übertragungen über eine beliebige Anzahl und Art von direkt oder indirekt verbundenen Komponenten ermöglicht, die intern oder extern zur APU 2500 sein können. In mindestens einer Ausführungsform sind die E/A-Schnittstellen 2570 repräsentativ für eine beliebige Anzahl und Art von E/A-Schnittstellen (z.B. PCI, PCI-Extended („PCI-X“), PCIe, Gigabit-Ethernet („GBE“), USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den E/A-Schnittstellen 2570 gekoppelt. Die Peripheriegeräte, die mit den E/A-Schnittstellen 2570 gekoppelt sind, können, ohne Beschränkung darauf, Tastaturen, Mäuse, Drucker, Scanner, Joysticks oder andere Arten von Spielsteuerungen, Medienaufzeichnungsvorrichtungen, externe Speichervorrichtungen, Netzwerkschnittstellenkarten usw. beinhalten.
  • In mindestens einer Ausführungsform gibt der Anzeigecontroller AMD92 Bilder auf einer oder mehreren Anzeigevorrichtungen an, z.B. auf einer Flüssigkristallanzeige („LCD“). In mindestens einer Ausführungsform umfasst die Multimedia-Engine 2594, ohne Beschränkung darauf, eine beliebige Menge und Art von Schaltkreisen, die sich auf Multimedia beziehen, wie z.B. einen Video-Decoder, einen Video-Encoder, einen Bildsignalprozessor usw. In mindestens einer Ausführungsform erleichtern Speichercontroller 2580 die Datenübertragung zwischen der APU 2500 und einem einheitlichen Systemspeicher 2590. In mindestens einer Ausführungsform teilen sich der Kernkomplex 2510 und der Grafikkomplex 2540 den vereinheitlichten Systemspeicher 2590.
  • In mindestens einer Ausführungsform implementiert die APU 2500 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichercontrollern 2580 und Speichervorrichtungen (z.B. den gemeinsam genutzten Speicher 2554) enthält, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die APU 2500 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 2528, L3-Cache 2530 und L2-Cache 2542) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 2520, Kernkomplex 2510, SIMD-Einheiten 2552, Recheneinheiten 2550 und Grafikkomplex 2540) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 25 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 18 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510 oder des Grafikkomplexes 2540 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510 oder des Grafikkomplexes 2540 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510 oder des Grafikkomplexes 2540 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510 oder des Grafikkomplexes 2540 dazu verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron von einem oder mehrere Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510 oder des Grafikkomplexes 2540 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 26 veranschaulicht eine CPU 2600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die CPU 2600 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die CPU 2600 so konfiguriert sein, dass sie ein Anwendungsprogramm ausführt. In mindestens einer Ausführungsform ist die CPU 2600 so konfiguriert, dass sie eine Hauptsteuerungssoftware, wie z.B. ein Betriebssystem, ausführt. In mindestens einer Ausführungsform gibt die CPU 2600 Befehle aus, die den Betrieb einer externen GPU (nicht dargestellt) steuern. In mindestens einer Ausführungsform kann die CPU 2600 so konfiguriert sein, dass sie ausführbaren Host-Code ausführt, der von CUDA-Quellcode abgeleitet ist, und kann eine externe GPU so konfiguriert sein, dass sie ausführbaren Geräte-Code ausführt, der von einem solchen CUDA-Quellcode abgeleitet ist. In mindestens einer Ausführungsform beinhaltet die CPU 2600, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 2610, ein Fabric 2660, E/A-Schnittstellen 2670 und Speichercontroller 2680.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 2610, ohne Beschränkung darauf, Kerne 2620(1)-2620(4) und einen L3-Cache 2630. In mindestens einer Ausführungsform kann der Kernkomplex 2610, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 2620 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 2620 so konfiguriert, dass sie Anweisungen eines bestimmten ISA ausführen. In mindestens einer Ausführungsform ist jeder Kern 2620 ein CPU-Kern.
  • In mindestens einer Ausführungsform beinhaltet jeder Kern 2620, ohne Beschränkung darauf, eine Abhol-/Decodier-Einheit 2622, eine Ganzzahlausführungs-Engine 2624, eine Gleitkommaausführungs-Engine 2626 und einen L2-Cache 2628. In mindestens einer Ausführungsform holt die Abruf-/Decodier-Einheit 2622 Anweisungen ab, decodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungs-Engine 2624 und die Gleitkommaausführungs-Engine 2626. In mindestens einer Ausführungsform kann die Abhol-/Decodier-Einheit 2622 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungs-Engine 2624 und eine andere Mikroanweisung an die Gleitkommaausführungs-Engine 2626 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungs-Engine 2624, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkomma-Engine 2626, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Decodier-Einheit 2622 Mikroanweisungen an eine einzige Ausführungs-Engine, die sowohl die Ganzzahlausführungs-Engine 2624 als auch die Gleitkommaausführungs-Engine 2626 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 2620(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 2620 repräsentiert, auf den L2-Cache 2628(i) zugreifen, der in dem Kern 2620(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 2610(j) enthaltene Kern 2620, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2610 repräsentiert, mit anderen Kernen 2620 in dem Kernkomplex 2610(j) über den in dem Kernkomplex 2610(j) enthaltenen L3-Cache 2630(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 2610(j) enthaltenen Kerne 2620, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2610 repräsentiert, auf den gesamten in dem Kernkomplex 2610(j) enthaltenen L3-Cache 2630(j) zugreifen. In mindestens einer Ausführungsform kann der L3-Cache 2630, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform ist das Fabric 2660 eine Systemverbindung, die Daten- und Steuerungs-Übertragungen über die Kernkomplexe 2610(1)-2610(N) (wobei N eine ganze Zahl größer als Null ist), E/A-Schnittstellen 2670 und Speichercontroller 2680 erleichtert. In mindestens einer Ausführungsform kann die CPU 2600, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 2660 enthalten, die Daten- und Steuerungs-Übertragungen über eine beliebige Anzahl und Art von direkt oder indirekt verbundenen Komponenten erleichtern, die intern oder extern zur CPU 2600 sein können. In mindestens einer Ausführungsform sind die E/A-Schnittstellen 2670 repräsentativ für eine beliebige Anzahl und Art von E/A-Schnittstellen (z.B. PCI , PCI-X, PCIe, GBE, USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den E/A-Schnittstellen 2670 gekoppelt. Zu den Peripheriegeräten, die mit den E/A-Schnittstellen 2670 gekoppelt sind, gehören unter anderem Bildschirme, Tastaturen, Mäuse, Drucker, Scanner, Joysticks oder andere Arten von Spielsteuerungen, Medienaufzeichnungsvorrichtungen, externe Speichervorrichtungen, Netzwerkschnittstellenkarten usw.
  • In mindestens einer Ausführungsform erleichtern die Speichercontroller 2680 Datenübertragungen zwischen der CPU 2600 und einem Systemspeicher 2690. In mindestens einer Ausführungsform teilen sich der Kernkomplex 2610 und der Grafikkomplex 2640 den Systemspeicher 2690. In mindestens einer Ausführungsform implementiert die CPU 2600 ein Speichersubsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichercontrollern 2680 und Speichervorrichtungen beinhaltet, die einer Komponente zugeordnet sein oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die CPU 2600 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 2628 und L3-Caches 2630) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 2620 und Kernkomplexe 2610) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 26 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2610(1)-2610(n) verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2610(1)-2610(n) verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2610(1)-2610(n) verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2610(1)-2610(n) verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2610(1)-2610(n) verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 27 veranschaulicht ein beispielhaftes Beschleunigerintegrationsslice 2790, gemäß mindestens einer Ausführungsform. Wie hierin verwendet, umfasst ein „Slice“ einen bestimmten Teil von Verarbeitungsressourcen einer Beschleunigerintegrationsschaltung. In mindestens einer Ausführungsform stellt die Beschleunigerintegrationsschaltung Cache-Verwaltung, Speicherzugriff, Kontextverwaltung und Interruptverwaltungsdienste für mehrere Grafikverarbeitungsmodule in einem Grafikbeschleunigungsmodul bereit. Die Grafikverarbeitungs-Engines können jeweils eine separate GPU umfassen. Alternativ können die Grafikverarbeitungs-Engines verschiedene Arten von Grafikverarbeitungs-Engines innerhalb einer GPU umfassen, wie z.B. Grafikausführungseinheiten, Medienverarbeitungs-Engines (z.B. Video-Encoder/Decoder), Sampler und Blit-Engines. In mindestens einer Ausführungsform kann das Grafikbeschleunigungsmodul eine GPU mit mehreren Grafikverarbeitungs-Engines sein. In mindestens einer Ausführungsform können die Grafikverarbeitungs-Engines einzelne GPUs sein, die auf einem gemeinsamen Package, einer Linecard oder einem Chip integriert sind.
  • Ein anwendungswirksamer Adressraum 2782 innerhalb eines Systemspeichers 2714 speichert Prozesselemente 2783. In einer Ausführungsform werden die Prozesselemente 2783 im Ansprechen auf GPU-Aufrufe 2781 von Anwendungen 2780, die auf dem Prozessor 2707 ausgeführt werden, gespeichert. Ein Prozesselement 2783 enthält den Prozessstatus für die entsprechende Anwendung 2780. Ein in dem Prozesselement 2783 enthaltener Arbeits- bzw. Workdeskriptor („WD“) 2784 kann ein einzelner, von einer Anwendung angeforderter Auftrag bzw. Job sein oder einen Zeiger auf eine Warteschlange von Jobs enthalten. In mindestens einer Ausführungsform ist der WD 2784 ein Zeiger auf eine Auftragsanforderungswarteschlange in dem effektiven Adressraum 2782 der Anwendung.
  • Das Grafikbeschleunigungsmodul 2746 und/oder einzelne Grafikverarbeitungs-Engines können von allen oder einer Teilmenge von Prozessen in einem System gemeinsam genutzt werden. In mindestens einer Ausführungsform kann eine Infrastruktur zum Einrichten eines Prozessstatus und zum Senden des WD 2784 an das Grafikbeschleunigungsmodul 2746 zum Starten eines Auftrags in einer virtualisierten Umgebung enthalten sein.
  • In mindestens einer Ausführungsform ist ein Dedizierter-Prozess-Programmiermodell implementierungsspezifisch. In diesem Modell besitzt ein einzelner Prozess das Grafikbeschleunigungsmodul 2746 oder eine individuelle Grafikverarbeitungs-Engine. Weil das Grafikbeschleunigungsmodul 2746 einem einzelnen Prozess gehört, initialisiert ein Hypervisor eine Beschleunigerintegrationsschaltung für eine besitzende Partition und initialisiert ein Betriebssystem die Beschleunigerintegrationsschaltung für einen besitzenden Prozess, wenn das Grafikbeschleunigungsmodul 2746 zugewiesen wird.
  • Im Betrieb holt eine WD-Abholeinheit 2791 in dem Beschleunigerintegrationsslice 2790 den nächsten WD 2784 ab, der eine Angabe der Arbeit enthält, die von einer oder mehreren Grafikverarbeitungs-Engines des Grafikbeschleunigungsmoduls 2746 zu erledigen ist. Daten aus dem WD 2784 können in Registern 2745 gespeichert und von einer Speicherverwaltungseinheit („MMU“) 2739, einer Unterbrechungs- bzw. Interrupt-Verwaltungsschaltung 2747 und/oder einer Kontextverwaltungsschaltung 2748 verwendet werden, wie dargestellt. Eine Ausführungsform der MMU 2739 beinhaltet beispielsweise einen Segment-/Seitenlauf-Schaltkreis für den Zugriff auf Segment-/Seitentabellen 2786 innerhalb des virtuellen Betriebssystemadressraums 2785. Die Interrupt-Verwaltungsschaltung 2747 kann von dem Grafikbeschleunigungsmodul 2746 empfangene Interrupt-Ereignisse („INT“) 2792 verarbeiten. Bei der Durchführung von Grafikoperationen wird eine von einer Grafikverarbeitungs-Engine erzeugte effektive Adresse 2793 von der MMU 2739 in eine reale Adresse übersetzt.
  • In einer Ausführungsform wird für jede Grafikverarbeitungs-Engine und/oder jedes Grafikbeschleunigungsmodul 2746 ein gleicher Satz von Registern 2745 dupliziert und kann von einem Hypervisor oder Betriebssystem initialisiert werden. Jedes dieser duplizierten Register kann in dem Beschleunigerintegrationsslice 2790 enthalten sein. Beispielhafte Register, die von einem Hypervisor initialisiert werden können, sind in Tabelle 1 gezeigt. Tabelle 1 -Hypervisor-initialisierte Register
    1 Slicesteuerregister
    2 Realadresse (RA)-Geplantprozesse-Bereichszeiger
    3 Autoritätsmasken-Überschreibungsregister
    4 Interruptvektor-Tabelleneintragsversatz
    5 Interruptvektor-Tabelleneintragsgrenze
    6 Zustandsregister
    7 Logische Partitions-ID
    8 Realadresse (RA)-Hypervisorbeschleunigernutzungsaufzeichnungs-Zeiger
    9 Speicherbeschreibungsregister
  • Beispielhafte Register, die von einem Betriebssystem initialisiert werden können, sind in Tabelle 2 gezeigt. Tabelle 2 - Betriebssystem-initialisierte Register
    1 Prozess- und Thread-Identifikation
    2 Effektivadresse (EA) Kontextspeicherungs-/Wiederherstellungs-Zeiger
    3 Virtuelleadresse (VA)-Beschleunigernutzungsaufzeichnungs-Zeiger
    4 Virtuelladresse (VA)-Speichersegmenttabellenzeiger
    5 Autoritätsmaske
    6 Arbeitsdeskriptor
  • In einer Ausführungsform ist jeder WD 2784 spezifisch für ein bestimmtes Grafikbeschleunigungsmodul 2746 und/oder eine bestimmte Grafikverarbeitungs-Engine. Er enthält alle Informationen, die von einer Grafikverarbeitungs-Engine benötigt werden, um Arbeit zu verrichten, oder er kann ein Zeiger auf einen Speicherplatz sein, an dem eine Anwendung eine Befehlswarteschlange von abzuschließender Arbeit eingerichtet hat.
  • In mindestens einer Ausführungsform wird mindestens eine in 27 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird der Prozessor 2707 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird der Prozessor 2707 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 2707 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 2707 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird der Prozessor 2707 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 28A bis 28B veranschaulichen beispielhafte Grafikprozessoren, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann jeder der beispielhaften Grafikprozessoren unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein. Zusätzlich zu dem, was dargestellt ist, können andere Logik und Schaltungen in mindestens einer Ausführungsform enthalten sein, einschließlich zusätzlicher Grafikprozessoren/-kerne, Peripherieschnittstellencontroller oder Universalprozessorkerne. In mindestens einer Ausführungsform sind die beispielhaften Grafikprozessoren zur Verwendung innerhalb eines SoC vorgesehen.
  • 28A veranschaulicht einen beispielhaften Grafikprozessor 2810 eines integrierten SoC-Schaltkreises, der unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein kann, gemäß mindestens einer Ausführungsform. 28B veranschaulicht einen weiteren beispielhaften Grafikprozessor 2840 eines integrierten SoC-Schaltkreises, der unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein kann, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Grafikprozessor 2810 von 28A ein stromsparender Grafikprozessorkern. In mindestens einer Ausführungsform ist der Grafikprozessor 2840 von 28B ein Grafikprozessorkern mit höherer Leistung. In mindestens einer Ausführungsform kann jeder der Grafikprozessoren 2810, 2840 eine Variante des Grafikprozessors 2310 von 23 sein.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2810 einen Vertex-Prozessor 2805 und einen oder mehrere Fragment-Prozessor(en) 2815A-2815N (z.B. 2815A, 2815B, 2815C, 2815D, bis 2815N-1 und 2815N). In mindestens einer Ausführungsform kann der Grafikprozessor 2810 verschiedene Shader-Programme über eine separate Logik ausführen, so dass der Vertex-Prozessor 2805 für die Ausführung von Operationen für Vertex-Shader-Programme optimiert ist, während ein oder mehrere Fragment-Prozessor(en) 2815A-2815N Fragment- (z.B. Pixel-) Shading-Operationen für Fragment- oder Pixel-Shader-Programme ausführen. In mindestens einer Ausführungsform führt der Vertex-Prozessor 2805 eine Vertex-Verarbeitungsstufe einer 3D-Grafik-Pipeline aus und erzeugt Primitive und Vertex-Daten. In mindestens einer Ausführungsform verwenden Fragmentprozessor(en) 2815A-2815N die von dem Vertexprozessor 2805 erzeugten Primitiv- und Vertexdaten, um einen Framebuffer bzw. Bildpuffer zu erzeugen, der auf einer Anzeigevorrichtung angezeigt wird. In mindestens einer Ausführungsform ist/sind der/die Fragmentprozessor(en) 2815A-2815N für die Ausführung von Fragment-Shader-Programmen optimiert, wie sie in einer OpenGL-API bereitgestellt sind, die verwendet werden können, um ähnliche Operationen wie ein Pixel-Shader-Programm durchzuführen, wie sie in einer Direct 3D-API bereitgestellt sind.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2810 zusätzlich eine oder mehrere MMU(s) 2820A-2820B, Cache(s) 2825A-2825B und Schaltungsverbindung(en) bzw. Interconnect(s) 2830A-2830B. In mindestens einer Ausführungsform sorgen eine oder mehrere MMU(s) 2820A-2820B für die Zuordnung von virtuellen zu physikalischen Adressen für den Grafikprozessor 2810, einschließlich für den Vertex-Prozessor 2805 und/oder den/die Fragment-Prozessor(en) 2815A-2815N, der/die auf in dem Speicher gespeicherte Vertex- oder Bild/Textur-Daten verweisen kann/können, zusätzlich zu Vertex- oder Bild/Textur-Daten, die in einem oder mehreren Cache(s) 2825A-2825B gespeichert sind. In mindestens einer Ausführungsform können eine oder mehrere MMU(s) 2820A-2820B mit anderen MMUs innerhalb eines Systems synchronisiert werden, einschließlich einer oder mehrerer MMUs, die einem oder mehreren Anwendungsprozessor(en) 2305, Bildprozessor(en) 2315 und/oder Videoprozessor(en) 2320 von 23 zugeordnet sind, so dass jeder Prozessor 2305-2320 an einem gemeinsamen oder vereinheitlichten virtuellen Speichersystem teilhaben kann. In mindestens einer Ausführungsform ermöglichen eine oder mehrere Schaltungsverbindung(en) 2830A-2830B dem Grafikprozessor 2810 die Verbindung mit anderen IP-Kernen innerhalb eines SoCs, entweder über einen internen Bus des SoCs oder über eine direkte Verbindung.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2840 eine oder mehrere MMU(s) 2820A-2820B, Caches 2825A-2825B und Schaltungsverbindungen 2830A-2830B des Grafikprozessors 2810 von 28A. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2840 einen oder mehrere Shader-Kerne 2855A-2855N (z.B. 2855A, 2855B, 2855C, 2855D, 2855E, 2855F bis 2855N-1 und 2855N), die eine einheitliche Shader-Kern-Architektur bereitstellen, in der ein einziger Kern oder Art oder Kern alle Arten von programmierbarem Shader-Code ausführen kann, einschließlich Shader-Programmcode zur Implementierung von Vertex-Shadern, Fragment-Shadern und/oder Rechen-Shadern. In mindestens einer Ausführungsform kann eine Anzahl von Shader-Kernen variieren. In mindestens einer Ausführungsform enthält der Grafikprozessor 2840 einen Zwischenkern-Aufgabenverwalter bzw. Intercore-Taskmanager 2845, der als ein Thread-Dispatcher bzw. -Versender fungiert, um Ausführungs-Threads an einen oder mehrere Shader-Kerne 2855A-2855N zu verteilen, und eine Kacheleinheit 2858, um Kacheloperationen für kachelbasiertes Rendering zu beschleunigen, bei denen Renderingoperationen für eine Szene in den Bildraum unterteilt werden, um beispielsweise lokale räumliche Kohärenz innerhalb einer Szene auszunutzen oder die Verwendung interner Caches zu optimieren.
  • In mindestens einer Ausführungsform wird mindestens eine in den 28A-28B gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit den 1-18 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Grafikprozessor 2810 oder ein Grafikprozessor 2840 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Grafikprozessor 2810 oder ein Grafikprozessor 2840 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Grafikprozessor 2810 oder ein Grafikprozessor 2840 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Grafikprozessor 2810 oder ein Grafikprozessor 2840 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Grafikprozessor 2810 oder ein Grafikprozessor 2840 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 29A veranschaulicht einen Grafikkern 2900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Grafikkern 2900 in dem Grafikprozessor 2310 von 23 enthalten sein. In mindestens einer Ausführungsform kann der Grafikkern 2900 ein einheitlicher Shader-Kern 2855A-2855N wie in 28B sein. In mindestens einer Ausführungsform beinhaltet der Grafikkern 2900 einen gemeinsam genutzten Befehlscache 2902, eine Textureinheit 2932 und einen Cache/gemeinsamen Speicher 2920, die den Ausführungsressourcen innerhalb des Grafikkerns 2900 gemeinsam sind. In mindestens einer Ausführungsform kann der Grafikkern 2900 mehrere Slices 2901 A-2901 N oder Partitionen für jeden Kern enthalten, und kann ein Grafikprozessor mehrere Instanzen des Grafikkerns 2900 enthalten. Die Slices 2901A-2901N können eine Unterstützungslogik enthalten, die einen lokalen Befehlscache 2904A-2904N, einen Thread-Planer bzw. Thread-Scheduler 2906A-2906N, einen Thread-Versender bzw. Thread-Dispatcher 2908A-2908N und einen Satz von Registern 2910A-2910N beinhaltet. In mindestens einer Ausführungsform können die Slices 2901A-2901N einen Satz zusätzlicher Funktionseinheiten („AFUs“) 2912A-2912N, Gleitkommaeinheiten („FPUs“) 2914A-2914N, ganzzahlige arithmetische Logikeinheiten („ALUs“) 2916-2916N, Adressberechnungseinheiten („ACUs“) 2913A-2913N, doppeltgenaue Gleitkommaeinheiten („DPFPUs“) 2915A-2915N und Matrixverarbeitungseinheiten („MPUs“) 2917A-2917N beinhalten.
  • In mindestens einer Ausführungsform können die FPUs 2914A-2914N Gleitkomma operationen mit einfacher Genauigkeit (32 Bit) und halber Genauigkeit (16 Bit) durchführen, während die DPFPUs 2915A-2915N Gleitkommaoperationen mit doppelter Genauigkeit (64 Bit) durchführen. In mindestens einer Ausführungsform können die ALUs 2916A-2916N Ganzzahloperationen mit variabler Präzision bei 8-Bit, 16-Bit- und 32-Bit-Präzision ausführen und für Operationen mit gemischter Präzision konfiguriert sein. In mindestens einer Ausführungsform können die MPUs 2917A-2917N auch für Matrixoperationen mit gemischter Genauigkeit konfiguriert sein, einschließlich Gleitkomma- und 8-Bit-Ganzzahloperationen mit halber Genauigkeit. In mindestens einer Ausführungsform können die MPUs 2917-2917N eine Vielzahl von Matrixoperationen durchführen, um CUDA-Programme zu beschleunigen, einschließlich der Unterstützung für eine beschleunigte allgemeine Matrix-zu-Matrix-Multiplikation („GEMM“). In mindestens einer Ausführungsform können die AFUs 2912A-2912N zusätzliche logische Operationen durchführen, die nicht von Gleitkomma- oder Ganzzahleinheiten unterstützt werden, einschließlich trigonometrischer Operationen (z.B. Sinus, Cosinus usw.).
  • 29B veranschaulicht eine Universal-Grafikverarbeitungseinheit („GPGPU“) 2930, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die GPGPU 2930 hochparallel und für den Einsatz auf einem Multi-Chip-Modul geeignet. In mindestens einer Ausführungsform kann die GPGPU 2930 so konfiguriert sein, dass hochparallele Rechenoperationen von einem Array von GPUs durchgeführt werden können. In mindestens einer Ausführungsform kann die GPGPU 2930 direkt mit anderen Instanzen der GPGPU 2930 verbunden sein, um einen Multi-GPU-Cluster zu erstellen, um die Ausführungszeit für CUDA-Programme zu verbessern. In mindestens einer Ausführungsform enthält die GPGPU 2930 eine Host-Schnittstelle 2932, um eine Verbindung mit einem Hostprozessor zu ermöglichen. In mindestens einer Ausführungsform ist die Host-Schnittstelle 2932 eine PCIe-Schnittstelle. In mindestens einer Ausführungsform kann die Host-Schnittstelle 2932 eine herstellerspezifische Kommunikationsschnittstelle oder ein Kommunikations-Fabric sein. In mindestens einer Ausführungsform empfängt die GPGPU 1330 Befehle von einem Hostprozessor und verwendet einen globalen Planer bzw. Scheduler 2934, um Ausführungs-Threads, die diesen Befehlen zugeordnet sind, an einen Satz von Rechenclustern 2936A-2936H zu verteilen. In mindestens einer Ausführungsform teilen sich die Rechencluster 2936A-2936H einen Cachespeicher 2938. In mindestens einer Ausführungsform kann der Cachespeicher 2938 als ein übergeordneter Cache für Cachespeicher innerhalb von Rechenclustern 2936A-2936H dienen.
  • In mindestens einer Ausführungsform beinhaltet die GPGPU 2930 einen Speicher 2944A-2944B, der über eine Reihe von Speichercontrollern 2942A-2942B mit den Rechenclustern 2936A-2936H verbunden ist. In mindestens einer Ausführungsform kann der Speicher 2944A-2944B verschiedene Arten von Speichervorrichtungen umfassen, darunter DRAM oder Grafik-Direktzugriffsspeicher, wie synchroner Grafik-Direktzugriffsspeicher („SGRAM“), einschließlich Grafik-Doppeldatenraten-Speicher („GDDR“).
  • In mindestens einer Ausführungsform enthalten die Rechencluster 2936A-2936H jeweils einen Satz von Grafikkernen, wie z.B. den Grafikkern 2900 von 29A, der mehrere Arten von Ganzzahl- und Gleitkomma-Logikeinheiten enthalten kann, die Rechenoperationen mit einer Reihe von Genauigkeiten durchführen können, die auch für Berechnungen im Zusammenhang mit CUDA-Programmen geeignet sind. Zum Beispiel kann in mindestens einer Ausführungsform mindestens eine Teilmenge der Gleitkommaeinheiten in jedem der Rechencluster 2936A-2936H so konfiguriert sein, dass sie 16-Bit- oder 32-Bit-Gleitkommaoperationen durchführen, während eine andere Teilmenge der Gleitkommaeinheiten so konfiguriert sein kann, dass sie 64-Bit-Gleitkommaoperationen durchführen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der GPGPU 2930 so konfiguriert sein, dass sie als Rechencluster arbeiten. Die Rechencluster 2936A-2936H können beliebige technisch machbare Kommunikationstechniken zur Synchronisation und zum Datenaustausch implementieren. In mindestens einer Ausführungsform kommunizieren mehrere Instanzen der GPGPU 2930 über die Host-Schnittstelle 2932. In mindestens einer Ausführungsform enthält die GPGPU 2930 einen E/A-Hub 2939, der die GPGPU 2930 mit einer GPU-Verbindung 2940 koppelt, die eine direkte Verbindung zu anderen Instanzen der GPGPU 2930 ermöglicht. In mindestens einer Ausführungsform ist die GPU-Verbindung 2940 mit einer dedizierten GPU-zu-GPU-Brücke gekoppelt, die die Kommunikation und Synchronisation die zwischen mehreren Instanzen der GPGPU 2930 ermöglicht. In mindestens einer Ausführungsform koppelt die GPU-Verbindung 2940 mit einem Hochgeschwindigkeits-Interconnect, um Daten an andere GPGPUs 2930 oder Parallelprozessoren zu senden und von diesen zu empfangen. In mindestens einer Ausführungsform befinden sich mehrere Instanzen der GPGPU 2930 in separaten Datenverarbeitungssystemen und kommunizieren über eine Netzwerkvorrichtung, die über die Host-Schnittstelle 2932 zugänglich ist. In mindestens einer Ausführungsform kann die GPU-Verbindung 2940 so konfiguriert sein, dass sie zusätzlich oder alternativ zu der Host-Schnittstelle 2932 eine Verbindung zu einem Hostprozessor ermöglicht. In mindestens einer Ausführungsform kann die GPGPU 2930 so konfiguriert sein, dass sie ein CUDA-Programm ausführt.
  • In mindestens einer Ausführungsform wird mindestens eine in den 29A-29B gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit den 1-18 beschrieben sind. In mindestens einer Ausführungsform wird mindestens eines des Grafikkerns 2900 oder der allgemeinen Grafikverarbeitungseinheit („GPGPU“) 2930 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens eines des Grafikkerns 2900 oder der GPGPU 2930 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens eines des Grafikkerns 2900 oder der GPGPU 2930 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens eines des Grafikkerns 2900 oder der GPGPU 2930 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens eines des Grafikkerns 2900 oder der GPGPU 2930 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 30A veranschaulicht einen Parallelprozessor 3000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform können verschiedene Komponenten des Parallelprozessors 3000 mit einem oder mehreren integrierten Schaltkreisen, wie z.B. programmierbaren Prozessoren, anwendungsspezifischen integrierten Schaltkreisen („ASICs“) oder FPGAs, implementiert sein.
  • In mindestens einer Ausführungsform beinhaltet der Parallelprozessor 3000 eine Parallelverarbeitungseinheit 3002. In mindestens einer Ausführungsform enthält die Parallelverarbeitungseinheit 3002 eine E/A-Einheit 3004, die die Kommunikation mit anderen Vorrichtungen ermöglicht, einschließlich anderer Instanzen der Parallelverarbeitungseinheit 3002. In mindestens einer Ausführungsform kann die E/A-Einheit 3004 direkt mit anderen Vorrichtungen verbunden sein. In mindestens einer Ausführungsform ist die E/A-Einheit 3004 über eine Hub- oder Switch-Schnittstelle, wie z.B. den Speicher-Hub 3005, mit anderen Vorrichtungen verbunden. In mindestens einer Ausführungsform bilden die Verbindungen zwischen dem Speicher-Hub 3005 und der E/A-Einheit 3004 eine Kommunikationsverbindung. In mindestens einer Ausführungsform ist die E/A-Einheit 3004 mit einer Host-Schnittstelle 3006 und einer Speicherkreuzschiene 3016 verbunden, wobei die Host-Schnittstelle 3006 Befehle zur Durchführung von Verarbeitungsoperationen und die Speicherkreuzschiene 3016 Befehle zur Durchführung von Speicheroperationen empfängt.
  • In mindestens einer Ausführungsform kann die Host-Schnittstelle 3006 dann, wenn die Host-Schnittstelle einen Befehlspuffer über die E/A-Einheit 3004 empfängt, Arbeitsoperationen zur Ausführung dieser Befehle an ein Frontend 3008 leiten. In mindestens einer Ausführungsform ist das Frontend 3008 mit einem Planer bzw. Scheduler 3010 gekoppelt, der so konfiguriert ist, dass er Befehle oder andere Arbeitselemente an ein Verarbeitungsfeld bzw. Verarbeitungs-Array 3012 verteilt. In mindestens einer Ausführungsform stellt der Scheduler 3010 sicher, dass das Verarbeitungs-Array 3012 richtig konfiguriert ist und sich in einem gültigen Zustand befindet, bevor Aufgaben an das Verarbeitungs-Array 3012 verteilt werden. In mindestens einer Ausführungsform ist der Scheduler 3010 über Firmware-Logik implementiert, die auf einem Mikrocontroller ausgeführt wird. In mindestens einer Ausführungsform ist der in einem Mikrocontroller implementierte Scheduler 3010 so konfigurierbar, dass er komplexe Planungs- und Arbeitsverteilungsoperationen mit grober und feiner Granularität durchführen kann, was eine schnelle Bevorrechtigung und Kontextumschaltung von Threads ermöglicht, die auf dem Verarbeitungs-Array 3012 ausgeführt werden. In mindestens einer Ausführungsform kann die Hostsoftware Arbeitslasten für die Planung auf dem Verarbeitungs-Array 3012 über eine von mehreren Grafikverarbeitungs-Doorbells nachweisen. In mindestens einer Ausführungsform können die Arbeitslasten dann automatisch über das Verarbeitungs-Array 3012 durch die Logik des Schedulers 3010 in einem Mikrocontroller mit Scheduler 3010 verteilt werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 3012 bis zu „N“ Cluster umfassen (z.B. Cluster 3014A, Cluster 3014B bis Cluster 3014N). In mindestens einer Ausführungsform kann jeder Cluster 3014A-3014N des Verarbeitungs-Arrays 3012 eine große Anzahl gleichzeitiger Threads ausführen. In mindestens einer Ausführungsform kann der Scheduler 3010 den Clustern 3014A-3014N des Verarbeitungs-Arrays 3012 durch Verwenden verschiedener Planungs- und/oder Arbeitsverteilungsalgorithmen, die in Abhängigkeit von der Arbeitslast variieren können, die für jede Art von Programm oder Berechnung entsteht, Arbeit zuweisen. In mindestens einer Ausführungsform kann die Planung dynamisch durch den Scheduler 3010 gehandhabt werden, oder kann teilweise durch die Compilerlogik während der Kompilierung der Programmlogik, die für die Ausführung durch das Verarbeitungs-Array 3012 konfiguriert ist, unterstützt werden. In mindestens einer Ausführungsform können verschiedene Cluster 3014A-3014N des Verarbeitungs-Arrays 3012 für die Verarbeitung verschiedener Arten von Programmen oder zum Durchführen verschiedener Arten von Berechnungen zugewiesen werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 3012 so konfiguriert sein, dass es verschiedene Arten von parallelen Verarbeitungsoperationen durchführt. In mindestens einer Ausführungsform ist das Verarbeitungs-Array 3012 so konfiguriert, dass es parallele Universalrechenoperationen durchführt. Zum Beispiel kann in mindestens einer Ausführungsform das Verarbeitungs-Array 3012 Logik zur Ausführung von Verarbeitungsaufgaben enthalten, einschließlich der Filterung von Video- und/oder Audiodaten, der Durchführung von Modellierungsoperationen, einschließlich physikalischer Operationen, und der Durchführung von Datentransformationen.
  • In mindestens einer Ausführungsform ist das Verarbeitungs-Array 3012 so konfiguriert, dass es parallele Grafikverarbeitungsoperationen durchführt. In mindestens einer Ausführungsform kann das Verarbeitungsarray 3012 zusätzliche Logik enthalten, um die Ausführung solcher Grafikverarbeitungsoperationen zu unterstützen, einschließlich, aber nicht beschränkt auf, Texturabtastlogik, um Texturoperationen durchzuführen, sowie Tesselationslogik und anderer Vertexverarbeitungslogik. In mindestens einer Ausführungsform kann das Verarbeitungs-Array 3012 so konfiguriert sein, dass es auf die Grafikverarbeitung bezogene Shader-Programme ausführt, wie z.B. Vertex-Shader, Tesselations-Shader, Geometrie-Shader und Pixel-Shader, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform kann die Parallelverarbeitungseinheit 3002 Daten aus dem Systemspeicher über die E/A-Einheit 3004 zur Verarbeitung übertragen. In mindestens einer Ausführungsform können die übertragenen Daten während der Verarbeitung in dem On-Chip-Speicher (z.B. einem Parallelprozessorspeicher 3022) gespeichert und dann in den Systemspeicher zurückgeschrieben werden.
  • In mindestens einer Ausführungsform kann dann, wenn die Parallelverarbeitungseinheit 3002 zur Durchführung der Grafikverarbeitung verwendet wird, der Scheduler 3010 so konfiguriert sein, dass er eine Verarbeitungslast in ungefähr gleich große Aufgaben aufteilt, um eine bessere Verteilung der Grafikverarbeitungsoperationen auf mehrere Cluster 3014A-3014N des Verarbeitungsarrays 3012 zu ermöglichen. In mindestens einer Ausführungsform können Teile des Verarbeitungs-Arrays 3012 so konfiguriert sein, dass sie verschiedene Arten der Verarbeitung durchführen. Zum Beispiel kann in mindestens einer Ausführungsform ein erster Teil so konfiguriert sein, dass er ein Vertexshading und eine Topologieerzeugung durchführt, ein kann zweiter Teil so konfiguriert sein, dass er Tesselation und Geometrieshading durchführt, und kann ein dritter Teil so konfiguriert sein, dass er Pixelshading oder andere Bildschirmraumoperationen durchführt, um ein gerendertes Bild für die Anzeige zu erzeugen. In mindestens einer Ausführungsform können Zwischendaten, die von einem oder mehreren der Cluster 3014A-3014N erzeugt werden, in Puffern gespeichert werden, damit Zwischendaten zur weiteren Verarbeitung zwischen den Clustern 3014A-3014N übertragen werden können.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 3012 Verarbeitungsaufgaben empfangen, die über den Scheduler 3010 auszuführen sind, der Befehle zur Definition von Verarbeitungsaufgaben von dem Frontend 3008 empfängt. In mindestens einer Ausführungsform können die Verarbeitungsaufgaben Indizes der zu verarbeitenden Daten enthalten, z.B. Oberflächen-(Patch-)Daten, Primitivdaten, Vertexdaten und/oder Pixeldaten, sowie Zustandsparameter und Befehle, die definieren, wie die Daten zu verarbeiten sind (z.B. welches Programm auszuführen ist). In mindestens einer Ausführungsform kann der Scheduler 3010 so konfiguriert sein, dass er den Aufgaben entsprechende Indizes abruft oder Indizes von dem Frontend 3008 empfängt. In mindestens einer Ausführungsform kann das Frontend 3008 so konfiguriert sein, dass es sicherstellt, dass das Verarbeitungs-Array 3012 in einen gültigen Zustand versetzt wird, bevor eine durch eingehende Befehlspuffer (z.B. Batch-Puffer, Push-Puffer usw.) spezifizierte Arbeitslast initiiert wird.
  • In mindestens einer Ausführungsform kann jede von einer oder mehreren Instanzen der Parallelverarbeitungseinheit 3002 mit dem Parallelprozessorspeicher 3022 gekoppelt sein. In mindestens einer Ausführungsform kann auf den Parallelprozessorspeicher 3022 über eine Speicherkreuzschiene 3016 zugegriffen werden, die Speicheranforderungen von dem Verarbeitungs-Array 3012 sowie von der E/A-Einheit 3004 empfangen kann. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 3016 über eine Speicherschnittstelle 3018 auf den Parallelprozessorspeicher 3022 zugreifen. In mindestens einer Ausführungsform kann die Speicherschnittstelle 3018 mehrere Partitionseinheiten (z.B. eine Partitionseinheit 3020A, eine Partitionseinheit 3020B bis eine Partitionseinheit 3020N) beinhalten, die jeweils mit einem Teil (z.B. einer Speichereinheit) des Parallelprozessorspeichers 3022 gekoppelt sein können. In mindestens einer Ausführungsform ist eine Anzahl von Partitionseinheiten 3020A-3020N so konfiguriert, dass sie gleich einer Anzahl von Speichereinheiten ist, so dass eine erste Partitionseinheit 3020A eine entsprechende erste Speichereinheit 3024A hat, eine zweite Partitionseinheit 3020B eine entsprechende Speichereinheit 3024B hat und eine N-te Partitionseinheit 3020N eine entsprechende N-te Speichereinheit 3024N hat. In mindestens einer Ausführungsform kann die Anzahl der Partitionseinheiten 3020A-3020N nicht gleich einer Anzahl von Speichervorrichtungen sein.
  • In mindestens einer Ausführungsform können die Speichereinheiten 3024A-3024N verschiedene Arten von Speichervorrichtungen enthalten, einschließlich DRAM oder Grafik-Direktzugriffsspeicher, wie SGRAM, einschließlich GDDR-Speicher. In mindestens einer Ausführungsform können die Speichereinheiten 3024A-3024N auch 3D-Stapelspeicher enthalten, einschließlich, aber nicht beschränkt auf, Speicher mit hoher Bandbreite („HBM“). In mindestens einer Ausführungsform können Renderingziele, wie z.B. Frame-Puffer oder Textur-Maps, über die Speichereinheiten 3024A-3024N hinweg gespeichert werden, so dass die Partitionseinheiten 3020A-3020N Teile jedes Renderingziels parallel schreiben können, um die verfügbare Bandbreite des Parallelprozessorspeichers 3022 effizient zu nutzen. In mindestens einer Ausführungsform kann eine lokale Instanz des Parallelprozessorspeichers 3022 zugunsten eines einheitlichen Speicherdesigns, das den Systemspeicher in Verbindung mit dem lokalen Cachespeicher nutzt, ausgeschlossen sein.
  • In mindestens einer Ausführungsform kann jeder der Cluster 3014A-3014N des Verarbeitungs-Arrays 3012 Daten verarbeiten, die in jede der Speichereinheiten 3024A-3024N in dem Parallelprozessorspeicher 3022 geschrieben werden. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 3016 so konfiguriert sein, dass sie eine Ausgabe jedes Clusters 3014A-3014N an eine beliebige Partitionseinheit 3020A-3020N oder an einen anderen Cluster 3014A-3014N überträgt, der zusätzliche Verarbeitungsoperationen an einer Ausgabe durchführen kann. In mindestens einer Ausführungsform kann jeder Cluster 3014A-3014N mit der Speicherschnittstelle 3018 über die Speicherkreuzschiene 3016 kommunizieren, um von verschiedenen externen Speichervorrichtungen zu lesen oder in diese zu schreiben. In mindestens einer Ausführungsform hat die Speicherkreuzschiene 3016 eine Verbindung zu der Speicherschnittstelle 3018, um mit der E/A-Einheit 3004 zu kommunizieren, sowie eine Verbindung zu einer lokalen Instanz des Parallelprozessorspeichers 3022, so dass die Verarbeitungseinheiten in den verschiedenen Clustern 3014A-3014N mit dem Systemspeicher oder einem anderen Speicher kommunizieren können, der nicht lokal zur Parallelverarbeitungseinheit 3002 ist. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 3016 virtuelle Kanäle verwenden, um Verkehrsstreams zwischen Clustern 3014A-3014N und Partitionseinheiten 3020A-3020N zu trennen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der Parallelverarbeitungseinheit 3002 auf einer einzigen Steckkarte bzw. Add-in-Karte bereitgestellt sein, oder es können mehrere Add-in-Karten miteinander verbunden sein. In mindestens einer Ausführungsform können verschiedene Instanzen der Parallelverarbeitungseinheit 3002 so konfiguriert sein, dass sie auch dann zusammenarbeiten, wenn die verschiedenen Instanzen eine unterschiedliche Anzahl von Prozessorkernen, unterschiedliche Mengen an lokalem Parallelprozessorspeicher und/oder andere Konfigurationsunterschiede aufweisen. Zum Beispiel können in mindestens einer Ausführungsform einige Instanzen der Parallelverarbeitungseinheit 3002 im Vergleich zu anderen Instanzen Gleitkommaeinheiten mit höherer Präzision enthalten. In mindestens einer Ausführungsform können Systeme, die eine oder mehrere Instanzen der Parallelverarbeitungseinheit 3002 oder des Parallelprozessors 3000 enthalten, in einer Vielzahl von Konfigurationen und Formfaktoren implementiert sein, einschließlich, aber nicht beschränkt auf, Desktop-, Laptop- oder Handheld-Personal Computer, Server, Workstations, Spielkonsolen und/oder eingebettete Systeme.
  • 30B veranschaulicht einen Verarbeitungscluster 3094, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Verarbeitungscluster 3094 in einer Parallelverarbeitungseinheit enthalten. In mindestens einer Ausführungsform ist der Verarbeitungscluster 3094 einer der Verarbeitungscluster 3014A-3014N von 30. In mindestens einer Ausführungsform kann der Verarbeitungscluster 3094 so konfiguriert sein, dass er viele Threads parallel ausführt, wobei sich der Begriff „Thread“ auf eine Instanz eines bestimmten Programms bezieht, das auf einem bestimmten Satz von Eingangsdaten ausgeführt wird. In mindestens einer Ausführungsform werden SIMD („Single Instruction, Multiple Data“)-Befehlsausgabetechniken verwendet, um die parallele Ausführung einer großen Anzahl von Threads zu unterstützen, ohne mehrere unabhängige Anweisungseinheiten bereitzustellen. In mindestens einer Ausführungsform werden SIMT („Single Instruction, Multiple Thread“)-Techniken verwendet, um die parallele Ausführung einer großen Anzahl von im Allgemeinen synchronisierten Threads zu unterstützen, wobei eine gemeinsame Anweisungseinheit verwendet wird, die so konfiguriert ist, dass sie Befehle an einen Satz von Verarbeitungs-Engines innerhalb jedes Verarbeitungsclusters 3094 ausgibt.
  • In mindestens einer Ausführungsform kann der Betrieb des Verarbeitungsclusters 3094 über einen Pipeline-Manager 3032 gesteuert werden, der Verarbeitungsaufgaben auf parallele SIMT-Prozessoren verteilt. In mindestens einer Ausführungsform empfängt der Pipeline-Manager 3032 Anweisungen von dem Scheduler 3010 von 30 und verwaltet die Ausführung dieser Anweisungen über einen Grafik-Multiprozessor 3034 und/oder eine Textureinheit 3036. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 3034 eine beispielhafte Instanz eines SIMT-Parallelprozessors. In mindestens einer Ausführungsform können jedoch verschiedene Typen von SIMT-Parallelprozessoren mit unterschiedlichen Architekturen in dem Verarbeitungscluster 3094 enthalten sein. In mindestens einer Ausführungsform können eine oder mehrere Instanzen des Grafik-Multiprozessors 3034 in dem Verarbeitungscluster 3094 enthalten sein. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 3034 Daten verarbeiten und kann eine Datenkreuzschiene 3040 verwendet werden, um verarbeitete Daten an eines von mehreren möglichen Zielen, einschließlich anderer Shader-Einheiten, zu verteilen. In mindestens einer Ausführungsform kann der Pipeline-Manager 3032 die Verteilung der verarbeiteten Daten erleichtern, indem er Ziele für die verarbeiteten Daten angibt, die über die Datenkreuzschiene 3040 zu verteilen sind.
  • In mindestens einer Ausführungsform kann jeder Grafik-Multiprozessor 3034 innerhalb des Verarbeitungsclusters 3094 einen identischen Satz an funktioneller Ausführungslogik (z.B. arithmetische Logikeinheiten, Lade-/Speichereinheiten („LSUs“) usw.) enthalten. In mindestens einer Ausführungsform kann die funktionelle Ausführungslogik in einer Pipeline konfiguriert sein, in der neue Anweisungen ausgegeben werden können, bevor vorherige Anweisungen abgeschlossen sind. In mindestens einer Ausführungsform unterstützt die funktionelle Ausführungslogik eine Vielzahl von Operationen, darunter Ganzzahl- und Gleitkommaarithmetik, Vergleichsoperationen, boolesche Operationen, Bitverschiebung und die Berechnung verschiedener algebraischer Funktionen. In mindestens einer Ausführungsform kann dieselbe Hardware mit funktionellen Einheiten genutzt werden, um verschiedene Operationen auszuführen, und es kann eine beliebige Kombination von funktionellen Einheiten vorhanden sein.
  • In mindestens einer Ausführungsform bilden die an den Verarbeitungscluster 3094 übertragenen Anweisungen einen Thread. In mindestens einer Ausführungsform ist ein Satz von Threads, die über einen Satz von Parallelverarbeitungs-Engines ausgeführt werden, eine Thread-Gruppe. In mindestens einer Ausführungsform führt eine Thread-Gruppe ein Programm auf unterschiedlichen Eingabedaten aus. In mindestens einer Ausführungsform kann jeder Thread innerhalb einer Thread-Gruppe einer anderen Verarbeitungs-Engine innerhalb des Grafik-Multiprozessors 3034 zugewiesen sein. In mindestens einer Ausführungsform kann eine Thread-Gruppe weniger Threads umfassen als die Anzahl der Verarbeitungs-Engines innerhalb des Grafik-Multiprozessors 3034. In mindestens einer Ausführungsform können dann, wenn eine Thread-Gruppe weniger Threads als eine Anzahl von Verarbeitungs-Engines beinhaltet, eine oder mehrere der Verarbeitungs-Engines während der Zyklen, in denen diese Thread-Gruppe verarbeitet wird, im Leerlauf sein. In mindestens einer Ausführungsform kann eine Thread-Gruppe auch mehr Threads als eine Anzahl von Verarbeitungs-Engines innerhalb des Grafik-Multiprozessors 3034 enthalten. Wenn eine Thread-Gruppe mehr Threads umfasst als die Anzahl der Verarbeitungs-Engines in dem Grafik-Multiprozessor 3034, kann die Verarbeitung in mindestens einer Ausführungsform über aufeinanderfolgende Taktzyklen hinweg durchgeführt werden. In mindestens einer Ausführungsform können mehrere Thread-Gruppen gleichzeitig auf dem Grafik-Multiprozessor 3034 ausgeführt werden.
  • In mindestens einer Ausführungsform enthält der Grafik-Multiprozessor 3034 einen internen Cachespeicher, um Lade- und Speicheroperationen durchzuführen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 3034 auf einen internen Cache verzichten und einen Cachespeicher (z.B. L1-Cache 3048) innerhalb des Verarbeitungsclusters 3094 verwenden. In mindestens einer Ausführungsform hat jeder Grafik-Multiprozessor 3034 auch Zugriff auf Level-2 („L2“)-Caches innerhalb von Partitionseinheiten (z.B. den Partitionseinheiten 3020A-3020N von 30A), die von allen Verarbeitungsclustern 3094 gemeinsam genutzt werden und zur Datenübertragung zwischen Threads verwendet werden können. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 3034 auch auf den globalen Off-Chip-Speicher zugreifen, der einen oder mehrere lokale Parallelprozessorspeicher und/oder Systemspeicher umfassen kann. In mindestens einer Ausführungsform kann jeder Speicher außerhalb der Parallelverarbeitungseinheit 3002 als globaler Speicher verwendet werden. In mindestens einer Ausführungsform umfasst der Verarbeitungscluster 3094 mehrere Instanzen des Grafik-Multiprozessors 3034, die sich gemeinsame Anweisungen und Daten teilen können, die in dem L1-Cache 3048 gespeichert sein können.
  • In mindestens einer Ausführungsform kann jeder Verarbeitungscluster 3094 eine MMU 3045 enthalten, die so konfiguriert ist, dass sie virtuelle Adressen auf physische Adressen abbildet. In mindestens einer Ausführungsform können sich eine oder mehrere Instanzen der MMU 3045 innerhalb der Speicherschnittstelle 3018 von 30 befinden. In mindestens einer Ausführungsform enthält die MMU 3045 einen Satz von Seitentabelleneinträgen („PTEs“), die verwendet werden, um eine virtuelle Adresse auf eine physische Adresse einer Tile bzw. Kachel abzubilden, und optional einen Cache-Zeilenindex. In mindestens einer Ausführungsform kann die MMU 3045 Adressübersetzungs-Lookaside-Puffer („TLBs“) oder Caches enthalten, die sich in dem Grafik-Multiprozessor 3034 oder in dem L1-Cache 3048 oder in dem Verarbeitungscluster 3094 befinden können. In mindestens einer Ausführungsform wird eine physische Adresse verarbeitet, um die Lokalität des Oberflächendatenzugriffs zu verteilen, um ein effizientes Request Interleaving zwischen den Partitionseinheiten zu ermöglichen. In mindestens einer Ausführungsform kann ein Cache-Zeilenindex verwendet werden, um zu bestimmen, ob eine Anforderung für eine Cachezeile ein Hit oder ein Miss ist.
  • In mindestens einer Ausführungsform kann der Verarbeitungscluster 3094 so konfiguriert sein, dass jeder Grafik-Multiprozessor 3034 mit einer Textureinheit 3036 gekoppelt ist, um Texturabbildungsoperationen, z.B. ein Bestimmen von Texturabtastpositionen, ein Lesen von Texturdaten und ein Filtern von Texturdaten. durchzuführen. In mindestens einer Ausführungsform werden die Texturdaten aus einem internen Textur-L1-Cache (nicht dargestellt) oder aus einem L1-Cache innerhalb des Grafik-Multiprozessors 3034 gelesen und je nach Bedarf aus einem L2-Cache, einem lokalen Parallelprozessorspeicher oder dem Systemspeicher abgerufen. In mindestens einer Ausführungsform gibt jeder Grafik-Multiprozessor 3034 eine verarbeitete Aufgabe an die Datenkreuzschiene 3040 aus, um die verarbeitete Aufgabe einem anderen Verarbeitungscluster 3094 zur weiteren Verarbeitung bereitzustellen oder um die verarbeitete Aufgabe in einem L2-Cache, einem lokalen Parallelprozessorspeicher oder einem Systemspeicher über die Speicherkreuzschiene 3016 zu speichern. In mindestens einer Ausführungsform ist eine Pre-Raster-Operations-Einheit („preROP“) 3042 so konfiguriert, dass sie Daten von dem Grafik-Multiprozessor 3034 empfängt und Daten an ROP-Einheiten weiterleitet, die sich bei den hierin beschriebenen Partitionseinheiten (z.B. den Partitionseinheiten 3020A-3020N in 30) befinden können. In mindestens einer Ausführungsform kann die PreROP 3042 Optimierungen für die Farbmischung durchführen, Pixelfarbdaten organisieren und Adressübersetzungen vornehmen.
  • 30C veranschaulicht einen Grafik-Multiprozessor 3096, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 3096 der Grafik-Multiprozessor 3034 von 30B. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 3096 mit dem Pipeline-Manager 3032 des Verarbeitungsclusters 3094 gekoppelt. In mindestens einer Ausführungsform hat der Grafik-Multiprozessor 3096 eine Ausführungs-Pipeline, die unter anderem einen Anweisungscache 3052, eine Anweisungseinheit 3054, eine Adressabbildungseinheit 3056, eine Registerdatei 3058, einen oder mehrere GPGPU-Kerne 3062 und eine oder mehrere LSUs 3066 beinhaltet. Die GPGPU-Kerne 3062 und die LSUs 3066 sind über eine Speicher- und Cache-Verbindung 3068 mit dem Cachespeicher 3072 und dem gemeinsamen Speicher 3070 gekoppelt.
  • In mindestens einer Ausführungsform empfängt der Anweisungscache 3052 einen Stream bzw. Strom von auszuführenden Befehlen von dem Pipeline-Manager 3032. In mindestens einer Ausführungsform werden die Befehle in dem Anweisungscache 3052 zwischengespeichert und von der Anweisungseinheit 3054 zur Ausführung bereitgestellt. In mindestens einer Ausführungsform kann die Anweisungseinheit 3054 Anweisungen als Thread-Gruppen (z.B. Warps) versenden, wobei jeder Thread einer Thread-Gruppe einer anderen Ausführungseinheit innerhalb des GPGPU-Kerns 3062 zugewiesen ist. In mindestens einer Ausführungsform kann ein Befehl durch Spezifizieren einer Adresse in einem einheitlichen Adressraum auf einen lokalen, gemeinsam genutzten oder globalen Adressraum zugreifen. In mindestens einer Ausführungsform kann die Adressabbildungseinheit 3056 verwendet werden, um Adressen in einem vereinheitlichten Adressraum in eine eindeutige Speicheradresse zu übersetzen, auf die die LSUs 3066 zugreifen können.
  • In mindestens einer Ausführungsform stellt die Registerdatei 3058 einen Satz von Registern für Funktionseinheiten des Grafik-Multiprozessors 3096 bereit. In mindestens einer Ausführungsform stellt die Registerdatei 3058 einen temporären Speicher für Operanden bereit, die Datenpfaden von Funktionseinheiten (z.B. GPGPU-Kerne 3062, LSUs 3066) des Grafik-Multiprozessors 3096 zugeordnet sind. In mindestens einer Ausführungsform ist die Registerdatei 3058 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 3058 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 3058 zwischen verschiedenen Thread-Gruppen aufgeteilt, die von dem Grafik-Multiprozessor 3096 ausgeführt werden.
  • In mindestens einer Ausführungsform können die GPGPU-Kerne 3062 jeweils FPUs und/oder Integer-ALUs enthalten, die zur Ausführung von Anweisungen des Grafik-Multiprozessors 3096 verwendet werden. Die GPGPU-Kerne 3062 können eine ähnliche Architektur aufweisen oder sich in der Architektur unterscheiden. In mindestens einer Ausführungsform enthält ein erster Teil der GPGPU-Kerne 3062 eine FPU mit einfacher Genauigkeit und eine Integer-ALU, während ein zweiter Teil der GPGPU-Kerne 3062 eine FPU mit doppelter Genauigkeit enthält. In mindestens einer Ausführungsform können die FPUs den IEEE 754-2008-Standard für Gleitkommaarithmetik implementieren oder Gleitkommaarithmetik mit variabler Genauigkeit ermöglichen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 3096 zusätzlich eine oder mehrere Funktionseinheiten mit fester Funktion oder mit Sonderfunktion enthalten, um spezifische Funktionen wie Kopierrechteck- oder Pixelmischoperationen durchzuführen. In mindestens einer Ausführungsform können einer oder mehrere der GPGPU-Kerne 3062 auch eine Logik mit fester oder spezieller Funktion enthalten.
  • In mindestens einer Ausführungsform enthalten die GPGPU-Kerne 3062 SIMD-Logik, die in der Lage ist, einen einzigen Befehl auf mehreren Datensätzen auszuführen. In mindestens einer Ausführungsform können die GPGPU-Kerne 3062 physisch SIMD4-, SIMD8- und SIMD16-Anweisungen und logisch SIMD1-, SIMD2- und SIMD32-Anweisungen ausführen. In mindestens einer Ausführungsform können SIMD-Befehle für die GPGPU-Kerne 3062 zur Kompilierzeit von einem Shader-Compiler generiert werden oder automatisch generiert werden, wenn Programme ausgeführt werden, die für Single Program Multiple Data („SPMD“) oder SIMT-Architekturen geschrieben und kompiliert wurden. In mindestens einer Ausführungsform können mehrere Threads eines für ein SIMT-Ausführungsmodell konfigurierten Programms über eine einzige SIMD-Anweisung ausgeführt werden. Zum Beispiel können in mindestens einer Ausführungsform acht SIMT-Threads, die die gleichen oder ähnliche Operationen ausführen, parallel über eine einzige SIMD8-Logikeinheit ausgeführt werden.
  • In mindestens einer Ausführungsform ist die Speicher- und Cache-Verbindung 3068 ein Verbindungsnetzwerk, das jede Funktionseinheit des Grafik-Multiprozessors 3096 mit der Registerdatei 3058 und dem gemeinsamen Speicher 3070 verbindet. In mindestens einer Ausführungsform ist die Speicher- und Cache-Verbindung 3068 eine Kreuzschienenverbindung, die es der LSU 3066 ermöglicht, Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher 3070 und der Registerdatei 3058 durchzuführen. In mindestens einer Ausführungsform kann die Registerdatei 3058 mit derselben Frequenz arbeiten wie die GPGPU-Kerne 3062, so dass die Datenübertragung zwischen den GPGPU-Kernen 3062 und der Registerdatei 3058 eine sehr geringe Latenz aufweist. In mindestens einer Ausführungsform kann der gemeinsame Speicher 3070 verwendet werden, um die Kommunikation zwischen Threads zu ermöglichen, die auf Funktionseinheiten innerhalb des Grafik-Multiprozessors 3096 ausgeführt werden. In mindestens einer Ausführungsform kann der Cachespeicher 3072 z.B. als Datencache verwendet werden, um Texturdaten zu cachen, die zwischen Funktionseinheiten und der Textureinheit 3036 kommuniziert werden. In mindestens einer Ausführungsform kann der gemeinsame Speicher 3070 auch als programmverwalteter Cache verwendet werden. In mindestens einer Ausführungsform können Threads, die auf den GPGPU-Kernen 3062 ausgeführt werden, zusätzlich zu den automatisch zwischengespeicherten Daten, die in dem Cachespeicher 3072 gespeichert sind, programmatisch Daten in dem gemeinsam genutzten Speicher speichern.
  • In mindestens einer Ausführungsform ist ein Parallelprozessor oder eine GPGPU, wie hierin beschrieben, kommunikativ mit einem Hostprozessor/mit Kernen gekoppelt, um Grafikoperationen, Operationen des maschinellen Lernens, Musteranalyseoperationen und verschiedene Universal-GPU-Funktionen (GPGPU) zu beschleunigen. In mindestens einer Ausführungsform kann eine GPU über einen Bus oder eine andere Verbindung (z.B. eine Hochgeschwindigkeitsverbindung wie beispielsweise PCIe oder NVLink) mit dem Hostprozessor/mit Kernen kommunikativ gekoppelt sein. In mindestens einer Ausführungsform kann ein Grafikprozessor auf demselben Gehäuse oder Chip wie die Kerne integriert sein und mit den Kernen über einen Prozessorbus/einen Interconnect kommunizieren, der sich innerhalb eines Gehäuses oder eines Chips befindet. In mindestens einer Ausführungsform können Prozessorkerne unabhängig von der Art und Weise, in der ein Grafikprozessor verbunden ist, dem Grafikprozessor Arbeit in Form von Sequenzen von Befehlen/Anweisungen, die in einem WD enthalten sind, zuweisen. In mindestens einer Ausführungsform verwendet die GPU dann dedizierte Schaltkreise/Logik zur effizienten Verarbeitung dieser Befehle/Anweisungen.
  • In mindestens einer Ausführungsform wird mindestens eine in den 30A-30C gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit den 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens einer der folgenden Prozessoren verwendet: Parallelprozessor 3000, Grafik-Multiprozessor 3034 oder Grafik-Multiprozessor 3096, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens einer der folgenden Prozessoren verwendet: Parallelprozessor 3000, Grafik-Multiprozessor 3034 oder Grafik-Multiprozessor 3096, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer der folgenden Prozessoren verwendet: Parallelprozessor 3000, Grafik-Multiprozessor 3034 oder Grafik-Multiprozessor 3096, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer der folgenden Prozessoren verwendet: Parallelprozessor 3000, Grafik-Multiprozessor 3034 oder Grafik-Multiprozessor 3096, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens einer der folgenden Prozessoren verwendet: Parallelprozessor 3000, Grafik-Multiprozessor 3034 oder Grafik-Multiprozessor 3096, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 31 veranschaulicht einen Grafikprozessor 3100, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst der Grafikprozessor 3100 eine Ringverbindung 3102, ein Pipeline-Frontend 3104, eine Media Engine 3137 und Grafikkerne 3180A-3180N. In mindestens einer Ausführungsform verbindet die Ringverbindung 3102 den Grafikprozessor 3100 mit anderen Verarbeitungseinheiten, einschließlich anderer Grafikprozessoren oder eines oder mehrerer Mehrzweckprozessorkerne. In mindestens einer Ausführungsform ist der Grafikprozessor 3100 einer von vielen Prozessoren, die in ein Multikern-Verarbeitungssystem integriert sind.
  • In mindestens einer Ausführungsform empfängt der Grafikprozessor 3100 Stapel von Befehlen über die Ringverbindung 3102. In mindestens einer Ausführungsform werden die eingehenden Befehle von einem Befehlsstreamer 3103 in dem Pipeline-Frontend 3104 interpretiert. In mindestens einer Ausführungsform enthält der Grafikprozessor 3100 eine skalierbare Ausführungslogik zur Durchführung der 3D-Geometrieverarbeitung und der Medienverarbeitung über den/die Grafikkern(e) 3180A-3180N. In mindestens einer Ausführungsform liefert der Befehlsstreamer 3103 für 3D-Geometrieverarbeitungsbefehle Befehle an die Geometrie-Pipeline 3136. In mindestens einer Ausführungsform liefert der Befehlsstreamer 3103 für mindestens einige Medienverarbeitungsbefehle Befehle an ein Video-Frontend 3134, das mit einer Medien-Engine 3137 gekoppelt ist. In mindestens einer Ausführungsform umfasst die Medien-Engine 3137 eine Video Quality Engine („VQE“) 3130 für die Video- und Bildnachbearbeitung und eine Multiformat-Codier-/ Decodier-Engine („MFX“) 3133 für die hardwarebeschleunigte Codierung und Decodierung von Mediendaten. In mindestens einer Ausführungsform erzeugen die Geometrie-Pipeline 3136 und die Medien-Engine 3137 jeweils Ausführungs-Threads für Thread-Ausführungsressourcen, die von mindestens einem Grafikkern 3180A bereitgestellt werden.
  • In mindestens einer Ausführungsform enthält der Grafikprozessor 3100 skalierbare Thread-Ausführungsressourcen mit modularen Grafikkernen 3180A-3180N (manchmal als Kern-Slices bezeichnet), die jeweils mehrere Subkerne 3150A-3150N, 3160A-3160N (manchmal als Kern-Sub-Slices bezeichnet) aufweisen. In mindestens einer Ausführungsform kann der Grafikprozessor 3100 eine beliebige Anzahl von Grafikkernen 3180A bis 3180N aufweisen. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 3100 einen Grafikkern 3180A mit mindestens einem ersten Subkern 3150A und einem zweiten Subkern 3160A. In mindestens einer Ausführungsform ist der Grafikprozessor 3100 ein Prozessor mit geringem Stromverbrauch und einem einzigen Subkern (z.B. dem Subkern 3150A). In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 3100 mehrere Grafikkerne 3180A-3180N, die jeweils einen Satz erster Subkerne 3150A-3150N und einen Satz zweiter Subkerne 3160A-3160N umfassen. In mindestens einer Ausführungsform enthält jeder Subkern in den ersten Subkernen 3150A-3150N mindestens einen ersten Satz von Ausführungseinheiten („EUs“) 3152A-3152N und Medien-/Textur-Sampler 3154A-3154N. In mindestens einer Ausführungsform enthält jeder Subkern in den zweiten Subkernen 3160A-3160N mindestens einen zweiten Satz von Ausführungseinheiten 3162A-3162N und Samplern 3164A-3164N. In mindestens einer Ausführungsform teilt sich jeder Subkern 3150A-3150N, 3160A-3160N einen Satz von gemeinsam genutzten Ressourcen 3170A-3170N. In mindestens einer Ausführungsform umfassen die gemeinsam genutzten Ressourcen 3170 den gemeinsam genutzten Cachespeicher und die Pixeloperationslogik.
  • In mindestens einer Ausführungsform wird mindestens eine in 31 dargestellte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird der Grafikprozessor 3100 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird der Grafikprozessor 3100 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Grafikprozessor 3100 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Grafikprozessor 3100 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird der Grafikprozessor 3100 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 32 veranschaulicht einen Prozessor 3200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Prozessor 3200, ohne Beschränkung darauf, Logikschaltungen zur Ausführung von Befehlen enthalten. In mindestens einer Ausführungsform kann der Prozessor 3200 Befehle ausführen, einschließlich x86-Befehle, ARM-Befehle, spezielle Befehle für ASICs usw. In mindestens einer Ausführungsform kann der Prozessor 3210 Register enthalten, um gepackte Daten zu speichern, wie z.B. 64 Bit breite MMXTM-Register in Mikroprozessoren, die mit der MMX-Technologie der Intel Corporation aus Santa Clara, Kalifornien, ausgestattet sind. In mindestens einer Ausführungsform können MMX-Register, die sowohl in Ganzzahl- als auch in Gleitkommaform verfügbar sind, mit gepackten Datenelementen arbeiten, die SIMD- und Streaming-SIMD-Erweiterungsbefehle („SSE“) begleiten. In mindestens einer Ausführungsform können 128 Bit breite XMM-Register, die sich auf SSE2-, SSE3-, SSE4-, AVX- oder darüber hinausgehende Technologien beziehen (allgemein als „SSEx“ bezeichnet), solche gepackten Datenoperanden aufnehmen. In mindestens einer Ausführungsform können die Prozessoren 3210 Anweisungen zur Beschleunigung von CUDA-Programmen ausführen.
  • In mindestens einer Ausführungsform enthält der Prozessor 3200 ein In-Order-FrontEnd („Front-End“) 3201 zum Abrufen von auszuführenden Anweisungen und zur Vorbereitung von Anweisungen, die später in der Prozessor-Pipeline zu verwenden sind. In mindestens einer Ausführungsform kann das Front-End 3201 mehrere Einheiten beinhalten. In mindestens einer Ausführungsform holt ein Anweisungs-Vorabrufer bzw. -Prefetcher 3226 Anweisungen aus dem Speicher und leitet sie an einen Anweisungs-Decodierer 3228 weiter, der seinerseits Anweisungen decodiert oder interpretiert. In mindestens einer Ausführungsform decodiert der Anweisungs-Decodierer 3228 beispielsweise eine empfangene Anweisung in eine oder mehrere Operationen, die als „Mikroanweisungen“ oder „Mikrooperationen“ (auch „mikro-ops“ oder „uops“ genannt) bezeichnet werden, um sie auszuführen. In mindestens einer Ausführungsform zerlegt der Anweisungs-Decodierer 3228 die Anweisung in einen Op-Code und entsprechende Daten- und Steuerfelder, die von der Mikroarchitektur zur Ausführung von Operationen verwendet werden können. In mindestens einer Ausführungsform kann ein Trace-Cache 3230 decodierte Uops in programmgeordnete Sequenzen oder Traces in einer Uop-Warteschlange 3234 zur Ausführung zusammenstellen. In mindestens einer Ausführungsform stellt dann, wenn der Trace-Cache 3230 auf eine komplexe Anweisung stößt, ein Mikrocode-ROM 3232 Uops bereit, die zum Abschluss einer Operation benötigt werden.
  • In mindestens einer Ausführungsform können einige Anweisungen in eine einzige Mikro-Op umgewandelt werden, während andere mehrere Mikro-Ops benötigen, um den vollen Betriebsablauf abzuschließen. In mindestens einer Ausführungsform kann der Anweisungs-Decodierer 3228 auf den Mikrocode-ROM 3232 zugreifen, wenn mehr als vier Mikro-Ops für die Ausführung einer Anweisung erforderlich sind. In mindestens einer Ausführungsform kann eine Anweisung in eine kleine Anzahl von Mikro-Ops für die Verarbeitung in dem Anweisungs-Decodierer 3228 decodiert werden. In mindestens einer Ausführungsform kann eine Anweisung in dem Mikrocode-ROM 3232 gespeichert werden, falls eine Anzahl von Mikro-Ops zur Ausführung der Operation benötigt wird. In mindestens einer Ausführungsform bezieht sich der Trace-Cache 3230 auf ein programmierbares Logik-Array („PLA“) als Einstiegspunkt, um einen korrekten Mikroanweisungszeiger zum Lesen von Mikrocode-Sequenzen zu bestimmen, um einen oder mehrere Anweisungen aus dem Mikrocode-ROM 3232 zu vervollständigen. In mindestens einer Ausführungsform kann das Front-End 3201 der Maschine, nachdem der Mikrocode-ROM 3232 die Sequenzierung von Mikro-Ops für eine Anweisung beendet hat, das Abrufen von Mikro-Ops aus dem Trace-Cache 3230 wieder aufnehmen.
  • In mindestens einer Ausführungsform kann die Out-of-Order-Ausführungs-Engine („Out of Order Engine“) 3203 Anweisungen für die Ausführung vorbereiten. In mindestens einer Ausführungsform verfügt die Out-of-Order-Ausführungslogik über eine Reihe von Puffern, um den Fluss von Anweisungen zu glätten und neu zu ordnen, um die Leistung zu optimieren, während sie eine Pipeline durchlaufen und für die Ausführung geplant werden. Die Out-of-Order-Ausführungslogik 3203 beinhaltet, ohne darauf beschränkt zu sein, einen Allokator/Register-Umbenenner 3240, eine Speicher-Uop-Warteschlange 3242, eine Ganzzahl-/Gleitkomma-Uop-Warteschlange 3244, einen Speicher-Scheduler 3246, einen schnellen Scheduler 3202, einen langsamen/allgemeinen Gleitkomma-Scheduler („langsamer/allgemeiner FP-Scheduler“) 3204 und einen einfachen Gleitkomma-Scheduler („einfacher FP-scheduler“) 3206. In mindestens einer Ausführungsform werden der schnelle Scheduler 3202, der langsame/allgemeine Gleitkomma-Scheduler 3204 und der einfache Gleitkomma-Scheduler 3206 hierin auch gemeinsam als „Uop-Scheduler 3202, 3204, 3206“ bezeichnet. Der Allocator/Register-Umbenenner 3240 weist Maschinenpuffer und Ressourcen zu, die jede Uop zur Ausführung benötigt. In mindestens einer Ausführungsform benennt der Allocator/Register-Umbenenner 3240 logische Register auf Einträge in einer Registerdatei um. In mindestens einer Ausführungsform weist der Allocator/Register-Umbenenner 3240 auch einen Eintrag für jede Uop in einer von zwei Uop-Warteschlangen zu, der Speicher-Uop-Warteschlange 3242 für Speicheroperationen und der Ganzzahl-/Gleitkomma-Uop-Warteschlange 3244 für Nicht-Speicheroperationen, und zwar vor dem Speicher-Scheduler 3246 und den Uop-Schedulern 3202, 3204, 3206. In mindestens einer Ausführungsform bestimmen die Uop-Scheduler 3202, 3204, 3206, wann eine Uop zur Ausführung bereit ist, basierend auf der Bereitschaft ihrer abhängigen Eingangsregister-Operandenquellen und der Verfügbarkeit der Ausführungs-ressourcen, die Uops benötigen, um ihre Operation abzuschließen. In mindestens einer Ausführungsform kann der schnelle Scheduler 3202 in jeder Hälfte des Haupttaktzyklus terminieren, während der langsame/allgemeine Gleitkomma-Scheduler 3204 und der einfache Gleitkomma-Scheduler 3206 einmal pro Hauptprozessortaktzyklus terminieren können. In mindestens einer Ausführungsform arbitrieren die Uop-Scheduler 3202, 3204, 3206 für Versende- bzw. Dispatch-Ports, um Uops für die Ausführung zu planen.
  • In mindestens einer Ausführungsform beinhaltet der Ausführungsblock 3211, ohne Beschränkung darauf, eine Ganzzahl-Registerdatei/ein Bypass-Netzwerk 3208, eine Gleitkommaregisterdatei/ein Bypass-Netzwerk („FP-Registerdatei/ein Bypass-Netzwerk“) 3210, Adressgenerierungseinheiten („AGUs“) 3212 und 3214, schnelle ALUs bzw. S-ALUSs 3216 und 3218, eine langsame ALU bzw. L-ALU 3220, eine Gleitkomma-ALU („FP“) 3222 und eine Gleitkomma-Bewegungseinheit („FP-Move“) 3224. In mindestens einer Ausführungsform werden die Ganzzahl-Registerdatei/das Bypass-Netzwerk 3208 und die Gleitkomma-Registerdatei/das Bypass-Netzwerk 3210 hierin auch als „Registerdateien 3208, 3210“ bezeichnet. In mindestens einer Ausführungsform werden die AGUs 3212 und 3214, die schnellen ALUs 3216 und 3218, die langsame ALU 3220, die Gleitkomma-ALU 3222 und die Gleitkomma-Bewegungseinheit 3224 hierin auch als „Ausführungseinheiten 3212, 3214, 3216, 3218, 3220, 3222 und 3224“ bezeichnet. In mindestens einer Ausführungsform kann ein Ausführungsblock, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) und Art von Registerdateien, Bypass-Netzwerken, Adressgenerierungseinheiten und Ausführungseinheiten in beliebiger Kombination enthalten.
  • In mindestens einer Ausführungsform können die Registerdateien 3208, 3210 zwischen den Uop-Schedulern 3202, 3204, 3206 und den Ausführungseinheiten 3212, 3214, 3216, 3218, 3220, 3222 und 3224 angeordnet sein. In mindestens einer Ausführungsform führt das Ganzzahl-Registerdatei/das Bypass-Netzwerk 3208 Ganzzahloperationen durch. In mindestens einer Ausführungsform führt die Gleitkommaregisterdatei/das Bypass-Netzwerk 3210 Gleitkommaoperationen durch. In mindestens einer Ausführungsform kann jede der Registerdateien 3208, 3210, ohne Beschränkung darauf, ein Bypass-Netzwerk beinhalten, das gerade abgeschlossene Ergebnisse, die noch nicht in die Registerdatei geschrieben wurden, umgehen oder an neue abhängige Uops weiterleiten kann. In mindestens einer Ausführungsform können die Registerdateien 3208, 3210 Daten miteinander austauschen. In mindestens einer Ausführungsform kann das Ganzzahl-Registerdatei/das Bypass-Netzwerk 3208, ohne Beschränkung darauf, zwei separate Registerdateien beinhalten, eine Registerdatei für Daten niedriger Ordnung mit 32 Bits und eine zweite Registerdatei für Daten hoher Ordnung mit 32 Bits. In mindestens einer Ausführungsform kann die Gleitkomma-Registerdatei/das Bypass-Netzwerk 3210, ohne Beschränkung darauf, 128 Bit breite Einträge enthalten, da Gleitkomma-Befehle typischerweise Operanden mit einer Breite von 64 bis 128 Bit haben.
  • In mindestens einer Ausführungsform können die Ausführungseinheiten 3212, 3214, 3216, 3218, 3220, 3222, 3224 Anweisungen ausführen. In mindestens einer Ausführungsform speichern Registerdateien 3208, 3210 Ganzzahl- und Gleitkomma-Daten-Operandenwerte, die Mikroanweisungen ausführen müssen. In mindestens einer Ausführungsform kann der Prozessor 3200, ohne Beschränkung darauf, eine beliebige Anzahl und Kombination von Ausführungseinheiten 3212, 3214, 3216, 3218, 3220, 3222, 3224 enthalten. In mindestens einer Ausführungsform können die Gleitkomma-ALU 3222 und die Gleitkomma-Bewegungseinheit 3224 Gleitkomma-, MMX-, SIMD-, AVX- und SSE- oder andere Operationen ausführen. In mindestens einer Ausführungsform kann die Gleitkomma-ALU 3222, ohne Beschränkung darauf, einen 64-Bitmal-64-Bit-Gleitkomma-Teiler enthalten, um die Mikrooperationen Dividieren, Quadratwurzel und Rest auszuführen. In mindestens einer Ausführungsform können Anweisungen, die einen Gleitkommawert beinhalten, mit Gleitkomma-Hardware verarbeitet werden. In mindestens einer Ausführungsform können ALU-Operationen an die schnellen ALUs 3216, 3218 übergeben werden. In mindestens einer Ausführungsform können die schnellen ALUS 3216, 3218 schnelle Operationen mit einer effektiven Latenz von einem halben Taktzyklus ausführen. In mindestens einer Ausführungsform gehen die meisten komplexen Ganzzahloperationen an die langsame ALU 3220, da die langsame ALU 3220, ohne Beschränkung darauf, Ganzzahl-Ausführungshardware für Operationen mit langer Latenzzeit enthalten kann, wie z.B. einen Multiplizierer, Verschiebungen, Flag-Logik und Verzweigungsverarbeitung. In mindestens einer Ausführungsform können Speicher-Lade-/Speicher-Operationen von den AGUs 3212, 3214 ausgeführt werden. In mindestens einer Ausführungsform können die schnelle ALU 3216, die schnelle ALU 3218 und die langsame ALU 3220 Ganzzahloperationen an 64-Bit-Datenoperanden durchführen. In mindestens einer Ausführungsform können die schnelle ALU 3216, die schnelle ALU 3218 und die langsame ALU 3220 so implementiert sein, dass sie eine Vielzahl von Datenbitgrößen unterstützen, einschließlich sechzehn, zweiunddreißig, 128, 256, usw. In mindestens einer Ausführungsform können die Gleitkomma-ALU 3222 und die Gleitkomma-Bewegungseinheit („FP MOVE“) 3224 so implementiert sein, dass sie einen Bereich von Operanden mit Bits unterschiedlicher Breite unterstützen. In mindestens einer Ausführungsform können die Gleitkomma-ALU 3222 und die Gleitkomma-Bewegungseinheit 3224 mit 128 Bit breiten gepackten Datenoperanden in Verbindung mit SIMD- und Multimedia-Anweisungen arbeiten.
  • In mindestens einer Ausführungsform versenden die Uop-Scheduler 3202, 3204, 3206 abhängige Operationen, bevor die Ausführung der übergeordneten Last beendet ist. Da in mindestens einer Ausführungsform UOPs spekulativ geplant und in dem Prozessor 3200 ausgeführt werden können, kann der Prozessor 3200 auch Logik zur Behandlung von Speicherfehlern enthalten. In mindestens einer Ausführungsform kann es dann, wenn eine Datenlast in einem Datencache fehlschlägt, abhängige Operationen in der Pipeline geben, die einen Scheduler mit vorübergehend falschen Daten verlassen haben. In mindestens einer Ausführungsform verfolgt ein Wiedergabemechanismus Anweisungen, die falsche Daten verwenden, und führt sie erneut aus. In mindestens einer Ausführungsform müssen abhängige Operationen möglicherweise erneut abgespielt werden, während unabhängige Operationen zu Ende geführt werden können. In mindestens einer Ausführungsform können Scheduler und Wiedergabemechanismen von mindestens einer Ausführungsform eines Prozessors auch so ausgelegt sein, dass sie Befehlssequenzen für Textstring-Vergleichsoperationen abfangen.
  • In mindestens einer Ausführungsform kann sich der Begriff „Register“ auf prozessorinterne Speicherplätze beziehen, die als Teil von Anweisungen verwendet werden können, um Operanden zu identifizieren. In mindestens einer Ausführungsform kann es sich bei den Registern um solche handeln, die von außerhalb eines Prozessors (aus der Sicht eines Programmierers) nutzbar sein können. In mindestens einer Ausführungsform brauchen die Register nicht auf einen bestimmten Schaltungstyp beschränkt zu sein. Vielmehr kann ein Register in mindestens einer Ausführungsform Daten speichern, Daten bereitstellen und die hierin beschriebenen Funktionen ausführen. In mindestens einer Ausführungsform können die hierin beschriebenen Register durch Schaltkreise innerhalb eines Prozessors unter Verwendung einer beliebigen Anzahl verschiedener Techniken implementiert sein, wie z.B. dedizierte physische Register, dynamisch zugewiesene physische Register unter Verwendung von Registerumbenennung, Kombinationen aus dedizierten und dynamisch zugewiesenen physischen Registern usw. In mindestens einer Ausführungsform speichern Ganzzahlregister 32-Bit-Ganzzahl-Daten. Eine Registerdatei von mindestens einer Ausführungsform enthält auch acht Multimedia-SIMD-Register für gepackte Daten.
  • In mindestens einer Ausführungsform wird mindestens eine in 32 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird der Prozessor 3200 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird der Prozessor 3200 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 3200 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Prozessor 3200 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird der Prozessor 3200 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 330, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist..
  • 33 veranschaulicht einen Prozessor 3300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet der Prozessor 3300, ohne Beschränkung darauf, einen oder mehrere Prozessorkerne („Kerne“) 3302A-3302N, einen integrierten Speichercontroller 3314 und einen integrierten Grafikprozessor 3308. In mindestens einer Ausführungsform kann der Prozessor 3300 zusätzliche Kerne bis hin zu und einschließlich des zusätzlichen Prozessorkerns 3302N enthalten, der durch gestrichelte, linierte Kästen dargestellt ist. In mindestens einer Ausführungsform enthält jeder der Prozessorkerne 3302A-3302N eine oder mehrere interne Cacheeinheiten 3304A-3304N. In mindestens einer Ausführungsform hat jeder Prozessorkern auch Zugriff auf eine oder mehrere gemeinsam genutzte Cacheeinheiten 3306.
  • In mindestens einer Ausführungsform repräsentieren die internen Cacheeinheiten 3304A-3304N und die gemeinsam genutzten Cacheeinheiten 3306 eine Cachespeicherhierarchie innerhalb des Prozessors 3300. In mindestens einer Ausführungsform können die Cachespeichereinheiten 3304A-3304N mindestens eine Ebene von Befehls- und Daten-Cache innerhalb jedes Prozessorkerns und eine oder mehrere Ebenen von gemeinsam genutztem Mid-Level-Cache, wie z.B. L2, L3, Ebene 4 („L4“) oder andere Cacheebenen, beinhalten, wobei eine höchste Cacheebene vor dem externen Speicher als LLC klassifiziert ist. In mindestens einer Ausführungsform hält die Cache-Kohärenzlogik die Kohärenz zwischen verschiedenen Cacheeinheiten 3306 und 3304A-3304N aufrecht.
  • In mindestens einer Ausführungsform kann der Prozessor 3300 auch einen Satz von einer oder mehreren Buscontrollereinheiten 3316 und einen Systemagent-Kern 3310 enthalten. In mindestens einer Ausführungsform verwalten eine oder mehrere Buscontrollereinheiten 3316 einen Satz von Peripheriebussen, wie z.B. einen oder mehrere PCI- oder PCI-Express-Busse. In mindestens einer Ausführungsform stellt der Systemagent-Kern 3310 Verwaltungsfunktionen für verschiedene Prozessorkomponenten bereit. In mindestens einer Ausführungsform enthält der Systemagent-Kern 3310 einen oder mehrere integrierte Speichercontroller 3314 zur Verwaltung des Zugriffs auf verschiedene externe Speichervorrichtungen (nicht gezeigt).
  • In mindestens einer Ausführungsform beinhalten einer oder mehrere der Prozessorkerne 3302A-3302N Unterstützung für gleichzeitiges Multithreading. In mindestens einer Ausführungsform enthält der Systemagent-Kern 3310 Komponenten zum Koordinieren und Betreiben der Prozessorkerne 3302A-3302N während der Multithreading-Verarbeitung. In mindestens einer Ausführungsform kann der Systemagent-Kern 3310 zusätzlich eine Leistungssteuerungseinheit („PCU“) enthalten, die Logik und Komponenten zur Regelung eines oder mehrerer Leistungszustände der Prozessorkerne 3302A-3302N und des Grafikprozessors 3308 beinhaltet.
  • In mindestens einer Ausführungsform enthält der Prozessor 3300 zusätzlich einen Grafikprozessor 3308 zur Ausführung von Grafikverarbeitungsoperationen. In mindestens einer Ausführungsform ist der Grafikprozessor 3308 mit gemeinsam genutzten Cacheeinheiten 3306 und dem Systemagent-Kern 3310 gekoppelt, einschließlich eines oder mehrerer integrierter Speichercontroller 3314. In mindestens einer Ausführungsform enthält der Systemagent-Kern 3310 auch einen Anzeigecontroller 2311, um die Ausgabe des Grafikprozessors an ein oder mehrere gekoppelte Anzeigen zu steuern. In mindestens einer Ausführungsform kann der Anzeigecontroller 3311 auch ein separates Modul sein, das über mindestens eine Verbindung bzw. einen Interconnect mit dem Grafikprozessor 3308 gekoppelt ist, oder kann in den Grafikprozessor 3308 integriert sein.
  • In mindestens einer Ausführungsform wird eine ringbasierte Verbindungseinheit 3312 verwendet, um interne Komponenten des Prozessors 3300 zu koppeln. In mindestens einer Ausführungsform kann auch eine alternative Verbindungseinheit verwendet werden, z.B. eine Punkt-zu-Punkt-Verbindung, eine geschaltete Verbindung oder andere Techniken. In mindestens einer Ausführungsform ist der Grafikprozessor 3308 über eine E/A-Verbindung 3313 mit der Ringverbindung 3312 gekoppelt.
  • In mindestens einer Ausführungsform repräsentiert die E/A-Verbindung 3313 mindestens eine von mehreren Arten von E/A-Verbindungen, einschließlich einer On-Package-E/A-Verbindung, die die Kommunikation zwischen verschiedenen Prozessorkomponenten und einem eingebetteten Hochleistungsspeichermodul 3318, wie z.B. einem eDRAM-Modul, erleichtert. In mindestens einer Ausführungsform verwenden jeder der Prozessorkerne 3302A-3302N und der Grafikprozessor 3308 eingebettete Speichermodule 3318 als gemeinsame LLC.
  • In mindestens einer Ausführungsform sind die Prozessorkerne 3302A-3302N homogene Kerne, die eine gemeinsame Befehlssatzarchitektur ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 3302A-3302N heterogen in Bezug auf die ISA, wobei ein oder mehrere Prozessorkerne 3302A-3302N einen gemeinsamen Befehlssatz ausführen, während ein oder mehrere andere Kerne der Prozessorkerne 3302A-3302N eine Teilmenge eines gemeinsamen Befehlssatzes oder einen anderen Befehlssatz ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 3302A-3302N in Bezug auf die Mikroarchitektur heterogen, wobei ein oder mehrere Kerne mit einer relativ höheren Leistungsaufnahme mit einem oder mehreren Kernen mit einer niedrigeren Leistungsaufnahme gekoppelt sind. In mindestens einer Ausführungsform kann der Prozessor 3300 auf einem oder mehreren Chips oder als integrierte SoC-Schaltung implementiert sein.
  • In mindestens einer Ausführungsform wird mindestens eine in 33 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens einer des Prozessors 3300 oder des Grafikprozessors 3308 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens einer des Prozessors 3300 oder des Grafikprozessors 3308 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer des Prozessors 3300 oder des Grafikprozessors 3308 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer des Prozessors 3300 oder des Grafikprozessors 3308 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens einer des Prozessors 3300 oder des Grafikprozessors 3308 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 34 veranschaulicht einen Grafikprozessorkern 3400, gemäß mindestens einer beschriebenen Ausführungsform. In mindestens einer Ausführungsform ist der Grafikprozessorkern 3400 in einem Grafikkern-Array enthalten. In mindestens einer Ausführungsform kann der Grafikprozessorkern 3400, der manchmal auch als ein Core Slice bezeichnet wird, ein oder mehrere Grafikkerne innerhalb eines modularen Grafikprozessors sein. In mindestens einer Ausführungsform ist der Grafikprozessorkern 3400 beispielhaft für ein Grafikkern-Slice, und ein Grafikprozessor, wie hierin beschrieben, kann mehrere Grafikkern-Slices enthalten, die auf den angestrebten Energie- und Leistungsumfängen basieren. In mindestens einer Ausführungsform kann jeder Grafikkern 3400 einen Festfunktionsblock 3430 enthalten, der mit mehreren Subkernen 3401A-3401F gekoppelt ist, die auch als Sub-Slices bezeichnet werden und modulare Blöcke von Logik allgemeiner und fester Funktion enthalten.
  • In mindestens einer Ausführungsform beinhaltet der Festfunktionsblock 3430 eine Geometrie/Festfunktions-Pipeline 3436, die von allen Subkernen in dem Grafikprozessor 3400, z.B. in Grafikprozessor-Implementierungen mit geringerer Leistung und/oder geringerem Energieverbrauch, gemeinsam genutzt werden kann. In mindestens einer Ausführungsform beinhaltet die Geometrie/Festfunktions-Pipeline 3436 eine 3D-Festfunktions-Pipeline, eine Video-Frontend-Einheit, einen Thread-Spawner und Thread-Dispatcher sowie einen Unified Return Puffer-Manager, der Unified Return Puffer verwaltet.
  • In mindestens einer Ausführungsform beinhaltet der Festfunktionsblock 3430 darüber hinaus eine Grafik-SoC-Schnittstelle 3437, einen Grafik-Mikrocontroller 3438 und eine Medienpipeline 3439. Die Grafik-SoC-Schnittstelle 3437 stellt eine Schnittstelle zwischen dem Grafikkern 3400 und anderen Prozessorkernen innerhalb einer integrierten SoC-Schaltung bereit. In mindestens einer Ausführungsform ist der Grafik-Mikrocontroller 3438 ein programmierbarer Subprozessor, der so konfiguriert werden kann, dass er verschiedene Funktionen des Grafikprozessors 3400 verwaltet, einschließlich Thread-Versendung, Planung und Präemption. In mindestens einer Ausführungsform enthält die Medienpipeline 3439 Logik zur Erleichterung der Decodierung, Codierung, Vorverarbeitung und/oder Nachverarbeitung von Multimediadaten, einschließlich Bild- und Videodaten. In mindestens einer Ausführungsform implementiert die Medienpipeline 3439 Medienoperationen über Anforderungen an die Rechen- oder Abtastlogik innerhalb der Subkerne 3401-3401 F.
  • In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 3437 dem Grafikkern 3400 die Kommunikation mit Mehrzweck-Anwendungsprozessor-kernen (z.B. CPUs) und/oder anderen Komponenten innerhalb eines SoC, einschließlich Speicherhierarchieelementen wie einem gemeinsam genutzten LLC-Speicher, System-RAM und/oder eingebettetem On-Chip- oder On-Package-DRAM. In mindestens einer Ausführungsform kann die SoC-Schnittstelle 3437 auch Kommunikation mit Vorrichtungen mit fester Funktion innerhalb eines SoCs ermöglichen, wie z.B. Kamera-Bildgebungs-Pipelines, und ermöglicht sie die Verwendung von und/oder implementiert globale(n) Speicheratome(n), die von einem Grafikkern 3400 und CPUs innerhalb eines SoCs gemeinsam genutzt werden können. In mindestens einer Ausführungsform kann die SoC-Schnittstelle 3437 auch Energieverwaltungssteuerungen für den Grafikkern 3400 implementieren und eine Schnittstelle zwischen einer Taktdomäne des Grafikkerns 3400 und anderen Taktdomänen innerhalb eines SoCs ermöglichen. In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 3437 den Empfang von Befehlspuffern von einem Befehlsstreamer und einem globalen Thread-Dispatcher, die so konfiguriert sind, dass sie Befehle und Anweisungen für jeden von einem oder mehreren Grafikkernen innerhalb eines Grafikprozessors bereitstellen. In mindestens einer Ausführungsform können Befehle und Anweisungen an die Medienpipeline 3439 gesendet werden, wenn Medienoperationen durchzuführen sind, oder an eine Geometrie- und Festfunktions-Pipeline (z.B. die Geometrie- und Festfunktions-Pipeline 3436, die Geometrie- und Festfunktions-Pipeline 3414), wenn Grafikverarbeitungsoperationen durchzuführen sind.
  • In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 3438 so konfiguriert sein, dass er verschiedene Planungs- und Verwaltungsaufgaben für den Grafikkern 3400 durchführt. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 3438 die Planung von Grafik- und/oder Rechenlasten auf verschiedenen parallelen Grafik-Engines in den Arrays 3402A-3402F, 3404A-3404F der Ausführungseinheiten (EU) in den Subkernen 3401A-3401 F durchführen. In mindestens einer Ausführungsform kann Hostsoftware, die auf einem CPU-Kern eines SoC mit Grafikkern 3400 ausgeführt wird, Arbeitslasten an eine von mehreren Grafikprozessor-Doorbells übermitteln, die einen Planungsvorgang auf einer geeigneten Grafik-Engine aufruft. In mindestens einer Ausführungsform umfassen die Planungsoperationen ein bestimmen, welche Arbeitslast als nächstes auszuführen ist, ein Übermitteln einer Arbeitslast an einen Befehlsstreamer, ein Vorziehen bestehender Arbeitslasten, die auf einer Engine laufen, ein Überwachen des Fortschritts einer Arbeitslast und ein Benachrichtigen der Hostsoftware, wenn eine Arbeitslast abgeschlossen ist. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 3438 auch Stromsparzustände oder Leerlaufzustände für den Grafikkern 3400 erleichtern, indem er dem Grafikkern 3400 eine Fähigkeit bereitstellt, Register innerhalb des Grafikkerns 3400 über Stromsparzustandsübergänge hinweg unabhängig von einem Betriebssystem und/oder einer Grafiktreibersoftware auf einem System zu speichern und wiederherzustellen.
  • In mindestens einer Ausführungsform kann der Grafikkern 3400 mehr oder weniger als die dargestellten Subkerne 3401A-3401 F haben, bis hin zu N modularen Subkernen. Für jeden Satz von N Subkernen kann der Grafikkern 3400 in mindestens einer Ausführungsform auch eine gemeinsam genutzte Funktionslogik 3410, einen gemeinsam genutzten Speicher und/oder Cachespeicher 3412, eine Geometrie-/ Festfunktions-Pipeline 3414 sowie eine zusätzliche Festfunktionslogik 3416 zur Beschleunigung verschiedener Grafik- und Rechenverarbeitungsoperationen beinhalten. In mindestens einer Ausführungsform kann die gemeinsam genutzte Funktionslogik 3410 Logikeinheiten (z.B. Sampler-, Mathematik- und/oder Inter-Thread-Kommunikationslogik) umfassen, die von allen N Subkernen innerhalb des Grafikkerns 3400 gemeinsam genutzt werden können. Der gemeinsam genutzte Speicher und/oder Cachespeicher 3412 kann ein LLC für N Subkerne 3401 A-3401 F innerhalb des Grafikkerns 3400 sein und kann auch als gemeinsam genutzter Speicher dienen, auf den mehrere Subkerne zugreifen können. In mindestens einer Ausführungsform kann die Geometrie-/Festfunktions-Pipeline 3414 anstelle der Geometrie-/ Festfunktions-Pipeline 3436 innerhalb des Festfunktionsblocks 3430 enthalten sein und kann gleiche oder ähnliche Logikeinheiten beinhalten.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkern 3400 zusätzliche feste Funktionslogik 3416, die verschiedene feste Funktionsbeschleunigungslogik zur Verwendung durch den Grafikkern 3400 enthalten kann. In mindestens einer Ausführungsform umfasst die zusätzliche Festfunktionslogik 3416 eine zusätzliche Geometrie-Pipeline für die Verwendung im positionsabhängigen Shading. Bei positionsabhängigem Shading existieren mindestens zwei Geometrie-Pipelines, d.h. eine vollständige Geometrie-Pipeline innerhalb der Geometrie/Festfunktions-Pipeline 3416, 3436, und eine Cull-Pipeline, bei der es sich um eine zusätzliche Geometrie-Pipeline handelt, die in der zusätzlichen Festfunktionslogik 3416 enthalten sein kann. In mindestens einer Ausführungsform ist die Cull-Pipeline eine abgespeckte Version einer vollständigen Geometrie-Pipeline. In mindestens einer Ausführungsform können eine vollständige Pipeline und eine Cull-Pipeline unterschiedliche Instanzen einer Anwendung ausführen, wobei jede Instanz einen separaten Kontext hat. In mindestens einer Ausführungsform kann positionsabhängiges Shading lange Cull-Läufe von verworfenen Dreiecken ausblenden, wodurch das Shading in einigen Fällen früher abgeschlossen werden kann. Zum Beispiel kann in mindestens einer Ausführungsform die Cull-Pipeline-Logik innerhalb der zusätzlichen Festfunktionslogik 3416 Positions-Shader parallel zu einer Hauptanwendung ausführen und generiert im Allgemeinen kritische Ergebnisse schneller als eine vollständige Pipeline, da eine Cull-Pipeline ein Positionsattribut von Vertices abruft und schattiert, ohne eine Rasterung und ein Rendering von Pixeln in einen Frame-Buffer durchzuführen. In mindestens einer Ausführungsform kann eine Cull-Pipeline generierte kritische Ergebnisse verwenden, um Sichtbarkeitsinformationen für alle Dreiecke zu berechnen, ohne Rücksicht darauf, ob diese Dreiecke gecullt sind. In mindestens einer Ausführungsform kann eine vollständige Pipeline (die in diesem Fall als eine Replay-Pipeline bezeichnet werden kann) Sichtbarkeitsinformationen verwenden, um gecullte Dreiecke zu überspringen, um nur sichtbare Dreiecke zu schattieren, die schließlich an eine Rasterisierungsphase übergeben werden.
  • In mindestens einer Ausführungsform kann die zusätzliche Festfunktionslogik 3416 auch eine allgemeine Verarbeitungsbeschleunigungslogik, wie z.B. eine Festfunktions-Matrixmultiplikationslogik, zur Beschleunigung von CUDA-Programmen beinhalten.
  • In mindestens einer Ausführungsform enthält jeder Grafiksubkern 3401A-3401 F einen Satz von Ausführungsressourcen, die verwendet werden können, um Grafik-, Medien- und Rechenoperationen im Ansprechen auf Anforderungen von Grafikpipeline-, Medienpipeline- oder Shader-Programmen durchzuführen. In mindestens einer Ausführungsform beinhalten die Grafiksubkerne 3401A-3401 F mehrere EU-Arrays 3402A-3402F, 3404A-3404F, Thread-Dispatch- und Inter-Thread-Kommunikationslogik („TD/IC“) 3403A-3403F, einen 3D (z.B. Textur-)- Sampler 3405A-3405F, einen Media-Sampler 3406A-3406F, einen Shader-Prozessor 3407A-3407F und gemeinsam genutzten lokalen Speicher („SLM“) 3408A-3408F. Die EU-Arrays 3402A-3402F, 3404A-3404F enthalten jeweils mehrere Ausführungseinheiten, welche GPGPUs sind, die in der Lage sind, Gleitkomma- und Ganzzahl-/Festkomma-Logikoperationen im Dienste einer Grafik-, Medien- oder Rechenoperation durchzuführen, einschließlich Grafik-, Medien- oder Rechen-Shader-Programmen. In mindestens einer Ausführungsform führt die TD/IC-Logik 3403A-3403F lokale Thread-Dispatch- und Thread-Steuerungsoperationen für Ausführungseinheiten innerhalb eines Subkerns durch und erleichtert Kommunikation zwischen Threads, die auf Ausführungseinheiten eines Subkerns ausgeführt werden. In mindestens einer Ausführungsform kann der 3D-Sampler 3405A-3405F Textur- oder andere auf 3D-Grafik bezogene Daten in den Speicher einlesen. In mindestens einer Ausführungsform kann der 3D-Sampler Texturdaten auf der Grundlage eines konfigurierten Abtaststatus und eines Texturformats, das mit einer bestimmten Textur verbunden ist, unterschiedlich lesen. In mindestens einer Ausführungsform kann der Media-Sampler 3406A-3406F ähnliche Leseoperationen auf der Grundlage eines Typs und eines Formats durchführen, die den Mediendaten zugeordnet sind. In mindestens einer Ausführungsform kann jeder Grafik-Subkern 3401A-3401F abwechselnd einen vereinheitlichten 3D- und Medien-Sampler enthalten. In mindestens einer Ausführungsform können Threads, die auf Ausführungseinheiten innerhalb jedes der Subkerne 3401A-3401F ausgeführt werden, den gemeinsamen lokalen Speicher 3408A-3408F innerhalb jedes Subkerns nutzen, damit Threads, die innerhalb einer Thread-Gruppe ausgeführt werden, unter Verwendung eines gemeinsamen Pools von On-Chip-Speicher ausgeführt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 34 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3400 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3400 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3400 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3400 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3400 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 35 veranschaulicht eine Parallelverarbeitungseinheit („PPU“) 3500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die PPU 3500 mit maschinenlesbarem Code konfiguriert, der, wenn er von der PPU 3500 ausgeführt wird, die PPU 3500 veranlasst, einige oder alle der hierin beschriebenen Prozesse und Techniken durchzuführen. In mindestens einer Ausführungsform ist die PPU 3500 ein Multi-Thread-Prozessor, der auf einer oder mehreren Vorrichtungen mit integrierten Schaltkreisen implementiert ist und der Multithreading als eine latenzverbergende Technik nutzt, um computerlesbare Anweisungen (auch als maschinenlesbare Anweisungen oder einfach Anweisungen bezeichnet) auf mehreren Threads parallel zu verarbeiten. In mindestens einer Ausführungsform bezieht sich ein Thread auf einen Ausführungs-Thread und ist eine Instanziierung eines Satzes von Anweisungen, die zur Ausführung durch die PPU 3500 konfiguriert sind. In mindestens einer Ausführungsform ist die PPU 3500 eine GPU, die so konfiguriert ist, dass sie eine Grafik-Rendering-Pipeline zur Verarbeitung dreidimensionaler („3D“) Grafikdaten implementiert, um zweidimensionale („2D“) Bilddaten zur Anzeige auf einer Anzeigevorrichtung, wie z.B. einer LCD-Vorrichtung, zu erzeugen. In mindestens einer Ausführungsform wird die PPU 3500 verwendet, um Berechnungen wie lineare Algebra-Operationen und Machine-Learning-Operationen durchzuführen. 35 veranschaulicht ein Beispiel für einen Parallelprozessor nur zu darstellenden Zwecken und ist als nicht ein beschränkendes Beispiel für eine Prozessorarchitektur zu verstehen, die in mindestens einer Ausführungsform implementiert sein kann.
  • In mindestens einer Ausführungsform sind eine oder mehrere PPUs 3500 so konfiguriert, dass sie High Performance Computing („HPC“)-, Rechenzentrums- und Machine Learning-Anwendungen beschleunigen. In mindestens einer Ausführungsform sind eine oder mehrere PPUs 3500 für die Beschleunigung von CUDA-Programmen konfiguriert. In mindestens einer Ausführungsform beinhaltet die PPU 3500, ohne Beschränkung darauf, eine E/A-Einheit 3506, eine Frontend-Einheit 3510, eine Scheduler-Einheit 3512, eine Arbeitsverteilungseinheit 3514, einen Hub 3516, eine Kreuzschiene bzw. Crossbar („Xbar“) 3520, einen oder mehrere Universalverarbeitungscluster („GPCs“) 3518 und eine oder mehrere Partitionseinheiten („Speicherpartitionseinheiten“) 3522. In mindestens einer Ausführungsform ist die PPU 3500 mit einem Hostprozessor oder anderen PPUs 3500 über eine oder mehrere Hochgeschwindigkeits-GPU-Verbindungen („GPU-Interconnects“) 3508 verbunden. In mindestens einer Ausführungsform ist die PPU 3500 über eine Zwischenverbindung bzw. einen Interconnect 3502 mit einem Hostprozessor oder anderen Peripheriegeräten verbunden. In mindestens einer Ausführungsform ist die PPU 3500 mit einem lokalen Speicher verbunden, der ein oder mehrere Speichervorrichtungen („Speicher“) 3504 umfasst. In mindestens einer Ausführungsform beinhalten die Speichervorrichtungen 3504, ohne Beschränkung darauf, eine oder mehrere DRAM-Vorrichtungen (Dynamic Random Access Memory). In mindestens einer Ausführungsform sind eine oder mehrere DRAM-Vorrichtungen als Hochbandbreitenspeicher („HBM“)-Subsysteme konfiguriert und/oder konfigurierbar, wobei mehrere DRAM-Chips innerhalb jeder Vorrichtung gestapelt sind.
  • In mindestens einer Ausführungsform kann sich die Hochgeschwindigkeits-GPU-Verbindung 3508 auf eine drahtgebundene Mehrspur-Kommunikations-verbindung beziehen, die von Systemen verwendet wird, um zu skalieren und die eine oder mehrere PPUs 3500 in Kombination mit einer oder mehreren CPUs umfassen, die Cache-Kohärenz zwischen PPUs 3500 und CPUs sowie CPU-Mastering unterstützen. In mindestens einer Ausführungsform werden Daten und/oder Befehle über die Hochgeschwindigkeits-GPU-Verbindung 3508 durch den Hub 3516 zu/von anderen Einheiten der PPU 3500, wie z.B. einer oder mehreren Kopier-Engines, Video-Codierern, Video-Decodierern, Energieverwaltungseinheiten und anderen Komponenten, die in 35 möglicherweise nicht explizit dargestellt sind, übertragen.
  • In mindestens einer Ausführungsform ist die E/A-Einheit 3506 so konfiguriert, dass sie Kommunikationen (z.B. Befehle, Daten) von einem Hostprozessor (in 35 nicht dargestellt) über den Systembus 3502 sendet und empfängt. In mindestens einer Ausführungsform kommuniziert die E/A-Einheit 3506 mit dem Hostprozessor direkt über den Systembus 3502 oder über ein oder mehrere Zwischenvorrichtungen, wie z.B. eine Speicherbrücke. In mindestens einer Ausführungsform kann die E/A-Einheit 3506 über den Systembus 3502 mit einem oder mehreren anderen Prozessoren kommunizieren, z.B. mit einer oder mehreren der PPUs 3500. In mindestens einer Ausführungsform implementiert die E/A-Einheit 3506 eine PCIe-Schnittstelle für die Kommunikation über einen PCIe-Bus. In mindestens einer Ausführungsform implementiert die E/A-Einheit 3506 Schnittstellen für die Kommunikation mit externen Geräten.
  • In mindestens einer Ausführungsform decodiert die E/A-Einheit 3506 über den Systembus 3502 empfangene Pakete. In mindestens einer Ausführungsform repräsentieren mindestens einige Pakete Befehle, die so konfiguriert sind, dass sie die PPU 3500 veranlassen, verschiedene Operationen durchzuführen. In mindestens einer Ausführungsform sendet die E/A-Einheit 3506 decodierte Befehle an verschiedene andere Einheiten der PPU 3500, wie durch Befehle vorgegeben. In mindestens einer Ausführungsform werden Befehle an die Frontend-Einheit 3510 und/oder an den Hub 3516 oder andere Einheiten der PPU 3500, wie z.B. eine oder mehrere Kopier-Engines, einen Video-Codierer, einen Video-Decodierer, eine Energieverwaltungseinheit usw., (in 35 nicht explizit dargestellt) übertragen. In mindestens einer Ausführungsform ist die E/A-Einheit 3506 so konfiguriert, dass sie die Kommunikation zwischen und unter verschiedenen logischen Einheiten der PPU 3500 routet bzw. leitet.
  • In mindestens einer Ausführungsform codiert ein von dem Hostprozessor ausgeführtes Programm einen Befehlsstrom in einem Puffer, der der PPU 3500 Arbeitslasten zur Verarbeitung bereitstellt. In mindestens einer Ausführungsform umfasst eine Arbeitslast Anweisungen und Daten, die von diesen Anweisungen zu verarbeiten sind. In mindestens einer Ausführungsform ist der Puffer eine Region in einem Speicher, auf die sowohl ein Hostprozessor als auch die PPU 3500 zugreifen können (z.B. Lesen/Schreiben) - eine Host-Schnittstelleneinheit kann so konfiguriert sein, dass sie auf einen Puffer in einem mit dem Systembus 3502 verbundenen Systemspeicher über Speicheranforderungen zugreift, die über den Systembus 3502 von der E/A-Einheit 3506 übertragen werden. In mindestens einer Ausführungsform schreibt ein Hostprozessor einen Befehlsstrom in einen Puffer und überträgt dann einen Zeiger auf den Anfang des Befehlsstroms an die PPU 3500, so dass die Frontend-Einheit 3510 Zeiger auf einen oder mehrere Befehlsströme empfängt und einen oder mehrere Befehlsströme verwaltet, wobei sie Befehle aus den Befehlsströmen liest und Befehle an verschiedene Einheiten der PPU 3500 weiterleitet.
  • In mindestens einer Ausführungsform ist die Frontend-Einheit 3510 mit der Scheduler-Einheit 3512 gekoppelt, die verschiedene GPCs 3518 zur Verarbeitung von Aufgaben konfiguriert, die durch einen oder mehrere Befehlsströme definiert sind. In mindestens einer Ausführungsform ist die Scheduler-Einheit 3512 so konfiguriert, dass sie Zustandsinformationen mit Bezug zu verschiedenen Aufgaben nachverfolgt, die von der Scheduler-Einheit 3512 verwaltet werden, wobei die Zustandsinformationen angeben können, welchem der GPCs 3518 eine Aufgabe zugewiesen ist, ob die Aufgabe aktiv oder inaktiv ist, welche Prioritätsstufe der Aufgabe zugeordnet ist und so weiter. In mindestens einer Ausführungsform verwaltet die Scheduler-Einheit 3512 die Ausführung einer Vielzahl von Aufgaben auf einem oder mehreren GPCs 3518.
  • In mindestens einer Ausführungsform ist die Scheduler-Einheit 3512 mit der Arbeitsverteilungseinheit 3514 gekoppelt, die so konfiguriert ist, dass sie Aufgaben zur Ausführung auf den GPCs 3518 versendet. In mindestens einer Ausführungsform nachverfolgt die Arbeitsverteilungseinheit 3514 eine Anzahl geplanter Aufgaben, die von der Scheduler-Einheit 3512 empfangen wurden, und verwaltet die Arbeitsverteilungseinheit 3514 einen Pool ausstehender Aufgaben und einen Pool aktiver Aufgaben für jeden GPC 3518. In mindestens einer Ausführungsform umfasst der Pool anstehender Aufgaben eine Anzahl von Slots (z.B. 32 Slots), die Aufgaben enthalten, die zur Verarbeitung durch einen bestimmten GPC 3518 zugewiesen sind; der Pool aktiver Aufgaben kann eine Anzahl von Slots (z.B. 4 Slots) für Aufgaben umfassen, die aktiv von den GPCs 3518 verarbeitet werden, so dass dann, wenn einer der GPCs 3518 die Ausführung einer Aufgabe abschließt, diese Aufgabe aus dem Pool aktiver Aufgaben für den GPC 3518 entfernt wird und eine der anderen Aufgaben aus dem Pool anstehender Aufgaben ausgewählt und zur Ausführung auf dem GPC 3518 eingeplant wird. In mindestens einer Ausführungsform wird dann, wenn eine aktive Aufgabe auf dem GPC 3518 im Leerlauf ist, z.B. während auf die Auflösung einer Datenabhängigkeit gewartet wird, die aktive Aufgabe aus dem GPC 3518 entfernt und in einen Pool anstehender Aufgaben zurückgegeben, während eine andere Aufgabe im Pool anstehender Aufgaben ausgewählt und zur Ausführung auf dem GPC 3518 eingeplant wird.
  • In mindestens einer Ausführungsform kommuniziert die Arbeitsverteilungseinheit 3514 mit einem oder mehreren GPCs 3518 über die Kreuzschiene bzw. XBar 3520. In mindestens einer Ausführungsform ist die XBar 3520 ein Interconnect- bzw. Verbindungsnetzwerk, das viele Einheiten der PPU 3500 mit anderen Einheiten der PPU 3500 koppelt und so konfiguriert sein kann, dass es die Arbeitsverteilungseinheit 3514 mit einem bestimmten GPC 3518 koppelt. In mindestens einer Ausführungsform können auch eine oder mehrere andere Einheiten der PPU 3500 über den Hub 3516 mit der XBar 3520 verbunden sein.
  • In mindestens einer Ausführungsform werden Aufgaben von der Scheduler-Einheit 3512 verwaltet und von der Arbeitsverteilungseinheit 3514 an einen der GPCs 3518 weitergeleitet. Der GPC 3518 ist so konfiguriert, dass er die Aufgabe verarbeitet und Ergebnisse erzeugt. In mindestens einer Ausführungsform können die Ergebnisse von anderen Aufgaben innerhalb des GPC 3518 verbraucht, über die XBar 3520 an einen anderen GPC 3518 weitergeleitet oder in dem Speicher 3504 gespeichert werden. In mindestens einer Ausführungsform können Ergebnisse in den Speicher 3504 über Partitionseinheiten 3522 geschrieben werden, die eine Speicherschnittstelle zum Lesen und Schreiben von Daten in/aus dem Speicher 3504 implementieren. In mindestens einer Ausführungsform können die Ergebnisse über die Hochgeschwindigkeits-GPU-Verbindung 3508 an eine andere PPU 3504 oder CPU übertragen werden. In mindestens einer Ausführungsform umfasst die PPU 3500, ohne Beschränkung darauf, eine Anzahl U von Partitionseinheiten 3522, die gleich der Anzahl der mit der PPU 3500 verbundenen separaten und unterschiedlichen Speichervorrichtungen 3504 ist.
  • In mindestens einer Ausführungsform führt ein Hostprozessor einen Treiberkern aus, der eine Anwendungsprogrammierschnittstelle („API“) implementiert, die es einer oder mehreren auf dem Hostprozessor ausgeführten Anwendungen ermöglicht, Operationen zur Ausführung auf der PPU 3500 zu planen. In mindestens einer Ausführungsform werden mehrere Rechenanwendungen gleichzeitig von der PPU 3500 ausgeführt und stellt die PPU 3500 Isolierung, Dienstgüte („QoS“) und unabhängige Adressräume für mehrere Rechenanwendungen bereit. In mindestens einer Ausführungsform generiert eine Anwendung Anweisungen (z.B. in Form von API-Aufrufen), die einen Treiberkern veranlassen, eine oder mehrere Aufgaben zur Ausführung durch die PPU 3500 zu generieren, und gibt der Treiberkern Aufgaben an einen oder mehrere Streams aus, die von der PPU 3500 verarbeitet werden. In mindestens einer Ausführungsform umfasst jede Aufgabe eine oder mehrere Gruppen von zusammenhängenden Threads, die als Warp bezeichnet werden können. In mindestens einer Ausführungsform umfasst ein Warp eine Vielzahl von zusammenhängenden Threads (z.B. 32 Threads), die parallel ausgeführt werden können. In mindestens einer Ausführungsform können sich kooperierende Threads auf eine Vielzahl von Threads beziehen, die Anweisungen zur Durchführung einer Aufgabe enthalten und die Daten über einen gemeinsamen Speicher austauschen.
  • In mindestens einer Ausführungsform wird mindestens eine in 35 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3500 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3500 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3500 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3500 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3500 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 36 veranschaulicht einen GPC 3600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der GPC 3600 der GPC 3518 von 35. In mindestens einer Ausführungsform beinhaltet jeder GPC 3600, ohne Beschränkung darauf, eine Anzahl von Hardware-Einheiten zur Verarbeitung von Aufgaben, und beinhaltet jeder GPC 3600, ohne Beschränkung darauf, einen Pipeline-Manager 3602, eine Pre-Raster-Operationseinheit („PROP“) 3604, eine Raster-Engine 3608, eine Arbeitsverteilungs-Kreuzschiene („WDX“) 3616, eine MMU 3618, einen oder mehrere Datenverarbeitungscluster („DPCs“) 3606 und jede geeignete Kombination von Teilen.
  • In mindestens einer Ausführungsform wird der Betriebsablauf des GPC 3600 von dem Pipeline-Manager 3602 gesteuert. In mindestens einer Ausführungsform verwaltet der Pipeline-Manager 3602 die Konfiguration eines oder mehrerer DPCs 3606 zur Verarbeitung von Aufgaben, die dem GPC 3600 zugewiesen sind. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3602 mindestens eine des einen oder der mehreren DPCs 3606, um mindestens einen Teil einer Grafik-Rendering-Pipeline zu implementieren. In mindestens einer Ausführungsform ist der DPC 3606 so konfiguriert, dass er ein Vertex-Shader-Programm auf einem programmierbaren Streaming-Multiprozessor („SM“) 3614 ausführt. In mindestens einer Ausführungsform ist der Pipeline-Manager 3602 so konfiguriert, dass er von einer Arbeitsverteilungseinheit empfangene Pakete an entsprechende logische Einheiten innerhalb des GPC 3600 weiterleitet, und in mindestens einer Ausführungsform können einige Pakete an Hardwareeinheiten mit fester Funktion in dem PROP 3604 und/oder in der Raster-Engine 3608 weitergeleitet werden, während andere Pakete an die DPCs 3606 zur Verarbeitung durch eine Primitiv-Engine 3612 oder den SM 3614 weitergeleitet werden können. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3602 mindestens einen der DPCs 3606, um eine Rechenpipeline zu implementieren. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3602 mindestens einen der DPCs 3606, um mindestens einen Teil eines CUDA-Programms auszuführen.
  • In mindestens einer Ausführungsform ist die PROP-Einheit 3604 so konfiguriert, dass sie von der Raster-Engine 3608 und den DPCs 3606 erzeugte Daten an eine Raster Operations („ROP“)-Einheit in einer Partitionseinheit weiterleitet, wie z.B. die vorstehend in Verbindung mit 22 näher beschriebene Speicherpartitionseinheit 2222. In mindestens einer Ausführungsform ist die PROP-Einheit 3604 so konfiguriert, dass sie Optimierungen für die Farbmischung durchführt, Pixeldaten organisiert, Adressübersetzungen durchführt, und mehr. In mindestens einer Ausführungsform beinhaltet die Raster-Engine 3608, ohne Beschränkung darauf, eine Reihe von Hardwareeinheiten mit fester Funktion, die so konfiguriert sind, dass sie verschiedene Rasteroperationen durchführen, und in mindestens einer Ausführungsform beinhaltet die Raster-Engine 3608, ohne Beschränkung darauf, eine Setup-Engine, eine Grobraster-Engine, eine Culling-Engine, eine Clipping-Engine, eine Feinraster-Engine, eine Kachelkoaleszenz-Engine und jede geeignete Kombination davon. In mindestens einer Ausführungsform empfängt eine Setup-Engine transformierte Vertices und erzeugt Ebenengleichungen, die einem durch Vertices definierten geometrischen Primitiv zugeordnet sind; die Ebenengleichungen werden an eine Grobraster-Engine übertragen, um Abdeckungsinformationen (z.B. eine x-, y-Abdeckungsmaske für eine Kachel) für ein Primitiv zu erzeugen; wird die Ausgabe der Grobraster-Engine an eine Culling-Engine übertragen, in der Fragmente, die einem Primitiv zugeordnet sind und einen z-Test nicht bestehen, aussortiert werden, und an eine Clipping-Engine übertragen, in der Fragmente, die außerhalb eines Sichtkegelstumpfs liegen, abgeschnitten werden. In mindestens einer Ausführungsform werden Fragmente, die das Clipping und Culling überstehen, an eine Feinraster-Engine weitergeleitet, um Attribute für Pixelfragmente auf der Grundlage von Ebenengleichungen zu erzeugen, die von einer Setup-Engine generiert werden. In mindestens einer Ausführungsform umfasst die Ausgabe der Raster-Engine 3608 Fragmente, die von einer geeigneten Einheit zu verarbeiten sind, z.B. von einem in dem DPC 3606 implementierten Fragment-Shader.
  • In mindestens einer Ausführungsform umfasst jeder in dem GPC 3600 enthaltene DPC 3606, ohne Beschränkung darauf, einen M-Pipe-Controller („MPC“) 3610, eine Primitiv-Engine 3612, einen oder mehrere SMs 3614 und jede geeignete Kombination davon. In mindestens einer Ausführungsform steuert der MPC 3610 den Betriebsablauf des DPC 3606, indem er von dem Pipeline-Manager 3602 empfangene Pakete an entsprechende Einheiten in dem DPC 3606 weiterleitet. In mindestens einer Ausführungsform werden Pakete, die einem Vertex zugeordnet sind, an die Primitive Engine 3612 weitergeleitet, die so konfiguriert ist, dass sie Vertexattribute, die dem Vertex zugeordnet sind, aus dem Speicher abruft; demgegenüber können Pakete, die einem Shader-Programm zugeordnet sind, an den SM 3614 übertragen werden.
  • In mindestens einer Ausführungsform umfasst der SM 3614, ohne Beschränkung darauf, einen programmierbaren Streamingprozessor, der so konfiguriert ist, dass er Aufgaben verarbeitet, die durch eine Anzahl von Threads repräsentiert werden. In mindestens einer Ausführungsform ist der SM 3614 mit mehreren Threads ausgestattet und so konfiguriert, dass er mehrere Threads (z.B. 32 Threads) aus einer bestimmten Gruppe von Threads gleichzeitig ausführt und eine SIMD-Architektur implementiert, bei der jeder Thread in einer Gruppe von Threads (z.B. ein Warp) so konfiguriert ist, dass er einen anderen Satz von Daten auf der Grundlage desselben Satzes von Anweisungen verarbeitet. In mindestens einer Ausführungsform führen alle Threads in einer Gruppe von Threads dieselben Anweisungen aus. In mindestens einer Ausführungsform implementiert der SM 3614 eine SIMT-Architektur, bei der jeder Thread in einer Gruppe von Threads so konfiguriert ist, dass er einen anderen Datensatz auf der Grundlage desselben Satzes von Anweisungen verarbeitet, wobei jedoch einzelne Threads in der Gruppe von Threads während der Ausführung divergieren dürfen. In mindestens einer Ausführungsform werden ein Programmzähler, ein Aufrufstapel und ein Ausführungsstatus für jeden Warp beibehalten, was Gleichzeitigkeit zwischen Warps und serielle Ausführung innerhalb von Warps ermöglicht, wenn Threads innerhalb eines Warps divergieren. In einer anderen Ausführungsform werden ein Programmzähler, ein Aufrufstapel und ein Ausführungsstatus für jeden einzelnen Thread beibehalten, wodurch gleiche Gleichzeitigkeit zwischen allen Threads innerhalb und zwischen Warps ermöglicht wird. In mindestens einer Ausführungsform wird ein Ausführungsstatus für jeden einzelnen Thread beibehalten, und können Threads, die die gleichen Anweisungen ausführen, zur besseren Effizienz zusammengeführt und parallel ausgeführt werden. Mindestens eine Ausführungsform des SM 3614 wird in Verbindung mit 37 ausführlicher beschrieben.
  • In mindestens einer Ausführungsform stellt die MMU 3618 eine Schnittstelle zwischen dem GPC 3600 und einer Speicherpartitionseinheit (z.B. der Partitionseinheit 3522 in 35) bereit, und stellt die MMU 3618 eine Übersetzung virtueller Adressen in physische Adressen, einen Speicherschutz und eine Arbitrierung von Speicheranforderungen bereit. In mindestens einer Ausführungsform stellt die MMU 3618 einen oder mehrere Übersetzungs-Lookaside-Puffer (TLBs) zur Durchführung der Übersetzung virtueller Adressen in physische Adressen im Speicher bereit.
  • In mindestens einer Ausführungsform wird mindestens eine in 36 dargestellte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3600 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3600 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3600 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3600 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3600 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 37 veranschaulicht einen Streaming-Multiprozessor („SM“) 3700, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der SM 3700 der SM 3614 von 36. In mindestens einer Ausführungsform beinhaltet der SM 3700, ohne Beschränkung darauf, einen Anweisungscache 3702; eine oder mehrere Schedulereinheiten 3704; eine Registerdatei 3708; einen oder mehrere Verarbeitungskerne („Cores“) 3710; eine oder mehrere Spezialfunktionseinheiten („SFUs“) 3712; eine oder mehrere LSUs 3714; ein Verbindungsnetzwerk 3716; einen gemeinsamen Speicher/L1-Cache 3718; und jede geeignete Kombination davon. In mindestens einer Ausführungsform verteilt eine Arbeitsverteilungseinheit Aufgaben zur Ausführung auf GPCs von Parallelverarbeitungseinheiten (PPUs), und wird jede Aufgabe einem bestimmten Datenverarbeitungscluster (DPC) innerhalb eines GPCs zugewiesen, und wenn eine Aufgabe mit einem Shader-Programm verbunden ist, dann wird die Aufgabe einem der SMs 3700 zugewiesen. In mindestens einer Ausführungsform empfängt die Schedulereinheit 3704 Aufgaben von einer Arbeitsverteilungseinheit und verwaltet die Befehlsplanung für einen oder mehrere Thread-Blöcke, die dem SM 3700 zugewiesen sind. In mindestens einer Ausführungsform plant die Schedulereinheit 3704 Thread-Blöcke zur Ausführung als Warps von parallelen Threads, wobei jedem Thread-Block mindestens ein Warp zugewiesen wird. In mindestens einer Ausführungsform führt jeder Warp Threads aus. In mindestens einer Ausführungsform verwaltet die Schedulereinheit 3704 eine Vielzahl verschiedener Thread-Blöcke, indem sie verschiedenen Thread-Blöcken Warps zuweist und dann Anweisungen von einer Vielzahl verschiedener kooperativer Gruppen an verschiedene Funktionseinheiten (z.B. Verarbeitungskerne 3710, SFUs 3712 und LSUs 3714) während jedes Taktzyklus verteilt.
  • In mindestens einer Ausführungsform kann sich „kooperative Gruppen“ auf ein Programmiermodell zum Organisieren von Gruppen kommunizierender Threads beziehen, das es Entwicklern ermöglicht, Granularität auszudrücken, mit der Threads kommunizieren, und so reichhaltigere, effizientere parallele Dekompositionen zu ermöglichen. In mindestens einer Ausführungsform unterstützen kooperative Start-APIs eine Synchronisierung zwischen Thread-Blöcken zur Ausführung paralleler Algorithmen. In mindestens einer Ausführungsform bieten APIs herkömmlicher Programmiermodelle ein einziges, einfaches Konstrukt zur Synchronisierung kooperierender Threads: eine Sperre über alle Threads eines Thread-Blocks (z.B. die Funktion syncthreads()). In mindestens einer Ausführungsform können Programmierer jedoch Gruppen von Threads mit einer kleineren Granularität als der des Thread-Blocks definieren und innerhalb definierter Gruppen synchronisieren, um höhere Leistung, Designflexibilität und Software-Wiederverwendung in Form von gemeinsamen gruppenweiten Funktionsschnittstellen zu ermöglichen. In mindestens einer Ausführungsform ermöglichen es kooperative Gruppen Programmierern, Gruppen von Threads explizit auf Subblock- und Multiblock-Granularität zu definieren und kollektive Operationen wie beispielsweise Synchronisation auf Threads in einer kooperativen Gruppe durchzuführen. In mindestens einer Ausführungsform ist eine Subblock-Granularität so klein wie ein einzelner Thread. In mindestens einer Ausführungsform unterstützt ein Programmiermodell eine saubere Komposition über Softwaregrenzen hinweg, so dass Bibliotheken und Utility-Funktionen innerhalb ihres lokalen Kontexts sicher synchronisieren können, ohne Annahmen über Konvergenz treffen zu müssen. In mindestens einer Ausführungsform ermöglichen kooperative Gruppenprimitive neue Muster kooperativer Parallelität, einschließlich, ohne Beschränkung darauf, Produzenten-Verbraucher-Parallelität, opportunistischer Parallelität und globaler Synchronisierung über ein gesamtes Gitter von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist eine Dispatcheinheit 3706 so konfiguriert, dass sie Befehle an eine oder mehrere Funktionseinheiten überträgt, und beinhaltet die Schedulereinheit 3704, ohne Beschränkung darauf, zwei Dispatcheinheiten 3706, die es ermöglichen, dass zwei verschiedene Befehle aus demselben Warp während jedes Taktzyklus versendet werden. In mindestens einer Ausführungsform umfasst jede Schedulereinheit 3704 eine einzelne Dispatcheinheit 3706 oder zusätzliche Dispatcheinheiten 3706.
  • In mindestens einer Ausführungsform enthält jeder SM 3700, ohne Beschränkung darauf, eine Registerdatei 3708, die einen Satz von Registern für Funktionseinheiten des SM 3700 bereitstellt. In mindestens einer Ausführungsform ist die Registerdatei 3708 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 3708 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 3708 zwischen verschiedenen Warps aufgeteilt, die von dem SM 3700 ausgeführt werden, und stellt die Registerdatei 3708 einen temporären Speicher für Operanden bereit, die Datenpfaden von Funktionseinheiten zugeordnet sind. In mindestens einer Ausführungsform umfasst jeder SM 3700, ohne Beschränkung darauf, eine Vielzahl von L Verarbeitungskernen 3710. In mindestens einer Ausführungsform beinhaltet der SM 3700, ohne Beschränkung darauf, eine große Anzahl (z.B. 128 oder mehr) von unterschiedlichen Verarbeitungskernen 3710. In mindestens einer Ausführungsform beinhaltet jeder Verarbeitungskern 3710, ohne Beschränkung darauf, eine voll gepipelte, einfachgenaue, doppeltgenaue und/oder gemischtgenaue Verarbeitungseinheit, die, ohne Beschränkung darauf, eine arithmetische Gleitkomma-Logikeinheit und eine arithmetische Ganzzahl-Logikeinheit umfasst. In mindestens einer Ausführungsform implementieren die Gleitkomma-Arithmetik-Logikeinheiten den Standard IEEE 754-1708 für Gleitkomma-Arithmetik. In mindestens einer Ausführungsform beinhalten die Verarbeitungskerne 3710, ohne Beschränkung darauf, 64 Gleitkommakerne mit einfacher Genauigkeit (32 Bit), 64 Ganzzahlkerne, 32 Gleitkommakerne mit doppelter Genauigkeit (64 Bit) und 8 Tensorkerne.
  • In mindestens einer Ausführungsform sind Tensorkerne so konfiguriert, dass sie Matrixoperationen durchführen. In mindestens einer Ausführungsform sind ein oder mehrere Tensorkerne in den Verarbeitungskernen 3710 enthalten. In mindestens einer Ausführungsform sind Tensorkerne so konfiguriert, dass sie eine Deep-Learning-Matrixarithmetik durchführen, wie z.B. Faltungsoperationen für das Training und die Inferenzierung neuronaler Netze. In mindestens einer Ausführungsform arbeitet jeder Tensorkern auf einer 4x4-Matrix und führt eine Matrixmultiplikations- und Akkumulationsoperation D = A X B + C durch, wobei A, B, C und D 4x4-Matrizen sind.
  • In mindestens einer Ausführungsform sind die Matrixmultiplikationseingänge A und B 16-Bit-Gleitkommamatrizen und sind die Akkumulationsmatrizen C und D 16-Bit-Gleitkomma- oder 32-Bit-Gleitkommamatrizen. In mindestens einer Ausführungsform arbeiten die Tensorkerne auf 16-Bit-Gleitkomma-Eingangsdaten mit 32-Bit-Gleitkomma-Akkumulation. In mindestens einer Ausführungsform verwendet die 16-Bit-Gleitkommamultiplikation 64 Operationen und ergibt ein Produkt mit voller Genauigkeit, das dann unter Verwendung einer 32-Bit-Gleitkomma-Addition mit anderen Zwischenprodukten für eine 4x4x4-Matrixmultiplikation akkumuliert wird. In mindestens einer Ausführungsform werden Tensorkerne verwendet, um viel größere zweidimensionale oder höherdimensionale Matrixoperationen durchzuführen, die aus diesen kleineren Elementen aufgebaut sind. In mindestens einer Ausführungsform stellt eine API, wie z.B. eine CUDA-C++ API, spezialisierte Operationen zum Laden, Multiplizieren und Akkumulieren von Matrizen und zum Speichern von Matrizen bereit, um Tensorkerne aus einem CUDA-C++ Programm heraus effizient zu nutzen. In mindestens einer Ausführungsform geht, auf der CUDA-Ebene, eine Schnittstelle auf Warp-Ebene von Matrizen der Größe 16x16 aus, die sich über alle 32 Threads eines Warps erstrecken.
  • In mindestens einer Ausführungsform umfasst jeder SM 3700, ohne Beschränkung darauf, M SFUs 3712, die spezielle Funktionen ausführen (z.B. Attributauswertung, reziproke Quadratwurzel und dergleichen). In mindestens einer Ausführungsform beinhalten die SFUs 3712, ohne Beschränkung darauf, eine Baumdurchlaufeinheit, die so konfiguriert ist, dass sie eine hierarchische Baumdatenstruktur durchläuft. In mindestens einer Ausführungsform beinhalten die SFUs 3712, ohne Beschränkung darauf, eine Textureinheit, die so konfiguriert ist, dass sie Texturabbildungsfilterungsoperationen durchführt. In mindestens einer Ausführungsform sind Textureinheiten so konfiguriert, dass sie Texturkarten (z.B. ein 2D-Array von Texeln) aus dem Speicher laden und die Texturkarten abtasten, um abgetastete Texturwerte zur Verwendung in Shader-Programmen zu erzeugen, die von dem SM 3700 ausgeführt werden. In mindestens einer Ausführungsform werden die Texturkarten in dem gemeinsamen Speicher/L1-Cache 3718 gespeichert. In mindestens einer Ausführungsform implementieren Textureinheiten Texturoperationen, wie z.B. Filteroperationen unter Verwendung von Mip-Maps (z.B. Texturkarten mit unterschiedlichen Detailstufen). In mindestens einer Ausführungsform umfasst jeder SM 3700, ohne Beschränkung darauf, zwei Textureinheiten.
  • In mindestens einer Ausführungsform umfasst jeder SM 3700, ohne Beschränkung darauf, N LSUs 3714, die Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher/L1-Cache 3718 und der Registerdatei 3708 implementieren. In mindestens einer Ausführungsform umfasst jeder SM 3700, ohne Beschränkung darauf, ein Verbindungsnetzwerk 3716, das jede der Funktionseinheiten mit der Registerdatei 3708 und die LSU 3714 mit der Registerdatei 3708 und dem gemeinsamen Speicher/L1-Cache 3718 verbindet. In mindestens einer Ausführungsform ist das Verbindungsnetzwerk 3716 eine Kreuzschiene, die so konfiguriert werden kann, dass sie jede der Funktionseinheiten mit jedem der Register in der Registerdatei 3708 verbindet und die LSUs 3714 mit der Registerdatei 3708 und Speicherplätzen in dem gemeinsamen Speicher/L1-Cache 3718 verbindet.
  • In mindestens einer Ausführungsform ist der gemeinsam genutzte Speicher/L1-Cache 3718 ein Array von On-Chip-Speicher, der die Datenspeicherung und Kommunikation zwischen dem SM 3700 und einer Primitiv-Engine sowie zwischen Threads in dem SM 3700 ermöglicht. In mindestens einer Ausführungsform umfasst der gemeinsam genutzte Speicher/L1-Cache 3718, ohne Beschränkung darauf, 128 KB Speicherkapazität und befindet sich in einem Pfad von dem SM 3700 zu einer Partitionseinheit. In mindestens einer Ausführungsform wird der gemeinsame Speicher/L1-Cache 3718 zum Zwischenspeichern von Lese- und Schreiboperationen verwendet. In mindestens einer Ausführungsform sind einer oder mehrere von gemeinsamem Speicher/L1-Cache 3718, L2-Cache und Arbeitsspeicher Sicherungsspeicher.
  • In mindestens einer Ausführungsform stellt die Kombination von Datencache- und Shared-Memory-Funktionalität in einem einzigen Speicherblock eine verbesserte Leistung für beide Arten von Speicherzugriffen bereit. In mindestens einer Ausführungsform wird die Kapazität von Programmen, die den gemeinsam genutzten Speicher nicht verwenden, als Cache genutzt oder ist dazu nutzbar, derart, dass beispielsweise dann, wenn der gemeinsam genutzte Speicher so konfiguriert ist, dass er die Hälfte der Kapazität nutzt, Textur- und Lade-/Speicheroperationen die verbleibende Kapazität nutzen können. In mindestens einer Ausführungsform ermöglicht die Integration in den gemeinsam genutzten Speicher/L1-Cache 3718, dass der gemeinsam genutzte Speicher/L1-Cache 3718 als eine Leitung mit hohem Durchsatz für Streaming-Daten fungiert und gleichzeitig einen Zugriff mit hoher Bandbreite und niedriger Latenz auf häufig wiederverwendete Daten ermöglicht. In mindestens einer Ausführungsform kann bei der Konfiguration für parallele Universalberechnungen eine einfachere Konfiguration als bei der Grafikverarbeitung verwendet werden. In mindestens einer Ausführungsform werden GPUs mit festen Funktionen umgangen, wodurch ein wesentlich einfacheres Programmiermodell entsteht. In mindestens einer Ausführungsform und in einer Konfiguration für parallele Berechnungen für allgemeine Zwecke weist eine Arbeitsverteilungseinheit Blöcke von Threads direkt den DPCs zu und verteilt sie. In mindestens einer Ausführungsform führen Threads in einem Block dasselbe Programm aus, wobei eine eindeutige Thread-ID in einer Berechnung verwendet wird, um sicherzustellen, dass jeder Thread eindeutige Ergebnisse erzeugt, wobei der SM 3700 zur Ausführung eines Programms und zur Durchführung von Berechnungen, der gemeinsame Speicher/L1-Cache 3718 zur Kommunikation zwischen Threads und die LSU 3714 zum Lesen und Schreiben des globalen Speichers über den gemeinsamen Speicher/L1-Cache 3718 und eine Speicherpartitionseinheit verwendet werden. In mindestens einer Ausführungsform schreibt der SM 3700, wenn er für allgemeine parallele Berechnungen konfiguriert ist, Befehle, die die Schedulereinheit 3704 verwenden kann, um neue Arbeit auf DPCs zu starten.
  • In mindestens einer Ausführungsform ist die PPU in einem Desktop-Computer, einem Laptop-Computer, einem Tablet-Computer, Servern, Supercomputern, einem Smartphone (z.B. einem drahtlosen Handheld-Gerät), einem PDA, einer Digitalkamera, einem Fahrzeug, einer kopfmontierten Anzeige, einem elektronischen Handheld-Gerät usw. enthalten oder mit diesen gekoppelt. In mindestens einer Ausführungsform ist die PPU auf einem einzigen Halbleitersubstrat verkörpert. In mindestens einer Ausführungsform ist die PPU in einem SoC zusammen mit einer oder mehreren anderen Vorrichtungen wie zusätzlichen PPUs, Speicher, einer RISC-CPU, einer MMU, einem Digital-Analog-Wandler („DAC“) und dergleichen enthalten.
  • In mindestens einer Ausführungsform kann die PPU auf einer Grafikkarte enthalten sein, die ein oder mehrere Speichervorrichtungen enthält. In mindestens einer Ausführungsform kann eine Grafikkarte so konfiguriert sein, dass sie mit einem PCIe-Steckplatz auf einer Hauptplatine eines Desktop-Computers verbunden werden kann. In mindestens einer Ausführungsform kann die PPU eine integrierte GPU („iGPU“) sein, die im Chipsatz der Hauptplatine enthalten ist.
  • In mindestens einer Ausführungsform wird mindestens eine in 37 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3700 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3700 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3700 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3700 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3700 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • Softwarekonstruktionen für universelles Rechnen
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte Softwarekonstrukte zur Implementierung mindestens einer Ausführungsform.
  • 38 veranschaulicht einen Software-Stack einer Programmierplattform, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform eine Plattform zur Nutzung von Hardware auf einem Rechen- bzw. Computersystem, um Berechnungsaufgaben zu beschleunigen. In mindestens einer Ausführungsform kann eine Programmierplattform für Softwareentwickler über Bibliotheken, Compilerdirektiven und/oder Erweiterungen von Programmiersprachen zugänglich sein. In mindestens einer Ausführungsform kann eine Programmierplattform CUDA, Radeon Open Compute Platform („ROCm“), OpenCL (OpenCL™ wird von der Khronos-Gruppe entwickelt), SYCL oder Intel One API sein, ist aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform stellt ein Software-Stack 3800 einer Programmierplattform eine Ausführungsumgebung für eine Anwendung 3801 bereit. In mindestens einer Ausführungsform kann die Anwendung 3801 jede beliebige Computersoftware umfassen, die auf dem Software-Stack 3800 gestartet werden kann. In mindestens einer Ausführungsform kann die Anwendung 3801 eine Anwendung für künstliche Intelligenz („KI“)/maschinelles Lernen („ML“), eine Anwendung für Hochleistungsrechnen („HPC“), eine virtuelle Desktop-Infrastruktur („VDI“) oder einen Rechenzentrums-Arbeitslast umfassen, ist aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform laufen die Anwendung 3801 und der Software-Stack 3800 auf Hardware 3807. Die Hardware 3807 kann in mindestens einer Ausführungsform eine oder mehrere GPUs, CPUs, FPGAs, KI-Engines und/oder andere Arten von Rechenvorrichtungen umfassen, die eine Programmierplattform unterstützen. In mindestens einer Ausführungsform, wie beispielsweise bei CUDA, kann der Software-Stack 3800 herstellerspezifisch und nur mit Vorrichtungen bestimmter Hersteller kompatibel sein. In mindestens einer Ausführungsform, wie beispielsweise bei OpenCL, kann der Software Stack 3800 mit Vorrichtungen verschiedener Hersteller verwendet werden. In mindestens einer Ausführungsform umfasst die Hardware 3807 einen Host, der mit einer oder mehreren Vorrichtungen verbunden ist, auf die zugegriffen werden kann, um Berechnungsaufgaben über API (Application Programming Interface)-Aufrufe durchzuführen. Eine Vorrichtung innerhalb der Hardware 3807 kann eine GPU, ein FPGA, eine KI-Engine oder eine andere Rechenvorrichtung (aber auch eine CPU) und dessen Speicher umfassen, im Gegensatz zu einem Host innerhalb der Hardware 3807, der in mindestens einer Ausführungsform eine CPU (aber auch eine Rechenvorrichtung) und dessen Speicher umfassen kann, aber nicht darauf beschränkt ist.
  • In mindestens einer Ausführungsform umfasst der Software-Stack 3800 einer Programmierplattform, ohne Beschränkung darauf, eine Reihe von Bibliotheken 3803, eine Laufzeitumgebung 3805 und einen Gerätekerneltreiber 3806. Jede der Bibliotheken 3803 kann in mindestens einer Ausführungsform Daten und Programmiercode enthalten, die von Computerprogrammen verwendet und während der Softwareentwicklung genutzt werden können. In mindestens einer Ausführungsform können die Bibliotheken 3803 vorgefertigten Code und Unterprogramme, Klassen, Werte, Typspezifikationen, Konfigurationsdaten, Dokumentation, Hilfsdaten und/oder Nachrichtenvorlagen enthalten, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform enthalten die Bibliotheken 3803 Funktionen, die für die Ausführung auf einer oder mehreren Vorrichtungsarten optimiert sind. In mindestens einer Ausführungsform können die Bibliotheken 3803 Funktionen zur Durchführung von mathematischen, Deep-Learning- und/oder anderen Arten von Operationen auf Vorrichtungen enthalten, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform sind Bibliotheken 3803 entsprechenden APIs 3802 zugeordnet, die eine oder mehrere APIs enthalten können, die in den Bibliotheken 3803 implementierte Funktionen offenlegen.
  • In mindestens einer Ausführungsform ist die Anwendung 3801 als Quellcode geschrieben, der in ausführbaren Code kompiliert wird, wie nachstehend in Verbindung mit 27 - 32 näher erläutert wird. In mindestens einer Ausführungsform kann ausführbarer Code der Anwendung 3801 zumindest teilweise auf einer Ausführungsumgebung laufen, die von dem Software-Stack 3800 bereitgestellt wird. In mindestens einer Ausführungsform kann während der Ausführung der Anwendung 3801 Code erreicht werden, der auf einem Gerät bzw. einer Vorrichtung , im Gegensatz zu einem Host, ausgeführt werden muss. In einem solchen Fall kann in mindestens einer Ausführungsform die Laufzeitumgebung 3805 aufgerufen werden, um den erforderlichen Code auf das Gerät zu laden und zu starten. In mindestens einer Ausführungsform kann die Laufzeitumgebung 3805 jedes technisch machbare Laufzeitsystem umfassen, das die Ausführung der Anwendung S01 unterstützen kann.
  • In mindestens einer Ausführungsform ist die Laufzeitumgebung 3805 als eine oder mehrere Laufzeitbibliotheken implementiert, die entsprechenden APIs zugeordnet sind, die als API(s) 3804 dargestellt sind. Eine oder mehrere solcher Laufzeitbibliotheken können in mindestens einer Ausführungsform, ohne Beschränkung darauf, Funktionen zur Speicherverwaltung, Ausführungssteuerung, Geräteverwaltung, Fehlerbehandlung und/oder Synchronisation enthalten. In mindestens einer Ausführungsform können die Speicherverwaltungsfunktionen. Ohne Beschränkung darauf, Funktionen zum Zuweisen, Freigeben und Kopieren von Gerätespeicher sowie zum Übertragen von Daten zwischen dem Hostspeicher und dem Gerätespeicher umfassen. In mindestens einer Ausführungsform können Ausführungssteuerungsfunktionen Funktionen zum Starten einer Funktion (manchmal als ein „Kernel“ bezeichnet, wenn eine Funktion eine globale Funktion ist, die von einem Host aus aufgerufen werden kann) auf einem Gerät und zum Festlegen von Attributwerten in einem Puffer, der von einer Laufzeitbibliothek für eine gegebene, auf einem Gerät auszuführende Funktion verwaltet wird, enthalten, sind aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform können Laufzeitbibliotheken und entsprechende API(s) 3804 auf jede technisch machbare Weise implementiert sein. In mindestens einer Ausführungsform kann eine (oder eine beliebige Anzahl von) API(s) einen Low-Level-Satz von Funktionen für eine feinkörnige Steuerung eines Geräts bereitstellen, während eine andere (oder eine beliebige Anzahl von) API(s) einen Higher-Level-Satz solcher Funktionen bereitstellen kann. In mindestens einer Ausführungsform kann eine High-Level-Laufzeit-API auf einer Low-Level-API aufgebaut sein. In mindestens einer Ausführungsform können eine oder mehrere Laufzeit-APIs sprachspezifische APIs sein, die auf eine sprachunabhängige Laufzeit-API aufgesetzt sind.
  • In mindestens einer Ausführungsform ist der Gerätekerneltreiber 3806 so konfiguriert, dass er Kommunikation mit einem zugrunde liegenden Gerät erleichtert. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 3806 Low-Level-Funktionalitäten bereitstellen, auf die sich APIs, wie z.B. die API(s) 3804, und/oder andere Software stützen. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 3806 so konfiguriert sein, dass er zur Laufzeit Intermediate Representation („IR“) Code in Binärcode kompiliert. In mindestens einer Ausführungsform kann für CUDA der Gerätekerneltreiber 3806 IR-Code für parallele Thread-Ausführung („PTX“), der nicht hardwarespezifisch ist, zur Laufzeit in Binärcode für ein bestimmtes Zielgerät kompilieren (mit Zwischenspeicherung kompilierten Binärcodes), was manchmal auch als „finalisierter“ Code bezeichnet wird. Dadurch kann in mindestens einer Ausführungsform finalisierter Code auf einem Zielgerät ausgeführt werden, das möglicherweise nicht existierte, als der Quellcode ursprünglich in PTX-Code kompiliert wurde. Alternativ kann in mindestens einer Ausführungsform der Gerätequellcode offline in Binärcode kompiliert werden, ohne dass der Gerätekerneltreiber 3806 den IR-Code zur Laufzeit kompilieren muss.
  • In mindestens einer Ausführungsform wird mindestens eine in 38 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Element des Softwarestapels 3800 einer Programmierplattform verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des Softwarestapels 3800 einer Programmierplattform verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Softwarestapels 3800 einer Programmierplattform verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Softwarestapels 3800 einer Programmierplattform verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des Softwarestapels 3800 einer Programmierplattform verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 39 veranschaulicht eine CUDA-Implementierung des Software-Stacks 3800 von 38, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein CUDA-Software-Stack 3900, auf dem eine Anwendung 3901 gestartet werden kann, CUDA-Bibliotheken 3903, eine CUDA-Laufzeitumgebung 3905, einen CUDA-Treiber 3907 und einen Gerätekerneltreiber 3908. In mindestens einer Ausführungsform wird der CUDA-Software-Stack 3900 auf der Hardware 3909 ausgeführt, die eine GPU umfassen kann, die CUDA unterstützt und von der NVIDIA Corporation in Santa Clara, CA, entwickelt wird.
  • In mindestens einer Ausführungsform können die Anwendung 3901, die CUDA-Laufzeitumgebung 3905 und der Gerätekerneltreiber 3908 ähnliche Funktionalitäten wie die Anwendung 2501, die Laufzeitumgebung 2505 bzw. der Gerätekerneltreiber 2506 ausführen, die vorstehend in Verbindung mit 25 beschrieben sind. In mindestens einer Ausführungsform umfasst der CUDA-Treiber 3907 eine Bibliothek (libcuda.so), die eine CUDA-Treiber-API 3906 implementiert. Ähnlich zu einer CUDA-Laufzeit-API 3904, die von einer CUDA-Laufzeitbibliothek (cudart) implementiert wird, kann die CUDA-Treiber-API 3906 in mindestens einer Ausführungsform, ohne darauf beschränkt zu sein, Funktionen für Speicherverwaltung, Ausführungssteuerung, Geräteverwaltung, Fehlerbehandlung, Synchronisierung und/oder Grafik-Interoperabilität bereitstellen. In mindestens einer Ausführungsform unterscheidet sich die CUDA-Treiber-API 3906 von der CUDA-Laufzeit-API 3904 dadurch, dass die CUDA-Laufzeit-API 3904 die Geräte-Codeverwaltung vereinfacht, indem sie eine implizite Initialisierung, eine Kontextverwaltung (analog zu einem Prozess) und eine Modulverwaltung (analog zu dynamisch geladenen Bibliotheken) bereitstellt. Im Gegensatz zu der High-Level-CUDA-Laufzeit-API 3904 ist die CUDA-Treiber-API 3906 eine Low-Level-API, die eine feinkörnigere Steuerung des Geräts ermöglicht, insbesondere in Bezug auf Kontexte und das Laden von Modulen, in mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann die CUDA-Treiber-API 3906 Funktionen zur Kontextverwaltung bereitstellen, die von der CUDA-Laufzeit-API 3904 nicht bereitgestellt werden. In mindestens einer Ausführungsform ist die CUDA-Treiber-API 3906 auch sprachunabhängig und unterstützt z.B. OpenCL zusätzlich zu der CUDA-Laufzeit-API 3904. Ferner können in mindestens einer Ausführungsform die Entwicklungsbibliotheken, einschließlich der CUDA-Laufzeitumgebung 3905, als getrennt von den Treiberkomponenten betrachtet werden, einschließlich des Benutzermodus-CUDA-Treibers 3907 und des Kernelmodus-Gerätetreibers 3908 (manchmal auch als „Anzeige“-Treiber bezeichnet).
  • In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3903 mathematische Bibliotheken, Deep-Learning-Bibliotheken, Bibliotheken paralleler Algorithmen und/oder Bibliotheken für Signal-/Bild-/Videoverarbeitung beinhalten, die von parallelen Rechenanwendungen wie der Anwendung 3901 verwendet werden können, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3903 mathematische Bibliotheken wie beispielsweise eine cuBLAS-Bibliothek, die eine Implementierung von Basic Linear Algebra Subprograms („BLAS“) zur Durchführung linearer Algebra-Operationen ist, eine cuFFT-Bibliothek zur Berechnung schneller Fourier-Transformationen („FFTs“) und eine cuRAND-Bibliothek zum Erzeugen von Zufallszahlen usw. beinhalten. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3903 unter anderem Deep-Learning-Bibliotheken wie eine cuDNN-Bibliothek mit Primitiven für tiefe neuronale Netze und eine TensorRT-Plattform für hochleistungsfähige Deep-Learning-Inferenz umfassen.
  • In mindestens einer Ausführungsform wird mindestens eine in 39 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3900 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3900 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3900 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3900 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3900 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 40 veranschaulicht eine ROCm-Implementierung des Software-Stacks 3800 von 38, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein ROCm-Software-Stack 4000, auf dem eine Anwendung 4001 gestartet werden kann, eine Sprachlaufzeitumgebung 4003, eine Systemlaufzeitumgebung 4005, einen Thunk 4007, einen ROCm-Kerneltreiber 4008 und einen Gerätekerneltreiber. In mindestens einer Ausführungsform wird der ROCm-Software-Stack 4000 auf der Hardware 4009 ausgeführt, die eine GPU umfassen kann, die ROCm unterstützt und von der AMD Corporation in Santa Clara, CA, entwickelt wird.
  • In mindestens einer Ausführungsform kann eine Anwendung 4001 ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 38 besprochene Anwendung 3801. Darüber hinaus können die Sprachlaufzeitumgebung 4003 und die Systemlaufzeitumgebung 4005 in mindestens einer Ausführungsform ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 38 beschriebene Laufzeitumgebung 3805. In mindestens einer Ausführungsform unterscheiden sich die Sprachlaufzeitumgebung 4003 und die Systemlaufzeitumgebung 4005 dadurch, dass die Systemlaufzeitumgebung 4005 eine sprachunabhängige Laufzeit ist, die eine ROCr-Systemlaufzeit-API 4004 implementiert und eine Heterogeneous System Architecture („HSA“) Laufzeit-API verwendet. Die HSA-Laufzeit-API ist eine schlanke API für den Benutzermodus, die Schnittstellen für den Zugriff auf und die Interaktion mit einer AMD-GPU bereitstellt, einschließlich Funktionen für die Speicherverwaltung, die Ausführungssteuerung über architektonisches Dispatch von Kerneln, die Fehlerbehandlung, System- und Agenteninformationen sowie die Laufzeitinitialisierung und das Herunterfahren, unter anderem, in mindestens einer Ausführungsform. Im Gegensatz zur Systemlaufzeitumgebung 4005 ist die Sprachlaufzeitumgebung 4003 in mindestens einer Ausführungsform eine Implementierung einer sprachspezifischen Laufzeit-API 4002, die auf der ROCr-Systemlaufzeit-API 4004 aufliegt. In mindestens einer Ausführungsform kann die Sprach-Laufzeit-API unter anderem eine Heterogeneous Compute Interface for Portability („HIP“)-Sprach-Laufzeit-API, eine Heterogeneous Compute Compiler („HCC“)-Sprach-Laufzeit-API oder eine OpenCL-API umfassen, ist aber nicht darauf beschränkt. HIP-Sprache ist insbesondere eine Erweiterung der C++-Programmiersprache mit funktionell ähnlichen Versionen der CUDA-Mechanismen, und in mindestens einer Ausführungsform umfasst eine HIP-Sprach-Laufzeit-API Funktionen, die denen der vorstehend in Verbindung mit 26 besprochenen CUDA-Laufzeit-API 2904 ähnlich sind, wie z.B. Funktionen für die Speicherverwaltung, Ausführungssteuerung, Geräteverwaltung, Fehlerbehandlung und Synchronisierung.
  • In mindestens einer Ausführungsform ist der Thunk (ROCt) 4007 eine Schnittstelle, die zur Interaktion mit dem zugrunde liegenden ROCm-Treiber 4008 verwendet werden kann. In mindestens einer Ausführungsform ist der ROCm-Treiber 4008 ein ROCk-Treiber, der eine Kombination aus einem AMDGPU-Treiber und einem H28-Kerneltreiber (amdkfd) ist. In mindestens einer Ausführungsform ist der AMDGPU-Treiber ein von AMD entwickelter Gerätekerneltreiber für GPUs, der ähnliche Funktionalitäten wie der vorstehend in Verbindung mit 38 besprochene Gerätekerneltreiber 3806 ausführt. In mindestens einer Ausführungsform ist der HSA-Kerneltreiber ein Treiber, der es verschiedenen Typen von Prozessoren ermöglicht, Systemressourcen über Hardwarefunktionen effektiver gemeinsam zu nutzen.
  • In mindestens einer Ausführungsform können verschiedene Bibliotheken (nicht gezeigt) in dem ROCm-Software-Stack 4000 oberhalb der Sprachlaufzeitumgebung 4003 enthalten sein und eine ähnliche Funktionalität wie die CUDA-Bibliotheken 3903, die vorstehend in Verbindung mit 39 besprochen wurden, bereitstellen. In mindestens einer Ausführungsform können verschiedene Bibliotheken mathematische, Deep-Learning- und/oder andere Bibliotheken enthalten, wie z.B. eine hipBLAS-Bibliothek, die Funktionen ähnlich denen von CUDA cuBLAS implementiert, eine rocFFT-Bibliothek zur Berechnung von FFTs, die CUDA cuFFT ähnlich ist, und andere.
  • In mindestens einer Ausführungsform wird mindestens eine in 40 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks 4000 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks 4000 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks 4000 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks 4000 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks 4000 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 41 veranschaulicht eine OpenCL-Implementierung des Software-Stacks 3800 von 38, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein OpenCL-Software-Stack 4100, auf dem eine Anwendung 4101 gestartet werden kann, ein OpenCL-Framework 4105, eine OpenCL-Laufzeitumgebung 4106 und einen Treiber 4107. In mindestens einer Ausführungsform wird der OpenCL-Software-Stack 4100 auf der Hardware 3909 ausgeführt, die nicht herstellerspezifisch ist. Da OpenCL von Geräten unterstützt wird, die von verschiedenen Anbietern entwickelt wurden, können in mindestens einer Ausführungsform spezifische OpenCL-Treiber erforderlich sein, um mit Hardware von solchen Anbietern zusammenzuarbeiten.
  • In mindestens einer Ausführungsform können die Anwendung 4101, die OpenCL-Laufzeitumgebung 4106, der Gerätekerneltreiber 4107 und die Hardware 4108 ähnliche Funktionen ausführen wie die Anwendung 3801, die Laufzeitumgebung 3805, der Gerätekerneltreiber 3806 bzw. die Hardware 3807, die vorstehend in Verbindung mit 38 beschrieben sind. In mindestens einer Ausführungsform enthält die Anwendung 4101 außerdem einen OpenCL-Kernel 4102 mit Code, der auf einem Gerät auszuführen ist.
  • In mindestens einer Ausführungsform definiert OpenCL eine „Plattform“, die es einem Host ermöglicht, mit dem Host verbundene Geräte zu steuern. In mindestens einer Ausführungsform stellt ein OpenCL-Framework eine Plattformschicht-API und eine Laufzeit-API, dargestellt als Plattform-API 4103 und Laufzeit-API 4105, bereit. In mindestens einer Ausführungsform verwendet die Laufzeit-API 4105 Kontexte, um die Ausführung von Kerneln auf Geräten zu verwalten. In mindestens einer Ausführungsform kann jedes identifizierte Gerät mit einem entsprechenden Kontext assoziiert sein, den die Laufzeit-API 4105 verwenden kann, um Befehlswarteschlangen, Programmobjekte und Kernelobjekte, gemeinsam genutzte Speicherobjekte usw. für dieses Gerät zu verwalten. In mindestens einer Ausführungsform stellt die Plattform-API 4103 Funktionen bereit, die es ermöglichen, Gerätekontexte zu verwenden, um Geräte auszuwählen und zu initialisieren, Arbeit über Befehlswarteschlangen an Geräte zu übermitteln und den Datentransfer zu und von Geräten zu ermöglichen, um nur einige Beispiele zu nennen. Darüber hinaus stellt das OpenCL-Framework in mindestens einer Ausführungsform verschiedene integrierte Funktionen (nicht dargestellt), darunter mathematische Funktionen, relationale Funktionen und Bildverarbeitungsfunktionen, bereit.
  • In mindestens einer Ausführungsform ist darüber hinaus ein Compiler 4104 in dem OpenCL-Framework 4110 enthalten. Der Quellcode kann in mindestens einer Ausführungsform offline vor der Ausführung einer Anwendung oder online während der Ausführung einer Anwendung kompiliert werden. Im Gegensatz zu CUDA und ROCm können OpenCL-Anwendungen in mindestens einer Ausführungsform online durch den Compiler 4104 kompiliert werden, der stellvertretend für eine beliebige Anzahl von Compilern steht, die zum Kompilieren von Quellcode und/oder IR-Code, wie Standard Portable Intermediate Representation („SPIR-V“) Code, in Binärcode verwendet werden können. Alternativ können in mindestens einer Ausführungsform OpenCL-Anwendungen offline kompiliert werden, bevor solche Anwendungen ausgeführt werden.
  • In mindestens einer Ausführungsform wird mindestens eine in 41 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4100 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4100 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4100 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4100 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4100 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 42 veranschaulicht Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform 4204 so konfiguriert, dass sie verschiedene Programmiermodelle 4203, Middlewares und/oder Bibliotheken 4202 und Frameworks 4201 unterstützt, auf die sich eine Anwendung 4200 stützen kann. In mindestens einer Ausführungsform kann die Anwendung 4200 eine KI/ML-Anwendung sein, die unter Verwendung beispielsweise eines Deep-Learning-Frameworks wie MXNet, PyTorch oder TensorFlow implementiert ist, das sich auf Bibliotheken wie cuDNN, NVIDIA Collective Communications Library („NCCL“) und/oder NVIDA Developer Data Loading Library („DALI“) CUDA-Bibliotheken stützen kann, um beschleunigte Berechnungen auf zugrunde liegender Hardware bereitzustellen.
  • In mindestens einer Ausführungsform kann die Programmierplattform 4204 eine der vorstehend in Verbindung mit 39, 40 bzw. 41 beschriebenen CUDA-, ROCm- oder OpenCL-Plattformen sein. In mindestens einer Ausführungsform unterstützt die Programmierplattform 4204 mehrere Programmiermodelle 4203, die Abstraktionen eines zugrunde liegenden Rechensystems sind, die Ausdrücke von Algorithmen und Datenstrukturen erlauben. In mindestens einer Ausführungsform können Programmiermodelle 4203 Merkmale zugrunde liegender Hardware offenlegen, um die Leistung zu verbessern. In mindestens einer Ausführungsform können die Programmiermodelle 4203 CUDA, HIP, OpenCL, C++ Accelerated Massive Parallelism („C++AMP“), Open Multi-Processing („OpenMP“), Open Accelerators („OpenACC“) und/oder Vulcan Compute umfassen, sind aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform stellen Bibliotheken und/oder Middlewares 4202 Implementierungen von Abstraktionen von Programmiermodellen 4204 bereit. In mindestens einer Ausführungsform enthalten solche Bibliotheken Daten und Programmiercode, die von Computerprogrammen verwendet und während der Softwareentwicklung genutzt werden können. In mindestens einer Ausführungsform umfassen solche Middlewares Software, die Anwendungen Dienste zur Verfügung stellt, die über die von der Programmierplattform 4204 verfügbaren Dienste hinausgehen. In mindestens einer Ausführungsform können die Bibliotheken und/oder Middlewares 4202 cuBLAS, cuFFT, cuRAND und andere CUDA-Bibliotheken oder rocBLAS, rocFFT, rocRAND und andere ROCm-Bibliotheken umfassen, sind aber nicht darauf beschränkt. Darüber hinaus können die Bibliotheken und/oder Middlewares 4202 in mindestens einer Ausführungsform NCCL- und ROCm Communication Collectives Library („RCCL“)-Bibliotheken, die Kommunikationsroutinen für GPUs bereitstellen, eine MI-Open-Bibliothek zur Deep-Learning-Beschleunigung und/oder eine Eigen-Bibliothek für lineare Algebra, Matrix- und Vektoroperationen, geometrische Transformationen, numerische Solver und verwandte Algorithmen umfassen.
  • In mindestens einer Ausführungsform hängen die Anwendungsframeworks 4201 von Bibliotheken und/oder Middlewares 4202 ab. In mindestens einer Ausführungsform ist jedes der Anwendungsframeworks 4201 ein Softwareframework, das zur Implementierung einer Standardstruktur von Anwendungssoftware verwendet wird. Um auf das vorstehend besprochene KI/ML-Beispiel zurückzukommen, kann eine KI/ML-Anwendung in mindestens einer Ausführungsform unter Verwendung von eines Frameworks wie Caffe, Caffe2, TensorFlow, Keras, PyTorch oder MxNet Deep Learning Frameworks implementiert sein.
  • In mindestens einer Ausführungsform wird mindestens eine in 42 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4200 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4200 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4200 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4200 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4200 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 43 veranschaulicht die Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 38-41, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform empfängt ein Compiler 4301 Quellcode 4300, der sowohl Host-Code als auch Geräte-Code enthält. In mindestens einer Ausführungsform ist der Compiler 4301 so konfiguriert, dass er den Quellcode 4300 in einen ausführbaren Host-Code 4302 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 4303 zur Ausführung auf einem Gerät umwandelt. In mindestens einer Ausführungsform kann der Quellcode 4300 entweder offline vor der Ausführung einer Anwendung oder online während der Ausführung einer Anwendung kompiliert werden.
  • In mindestens einer Ausführungsform kann der Quellcode 4300 Code in einer beliebigen, von dem Compiler 4301 unterstützten Programmiersprache enthalten, wie z.B. C++, C, Fortran usw. In mindestens einer Ausführungsform kann der Quellcode 4300 in einer Einquellen- bzw. Single-Source-Datei enthalten sein, die eine Mischung aus Host-Code und Geräte-Code enthält, wobei Positionen des Geräte-Codes darin angegeben sind. In mindestens einer Ausführungsform kann eine Single-Source-Datei eine .cu-Datei sein, die CUDA-Code enthält, oder eine .hip.cpp-Datei, die HIP-Code enthält. Alternativ kann der Quellcode 4300 in mindestens einer Ausführungsform mehrere Quellcodedateien anstelle einer einzigen Quellcodedatei beinhalten, in denen Host-Code und Geräte-Code getrennt sind.
  • In mindestens einer Ausführungsform ist der Compiler 4301 so konfiguriert, dass er den Quellcode 4300 in einen ausführbaren Host-Code 4302 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 4303 zur Ausführung auf einem Gerät kompiliert. In mindestens einer Ausführungsform führt der Compiler 4301 Operationen durch, darunter ein Parsen des Quellcodes 4300 in einen abstrakten Systembaum (AST), ein Durchführen von Optimierungen und ein Erzeugen von ausführbarem Code.
  • In mindestens einer Ausführungsform, in der der Quellcode 4300 eine Single-Source-Datei enthält, kann der Compiler 4301 den Geräte-Code von dem Host-Code in einer solchen Single-Source-Datei trennen, den Geräte-Code und den Host-Code in den ausführbaren Geräte-Code 4303 bzw. den ausführbaren Host-Code 4302 kompilieren und den ausführbaren Geräte-Code 4303 und den ausführbaren Host-Code 4302 in einer einzigen Datei miteinander verknüpfen, wie nachstehend unter Bezugnahme auf 31 ausführlicher erläutert.
  • In mindestens einer Ausführungsform können der ausführbare Host-Code 4302 und der ausführbare Geräte-Code 4303 in jedem geeigneten Format vorliegen, z.B. als Binärcode und/oder IR-Code. Im Fall von CUDA kann der ausführbare Host-Code 4302 in mindestens einer Ausführungsform nativen Objektcode beinhalten und kann der ausführbare Geräte-Code 4303 Code in PTX-Zwischendarstellung beinhalten. Im Fall von ROCm können sowohl der ausführbare Host-Code 4302 als auch der ausführbare Geräte-Code 4303 in mindestens einer Ausführungsform einen Ziel-Binärcode enthalten.
  • In mindestens einer Ausführungsform wird mindestens eine in 43 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4300 angegebenen ausführbaren Host-Codes 4302 oder ausführbaren Geräte-Codes 4303 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4300 angegebenen ausführbaren Host-Codes 4302 oder ausführbaren Geräte-Codes 4303 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4300 angegebenen ausführbaren Host-Codes 4302 oder ausführbaren Geräte-Codes 4303 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4300 angegebenen ausführbaren Host-Codes 4302 oder ausführbaren Geräte-Codes 4303 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4300 angegebenen ausführbaren Host-Codes 4302 oder ausführbaren Geräte-Codes 4303 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 44 ist eine detailliertere Darstellung der Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 38-41, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist ein Compiler 4401 so konfiguriert, dass er Quellcode 4400 empfängt, Quellcode 4400 kompiliert und eine ausführbare Datei 4408 ausgibt. In mindestens einer Ausführungsform ist der Quellcode 4400 eine Single-Source-Datei, wie z.B. eine .cu-Datei, eine .hip.cpp-Datei oder eine Datei in einem anderen Format, die sowohl Host- als auch Geräte-Code enthält. In mindestens einer Ausführungsform kann der Compiler 4401 ein NVIDIA CUDA Compiler („NVCC“) zum Kompilieren von CUDA-Code in .cu-Dateien oder ein HCC-Compiler zum Kompilieren von HIP-Code in .hip.cpp-Dateien sein, ist aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform beinhaltet der Compiler 4401 ein Compiler-Frontend 4402, einen Host-Compiler 4405, einen Geräte-Compiler 4406 und einen Linker 4409. In mindestens einer Ausführungsform ist das Compiler-Frontend 4402 so konfiguriert, dass es den Geräte-Code 4404 von dem Host-Code 4403 in dem Quellcode 4400 trennt. Geräte-Code 4404 wird von dem Gerätecompiler 4406 in ausführbaren Geräte-Code 4408 kompiliert, der, wie beschrieben wurde, in mindestens einer Ausführungsform Binärcode oder IR-Code enthalten kann. In mindestens einer Ausführungsform wird getrennt davon Host-Code 4403 von dem Host-Compiler 4405 in ausführbaren Host-Code 4407 kompiliert. In mindestens einer Ausführungsform kann für NVCC der Host-Compiler 4405, ohne darauf beschränkt zu sein, ein universeller C/C++-Compiler sein, der nativen Objektcode ausgibt, während der Geräte-Compiler 4406, ohne darauf beschränkt zu sein, ein auf einer Low Level Virtual Machine („LLVM“) basierender Compiler sein kann, der eine LLVM-Compiler-Infrastruktur aufspaltet und PTX-Code oder Binärcode ausgibt. In mindestens einer Ausführungsform können für den HCC sowohl der Host-Compiler 4405 als auch der Geräte-Compiler 4406 LLVM-basierte Compiler sein, die Ziel-Binärcode ausgeben, sind aber nicht darauf beschränkt.
  • Nach der Kompilierung des Quellcodes 4400 in einen ausführbaren Host-Code 4407 und einen ausführbaren Geräte-Code 4408 verknüpft der Linker 4409 in mindestens einer Ausführungsform den ausführbaren Host- und Geräte-Code 4407 und 4408 in einer ausführbaren Datei 4410. In mindestens einer Ausführungsform können nativer Objektcode für einen Host und PTX- oder Binärcode für ein Gerät in einer Executable and Linkable Format („ELF“)-Datei miteinander verknüpft werden, die ein Containerformat zum Speichern von Objektcode ist.
  • In mindestens einer Ausführungsform wird mindestens eine in 44 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird die im Quellcode 4400 angegebene ausführbare Datei 4410 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird die im Quellcode 4400 angegebene ausführbare Datei 4410 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird die im Quellcode 4400 angegebene ausführbare Datei 4410 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird die im Quellcode 4400 angegebene ausführbare Datei 4410 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird die im Quellcode 4400 angegebene ausführbare Datei 4410 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 45 veranschaulicht ein Übersetzen von Quellcode vor der Kompilierung des Quellcodes, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird Quellcode 4500 durch ein Übersetzungswerkzeug 4501 geleitet, das den Quellcode 4500 in übersetzten Quellcode 4502 übersetzt. In mindestens einer Ausführungsform wird ein Compiler 4503 verwendet, um den übersetzten Quellcode 4502 in einen ausführbaren Host-Code 4504 und einen ausführbaren Geräte-Code 4505 zu kompilieren, in einem Prozess, der der Kompilierung des Quellcodes 4300 durch den Compiler 4301 in einen ausführbaren Host-Code 4302 und einen ausführbaren Geräte-Code 4303 ähnelt, wie vorstehend in Verbindung mit 43 beschrieben wurde.
  • In mindestens einer Ausführungsform wird eine von dem Übersetzungswerkzeug 4501 durchgeführte Übersetzung verwendet, um den Quellcode 4500 für die Ausführung in einer anderen Umgebung als der, in der er ursprünglich ausgeführt werden sollte, zu portieren. In mindestens einer Ausführungsform kann das Übersetzungswerkzeug 4501 einen HIP-Übersetzer umfassen, der verwendet wird, um CUDA-Code, der für eine CUDA-Plattform vorgesehen ist, in HIP-Code zu „hipifizieren“, der auf einer ROCm-Plattform kompiliert und ausgeführt werden kann, ist aber nicht darauf beschränkt. In mindestens einer Ausführungsform kann die Übersetzung des Quellcodes 4500 ein Parsen des Quellcodes 4500 und ein Konvertieren von Aufrufen zu API(s), die von einem Programmiermodell (z.B. CUDA) bereitgestellt werden, in entsprechende Aufrufe zu API(s), die von einem anderen Programmiermodell (z.B. HIP) bereitgestellt werden, beinhalten, wie nachstehend in Verbindung mit den 46A-47 ausführlicher erläutert wird. Um auf das Beispiel des Hipifying von CUDA-Code zurückzukommen, können in mindestens einer Ausführungsform Aufrufe der CUDA-Laufzeit-API, der CUDA-Treiber-API und/oder der CUDA-Bibliotheken in entsprechende HIP-API-Aufrufe konvertiert werden. In mindestens einer Ausführungsform können automatisierte Übersetzungen, die von dem Übersetzungswerkzeug 4501 durchgeführt werden, manchmal unvollständig sein, so dass zusätzlicher, manueller Aufwand erforderlich ist, um den Quellcode 4500 vollständig zu portieren.
  • In mindestens einer Ausführungsform wird mindestens eine in 45 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 18 beschrieben sind. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4500 angegebenen ausführbaren Host-Codes 4504 oder ausführbaren Geräte-Codes 4505 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4500 angegebenen ausführbaren Host-Codes 4504 oder ausführbaren Geräte-Codes 4505 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4500 angegebenen ausführbaren Host-Codes 4504 oder ausführbaren Geräte-Codes 4505 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4500 angegebenen ausführbaren Host-Codes 4504 oder ausführbaren Geräte-Codes 4505 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 4500 angegebenen ausführbaren Host-Codes 4504 oder ausführbaren Geräte-Codes 4505 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • Konfigurieren von GPUs für universelle Berechnungen
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte Architekturen für die Kompilierung und Ausführung von Rechen-Quellcode, gemäß mindestens einer Ausführungsform.
  • 46A veranschaulicht ein System 4600, das so konfiguriert ist, dass es CUDA-Quellcode 4610 unter Verwendung verschiedener Arten von Verarbeitungseinheiten kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das System 4600, ohne Beschränkung darauf, CUDA-Quellcode10, einen CUDA-Compiler 4650, ausführbaren Host-Code 4670(1), ausführbaren Host-Code 4670(2), ausführbaren CUDA-Geräte-Code 4684, eine CPU 4690, eine CUDA-fähige GPU 4694, eine GPU 4692, ein CUDA-zu-HIP-Übersetzungswerkzeug 4620, HIP-Quellcode 4630, einen HIP-Compilertreiber 4640, einen HCC 4660 und ausführbaren HCC-Geräte-Code 4682.
  • In mindestens einer Ausführungsform ist der CUDA-Quellcode 4610 eine Sammlung von Menschen lesbarer Code in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Code ein von Menschen lesbarer Code in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist eine CUDA-Programmiersprache eine Erweiterung der Programmiersprache C++, die, ohne Beschränkung darauf, Mechanismen zur Definition von Geräte-Code und zur Unterscheidung zwischen Geräte-Code und Host-Code beinhaltet. In mindestens einer Ausführungsform ist der Geräte-Code ein Quellcode, der nach der Kompilierung parallel auf einem Gerät ausführbar ist. In mindestens einer Ausführungsform kann ein Gerät ein Prozessor sein, der für parallele Befehlsverarbeitung optimiert ist, wie z.B. eine CUDA-fähige GPU 4690, eine GPU 46192 oder eine andere GPGPU, usw. In mindestens einer Ausführungsform ist der Host-Code ein Quellcode, der nach der Kompilierung auf einem Host ausführbar ist. In mindestens einer Ausführungsform ist ein Host ein Prozessor, der für die sequenzielle Befehlsverarbeitung optimiert ist, wie z.B. die CPU 4690.
  • In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4614, eine beliebige Anzahl (einschließlich Null) von Hostfunktionen 4616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4618. In mindestens einer Ausführungsform können globale Funktionen 4612, Gerätefunktionen 4614, Hostfunktionen 4616 und Host/Geräte-Funktionen 4618 in dem CUDA-Quellcode 4610 gemischt sein. In mindestens einer Ausführungsform ist jede der globalen Funktionen 4612 auf einem Gerät ausführbar und von einem Host aus aufrufbar. In mindestens einer Ausführungsform können daher eine oder mehrere der globalen Funktionen 4612 als Einstiegspunkte zu einem Gerät dienen. In mindestens einer Ausführungsform ist jede der globalen Funktionen 4612 ein Kernel. In mindestens einer Ausführungsform und in einer Technik, die als dynamische Parallelität bekannt ist, definiert eine oder mehrere der globalen Funktionen 4612 einen Kernel, der auf einem Gerät ausführbar ist und von einem solchen Gerät aus aufgerufen werden kann. In mindestens einer Ausführungsform wird ein Kernel während der Ausführung N (wobei N eine beliebige positive ganze Zahl ist) Mal parallel von N verschiedenen Threads auf einem Gerät ausgeführt.
  • In mindestens einer Ausführungsform wird jede von Gerätefunktionen 4614 auf einem Gerät ausgeführt und kann nur von einem solchen Gerät aus aufgerufen werden. In mindestens einer Ausführungsform wird jede von Host-Funktionen 4616 auf einem Host ausgeführt und ist nur von einem solchen Host aus aufrufbar. In mindestens einer Ausführungsform definiert jede der Host-/Geräte-Funktionen 4616 sowohl eine Host-Version einer Funktion, die auf einem Host ausführbar und nur von einem solchen Host aufrufbar ist, als auch eine Geräteversion der Funktion, die auf einem Gerät ausführbar und nur von einem solchen Gerät aufrufbar ist.
  • In mindestens einer Ausführungsform kann der CUDA-Quellcode 4610 auch, ohne Beschränkung darauf, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die über eine CUDA-Laufzeit-API 4602 definiert sind. In mindestens einer Ausführungsform kann die CUDA-Laufzeit-API 4602, ohne Beschränkung darauf, eine beliebige Anzahl von Funktionen enthalten, die auf einem Host ausgeführt werden, um Gerätespeicher zuzuweisen und freizugeben, Daten zwischen Hostspeicher und Gerätespeicher zu übertragen, Systeme mit mehreren Geräten zu verwalten usw. In mindestens einer Ausführungsform kann der CUDA-Quellcode 4610 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die in einer beliebigen Anzahl von anderen CUDA-APIs angegeben sind. In mindestens einer Ausführungsform kann eine CUDA-API eine beliebige API sein, die für die Verwendung durch CUDA-Code vorgesehen ist. In mindestens einer Ausführungsform umfassen CUDA-APIs, ohne Beschränkung darauf, eine CUDA-Laufzeit-API 4602, eine CUDA-Treiber-API, APIs für eine beliebige Anzahl von CUDA-Bibliotheken, usw. In mindestens einer Ausführungsform und im Vergleich zu der CUDA-Laufzeit-API 4602 ist eine CUDA-Treiber-API eine API auf niedrigerer Ebene, die jedoch eine feinkörnigere Steuerung eines Geräts ermöglicht. In mindestens einer Ausführungsform umfassen Beispiele für CUDA-Bibliotheken, ohne Beschränkung darauf, cuBLAS, cuFFT, cuRAND, cuDNN usw.
  • In mindestens einer Ausführungsform kompiliert der CUDA-Compiler 4650 den eingegebenen CUDA-Code (z.B. den CUDA-Quellcode 4610), um den ausführbaren Host-Code 4670(1) und den ausführbaren CUDA-Geräte-Code 4684 zu erzeugen. In mindestens einer Ausführungsform ist der CUDA-Compiler 4650 ein NVCC. In mindestens einer Ausführungsform ist der ausführbare Host-Code 4670(1) eine kompilierte Version des Host-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CPU 4690 ausführbar ist. In mindestens einer Ausführungsform kann die CPU 4690 ein beliebiger Prozessor sein, der für die sequenzielle Befehlsverarbeitung optimiert ist.
  • In mindestens einer Ausführungsform ist der ausführbare CUDA-Geräte-Code 4684 eine kompilierte Version des Geräte-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CUDA-fähigen GPU 4694 ausführbar ist. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4684, ohne Beschränkung darauf, Binärcode. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4684, ohne Beschränkung darauf, IR-Code, wie z.B. PTX-Code, der zur Laufzeit von einem Gerätetreiber weiter in Binärcode für ein bestimmtes Zielgerät (z.B. CUDA-fähige GPU 4694) kompiliert wird. In mindestens einer Ausführungsform kann der CUDA-fähige Grafikprozessor 4694 ein beliebiger Prozessor sein, der für die parallele Befehlsverarbeitung optimiert ist und CUDA unterstützt. In mindestens einer Ausführungsform wird der CUDA-fähige Grafikprozessor 4694 von der NVIDIA Corporation in Santa Clara, CA, entwickelt.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4620 so konfiguriert, dass es den CUDA-Quellcode 4610 in einen funktionell ähnlichen HIP-Quellcode 4630 übersetzt. In mindestens einer Ausführungsform ist der HIP-Quellcode 4630 eine Sammlung von von Menschen lesbarem Code in einer HIP-Programmiersprache. In mindestens einer Ausführungsform ist der HIP-Code ein von Menschen lesbarer Code in einer HIP-Programmiersprache. In mindestens einer Ausführungsform ist eine HIP-Programmiersprache eine Erweiterung der C++-Programmiersprache, die, ohne Beschränkung darauf, funktionell ähnliche Versionen von CUDA-Mechanismen enthält, um Geräte-Code zu definieren und zwischen Geräte-Code und Host-Code zu unterscheiden. In mindestens einer Ausführungsform kann eine HIP-Programmiersprache eine Teilmenge der Funktionalität einer CUDA-Programmiersprache enthalten. In mindestens einer Ausführungsform enthält eine HIP-Programmiersprache beispielsweise, ohne Beschränkung darauf, Mechanismen zum Definieren globaler Funktionen 4612, aber einer solchen HIP-Programmiersprache kann die Unterstützung für dynamische Parallelität fehlen, und daher können in dem HIP-Code definierte globale Funktionen 4612 nur von einem Host aus aufrufbar sein.
  • In mindestens einer Ausführungsform enthält der HIP-Quellcode 4630, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4618. In mindestens einer Ausführungsform kann der HIP-Quellcode 4630 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die in einer HIP-Laufzeit-API 4632 angegeben sind. In mindestens einer Ausführungsform enthält die HIP-Laufzeit-API 4632, ohne Beschränkung darauf, funktionell ähnliche Versionen einer Teilmenge von Funktionen, die in der CUDA-Laufzeit-API 4602 enthalten sind. In mindestens einer Ausführungsform kann der HIP-Quellcode 4630 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die in einer beliebigen Anzahl von anderen HIP-APIs angegeben sind. In mindestens einer Ausführungsform kann eine HIP-API eine beliebige API sein, die für die Verwendung durch HIP-Code und/oder ROCm vorgesehen ist. In mindestens einer Ausführungsform umfassen HIP-APIs, ohne Beschränkung darauf, die HIP-Laufzeit-API 4632, eine HIP-Treiber-API, APIs für eine beliebige Anzahl von HIP-Bibliotheken, APIs für eine beliebige Anzahl von ROCm-Bibliotheken, usw.
  • In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 4620 jeden Kernel-Aufruf in dem CUDA-Code von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem CUDA-Code in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe. In mindestens einer Ausführungsform ist ein CUDA-Aufruf ein Aufruf einer Funktion, die in einer CUDA-API angegeben ist, und ist ein HIP-Aufruf ein Aufruf einer Funktion, die in einer HIP-API angegeben ist. In mindestens einer Ausführungsform wandelt das CUDA-zu-HIP-Übersetzungswerkzeug 4620 eine beliebige Anzahl von Aufrufen zu Funktionen, die in der CUDA-Laufzeit-API 4602 angegeben sind, in eine beliebige Anzahl von Aufrufen zu Funktionen, die in der HIP-Laufzeit-API 4632 angegeben sind, um.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4620 ein als hipify-perl bekanntes Werkzeug, das einen textbasierten Übersetzungsprozess ausführt. In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4620 ein als hipify-clang bekanntes Werkzeug, das im Vergleich zu hipify-perl einen komplexeren und robusteren Übersetzungsprozess ausführt, der das Parsen von CUDA-Code unter Verwendung von clang (einem Compiler-Frontend) und die anschließende Übersetzung der resultierenden Symbole umfasst. In mindestens einer Ausführungsform kann die ordnungsgemäße Konvertierung von CUDA-Code in HIP-Code Modifikationen (z.B. manuelle Bearbeitungen) zusätzlich zu denjenigen, die von dem CUDA-zu-HIP-Übersetzungswerkzeug 4620 durchgeführt werden, erfordern.
  • In mindestens einer Ausführungsform ist der HIP-Compilertreiber 4640 ein Frontend, das ein Zielgerät 4646 bestimmt und dann einen mit dem Zielgerät 4646 kompatiblen Compiler konfiguriert, um den HIP-Quellcode 4630 zu kompilieren. In mindestens einer Ausführungsform ist das Zielgerät 4646 ein Prozessor, der für die parallele Befehlsverarbeitung optimiert ist. In mindestens einer Ausführungsform kann der HIP-Compilertreiber 4640 das Zielgerät 4646 auf jede technisch machbare Weise bestimmen.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 4646 mit CUDA kompatibel ist (z.B. die CUDA-fähige GPU 4694), der HIP-Compilertreiber 4640 einen HIP/NVCC-Kompilierungsbefehl 4642. In mindestens einer Ausführungsform und wie in Verbindung mit 46B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 4642 den CUDA-Compiler 4650 zum Kompilieren des HIP-Quellcodes 4630 unter Verwendung eines HIP-zu-CUDA-Übersetzungsheaders und einer CUDA-Laufzeitbibliothek, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform und im Ansprechen auf den HIP/NVCC-Kompilierungsbefehl 4642 erzeugt der CUDA-Compiler 4650 den ausführbaren Host-Code 4670(1) und den ausführbaren CUDA-Geräte-Code 4684.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 4646 nicht mit CUDA kompatibel ist, der HIP-Compilertreiber 4640 einen HIP/HCC-Kompilierungsbefehl 4644. In mindestens einer Ausführungsform und wie in Verbindung mit 46C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 4644 den HCC 4660 zum Kompilieren von HIP-Quellcode 4630 unter Verwendung eines HCC-Headers und einer HIP/HCC-Laufzeitbibliothek, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform und im Ansprechen auf den HIP/HCC-Kompilierungsbefehl 4644 erzeugt der HCC 4660 ausführbaren Host-Code 4670(2) und ausführbaren HCC-Geräte-Code 4682. In mindestens einer Ausführungsform ist der ausführbare HCC-Geräte-Code 4682 eine kompilierte Version des in dem HIP-Quellcode 4630 enthaltenen Geräte-Codes, der auf der GPU 4692 ausführbar ist. In mindestens einer Ausführungsform kann die GPU 4692 ein beliebiger Prozessor sein, der für die parallele Befehlsverarbeitung optimiert ist, nicht mit CUDA kompatibel ist und mit dem HCC kompatibel ist. In mindestens einer Ausführungsform wird der Grafikprozessor 4692 von der AMD Corporation in Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform ist GPU, 4692 eine nicht CUDA-fähige GPU 4692.
  • Nur zu Erläuterungszwecken sind in 46A drei verschiedene Abläufe dargestellt, die in mindestens einer Ausführungsform implementiert sein können, um den CUDA-Quellcode 4610 für die Ausführung auf der CPU 4690 und verschiedenen Geräten zu kompilieren. In mindestens einer Ausführungsform kompiliert ein direkter CUDA-Ablauf den CUDA-Quellcode 4610 für die Ausführung auf der CPU 4690 und der CUDA-fähigen GPU 4694, ohne den CUDA-Quellcode 4610 in den HIP-Quellcode 4630 zu übersetzen. In mindestens einer Ausführungsform übersetzt ein indirekter CUDA-Ablauf den CUDA-Quellcode 4610 in den HIP-Quellcode 4630 und kompiliert dann den HIP-Quellcode 4630 zur Ausführung auf der CPU 4690 und der CUDA-fähigen GPU 4694. In mindestens einer Ausführungsform übersetzt ein CUDA/HCC-Ablauf den CUDA-Quellcode 4610 in HIP-Quellcode 4630 und kompiliert dann den HIP-Quellcode 4630 für die Ausführung auf der CPU 4690 und der GPU 4692.
  • Ein direkter CUDA-Ablauf, der in mindestens einer Ausführungsform implementiert sein kann, ist durch gestrichelte Linien und eine Reihe von Blasen mit Bezeichnungen A1-A3 dargestellt. In mindestens einer Ausführungsform und wie in der mit A1 bezeichneten Blase dargestellt, empfängt der CUDA-Compiler 4650 den CUDA-Quellcode 4610 und einen CUDA-Kompilierbefehl 4648, der den CUDA-Compiler 4650 für die Kompilierung des CUDA-Quellcodes 4610 konfiguriert. In mindestens einer Ausführungsform ist der CUDA-Quellcode 4610, der in einem direkten CUDA-Ablauf verwendet wird, in einer CUDA-Programmiersprache geschrieben, die auf einer anderen Programmiersprache als C++ (z.B. C, Fortran, Python, Java usw.) basiert. In mindestens einer Ausführungsform und im Ansprechen auf den CUDA-Kompilierbefehl 4648 generiert der CUDA-Compiler 4650 den ausführbaren Host-Code 4670(1) und den ausführbaren CUDA-Geräte-Code 4684 (dargestellt mit der Blase mit der Bezeichnung A2). In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung A3 dargestellt, können der ausführbare Host-Code 4670(1) und der ausführbare CUDA-Geräte-Code 4684 auf der CPU 4690 bzw. der CUDA-fähigen GPU 4694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4684, ohne darauf beschränkt zu sein, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • Ein indirekter CUDA-Ablauf, der in mindestens einer Ausführungsform implementiert sein kann, ist durch gestrichelte Linien und eine Reihe von Blasen mit der Bezeichnung B1-B6 dargestellt. In mindestens einer Ausführungsform und wie in der mit B1 gekennzeichneten Blase dargestellt, empfängt das CUDA-HIP-Übersetzungswerkzeug 4620 den CUDA-Quellcode 4610. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung B2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 4620 den CUDA-Quellcode 4610 in den HIP-Quellcode 4630. In mindestens einer Ausführungsform und wie in der mit B3 bezeichneten Blase dargestellt, empfängt der HIP-Compilertreiber 4640 den HIP-Quellcode 4630 und bestimmt, dass das Zielgerät 4646 CUDA-fähig ist.
  • In mindestens einer Ausführungsform und wie mit der mit B4 bezeichneten Blase dargestellt, erzeugt der HIP-Compilertreiber 4640 den HIP/NVCC-Kompilierbefehl 4642 und überträgt sowohl den HIP/NVCC-Kompilierbefehl 4642 als auch den HIP-Quellcode 4630 an den CUDA-Compiler 4650. In mindestens einer Ausführungsform und wie in Verbindung mit 46B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 4642 den CUDA-Compiler 4650 zum Kompilieren des HIP-Quellcodes 4630 unter Verwendung eines HIP-zu-CUDA-Übersetzungsheaders und einer CUDA-Laufzeitbibliothek, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform und im Ansprechen auf den HIP/NVCC-Kompilierungsbefehl 4642 erzeugt der CUDA-Compiler 4650 den ausführbaren Host-Code 4670(1) und den ausführbaren CUDA-Geräte-Code 4684 (dargestellt mit der Blase mit der Bezeichnung B5). In mindestens einer Ausführungsform und wie in der mit B6 bezeichneten Blase dargestellt, können der ausführbare Host-Code 4670(1) und der ausführbare CUDA-Geräte-Code 4684 auf der CPU 4690 bzw. der CUDA-fähigen GPU 4694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4684, ohne darauf beschränkt zu sein, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • Ein CUDA/HCC-Ablauf, der in mindestens einer Ausführungsform implementiert sein kann, wird durch durchgezogene Linien und eine Reihe von Blasen mit der Bezeichnung C1-C6 dargestellt. In mindestens einer Ausführungsform und wie in der Blase mit der Bezeichnung C1 dargestellt, empfängt das CUDA-HIP-Übersetzungswerkzeug 4620 den CUDA-Quellcode 4610. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung C2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 4620 den CUDA-Quellcode 4610 in den HIP-Quellcode 4630. In mindestens einer Ausführungsform und wie mit der Blase C3 dargestellt, empfängt der HIP-Compilertreiber 4640 den HIP-Quellcode 4630 und bestimmt, dass das Zielgerät 4646 nicht CUDA-fähig ist.
  • In mindestens einer Ausführungsform erzeugt der HIP-Compilertreiber 4640 den HIP/HCC-Kompilierbefehl 4644 und überträgt sowohl den HIP/HCC-Kompilierbefehl 4644 als auch den HIP-Quellcode 4630 an den HCC 4660 (dargestellt durch die mit C4 bezeichnete Blase). In mindestens einer Ausführungsform und wie in Verbindung mit 46C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 4644 den HCC 4660, um den HIP-Quellcode 4630 zu kompilieren, wobei, ohne Beschränkung darauf, ein HCC-Header und eine HIP/HCC-Laufzeitbibliothek verwendet werden. In mindestens einer Ausführungsform und im Ansprechen auf den HIP/HCC-Kompilierungsbefehl 4644 erzeugt der HCC 4660 einen ausführbaren Host-Code 4670(2) und einen ausführbaren HCC-Geräte-Code 4682 (dargestellt mit einer Blase mit der Bezeichnung C5). In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung C6 dargestellt, können der ausführbare Host-Code 4670(2) und der ausführbare HCC-Geräte-Code 4682 auf der CPU 4690 bzw. der GPU 4692 ausgeführt werden.
  • In mindestens einer Ausführungsform kann, nachdem der CUDA-Quellcode 4610 in HIP-Quellcode 4630 übersetzt wurde, der HIP-Compilertreiber 4640 anschließend verwendet werden, um ausführbaren Code entweder für die CUDA-fähige GPU 4694 oder die GPU 4692 zu erzeugen, ohne CUDA-HIP-Übersetzungswerkzeug 4620 erneut auszuführen. In mindestens einer Ausführungsform übersetzt das CUDA-zu-HIP-Übersetzungswerkzeug 4620 den CUDA-Quellcode 4610 in HIP-Quellcode 4630, der dann im Speicher abgelegt wird. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4640 dann den HCC 4660, um den ausführbaren Host-Code 4670(2) und den ausführbaren HCC-Geräte-Code 4682 basierend auf dem HIP-Quellcode 4630 zu erzeugen. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4640 anschließend den CUDA-Compiler 4650, um auf der Grundlage des gespeicherten HIP-Quellcodes 4630 den ausführbaren Host-Code 4670(1) und den ausführbaren CUDA-Geräte-Code 4684 zu erzeugen.
  • 46B veranschaulicht ein System 4604, das so konfiguriert ist, dass es den CUDA-Quellcode 4610 von 46A unter Verwendung der CPU 4690 und der CUDA-fähigen GPU 4694 gemäß mindestens einer Ausführungsform kompiliert und ausführt. In mindestens einer Ausführungsform umfasst das System 4604, ohne Beschränkung darauf, den CUDA-Quellcode 4610, das CUDA-HIP-Übersetzungswerkzeug 4620, den HIP-Quellcode 4630, den HIP-Compilertreiber 4640, den CUDA-Compiler 4650, den ausführbaren Host-Code 4670(1), den ausführbaren CUDA-Geräte-Code 4684, die CPU 4690 und die CUDA-fähige GPU 4694.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 46A beschrieben, enthält der CUDA-Quellcode 4610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4618. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4610 auch, ohne Beschränkung darauf, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen, die in einer beliebigen Anzahl von CUDA-APIs spezifiziert sind.
  • In mindestens einer Ausführungsform übersetzt das CUDA-zu-HIP-Übersetzungswerkzeug 4620 den CUDA-Quellcode 4610 in den HIP-Quellcode 4630. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 4620 jeden Kernel-Aufruf in dem CUDA-Quellcode 4610 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem CUDA-Quellcode 4610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt der HIP-Compilertreiber 4640, dass das Zielgerät 4646 CUDA-fähig ist, und erzeugt den HIP/NVCC-Kompilierungsbefehl 4642. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4640 dann den CUDA-Compiler 4650 über den HIP/NVCC-Kompilierbefehl 4642, um den HIP-Quellcode 4630 zu kompilieren. In mindestens einer Ausführungsform stellt der HIP-Compilertreiber 4640 Zugriff auf einen HIP-zu-CUDA-Übersetzungsheader 4652 als Teil der Konfiguration des CUDA-Compilers 4650 bereit. In mindestens einer Ausführungsform übersetzt der HIP-zu-CUDA-Übersetzungsheader 4652 eine beliebige Anzahl von Mechanismen (z.B. Funktionen), die in einer beliebigen Anzahl von HIP-APIs spezifiziert sind, in eine beliebige Anzahl von Mechanismen, die in einer beliebigen Anzahl von CUDA-APIs spezifiziert sind. In mindestens einer Ausführungsform verwendet der CUDA-Compiler 4650 den HIP-zu-CUDA-Übersetzungsheader 4652 in Verbindung mit einer CUDA-Laufzeitbibliothek 4654, die der CUDA-Laufzeit-API 4602 entspricht, um den ausführbaren Host-Code 4670(1) und den ausführbaren CUDA-Geräte-Code 4684 zu erzeugen. In mindestens einer Ausführungsform können der ausführbare Host-Code 4670(1) und der ausführbare CUDA-Geräte-Code 4684 dann auf der CPU 4690 bzw. der CUDA-fähigen GPU 4694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4684, ohne Beschränkung darauf, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • 46C veranschaulicht ein System 4606, das so konfiguriert ist, dass es den CUDA-Quellcode 4610 von 46A unter Verwendung einer CPU 4690 und einer nicht-CUDA-fähigen GPU 4692 kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das System 4606, ohne Beschränkung darauf, den CUDA-Quellcode 4610, das CUDA-zu-HIP-Übersetzungswerkzeug 4620, den HIP-Quellcode 4630, den HIP-Compilertreiber 4640, den HCC 4660, den ausführbaren Host-Code 4670(2), den ausführbaren HCC-Geräte-Code 4682, die CPU 4690 und die GPU 4692.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 46A beschrieben, enthält der CUDA-Quellcode 4610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4618. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4610 auch, ohne Beschränkung darauf, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen, die in einer beliebigen Anzahl von CUDA-APIs spezifiziert sind.
  • In mindestens einer Ausführungsform übersetzt das CUDA-zu-HIP-Übersetzungswerkzeug 4620 den CUDA-Quellcode 4610 in den HIP-Quellcode 4630. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 4620 jeden Kernel-Aufruf in dem CUDA-Quellcode 4610 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 4610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt der HIP-Compilertreiber 4640 anschließend, dass das Zielgerät 4646 nicht CUDA-fähig ist, und erzeugt den HIP/HCC-Kompilierbefehl 4644. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4640 dann den HCC 4660, um den HIP/HCC-Kompilierbefehl 4644 auszuführen, um den HIP-Quellcode 4630 zu kompilieren. In mindestens einer Ausführungsform konfiguriert der HIP/HCC-Kompilierbefehl 4644 den HCC 4660 so, dass er, ohne Beschränkung darauf, eine HIP/HCC-Laufzeitbibliothek 4658 und einen HCC-Header 4656 verwendet, um ausführbaren Host-Code 4670(2) und ausführbaren HCC-Geräte-Code 4682 zu erzeugen. In mindestens einer Ausführungsform entspricht die HIP/HCC-Laufzeitbibliothek 4658 der HIP-Laufzeit-API 4632. In mindestens einer Ausführungsform enthält der HCC-Header 4656, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Interoperabilitätsmechanismen für HIP und HCC. In mindestens einer Ausführungsform können der ausführbare Host-Code 4670(2) und der ausführbare HCC-Geräte-Code 4682 auf der CPU 4690 bzw. der GPU 4692 ausgeführt werden.
  • In mindestens einer Ausführungsform wird mindestens eine in den 46A-46C gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-18 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4600, des Systems 4604 oder des Systems 4606 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4600, des Systems 4604 oder des Systems 4606 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4600, des Systems 4604 oder des Systems 4606 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4600, des Systems 4604 oder des Systems 4606 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4600, des Systems 4604 oder des Systems 4606 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 47 veranschaulicht einen beispielhaften Kernel, der von dem CUDA-zu-HIP-Übersetzungswerkzeug 4620 von 46C übersetzt wurde, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform unterteilt der CUDA-Quellcode 3310 ein Gesamtproblem, das ein bestimmter Kernel lösen soll, in relativ grobe Teilprobleme, die unabhängig voneinander unter Verwendung von Thread-Blöcken gelöst werden können. In mindestens einer Ausführungsform umfasst jeder Thread-Block, ohne Beschränkung darauf, eine beliebige Anzahl von Threads. In mindestens einer Ausführungsform wird jedes Teilproblem in relativ feine Teile partitioniert, die kooperativ parallel von Threads innerhalb eines Thread-Blocks gelöst werden können. In mindestens einer Ausführungsform können Threads innerhalb eines Thread-Blocks zusammenarbeiten, indem sie Daten über einen gemeinsam genutzten Speicher gemeinsam nutzen und die Ausführung synchronisieren, um Speicherzugriffe zu koordinieren.
  • In mindestens einer Ausführungsform organisiert der CUDA-Quellcode 4610 Thread-Blöcke, die einem bestimmten Kernel zugeordnet sind, in ein eindimensionales, zweidimensionales oder dreidimensionales Gitter von Thread-Blöcken. In mindestens einer Ausführungsform beinhaltet jeder Thread-Block, ohne Beschränkung darauf, eine beliebige Anzahl von Threads, und beinhaltet ein Gitter, ohne Beschränkung darauf, eine beliebige Anzahl von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist ein Kernel eine Funktion in dem Geräte-Code, die unter Verwendung eines „_global_“-Deklarationsbezeichners definiert ist. In mindestens einer Ausführungsform werden die Dimension eines Gitters, das einen Kernel für einen bestimmten Kernelaufruf ausführt, und zugehörige Streams unter Verwendung einer CUDA-Kernel-Startsyntax 4710 spezifiziert. In mindestens einer Ausführungsform wird die CUDA-Kernel-Start-Syntax 4710 als „KernelName«<GridSize, BlockSize, SharedMemorySize, Stream>» (KernelArguments);“ spezifiziert. In mindestens einer Ausführungsform ist eine Ausführungskonfigurationssyntax ein „«<...»>“-Konstrukt, das zwischen einem Kernelnamen („KernelName“) und einer eingeklammerten Liste von Kernelargumenten („KernelArguments“) eingefügt wird. In mindestens einer Ausführungsform umfasst die CUDA-Kernel-Startsyntax 4710, ohne Beschränkung darauf, eine CUDA-Startfunktionssyntax anstelle einer Ausführungskonfigurations-syntax.
  • In mindestens einer Ausführungsform ist „GridSize“ von einem Typ dim3 und spezifiziert die Dimension und die Größe eines Gitters. In mindestens einer Ausführungsform ist der Typ dim3 eine CUDA-definierte Struktur, die, ohne Beschränkung darauf, vorzeichenlose Ganzzahlen x, y und z beinhaltet. In mindestens einer Ausführungsform ist z standardmäßig gleich eins, falls z nicht spezifiziert ist. In mindestens einer Ausführungsform ist y standardmäßig gleich eins, falls y nicht spezifiziert ist. In mindestens einer Ausführungsform ist die Anzahl von Thread-Blöcken in einem Gitter gleich dem Produkt aus GridSize.x, GridSize.y und GridSize.z. In mindestens einer Ausführungsform ist „BlockSize“ vom Typ dim3 und gibt die Dimension und die Größe jedes Thread-Blocks an. In mindestens einer Ausführungsform ist die Anzahl der Threads pro Thread-Block gleich dem Produkt aus BlockSize.x, BlockSize.y und BlockSize.z. In mindestens einer Ausführungsform erhält jeder Thread, der einen Kernel ausführt, eine eindeutige Thread-ID, die innerhalb des Kernels über eine eingebaute Variable (z.B. „threadldx“) zugänglich ist.
  • In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 4710 ist „SharedMemorySize“ ein optionales Argument, das eine Anzahl von Bytes in einem gemeinsam genutzten Speicher spezifiziert, der pro Thread-Block für einen bestimmten Kernel-Aufruf zusätzlich zu statisch zugewiesenem Speicher dynamisch zugewiesen wird. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 4710 ist „SharedMemorySize“ standardmäßig auf null gesetzt. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 4710 ist „Stream“ ein optionales Argument, das einen zugehörigen Stream angibt und standardmäßig auf null gesetzt ist, um einen Standardstream zu spezifizieren. In mindestens einer Ausführungsform ist ein Stream eine Folge von Befehlen (möglicherweise von verschiedenen Host-Threads ausgegeben), die der Reihe nach ausgeführt werden. In mindestens einer Ausführungsform können verschiedene Streams Befehle außerhalb der Reihe in Bezug aufeinander oder gleichzeitig ausführen.
  • In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4610, ohne Beschränkung darauf, eine Kerneldefinition für einen beispielhaften Kernel „MatAdd“ und eine Hauptfunktion. In mindestens einer Ausführungsform ist die Hauptfunktion ein Host-Code, der auf einem Host ausgeführt wird und, ohne Beschränkung darauf, einen Kernelaufruf enthält, der die Ausführung des Kernels „MatAdd“ auf einem Gerät bewirkt. In mindestens einer Ausführungsform und wie gezeigt, addiert der Kernel MatAdd zwei Matrizen A und B der Größe NxN, wobei N eine positive ganze Zahl ist, und speichert das Ergebnis in einer Matrix C. In mindestens einer Ausführungsform definiert die Hauptfunktion eine Variable threadsPerBlock als 16 mal 16 und eine Variable numBlocks als N/16 mal N/16. In mindestens einer Ausführungsform spezifiziert die Hauptfunktion dann den Kernelaufruf „MatAdd«<numBlocks, threadsPerBlock»(A, B, C);“. In mindestens einer Ausführungsform und gemäß der CUDA-Kernel-Start-Syntax 4710 wird der Kernel MatAdd unter Verwendung eines Gitters von Thread-Blöcken mit einer Dimension N/16 mal N/16 ausgeführt, wobei jeder Thread-Block eine Dimension von 16 mal 16 hat. In mindestens einer Ausführungsform umfasst jeder Thread-Block 256 Threads, wird ein Gitter mit genügend Blöcken erstellt, um einen Thread pro Matrixelement zu haben, und führt jeder Thread in einem solchen Gitter den Kernel MatAdd aus, um eine paarweise Addition durchzuführen.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 4620 während des Übersetzens von CUDA-Quellcode 4610 in HIP-Quellcode 4630 jeden Kernelaufruf in dem CUDA-Quellcode 4610 von der CUDA-Kernel-Start-Syntax 4710 in eine HIP-Kernel-Start-Syntax 4720 und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 4610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe. In mindestens einer Ausführungsform ist die HIP-Kernel-Start-Syntax 4720 als „hipLaunchKernelGGL(KernelName,GridSize, BlockSize, SharedMemorySize, Stream, KernelArguments);“ spezifiziert. In mindestens einer Ausführungsform hat jeder der Parameter KernelName, GridSize, BlockSize, ShareMemorySize, Stream und KernelArguments in der HIP-Kernel-Start-Syntax 4720 die gleiche Bedeutung wie in der CUDA-Kernel-Start-Syntax 4710 (hierin zuvor beschrieben). In mindestens einer Ausführungsform sind die Argumente SharedMemorySize und Stream in der HIP-Kernel-Startsyntax 4720 erforderlich und in der CUDA-Kernel-Startsyntax 4710 optional.
  • In mindestens einer Ausführungsform ist ein Teil des in 47 dargestellten HIP-Quellcodes 4630 identisch mit einem Teil des in 47 dargestellten CUDA-Quellcodes 4610, mit Ausnahme eines Kernelaufrufs, der die Ausführung des Kernels MatAdd auf einem Gerät bewirkt. In mindestens einer Ausführungsform ist der Kernel MatAdd in dem HIP-Quellcode 4630 mit demselben Deklarationsbezeichner „_global_“ definiert, mit dem der Kernel MatAdd in dem CUDA-Quellcode 4610 definiert ist. In mindestens einer Ausführungsform lautet ein Kernelaufruf in dem HIP-Quellcode 4630 „hipLaunchKernelGGL(MatAdd, numBlocks, threadsPerBlock, 0, 0, A, B, C);“, während ein entsprechender Kernelaufruf in dem CUDA-Quellcode 4610 „MatAdd«<numBlocks, threadsPerBlock»(A, B, C);“ lautet.
  • 48 veranschaulicht die nicht-CUDA-fähige GPU 4692 von 46C in größerem Detail, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird die GPU 4692 von der AMD Corporation in Santa Clara entwickelt. In mindestens einer Ausführungsform kann die GPU 4692 so konfiguriert sein, dass sie Rechenoperationen hochparallel durchführt. In mindestens einer Ausführungsform ist die GPU 4692 so konfiguriert, dass sie Grafikpipelineoperationen wie Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen ausführt, die dem Rendern eines Bildes auf einer Anzeige zugeordnet sind. In mindestens einer Ausführungsform ist die GPU 4692 so konfiguriert, dass sie Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist die GPU 4692 so konfiguriert, dass sie sowohl grafikbezogene als auch grafikfremde Operationen ausführt. In mindestens einer Ausführungsform kann die GPU 4692 so konfiguriert sein, dass sie Geräte-Code ausführt, der in dem HIP-Quellcode 4630 enthalten ist.
  • In mindestens einer Ausführungsform umfasst die GPU 4692, ohne Beschränkung darauf, eine beliebige Anzahl von programmierbaren Verarbeitungseinheiten 4820, einen Befehlsprozessor 4810, einen L2-Cache 4822, Speichercontroller 4870, DMA-Engines 4880(1), Systemspeichercontroller 4882, DMA-Engines 4880(2) und GPU-Controller 4884. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 4820, ohne Beschränkung darauf, einen Arbeitslastverwalter 4830 und eine beliebige Anzahl von Recheneinheiten 4840. In mindestens einer Ausführungsform liest der Befehlsprozessor 4810 Befehle aus einer oder mehreren Befehlswarteschlangen (nicht dargestellt) und verteilt die Befehle an Arbeitslastverwalter 4830. In mindestens einer Ausführungsform verteilt der zugehörige Arbeitslastverwalter 4830 für jede programmierbare Verarbeitungseinheit 4820 Arbeit an in der programmierbaren Verarbeitungseinheit 4820 enthaltene Recheneinheiten 4840. In mindestens einer Ausführungsform kann jede Recheneinheit 4840 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 4840 ausgeführt. In mindestens einer Ausführungsform ist eine Arbeitsgruppe ein Thread-Block.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 4840, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 4850 und einen gemeinsamen Speicher 4860. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 4850 eine SIMD-Architektur und ist zur parallelen Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform beinhaltet jede SIMD-Einheit 4850, ohne Beschränkung darauf, eine Vektor-ALU 4852 und eine Vektorregisterdatei 4854. In mindestens einer Ausführungsform führt jede SIMD-Einheit 4850 einen anderen Warp aus. In mindestens einer Ausführungsform ist ein Warp eine Gruppe von Threads (z.B. 16 Threads), wobei jeder Thread in dem Warp zu einem einzelnen Thread-Block gehört und so konfiguriert ist, dass er einen anderen Datensatz auf der Grundlage eines einzelnen Satzes von Anweisungen verarbeitet. In mindestens einer Ausführungsform kann Prädikation verwendet werden, um einen oder mehrere Threads in einem Warp zu deaktivieren. In mindestens einer Ausführungsform ist eine Spur ein Thread. In mindestens einer Ausführungsform ist ein Arbeitselement bzw. Workitem ein Thread. In mindestens einer Ausführungsform ist eine Wellenfront ein Thread. In mindestens einer Ausführungsform können verschiedene Wellenfronten in einem Thread-Block miteinander synchronisieren und über den gemeinsam genutzten Speicher 4860 kommunizieren.
  • In mindestens einer Ausführungsform werden programmierbare Verarbeitungseinheiten 4820 als „Shader-Engines“ bezeichnet. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 4820, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware zusätzlich zu Recheneinheiten 4840. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 4820, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich null) von Geometrieprozessoren, eine beliebige Anzahl (einschließlich null) von Rasterisierern, eine beliebige Anzahl (einschließlich null) von Render-Backends, einen Arbeitslastverwalter 4830 und eine beliebige Anzahl von Recheneinheiten 4840.
  • In mindestens einer Ausführungsform teilen sich die Recheneinheiten 4840 einen L2-Cache 4822. In mindestens einer Ausführungsform ist der L2-Cache 4822 partitioniert. In mindestens einer Ausführungsform ist ein GPU-Speicher 4890 für alle Recheneinheiten 4840 in der GPU 4692 zugänglich. In mindestens einer Ausführungsform erleichtern Speichercontroller 4870 und Systemspeichercontroller 4882 die Datenübertragung zwischen der GPU 4692 und einem Host, und ermöglichen die DMA-Engines 4880(1) asynchrone Speicherübertragungen zwischen der GPU 4692 und einem solchen Host. In mindestens einer Ausführungsform erleichtern Speichercontroller 4870 und GPU-Controller 4884 Datenübertragungen zwischen der GPU 4692 und anderen GPUs 4692, und ermöglichen DMA-Engines 4880(2) asynchrone Speicherübertragungen zwischen der GPU 4692 und anderen GPUs 4692.
  • In mindestens einer Ausführungsform beinhaltet die GPU 4692, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Systemverbindungen, die Daten- und Steuerübertragungen über eine beliebige Anzahl und Art von direkt oder indirekt verbundenen Komponenten, die intern oder extern zur GPU 4692 sein können, hinweg erleichtern. In mindestens einer Ausführungsform beinhaltet die GPU 4692, ohne Beschränkung darauf, eine beliebige Anzahl und Art von E/A-Schnittstellen (z.B. PCIe), die mit einer beliebigen Anzahl und Art von Peripheriegeräten gekoppelt sind. In mindestens einer Ausführungsform kann die GPU 4692, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von Display-Engines und eine beliebige Anzahl (einschließlich Null) von Multimedia-Engines enthalten. In mindestens einer Ausführungsform implementiert die GPU 4692 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und eine beliebige Art von Speichercontrollern (z.B. Speichercontroller 4870 und Systemspeichercontroller 4882) und Speichervorrichtungen (z.B. gemeinsam genutzte Speicher 4860) umfasst, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die GPU 4692 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Cache 4822) umfasst, die jeweils für eine beliebige Anzahl von Komponenten (z.B. SIMD-Einheiten 4850, Recheneinheiten 4840 und programmierbare Verarbeitungseinheiten 4820) reserviert oder von diesen gemeinsam genutzt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 48 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens eine der GPU 4692 oder programmierbaren Verarbeitungseinheiten 4820 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens eine der GPU 4692 oder programmierbaren Verarbeitungseinheiten 4820 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens eine der GPU 4692 oder programmierbaren Verarbeitungseinheiten 4820 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens eine der GPU 4692 oder programmierbaren Verarbeitungseinheiten 4820 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens eine der GPU 4692 oder programmierbaren Verarbeitungseinheiten 4820 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 49 veranschaulicht, wie Threads eines beispielhaften CUDA-Grids 4920 gemäß mindestens einer Ausführungsform auf verschiedene Recheneinheiten 4840 von 48 abgebildet werden. In mindestens einer Ausführungsform und nur zu Erläuterungszwecken hat das Raster 4920 eine Gittergröße bzw. GridSize von BX mal BY mal 1 und eine Blockgröße bzw. BlockSize von TX mal TY mal 1. In mindestens einer Ausführungsform umfasst das Raster 4920 daher, ohne Beschränkung darauf, (BX * BY) Thread-Blöcke 4930 und umfasst jeder Thread-Block 4930, ohne Beschränkung darauf, (TX * TY) Threads 4940. Die Threads 4940 sind in 49 als verschnörkelte Pfeile dargestellt.
  • In mindestens einer Ausführungsform wird das Raster 4920 auf die programmierbare Verarbeitungseinheit 4820(1) abgebildet, die, ohne Beschränkung darauf, die Recheneinheiten 4840(1)-4840(C) umfasst. In mindestens einer Ausführungsform und wie gezeigt werden (BJ * BY) Thread-Blöcke 4930 auf die Recheneinheit 4840(1) abgebildet, und werden die restlichen Thread-Blöcke 4930 auf die Recheneinheit 4840(2) abgebildet. In mindestens einer Ausführungsform kann jeder Thread-Block 4930, ohne Beschränkung darauf, eine beliebige Anzahl von Warps enthalten, und ist jeder Warp einer anderen SIMD-Einheit 4850 von 48 zugeordnet.
  • In mindestens einer Ausführungsform können Warps in einem gegebenen Thread-Block 4930 zusammen synchronisieren und über gemeinsam genutzten Speicher 4860 in der zugeordneten Recheneinheit 4840 kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 4930(BJ,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 4860(1) kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 4930(BJ+1,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 4860(2) kommunizieren.
  • In mindestens einer Ausführungsform wird mindestens eine in 49 gezeigte oder beschriebene Komponente verwendet, um in Verbindung mit 1-18 beschriebene Techniken und/oder Funktionen zu implementieren. In mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grid 4920 verwendet, um eine asynchrone Zuweisung von Speicher und/oder eine asynchrone Freigabe von Speicher durchzuführen. In mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grid 4920 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze asynchron an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grid 4920 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrerer Speicherplätze an einen oder mehrere Prozessoren zugewiesen werden. In mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grid 4920 verwendet, um eine API auszuführen, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden. In mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grid 4920 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Computersystem 200, das beispielhafte Computersystem 300, das beispielhafte Computersystem 400, den Beispielprozess 500, den Beispielprozess 600, den Beispielprozess 700, den Beispielprozess 800, den Beispieldatenfluss 900, den beispielhaften ersten Teil eines Datenflusses 1000, den beispielhaften zweiten Teil eines Datenflusses 1100, den beispielhaften dritten Teil eines Datenflusses 1200, den Beispielprozess 1300, das beispielhafte Computersystem 1400, das beispielhafte Computersystem 1500, den Beispielprozess 1600, das beispielhafte Computersystem 1700 und/oder den Beispielprozess 1800 beschrieben ist.
  • 50 veranschaulicht die Migration von bestehendem CUDA-Code zu Data Parallel C++-Code, gemäß mindestens einer Ausführungsform. Data Parallel C++ (DPC++) kann sich auf eine offene, auf Standards basierende Alternative zu proprietären Sprachen mit nur einer Architektur beziehen, die es Entwicklern ermöglicht, Code für verschiedene Hardwareziele (CPUs und Beschleuniger wie GPUs und FPGAs) wiederzuverwenden und auch eine benutzerdefinierte Abstimmung für einen bestimmten Beschleuniger vorzunehmen. DPC++ verwendet ähnliche und/oder identische C- und C++-Konstrukte in Übereinstimmung mit ISO C++, mit denen Entwickler vertraut sein dürften. DPC++ beinhaltet den Standard SYCL von The Khronos Group zur Unterstützung von Datenparallelität und heterogener Programmierung. SYCL bezieht sich auf eine plattformübergreifende Abstraktionsschicht, die auf den zugrundeliegenden Konzepten, der Portabilität und der Effizienz von OpenCL aufbaut und es ermöglicht, Code für heterogene Prozessoren in einem „Single-Source“-Stil mit Standard-C++ zu schreiben. SYCL kann eine Single-Source-Entwicklung ermöglichen, bei der C++-Vorlagenfunktionen sowohl Host- als auch Gerätecode enthalten können, um komplexe Algorithmen zu konstruieren, die die OpenCL-Beschleunigung nutzen, und diese dann in ihrem gesamten Quellcode für verschiedene Datentypen wiederverwenden.
  • In mindestens einer Ausführungsform wird ein DPC++-Compiler verwendet, um DPC++-Quellcode zu kompilieren, der auf verschiedenen Hardware-Zielen eingesetzt werden kann. In mindestens einer Ausführungsform wird ein DPC++-Compiler verwendet, um DPC++-Anwendungen zu erzeugen, die auf verschiedenen Hardwarezielen eingesetzt werden können, und kann ein DPC++-Kompatibilitätswerkzeug verwendet werden, um CUDA-Anwendungen in ein Multiplattformprogramm in DPC++ zu migrieren. In mindestens einer Ausführungsform umfasst ein DPC++-Basis-Toolkit einen DPC++-Compiler zum Einsatz von Anwendungen auf verschiedenen Hardwarezielen, eine DPC++-Bibliothek zur Steigerung der Produktivität und Leistung auf CPUs, GPUs und FPGAs, ein DPC++-Kompatibilitätstool zur Migration von CUDA-Anwendungen in Multiplattform-Anwendungen und eine beliebige geeignete Kombination davon.
  • In mindestens einer Ausführungsform wird ein DPC++-Programmiermodell verwendet, um einen oder mehrere Aspekte im Zusammenhang mit der Programmierung von CPUs und Beschleunigern zu vereinfachen, indem moderne C++-Funktionen verwendet werden, um Parallelität mit einer Programmiersprache namens Data Parallel C++ auszudrücken. Die DPC++-Programmiersprache kann zur Code-Wiederverwendung für Hosts (z.B. eine CPU) und Beschleuniger (z.B. eine GPU oder FPGA) unter Verwendung einer einzigen Quellsprache verwendet werden, wobei Ausführungs- und Speicherabhängigkeiten klar kommuniziert werden. Mappings innerhalb des DPC++-Codes können verwendet werden, um eine Anwendung auf einer Hardware oder einem Satz von Hardwaregeräten laufen zu lassen, die eine Arbeitslast am besten beschleunigen. Ein Host kann verfügbar sein, um die Entwicklung und das Debugging von Gerätecode zu vereinfachen, selbst auf Plattformen, die keinen Beschleuniger zur Verfügung haben.
  • In mindestens einer Ausführungsform wird der CUDA-Quellcode 5000 als Eingabe für ein DPC++-Kompatibilitätstool 5002 bereitgestellt, um menschenlesbares DPC++ 5004 zu erzeugen. In mindestens einer Ausführungsform enthält der für den Menschen lesbare DPC++ 5004 Inline-Kommentare, die vom DPC++-Kompatibilitätstool 5002 generiert werden und den Entwickler anleiten, wie und/oder wo er den DPC++-Code modifizieren muss, um die Codierung und Abstimmung auf die gewünschte Leistung 5006 abzuschließen und dadurch den DPC++-Quellcode 5008 zu erzeugen.
  • In mindestens einer Ausführungsform ist oder enthält der CUDA-Quellcode 5000 eine Sammlung von menschenlesbarem Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Quellcode 5000 ein von Menschen lesbarer Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist eine CUDA-Programmiersprache eine Erweiterung der Programmiersprache C++, die ohne Beschränkung Mechanismen zur Definition von Gerätecode und zur Unterscheidung zwischen Gerätecode und Hostcode enthält. In mindestens einer Ausführungsform ist der Gerätecode ein Quellcode, der nach der Kompilierung auf einem Gerät (z.B. einer GPU oder einem FPGA) ausführbar ist und mehrere parallelisierbare Arbeitsabläufe bzw. Workflows enthalten kann, die auf einem oder mehreren Prozessorkernen eines Geräts ausgeführt werden können. In mindestens einer Ausführungsform kann ein Gerät ein Prozessor sein, der für die parallele Befehlsverarbeitung optimiert ist, z.B. eine CUDA-fähige GPU, GPU oder eine andere GPGPU usw. In mindestens einer Ausführungsform ist der Hostcode ein Quellcode, der nach der Kompilierung auf einem Host ausführbar ist. In mindestens einer Ausführungsform können ein Teil oder der gesamte Hostcode und Gerätecode parallel auf einer CPU und einer GPU/FPGA ausgeführt werden. In mindestens einer Ausführungsform ist ein Host ein Prozessor, der für die sequenzielle Anweisungsverarbeitung optimiert ist, wie beispielsweise eine CPU. Der in Verbindung mit 50 beschriebene CUDA-Quellcode 5000 kann mit den an anderer Stelle in diesem Dokument beschriebenen Quellcodes übereinstimmen.
  • In mindestens einer Ausführungsform bezieht sich das DPC++-Kompatibilitätswerkzeug 5002 auf ein ausführbares Werkzeug, ein Programm, eine Anwendung oder eine andere geeignete Art von Werkzeug, das zur Erleichterung der Migration von CUDA-Quellcode 5000 zu DPC++-Quellcode 5008 verwendet wird. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 5002 ein befehlszeilenbasiertes Code-Migrationswerkzeug, das als Teil eines DPC++-Toolkits verfügbar ist und zur Portierung bestehender CUDA-Quellen auf DPC++ verwendet wird. In mindestens einer Ausführungsform konvertiert das DPC++-Kompatibilitätswerkzeug 5002 einen Teil oder den gesamten Quellcode einer CUDA-Anwendung von CUDA nach DPC++ und erzeugt eine resultierende Datei, die zumindest teilweise in DPC++ geschrieben ist und als menschenlesbares DPC++ 5004 bezeichnet wird. In mindestens einer Ausführungsform enthält das menschenlesbare DPC++ 5004 Kommentare, die vom DPC++-Kompatibilitätswerkzeug 5002 erzeugt werden, um anzuzeigen, wo ein Benutzereingriff erforderlich sein kann. In mindestens einer Ausführungsform ist ein Benutzereingriff erforderlich, wenn der CUDA-Quellcode 5000 eine CUDA-API aufruft, für die es keine analoge DPC++-API gibt; andere Beispiele, bei denen ein Benutzereingriff erforderlich ist, werden später ausführlicher behandelt.
  • In mindestens einer Ausführungsform umfasst ein Arbeitsablauf zum Migrieren von CUDA-Quellcode 5000 (z.B. einer Anwendung oder eines Teils davon) das Erstellen einer oder mehrerer Kompilierungsdatenbankdateien; das Migrieren von CUDA zu DPC++ unter Verwendung eines DPC++-Kompatibilitätswerkzeugs 5002; das Abschließen der Migration und das Überprüfen der Korrektheit, wodurch DPC++-Quellcode 5008 erzeugt wird; und das Kompilieren von DPC++-Quellcode 5008 mit einem DPC++-Compiler zum Erzeugen einer DPC++-Anwendung. In mindestens einer Ausführungsform stellt ein Kompatibilitätswerkzeug ein Dienstprogramm bereit, das Befehle abfängt, die bei der Ausführung von Makefile verwendet werden, und sie in einer Kompilierungsdatenbankdatei speichert. In mindestens einer Ausführungsform wird eine Datei im JSON-Format gespeichert. In mindestens einer Ausführungsform wandelt ein abgefangener Befehl den Makefile-Befehl in einen DPC-Kompatibilitätsbefehl um.
  • In mindestens einer Ausführungsform ist intercept-build ein Hilfsskript, das einen Build-Prozess abfängt, um Kompilierungsoptionen, Makrodefinitionen und Include-Pfade zu erfassen, und diese Daten in eine Kompilierungsdatenbankdatei schreibt. In mindestens einer Ausführungsform handelt es sich bei der Kompilierungsdatenbankdatei um eine JSON-Datei. In mindestens einer Ausführungsform analysiert das DPC++-Kompatibilitätswerkzeug 5002 eine Kompilierungsdatenbank und wendet Optionen an, wenn Eingabequellen migriert werden. In mindestens einer Ausführungsform ist die Verwendung von intercept-build optional, wird aber für Make- oder CMake-basierte Umgebungen dringend empfohlen. In mindestens einer Ausführungsform enthält eine Migrationsdatenbank Befehle, Verzeichnisse und Dateien: Der Befehl kann die erforderlichen Kompilierungsflags enthalten; das Verzeichnis kann Pfade zu Header-Dateien enthalten; die Datei kann Pfade zu CUDA-Dateien enthalten.
  • In mindestens einer Ausführungsform migriert das DPC++-Kompatibilitätswerkzeug 5002 CUDA-Code (z.B. Anwendungen), der in CUDA geschrieben wurde, nach DPC++, indem es, wo immer möglich, DPC++ generiert. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätstool 5002 als Teil eines Toolkits erhältlich. In mindestens einer Ausführungsform umfasst ein DPC++-Toolkit ein Intercept-Build-Tool. In mindestens einer Ausführungsform erstellt ein Intercept-Build-Tool eine Kompilierungsdatenbank, die Kompilierungsbefehle zur Migration von CUDA-Dateien erfasst. In mindestens einer Ausführungsform wird eine von einem Intercept-Built-Werkzeug erzeugte Kompilierungsdatenbank vom DPC++-Kompatibilitätswerkzeug 5002 verwendet, um CUDA-Code nach DPC++ zu migrieren. In mindestens einer Ausführungsform werden Nicht-CUDA-C++-Code und -Dateien unverändert migriert. In mindestens einer Ausführungsform generiert das DPC++-Kompatibilitätstool 5002 menschenlesbaren DPC++ 5004, bei dem es sich um DPC++-Code handeln kann, der in der vom DPC++-Kompatibilitätstool 5002 generierten Form nicht vom DPC++-Compiler kompiliert werden kann und zusätzliches Ausloten erfordert, um Teile des Codes, die nicht korrekt migriert wurden, zu verifizieren, und der manuelle Eingriffe, beispielsweise durch einen Entwickler, erfordern kann. In mindestens einer Ausführungsform bietet das DPC++-Kompatibilitätstool 5002 in den Code eingebettete Hinweise oder Werkzeuge, die dem Entwickler helfen, zusätzlichen Code, der nicht automatisch migriert werden konnte, manuell zu migrieren. In mindestens einer Ausführungsform ist die Migration ein einmaliger Vorgang für eine Quelldatei, ein Projekt oder eine Anwendung.
  • In mindestens einer Ausführungsform ist das DPC++ Kompatibilitätswerkzeug 50002 in der Lage, alle Teile des CUDA-Codes erfolgreich nach DPC++ zu migrieren, und es kann lediglich ein optionaler Schritt zur manuellen Überprüfung und Abstimmung der Leistung des erzeugten DPC++ Quellcodes erfolgen. In mindestens einer Ausführungsform erzeugt das DPC++-Kompatibilitätswerkzeug 5002 direkt DPC++-Quellcode 5008, der von einem DPC++-Compiler kompiliert wird, ohne dass ein menschliches Eingreifen erforderlich ist oder genutzt wird, um den vom DPC++-Kompatibilitätswerkzeug 5002 erzeugten DPC++-Code zu ändern. In mindestens einer Ausführungsform erzeugt das DPC++-Kompatibilitätswerkzeug kompilierbaren DPC++-Code, der optional von einem Entwickler auf Leistung, Lesbarkeit, Wartbarkeit, andere verschiedene Überlegungen oder eine beliebige Kombination davon abgestimmt werden kann.
  • In mindestens einer Ausführungsform werden eine oder mehrere CUDA-Quelldateien zumindest teilweise mit dem DPC++-Kompatibilitätswerkzeug 5002 in DPC++-Quelldateien migriert. In mindestens einer Ausführungsform enthält der CUDA-Quellcode eine oder mehrere Header-Dateien, die auch CUDA-Header-Dateien enthalten können. In mindestens einer Ausführungsform enthält eine CUDA-Quelldatei eine <cuda.h>-Header-Datei und eine <stdio.h>-Header-Datei, die zum Drucken von Text verwendet werden kann. In mindestens einer Ausführungsform kann ein Teil einer Vektoradditionskern-CUDA-Quelldatei geschrieben werden als oder mit Bezug zu:
      #include <cuda.h>
      #include <stdio.h>
      #define VECTOR_SIZE 256 
       [] global_void VectorAddKernel(float* A, float* B, float* C)
       {
        A[threadldx.x] = threadldx.x + 1.0f;
        B[threadldx.x] = threadldx.x + 1.0f;
        C[threadldx.x] = A[threadldx.x] + B[threadldx.x]; 
       }


       int main() 
       {
         float *d_A, *d_B, *d_C;

        cudaMalloc(& d_A, VECTOR_SIZE*sizeof(float));
        cudaMalloc(& d_B, VECTOR_SIZE*sizeof(float));
        cudaMalloc(& d_C, VECTOR_SIZE*sizeof(float));


        VectorAddKernel«<1, VECTOR_SIZE» >(d_A, d_B, d_C);


        float Result[VECTOR_SIZE] = { };
        cudaMemcpy(Result, d_C, VECTOR_SIZE*sizeof(float),
       cudaMemcpyDeviceToHost);


        cudaFree(d_A);
        cudaFree(d_B);
        cudaFree(d_C);


        for (int i=0; i<VECTOR_SIZE; i++ {
          if (i % 16 == 0) {
              printf("\n");
          }
          printf("%f ", Result[i]); 
        }


        return 0; 
       }
  • In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei analysiert das DPC++-Kompatibilitätswerkzeug 5002 einen CUDA-Quellcode und ersetzt die Header-Dateien durch geeignete DPC++- und SYCL-Header-Dateien. In mindestens einer Ausführungsform enthalten die DPC++-Header-Dateien Hilfsdeklarationen. In CUDA gibt es das Konzept einer Thread-ID, und dementsprechend gibt es in DPC++ oder SYCL für jedes Element einen lokalen Bezeichner.
  • In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei gibt es zwei Vektoren A und B, die initialisiert werden, und wird ein Vektoradditionsergebnis als Teil von VectorAddKernel() in den Vektor C gestellt. In mindestens einer Ausführungsform konvertiert das DPC++-Kompatibilitätswerkzeug 5002 CUDA-Thread-IDs, die zur Indexierung von Arbeitselementen verwendet werden, in eine SYCL-Standardadressierung für Arbeitselemente über eine lokale ID als Teil der Migration von CUDA-Code in DPC++-Code. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätswerkzeug 5002 erzeugte DPC++-Code optimiert werden, z.B. durch Verringerung der Dimensionalität eines nd_item, wodurch die Speicher- und/oder Prozessorauslastung erhöht wird.
  • In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei wird die Speicherzuweisung migriert. In mindestens einer Ausführungsform wird cudaMalloc() zu einem einheitlichen SYCL-Aufruf malloc_device() mit gemeinsamem Speicher migriert, dem ein Gerät und ein Kontext übergeben wird, wobei SYCL-Konzepte wie Plattform, Gerät, Kontext und Warteschlange verwendet werden. In mindestens einer Ausführungsform kann eine SYCL-Plattform mehrere Geräte haben (z.B. Host- und GPU-Geräte); kann ein Gerät mehrere Warteschlangen haben, an die Aufträge übermittelt werden können; kann jedes Gerät einen Kontext haben; und kann ein Kontext mehrere Geräte haben und gemeinsam genutzte Speicherobjekte verwalten.
  • In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei ruft eine main()-Funktion VectorAddKernel() auf, um zwei Vektoren A und B zu addieren und das Ergebnis in Vektor C zu speichern. In mindestens einer Ausführungsform wird der CUDA-Code zum Aufrufen von VectorAddKernel() durch DPC++-Code ersetzt, um einen Kernel zur Ausführung an eine Befehlswarteschlange zu übergeben. In mindestens einer Ausführungsform übergibt ein Befehlsgruppen-Handler cgh Daten, Synchronisierung und Berechnungen, die an die Warteschlange übermittelt werden, wird parallel_for für eine Anzahl globaler Elemente und eine Anzahl von Arbeitselementen in dieser Arbeitsgruppe aufgerufen, in der VectorAddKernel() aufgerufen wird.
  • In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei werden CUDA-Aufrufe zum Kopieren von Gerätespeicher und zum anschließenden Freigeben von Speicher für die Vektoren A, B und C in entsprechende DPC++-Aufrufe migriert. In mindestens einer Ausführungsform wird der C++-Code (z.B. der Standard-ISO-C++-Code zum Drucken eines Vektors von Gleitkommavariablen) unverändert migriert, ohne vom DPC++-Kompatibilitätswerkzeug 5002 geändert zu werden. In mindestens einer Ausführungsform modifiziert das DPC++-Kompatibilitätswerkzeug 5002 die CUDA-APIs für die Speichereinrichtung und/oder Host-Aufrufe, um den Kernel auf dem Beschleunigungsgerät auszuführen. In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei wird ein entsprechendes, für den Menschen lesbares DPC++ 5004 (das z.B. kompiliert werden kann) geschrieben als oder mit Bezug zu:
  •       #include <CL/sycl.hpp>
          #include <dpct/dpct.hpp>
          #define VECTOR_SIZE 256
    
    
          void VectorAddKernel(float* A, float* B, float* C,
                                  {sycl::nd_item<3> item_ct1)
          {
            A[item_ct1.get_local_id(2)] = item_ct1.get_local_id(2) + 1.0f;
            B[item ct1.get_local_id(2)] = item_ct1.get_local_id(2) + 1.0f;
            C[item_ct1.get_local_id(2)] =
                  A[item_ct1.get_local_id(2)] + B[item_ct1 ,get_local_id(2)]; 
    
           }
    
    
           int main() 
           {
            float *d_A, *d_B, *d_C;
    
    
            d_A = (float *)sycl::malloc device(VECTOR_SIZE * sizeof(float),
              dpct::get_current_device(),
              dpct::get_default_context());
            d_B = (float *)sycl::malloc device(VECTOR_SIZE * sizeof(float),
              dpct::get_current_device(),
              dpct::get_default_context());
            d_C = (float *)sycl::malloc device(VECTOR_SIZE * sizeof(float),
              dpct::get_current_device(),
              dpct::get_default_context());
    
    
            dpct::get_default_queue_wait().submit([&](sycl::handler & cgh) {
              cgh.parallel_for(
                sycl::nd_range<3>(sycl::range<3>(1, 1, 1) *
                                               sycl::range<3>(1, 1, VECTOR_SIZE) *
                                               sycl::range<3>(1, 1, VECTOR_SIZE)),
                 [=](sycl::nd_items<3> item_ct1) {
                  VectorAddKernel(d_A, d_B, d_C, item_ct1);
                 });
            });
    
    
            float Result [VECTOR_SIZE] = { };
              dpct::get_default_queue_wait()
                .memcpy(Result, d_C, VECTOR_SIZE * sizeof(float))
                .wait();
    
    
            sycl::free(d_A, dpct::get_default_context());
            sycl::free(d_B, dpct::get_default_context()); 
    
            sycl::free(d_C, dpct::get_default_context());
    
    
            for (int i=0; i<VECTOR_SIZE; i++ {
              if (i % 16 == 0) {
                  printf("\n");
              }
              printf("%f ", Result [i]);
            }
    
    
           return 0;
         }
  • In mindestens einer Ausführungsform bezieht sich das für den Menschen lesbare DPC++ 5004 auf die vom DPC++-Kompatibilitätswerkzeug 5002 erzeugte Ausgabe und kann auf die eine oder andere Weise optimiert werden. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätstool 5002 erzeugte, für den Menschen lesbare DPC++ 5004 von einem Entwickler nach der Migration manuell bearbeitet werden, um ihn wartbarer zu machen, die Leistung zu verbessern oder andere Aspekte zu berücksichtigen. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätstool 50002 erzeugte DPC++-Code, wie z.B. DPC++ disclosed, durch Entfernen der wiederholten Aufrufe von get_current_device() und/oder get_default_context() für jeden malloc_device()-Aufruf optimiert werden. In mindestens einer Ausführungsform verwendet der oben erzeugte DPC++-Code einen dreidimensionalen nd_range, der so umgestaltet werden kann, dass er nur eine einzige Dimension verwendet, wodurch die Speichernutzung reduziert wird. In mindestens einer Ausführungsform kann ein Entwickler den vom DPC++-Kompatibilitätstool 5002 erzeugten DPC++-Code manuell bearbeiten und die Verwendung von gemeinsam genutztem Speicher durch Accessoren ersetzen. In mindestens einer Ausführungsform verfügt das DPC++-Kompatibilitätswerkzeug 5002 über eine Option zum Ändern der Art und Weise, wie es CUDA-Code in DPC++-Code migriert. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 5002 sehr ausführlich, da es eine allgemeine Vorlage für die Migration von CUDA-Code in DPC++-Code verwendet, die für eine große Anzahl von Fällen funktioniert.
  • In mindestens einer Ausführungsform bezieht sich das für den Menschen lesbare DPC++ 5004 auf die vom DPC++ Kompatibilitätstool 5002 erzeugte Ausgabe und kann auf die eine oder andere Weise optimiert werden. In mindestens einer Ausführungsform kann das vom DPC++-Kompatibilitätstool 5002 erzeugte, für den Menschen lesbare DPC++ 5004 nach der Migration von einem Entwickler manuell bearbeitet werden, um es wartbarer zu machen, die Leistung zu verbessern oder andere Aspekte zu berücksichtigen. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätswerkzeug 50002 erzeugte DPC++-Code, wie z.B. DPC++ disclosed, durch Entfernen der wiederholten Aufrufe von get_current_device() und/oder get_default_context() für jeden malloc_device()-Aufruf optimiert werden. In mindestens einer Ausführungsform verwendet der oben erzeugte DPC++-Code einen dreidimensionalen nd_range, der so umgestaltet werden kann, dass er nur eine einzige Dimension verwendet, wodurch die Speichernutzung reduziert wird. In mindestens einer Ausführungsform kann ein Entwickler den vom DPC++-Kompatibilitätstool 5002 erzeugten DPC++-Code manuell bearbeiten und die Verwendung von gemeinsam genutztem Speicher durch Accessoren ersetzen. In mindestens einer Ausführungsform verfügt das DPC++-Kompatibilitätswerkzeug 5002 über eine Option zum Ändern der Art und Weise, wie es CUDA-Code in DPC++-Code migriert. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 5002 sehr ausführlich, da es eine allgemeine Vorlage für die Migration von CUDA-Code in DPC++-Code verwendet, die für eine große Anzahl von Fällen funktioniert.
  • In mindestens einer Ausführungsform umfasst ein Arbeitsablauf für die Migration von CUDA zu DPC++ folgende Schritte: Vorbereitung der Migration mithilfe des Intercept-Build-Skripts; Durchführung der Migration von CUDA-Projekten zu DPC++ mithilfe des DPC++-Kompatibilitätswerkzeugs 5002; manuelle Überprüfung und Bearbeitung der migrierten Quelldateien auf Vollständigkeit und Korrektheit; und Kompilierung des endgültigen DPC++-Codes zur Erzeugung einer DPC++-Anwendung. In mindestens einer Ausführungsform kann eine manuelle Überprüfung des DPC++-Quellcodes in einem oder mehreren Szenarien erforderlich sein, einschließlich, aber nicht beschränkt auf:
    • migrierte API gibt keinen Fehlercode zurück (CUDA-Code kann einen Fehlercode zurückgeben, der dann von der Anwendung verwendet werden kann, aber SYCL verwendet Ausnahmen, um Fehler zu melden, und verwendet daher keine Fehlercodes, um Fehler aufzudecken); CUDA-Compute-Capability-abhängige Logik wird von DPC++ nicht unterstützt; Anweisung konnte nicht entfernt werden. In mindestens einer Ausführungsform können Szenarien, in denen DPC++-Code ein manuelles Eingreifen erfordert, ohne Beschränkung Folgendes umfassen: Ersetzen der Fehlercodelogik durch (*,0)-Code oder Auskommentieren; keine äquivalente DPC++-API verfügbar; CUDA-Compute-Capability-abhängige Logik; hardwareabhängige API (clock()); fehlende Funktionen, nicht unterstützte API; Logik zur Messung der Ausführungszeit; Umgang mit eingebauten Vektortypkonflikten; Migration der cuBLAS-API; und mehr.
  • In mindestens einer Ausführungsform verwenden eine oder mehrere der hierin beschriebenen Techniken ein oneAPI-Programmiermodell. In mindestens einer Ausführungsform bezieht sich ein oneAPI-Programmiermodell auf ein Programmiermodell für die Interaktion mit verschiedenen Compute Accelerator-Architekturen. In mindestens einer Ausführungsform bezieht sich oneAPI auf eine Anwendungsprogrammierschnittstelle (API), die für die Interaktion mit verschiedenen Compute Accelerator-Architekturen entwickelt wurde. In mindestens einer Ausführungsform verwendet ein oneAPI-Programmiermodell eine DPC++-Programmiersprache. In mindestens einer Ausführungsform bezieht sich eine DPC++-Programmiersprache auf eine Hochsprache für die Produktivität der datenparallelen Programmierung. In mindestens einer Ausführungsform basiert eine DPC++-Programmiersprache zumindest teilweise auf den Programmiersprachen C und/oder C++. In mindestens einer Ausführungsform ist ein oneAPI-Programmiermodell ein Programmiermodell, wie es von der Intel Corporation in Santa Clara, CA, entwickelt wurde.
  • In mindestens einer Ausführungsform wird eineAPI und/oder eineAPI-Programmiermodell verwendet, um mit verschiedenen Beschleuniger-, GPU-, Prozessor- und/oder Variationen davon-Architekturen zu interagieren. In mindestens einer Ausführungsform umfasst oneAPI eine Reihe von Bibliotheken, die verschiedene Funktionalitäten implementieren. In mindestens einer Ausführungsform umfasst oneAPI mindestens eine oneAPI-DPC++-Bibliothek, eine oneAPI-Mathekernel-Bibliothek, eine oneAPI-Datenanalysebibliothek, eine oneAPI-Bibliothek für tiefe neuronale Netze, eine oneAPI-Bibliothek für kollektive Kommunikation, eine oneAPI-Bibliothek für Threading-Bausteine, eine oneAPI-Bibliothek für Videoverarbeitung und/oder Variationen davon.
  • In mindestens einer Ausführungsform ist eine oneAPI-DPC++-Bibliothek, auch oneDPL genannt, eine Bibliothek, die Algorithmen und Funktionen zur Beschleunigung der DPC++-Kernelprogrammierung implementiert. In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere Funktionen der Standard Template Library (STL). In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere parallele STL-Funktionen. In mindestens einer Ausführungsform bietet oneDPL einen Satz von Bibliotheksklassen und -funktionen wie parallele Algorithmen, Iteratoren, Funktionsobjektklassen, bereichsbasierte API und/oder Variationen davon. In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere Klassen und/oder Funktionen einer C++-Standardbibliothek. In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere Zufallszahlengeneratorfunktionen.
  • In mindestens einer Ausführungsform ist eine oneAPI-Mathe-Kernel-Bibliothek, die auch als oneMKL bezeichnet wird, eine Bibliothek, die verschiedene optimierte und parallelisierte Routinen für verschiedene mathematische Funktionen und/oder Operationen implementiert. In mindestens einer Ausführungsform implementiert oneMKL ein oder mehrere Basic Linear Algebra Subprograms (BLAS) und/oder Linear Algebra Package (LAPACK) Dense Linear Algebra Routines. In mindestens einer Ausführungsform implementiert oneMKL eine oder mehrere dünn besetzte BLAS-Routinen für lineare Algebra. In mindestens einer Ausführungsform implementiert oneMKL einen oder mehrere Zufallszahlengeneratoren (RNGs). In mindestens einer Ausführungsform implementiert oneMKL eine oder mehrere Vektormathematik (VM)-Routinen für mathematische Operationen mit Vektoren. In mindestens einer Ausführungsform implementiert oneMKL eine oder mehrere Fast-Fourier-Transformationsfunktionen (FFT).
  • In mindestens einer Ausführungsform ist eine oneAPI-Datenanalysebibliothek, die auch als oneDAL bezeichnet wird, eine Bibliothek, die verschiedene Datenanalyseanwendungen und verteilte Berechnungen implementiert. In mindestens einer Ausführungsform implementiert oneDAL verschiedene Algorithmen für die Vorverarbeitung, Transformation, Analyse, Modellierung, Validierung und Entscheidungsfindung für die Datenanalyse in Stapel-, Online- und verteilten Verarbeitungsmodi der Berechnung. In mindestens einer Ausführungsform implementiert oneDAL verschiedene C++ und/oder Java APIs und verschiedene Konnektoren zu einer oder mehreren Datenquellen. In mindestens einer Ausführungsform implementiert oneDAL DPC++ API-Erweiterungen zu einer herkömmlichen C++-Schnittstelle und ermöglicht die Nutzung von GPUs für verschiedene Algorithmen.
  • In mindestens einer Ausführungsform ist eine oneAPI-Bibliothek für tiefe neuronale Netze, die auch als oneDNN bezeichnet wird, eine Bibliothek, die verschiedene Funktionen des tiefen Lernens implementiert. In mindestens einer Ausführungsform implementiert oneDNN verschiedene neuronale Netzwerk-, maschinelle Lern- und Deep-Learning-Funktionen, Algorithmen und/oder Variationen davon.
  • In mindestens einer Ausführungsform ist eine kollektive OneAPI-Kommunikationsbibliothek, die auch als oneCCL bezeichnet wird, eine Bibliothek, die verschiedene Anwendungen für Deep Learning und maschinelles Lernen implementiert. In mindestens einer Ausführungsform baut oneCCL auf Kommunikations-Middleware auf niedrigerer Ebene auf, wie z.B. Message Passing Interface (MPI) und libfabrics. In mindestens einer Ausführungsform ermöglicht oneCCL eine Reihe von Deep-Learning-spezifischen Optimierungen, wie z.B. Priorisierung, persistente Operationen, Ausführungen außerhalb der Reihenfolge und/oder Variationen davon. In mindestens einer Ausführungsform implementiert oneCCL verschiedene CPU- und GPU-Funktionen.
  • In mindestens einer Ausführungsform ist eine oneAPI-Threading-Building-Blocks-Bibliothek, die auch als oneTBB bezeichnet wird, eine Bibliothek, die verschiedene parallelisierte Prozesse für verschiedene Anwendungen implementiert. In mindestens einer Ausführungsform wird oneTBB für die aufgabenbasierte, gemeinsame parallele Programmierung auf einem Host verwendet. In mindestens einer Ausführungsform implementiert oneTBB generische parallele Algorithmen. In mindestens einer Ausführungsform implementiert oneTBB nebenläufige Container. In mindestens einer Ausführungsform implementiert oneTBB einen skalierbaren Speicherallokator. In mindestens einer Ausführungsform implementiert oneTBB einen Aufgabenplaner, der Arbeit stiehlt. In mindestens einer Ausführungsform implementiert oneTBB Synchronisationsprimitive auf niedriger Ebene. In mindestens einer Ausführungsform ist oneTBB compilerunabhängig und kann auf verschiedenen Prozessoren wie GPUs, PPUs, CPUs und/oder Variationen davon eingesetzt werden.
  • In mindestens einer Ausführungsform ist eine oneAPI-Videoverarbeitungsbibliothek, die auch als oneVPL bezeichnet wird, eine Bibliothek, die zur Beschleunigung der Videoverarbeitung in einer oder mehreren Anwendungen eingesetzt wird. In mindestens einer Ausführungsform implementiert oneVPL verschiedene Videodecodierungs-, -codierungs- und -verarbeitungsfunktionen. In mindestens einer Ausführungsform implementiert oneVPL verschiedene Funktionen für Medien-Pipelines auf CPUs, GPUs und anderen Beschleunigern. In mindestens einer Ausführungsform implementiert oneVPL die Geräteerkennung und -auswahl in medienzentrierten und videoanalytischen Workloads. In mindestens einer Ausführungsform implementiert oneVPL API-Primitive für die gemeinsame Nutzung von Null-Kopie-Puffern.
  • In mindestens einer Ausführungsform wird für ein oneAPI-Programmiermodell eine DPC++-Programmiersprache verwendet. In mindestens einer Ausführungsform ist eine DPC++-Programmiersprache eine Programmiersprache, die ohne Einschränkung funktional ähnliche Versionen von CUDA-Mechanismen enthält, um Gerätecode zu definieren und zwischen Gerätecode und Hostcode zu unterscheiden. In mindestens einer Ausführungsform kann eine DPC++-Programmiersprache eine Teilmenge der Funktionalität einer CUDA-Programmiersprache enthalten. In mindestens einer Ausführungsform werden eine oder mehrere CUDA-Programmiermodelloperationen unter Verwendung eines oneAPI-Programmiermodells mit einer DPC++-Programmiersprache durchgeführt.
  • Es sollte beachtet werden, dass sich die hierin beschriebenen Ausführungsbeispiele zwar auf ein CUDA-Programmiermodell beziehen, die hierin beschriebenen Techniken jedoch mit jedem geeigneten Programmiermodell wie HIP, oneAPI und/oder Variationen davon verwendet werden können.
  • Mindestens eine Ausführungsform der Offenbarung kann im Hinblick auf die folgenden Bestimmungen beschrieben werden:
    1. 1. Prozessor, umfassend:
      • eine oder mehrere Schaltungen zum Durchführen einer Anwendungsprogrammierschnittstelle, API, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden.
    2. 2. Prozessor nach Bestimmung 1, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfassen.
    3. 3. Prozessor nach Bestimmung 1 oder 2, wobei der eine oder die mehreren Speicherplätze asynchron unter Verwendung einer Virtuellspeicheradresse zu allozieren sind.
    4. 4. Prozessor nach einer der vorhergehenden Bestimmungen, wobei der eine oder die mehreren Speicherplätze asynchron unter Verwendung eines aus einem Speicherpool zugewiesenen Sicherungsspeichers zu allozieren sind.
    5. 5. Prozessor nach einer der vorhergehenden Bestimmungen, wobei der eine oder die mehreren Speicherplätze asynchron dealloziert werden, wenn ein auf dem einen oder den mehreren Prozessoren ausgeführter Prozess die Ausführung beendet.
    6. 6. Prozessor nach einer der vorhergehenden Bestimmungen, wobei die API zumindest einen Virtuellspeicherzeiger zum Deallozieren und einen Ausführungsstream, der eine Streamreihenfolge von Operationen angibt, die den einen oder die mehreren Speicherplätze verwenden, angibt.
    7. 7. Prozessor nach einer der vorhergehenden Bestimmungen, wobei der eine oder die mehreren Speicherplätze Speicherplätze in GPU-Speicher sind.
    8. 8. Prozessor nach einer der vorhergehenden Bestimmungen, wobei der eine oder die mehreren Speicherplätze im Ansprechen auf die API an einen Speicherpool zurückgegeben werden.
    9. 9. Computer-implementiertes Verfahren, umfassend:
      • Durchführen einer Anwendungsprogrammierschnittstelle, API, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren dealloziert werden.
    10. 10. Computer-implementiertes Verfahren nach Bestimmung 9, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfass
    11. 11. Computer-implementiertes Verfahren nach Bestimmung 9 oder 10, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Parallelverarbeitungseinheit, PPU, umfassen.
    12. 12. Computer-implementiertes Verfahren nach einer der Bestimmungen 9 bis 11, wobei die API einen Virtuellspeicherzeiger beinhaltet, der als ein Ergebnis eines asynchronen Allozierens des einen oder der mehreren Speicherplätze empfangen wird.
    13. 13. Computer-implementiertes Verfahren nach einer der Bestimmungen 9 bis 12, ferner umfassend:
      • Zurückgeben von Sicherungsspeicher, der dem einen oder den mehreren Speicherplätzen zugeordnet ist, an einen Speicherpool; und
      • Trennen des Sicherungsspeichers von einem Virtuellspeicherzeiger, der dem einen oder den mehreren Speicherplätzen zugeordnet ist.
    14. 14. Computer-implementiertes Verfahren nach einer der Bestimmungen 9 bis 13, ferner umfassend:
      • Asynchrones Allozieren von Sicherungsspeicher, wenn ein Prozess die Ausführung auf dem einen oder den mehreren Prozessoren beginnt.
    15. 15. Computer-implementiertes Verfahren nach einer der Bestimmungen 9 bis 13, ferner umfassend:
      • Asynchrones Deallozieren von Sicherungsspeicher, wenn ein Prozess die Ausführung auf dem einen oder den mehreren Prozessoren beendet.
    16. 16. Computersystem mit einem oder mehreren Prozessoren und Speicher, der ausführbare Anweisungen speichert, die als ein Ergebnis des Ausgeführtwerdens durch den einen oder die mehreren Prozessoren das Computersystem veranlassen, eine Anwendungsprogrammierschnittstelle, API, durchzuführen, um asynchron einen oder mehrere Speicherplätze von einem oder mehreren Prozessoren zu deallozieren.
    17. 17. Computersystem nach Bestimmung 16, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfassen.
    18. 18. Computersystem nach Bestimmung 16 oder 17, wobei der eine oder die mehreren Speicherplätze Speicherplätze in GPU-Speicher sind.
    19. 19. Computersystem nach einer der Bestimmungen 16 bis 18, wobei die API eine Streamreihenfolge einer oder mehrerer der einen oder der mehreren ausführbaren Anweisungen angibt.
    20. 20. Computersystem nach einer der Bestimmungen 16 bis 19, wobei die API eine Virtuellspeicheradresse angibt, die im Ansprechen auf eine asynchrone Speicherallozierungs-API zurückgegeben wird.
    21. 21. Computersystem nach einer der Bestimmungen 16 bis 20, wobei die eine oder die mehreren ausführbaren Anweisungen zumindest ausführbare Anweisungen zum Ausführen eines Prozesses auf dem einen oder den mehreren Prozessoren beinhalten.
    22. 22. Computersystem nach einer der Bestimmungen 16 bis 21, wobei der eine oder die mehreren Speicherplätze asynchron unter Verwendung einer Virtuellspeicheradresse zu allozieren sind.
    23. 23. Computersystem nach einer der Bestimmungen 16 bis 22, wobei:
      • der eine oder die mehreren Speicherplätze asynchron zu allozieren sind, bevor ein Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird; und
      • der eine oder die mehreren Speicherstellen asynchron zu deallozieren sind, nachdem der Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird.
    24. 24. Maschinenlesbares Medium, auf dem ein Satz von Anweisungen gespeichert ist, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, eine Anwendungsprogrammierschnittstelle, API, auszuführen, um einen oder mehrere Speicherplätze von einem oder mehreren Prozessoren asynchron zu deallozieren.
    25. 25. Maschinenlesbares Medium nach Bestimmung 24, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfassen.
    26. 26. Maschinenlesbares Medium nach Bestimmung 24 oder 25, wobei der eine oder die mehreren Speicherplätze Speicherplätze in GPU-Speicher sind.
    27. 27. Maschinenlesbares Medium nach einer der Bestimmungen 24 bis 26, wobei:
      • der eine oder die mehreren Speicherplätze asynchron unter Verwendung einer Virtuellspeicheradresse zu allozieren sind;
      • der eine oder die mehreren Speicherplätze asynchron unter Verwendung eines aus einem Speicherpool allozierten Sicherungsspeichers zu allozieren sind;
      • die Virtuellspeicheradresse dem Sicherungsspeicher zuzuordnen ist; und
      • die Virtuellspeicheradresse von der API anzugeben ist.
    28. 28. Maschinenlesbares Medium nach einer der Bestimmungen 24 bis 27, wobei der eine oder die mehreren Speicherplätze zumindest teilweise auf der Grundlage einer in der API spezifizierten Streamausführungsreihenfolge bestimmt werden.
    29. 29. Maschinenlesbares Medium nach einer der Bestimmungen 24 bis 28, wobei der eine oder die mehreren Speicherplätze zumindest teilweise auf der Grundlage eines oder mehrerer Synchronisationsereignisse zwischen einer Vielzahl von Prozessen bestimmt werden, die auf dem einen oder den mehreren Prozessoren ausgeführt werden.
    30. 30. Maschinenlesbares Medium nach einer der Bestimmungen 24 bis 29, wobei:
      • der eine oder die mehreren Speicherplätze asynchron dem einen oder den mehreren Prozessoren zu allozieren sind, bevor ein Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird; und
      • der eine oder die mehreren Speicherplätze asynchron von dem einen oder den mehreren Prozessoren zu deallozieren sind, nachdem ein Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird.
  • Andere Variationen sind im Sinne der Erfindung. Während die offenbarten Techniken verschiedenen Modifikationen und alternativen Konstruktionen zugänglich sind, sind bestimmte dargestellte Ausführungsformen derselben in Zeichnungen gezeigt und wurden vorstehend im Detail beschrieben. Es versteht sich jedoch, dass nicht beabsichtigt ist, die Erfindung auf eine bestimmte Form oder bestimmte Formen zu beschränken, sondern dass im Gegenteil beabsichtigt ist, alle Modifikationen, alternativen Konstruktionen und Äquivalente abzudecken, die in den Gedanken und den Rahmen der Erfindung fallen, wie er in den beigefügten Ansprüchen definiert ist.
  • Die Verwendung der Begriffe „ein“ und „eine“ und „der“ und ähnlicher Bezeichnungen im Kontext der Beschreibung offenbarter Ausführungsformen (insbesondere im Kontext der nachfolgenden Ansprüche) ist so auszulegen, dass sie sowohl die Einzahl als auch die Mehrzahl umfasst, sofern hierin nicht anders angegeben oder durch Kontext eindeutig widerlegt, und nicht als Definition eines Begriffs. Die Begriffe „umfassend“, „mit“, „beinhaltend“ und „enthaltend“ sind, sofern nicht anders angegeben, als nicht abschließende Begriffe (d.h. „einschließlich, aber nicht beschränkt auf“) zu verstehen. Der Begriff „verbunden“ ist, wenn er unverändert bleibt und sich auf physische Verbindungen bezieht, als teilweise oder ganz in einem Bauteil enthalten, an ihm angebracht oder mit ihm verbunden zu verstehen, auch wenn etwas dazwischen liegt. Die Wiedergabe von Wertebereichen ist lediglich als ein verkürzendes Verfahren des individuellen Bezugnehmens auf jeden einzelnen Wert, der in den Bereich fällt, beabsichtigt, sofern hierin nichts anderes angegeben ist, und jeder einzelne Wert ist in die Spezifikation aufgenommen, als wäre er hierin einzeln aufgeführt. Die Verwendung des Begriffs „Menge“ (z.B. „eine Menge von Gegenständen“) oder „Teilmenge“ ist, sofern nicht anders angegeben oder durch Kontext widerlegt, als eine nicht leere Sammlung zu verstehen, die ein oder mehrere Elemente umfasst. Sofern außerdem nicht anders vermerkt oder durch Kontext widerlegt, bezeichnet der Begriff „Teilmenge“ einer entsprechenden Menge nicht notwendigerweise eine echte Teilmenge der entsprechenden Menge, sondern Teilmenge und entsprechende Menge können gleich sein.
  • Konjunktive Sprache, wie z.B. Phrasen der Form „mindestens eines von A, B und C“ oder „mindestens eines von A, B und C“, wird, sofern nicht ausdrücklich anders angegeben oder anderweitig eindeutig durch Kontext widersprochen ist, im Allgemeinen so verstanden, dass damit ausgedrückt wird, dass ein Element, ein Begriff usw. entweder A oder B oder C oder eine beliebige nicht leere Teilmenge der Menge von A und B und C sein kann. So beziehen sich z.B. in dem veranschaulichenden Beispiel einer Menge mit drei Elementen die konjunktiven Ausdrücke „mindestens eines von A, B und C“ und „mindestens eines von A, B und C“ auf eine der folgenden Mengen: {A}, {B}, {C}, {A, B}, {A, C}, {B, C}, {A, B, C}. Eine solche konjunktivische Sprache soll also nicht generell bedeuten, dass bei bestimmten Ausführungsformen jeweils mindestens eines von A, mindestens eines von B und mindestens eines von C vorhanden sein muss. Darüber hinaus, sofern nicht anders angegeben oder durch Kontext widerlegt, gibt der Begriff „Mehrzahl“ einen Zustand an, in dem er plural ist (z.B. „eine Mehrzahl von Elementen“ gibt mehrere Elemente an). Die Anzahl der Elemente in einer Mehrzahl ist mindestens zwei, kann aber mehr sein, wenn dies entweder explizit oder durch Kontext angegeben wird. Sofern nicht anders angegeben oder aus Kontext ersichtlich ist, bedeutet „basierend auf“ „zumindest teilweise basierend auf“ und nicht „ausschließlich basierend auf“.
  • Operationen hierin beschriebener Prozesse können in jeder geeigneten Reihenfolge ausgeführt werden, sofern hierin nicht anders angegeben oder durch den Kontext eindeutig widerlegt ist. In mindestens einer Ausführungsform wird ein Prozess wie die hierin beschriebenen Prozesse (oder Variationen und/oder Kombinationen derselben) unter der Steuerung eines oder mehrerer Computersysteme durchgeführt, die mit ausführbaren Anweisungen konfiguriert sind und als Code (z.B. ausführbare Anweisungen, ein oder mehrere Computerprogramme oder eine oder mehrere Anwendungen) implementiert sind, die gemeinsam auf einem oder mehreren Prozessoren, durch Hardware oder Kombinationen davon ausgeführt werden. In mindestens einer Ausführungsform ist der Code auf einem computerlesbaren Speichermedium gespeichert, z.B. in Form eines Computerprogramms, das eine Vielzahl von Anweisungen umfasst, die von einem oder mehreren Prozessoren ausgeführt werden können. In mindestens einer Ausführungsform ist ein computerlesbares Speichermedium ein nicht-transitorisches computerlesbares Speichermedium, das transitorische Signale (z.B. eine sich ausbreitende transiente elektrische oder elektromagnetische Übertragung) ausschließt, aber nicht-transitorische Datenspeicherschaltungen (z.B. Puffer, Cache und Warteschlangen) innerhalb der Transceiver von transitorischen Signalen enthält. In mindestens einer Ausführungsform ist der Code (z.B. ausführbarer Code oder Quellcode) auf einem Satz von einem oder mehreren nicht-transitorischen computerlesbaren Speichermedien gespeichert, auf denen ausführbare Anweisungen (oder ein anderer Speicher zum Speichern von ausführbaren Anweisungen) gespeichert sind, die, wenn sie von einem oder mehreren Prozessoren eines Computersystems ausgeführt werden (d.h. als ein Ergebnis der Ausführung), das Computersystem veranlassen, hierin beschriebene Operationen durchzuführen. In mindestens einer Ausführungsform umfasst der Satz nicht-transitorischer computerlesbarer Speichermedien mehrere nicht-transitorische computerlesbare Speichermedien, und einem oder mehreren der einzelnen nicht-transitorischen Speichermedien der mehreren nicht-transitorischen computerlesbaren Speichermedien fehlt der gesamte Code, während die mehreren nicht-transitorischen computerlesbaren Speichermedien gemeinsam den gesamten Code speichern. In mindestens einer Ausführungsform werden ausführbare Befehle so ausgeführt, dass verschiedene Befehle von verschiedenen Prozessoren ausgeführt werden - zum Beispiel speichert ein nicht-transitorisches computerlesbares Speichermedium Befehle und führt eine zentrale Verarbeitungseinheit („CPU“) einige der Befehle aus, während eine Grafikverarbeitungseinheit („GPU“) andere Befehle ausführt. In mindestens einer Ausführungsform haben verschiedene Komponenten eines Computersystems separate Prozessoren und verschiedene Prozessoren führen verschiedene Teilmengen von Anweisungen aus.
  • Demgemäß sind in mindestens einer Ausführungsform Computersysteme dazu konfiguriert, einen oder mehrere Dienste zu implementieren, die einzeln oder gemeinsam Operationen der hierin beschriebenen Prozesse durchführen, und sind solche Computersysteme mit anwendbarer Hardware und/oder Software konfiguriert, die die Durchführung der Operationen ermöglichen. Ferner ist ein Computersystem, das mindestens eine Ausführungsform der Erfindung implementiert, eine einzelne Vorrichtung und in einer anderen Ausführungsform ein verteiltes Computersystem, das mehrere Vorrichtungen umfasst, die unterschiedlich arbeiten, so dass das verteilte Computersystem die hierin beschriebenen Operationen durchführt und eine einzelne Vorrichtung nicht alle Operationen durchführt.
  • Die Verwendung von Beispielen oder beispielhaften Ausdrücken (z.B. „wie beispielsweise“) dient lediglich der besseren Veranschaulichung von Ausführungsformen der Offenbarung und stellt keine Beschränkung des Umfangs der Offenbarung dar, sofern nicht anders angegeben. Keine Formulierung in der Beschreibung sollte so ausgelegt werden, dass ein nicht beanspruchtes Element als wesentlich für die Praxis der Offenbarung angesehen wird.
  • Alle hierin zitierten Referenzen, einschließlich Veröffentlichungen, Patentanmeldungen und Patente, werden hiermit durch Verweis in demselben Umfang einbezogen, als ob jede Referenz einzeln und ausdrücklich als durch Verweis einbezogen angegeben wäre und hierin in ihrer Gesamtheit wiedergegeben würde.
  • In der Beschreibung und den Ansprüchen können die Begriffe „gekoppelt“ und „verbunden“ sowie ihre Ableitungen verwendet werden. Es ist zu verstehen, dass diese Begriffe nicht als Synonyme füreinander zu verstehen sind. Vielmehr kann in bestimmten Beispielen „verbunden“ oder „gekoppelt“ verwendet werden, um anzuzeigen, dass zwei oder mehr Elemente in direktem oder indirektem physischem oder elektrischem Kontakt zueinander stehen. „Gekoppelt“ kann auch bedeuten, dass zwei oder mehr Elemente nicht in direktem Kontakt zueinander stehen, aber dennoch miteinander zusammenarbeiten oder interagieren.
  • Sofern nicht ausdrücklich anders angegeben, beziehen sich Begriffe wie „Verarbeitung“, „Berechnung“, „Berechnen“, „Bestimmen“ o. ä. in der gesamten Spezifikation auf Aktionen und/oder Prozesse eines Computers oder eines Computersystems oder eines ähnlichen elektronischen Rechengeräts, die Daten, die als physikalische, z.B. elektronische, Größen in den Registern und/oder Speichern des Computersystems dargestellt werden, manipulieren und/oder in andere Daten umwandeln, die in ähnlicher Weise als physikalische Größen in den Speichern, Registern oder anderen Informationsspeicher-, Übertragungs- oder Anzeigegeräten des Computersystems dargestellt werden.
  • In ähnlicher Weise kann sich der Begriff „Prozessor“ auf ein Gerät oder einen Teil eines Geräts beziehen, das elektronische Daten aus Registern und/oder einem Speicher verarbeitet und diese elektronischen Daten in andere elektronische Daten umwandelt, die in Registern und/oder einem Speicher gespeichert werden können. Als nicht beschränkende Beispiele kann der „Prozessor“ eine CPU oder eine GPU sein. Eine „Datenverarbeitungsplattform“ kann einen oder mehrere Prozessoren umfassen. Der hierin verwendete Begriff „Software“-Prozesse kann z.B. Software- und/oder Hardware-Einheiten umfassen, die im Laufe der Zeit Arbeit verrichten, wie z.B. Aufgaben, Threads und intelligente Agenten. Jeder Prozess kann sich auch auf mehrere Prozesse beziehen, um Anweisungen nacheinander oder parallel, kontinuierlich oder intermittierend auszuführen. Die Begriffe „System“ und „Verfahren" werden hierin insofern synonym verwendet, als ein System eine oder mehrere Verfahren umfassen kann und Verfahren als System betrachtet werden können.
  • In mindestens einer Ausführungsform ist eine Arithmetiklogikeinheit ein Satz von kombinatorischen Logikschaltungen, die eine oder mehrere Eingaben verarbeiten, um ein Ergebnis zu erzeugen. In mindestens einer Ausführungsform wird eine Arithmetiklogikeinheit von einem Prozessor verwendet, um mathematische Operationen wie Addition, Subtraktion oder Multiplikation durchzuführen. In mindestens einer Ausführungsform wird eine Arithmetiklogikeinheit verwendet, um logische Operationen wie logisches UND/ODER oder XOR zu implementieren. In mindestens einer Ausführungsform ist eine Arithmetiklogikeinheit zustandslos und besteht aus physikalischen Schaltkomponenten wie Halbleitertransistoren, die zur Bildung logischer Gatter angeordnet sind. In mindestens einer Ausführungsform kann eine Arithmetiklogikeinheit intern als zustandsabhängige Logikschaltung mit einem zugehörigen Taktgeber arbeiten. In mindestens einer Ausführungsform kann eine Arithmetiklogikeinheit als asynchrone Logikschaltung aufgebaut sein, deren interner Zustand nicht in einem zugehörigen Registersatz gehalten wird. In mindestens einer Ausführungsform wird eine Arithmetiklogikeinheit von einem Prozessor verwendet, um in einem oder mehreren Registern des Prozessors gespeicherte Operanden zu kombinieren und eine Ausgabe zu erzeugen, die vom Prozessor in einem anderen Register oder einem Speicherplatz gespeichert werden kann.
  • In mindestens einer Ausführungsform gibt der Prozessor als ein Ergebnis der Verarbeitung eines vom Prozessor abgerufenen Befehls einen oder mehrere Eingänge oder Operanden an eine Arithmetiklogikeinheit weiter, wodurch die Arithmetiklogikeinheit veranlasst wird, ein Ergebnis zu erzeugen, das zumindest teilweise auf einem Befehlscode basiert, der den Eingängen der Arithmetiklogikeinheit bereitgestellt wird. In mindestens einer Ausführungsform basieren die vom Prozessor an die ALU gelieferten Befehlscodes zumindest teilweise auf dem vom Prozessor ausgeführten Befehl. In mindestens einer Ausführungsform verarbeitet die kombinatorische Logik in der ALU die Eingänge und erzeugt einen Ausgang, der auf einen Bus innerhalb des Prozessors gelegt wird. In mindestens einer Ausführungsform wählt der Prozessor ein Zielregister, einen Speicherplatz, ein Ausgabegerät oder einen Ausgabespeicherplatz auf dem Ausgangsbus aus, so dass das Takten des Prozessors bewirkt, dass die von der ALU erzeugten Ergebnisse an den gewünschten Ort gesendet werden.
  • Im vorliegenden Dokument kann auf das Beschaffen, Erfassen, Empfangen oder Eingeben von analogen oder digitalen Daten in ein Teilsystem, ein Computersystem oder eine computerimplementierte Maschine Bezug genommen werden. Der Prozess des Erhaltens, Erfassens, Empfangens oder Eingebens analoger und digitaler Daten kann auf verschiedene Weise erfolgen, z.B. durch Empfangen von Daten als Parameter eines Funktionsaufrufs oder eines Aufrufs an eine Anwendungsprogrammierschnittstelle. In einigen Implementierungen kann der Prozess des Erhaltens, Erfassens, Empfangens oder Eingebens von analogen oder digitalen Daten durch die Übertragung von Daten über eine serielle oder parallele Schnittstelle durchgeführt werden. In einer anderen Implementierung kann der Prozess des Erhaltens, Erfassens, Empfangens oder Eingebens analoger oder digitaler Daten durch die Übertragung von Daten über ein Computernetzwerk von der bereitstellenden Einheit zur erfassenden Einheit durchgeführt werden. Es kann auch auf das Bereitstellen, Ausgeben, Übertragen, Senden oder Präsentieren analoger oder digitaler Daten Bezug genommen werden. In verschiedenen Beispielen kann das Bereitstellen, Ausgeben, Übertragen, Senden oder Darstellen analoger oder digitaler Daten durch die Übertragung von Daten als Eingabe- oder Ausgabeparameter eines Funktionsaufrufs, eines Parameters einer Anwendungsprogrammierschnittstelle oder eines Interprozess-Kommunikationsmechanismus erfolgen.
  • Obwohl die obige Diskussion Beispielimplementierungen der beschriebenen Techniken darlegt, können auch andere Architekturen verwendet werden, um die beschriebene Funktionalität zu implementieren, und sie sollen in den Anwendungsbereich dieser Offenlegung fallen. Darüber hinaus können verschiedene Funktionen und Verantwortlichkeiten je nach den Umständen auf unterschiedliche Weise verteilt und aufgeteilt werden, auch wenn oben zu Diskussionszwecken eine bestimmte Verteilung der Verantwortlichkeiten definiert wurde.
  • Auch wenn der Gegenstand in einer Sprache beschrieben wurde, die sich auf strukturelle Merkmale und/oder methodische Handlungen bezieht, versteht sich ferner, dass der in den beigefügten Ansprüchen beanspruchte Gegenstand nicht notwendigerweise auf die beschriebenen spezifischen Merkmale oder Handlungen beschränkt ist. Vielmehr werden die spezifischen Merkmale und Handlungen als beispielhafte Formen der Umsetzung der Ansprüche offenbart.
  • Claims (30)

    1. Prozessor, umfassend: eine oder mehrere Schaltungen zum Durchführen einer Anwendungsprogrammierschnittstelle, API, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren freigegeben werden.
    2. Prozessor nach Anspruch 1, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfassen.
    3. Prozessor nach Anspruch 1 oder 2, wobei der eine oder die mehreren Speicherplätze asynchron unter Verwendung einer Virtuellspeicheradresse zu allozieren sind.
    4. Prozessor nach einem der vorhergehenden Ansprüche, wobei der eine oder die mehreren Speicherplätze asynchron unter Verwendung eines aus einem Speicherpool zugewiesenen Sicherungsspeichers zu allozieren sind.
    5. Prozessor nach einem der vorhergehenden Ansprüche, wobei der eine oder die mehreren Speicherplätze asynchron dealloziert werden, wenn ein auf dem einen oder den mehreren Prozessoren ausgeführter Prozess die Ausführung beendet.
    6. Prozessor nach einem der vorhergehenden Ansprüche, wobei die API zumindest einen Virtuellspeicherzeiger zum Deallozieren und einen Ausführungsstream, der eine Streamreihenfolge von Operationen angibt, die den einen oder die mehreren Speicherplätze verwenden, angibt.
    7. Prozessor nach einem der vorhergehenden Ansprüche, wobei der eine oder die mehreren Speicherplätze Speicherplätze in GPU-Speicher sind.
    8. Prozessor nach einem der vorhergehenden Ansprüche, wobei der eine oder die mehreren Speicherplätze im Ansprechen auf die API an einen Speicherpool zurückgegeben werden.
    9. Computer-implementiertes Verfahren, umfassend: Durchführen einer Anwendungsprogrammierschnittstelle, API, um zu veranlassen, dass ein oder mehrere Speicherplätze asynchron von einem oder mehreren Prozessoren dealloziert werden.
    10. Computer-implementiertes Verfahren nach Anspruch 9, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfass
    11. Computer-implementiertes Verfahren nach Anspruch 9 oder 10, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Parallelverarbeitungseinheit, PPU, umfassen.
    12. Computer-implementiertes Verfahren nach einem der Ansprüche 9 bis 11, wobei die API einen Virtuellspeicherzeiger beinhaltet, der als ein Ergebnis eines asynchronen Allozierens des einen oder der mehreren Speicherplätze empfangen wird.
    13. Computer-implementiertes Verfahren nach einem der Ansprüche 9 bis 12, ferner umfassend: Zurückgeben von Sicherungsspeicher, der dem einen oder den mehreren Speicherplätzen zugeordnet ist, an einen Speicherpool; und Trennen des Sicherungsspeichers von einem Virtuellspeicherzeiger, der dem einen oder den mehreren Speicherplätzen zugeordnet ist.
    14. Computer-implementiertes Verfahren nach einem der Ansprüche 9 bis 13, ferner umfassend: Asynchrones Allozieren von Sicherungsspeicher, wenn ein Prozess die Ausführung auf dem einen oder den mehreren Prozessoren beginnt.
    15. Computer-implementiertes Verfahren nach einem der Ansprüche 9 bis 13, ferner umfassend: Asynchrones Deallozieren von Sicherungsspeicher, wenn ein Prozess die Ausführung auf dem einen oder den mehreren Prozessoren beendet.
    16. Computersystem mit einem oder mehreren Prozessoren und Speicher, der ausführbare Anweisungen speichert, die als ein Ergebnis des Ausgeführtwerdens durch den einen oder die mehreren Prozessoren das Computersystem veranlassen, eine Anwendungsprogrammierschnittstelle, API, durchzuführen, um asynchron einen oder mehrere Speicherplätze von einem oder mehreren Prozessoren zu deallozieren.
    17. Computersystem nach Anspruch 16, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfassen.
    18. Computersystem nach Anspruch 16 oder 17, wobei der eine oder die mehreren Speicherplätze Speicherplätze in GPU-Speicher sind.
    19. Computersystem nach einem der Ansprüche 16 bis 18, wobei die API eine Streamreihenfolge einer oder mehrerer der einen oder der mehreren ausführbaren Anweisungen angibt.
    20. Computersystem nach einem der Ansprüche 16 bis 19, wobei die API eine Virtuellspeicheradresse angibt, die im Ansprechen auf eine asynchrone Speicherallozierungs-API zurückgegeben wird.
    21. Computersystem nach einem der Ansprüche 16 bis 20, wobei die eine oder die mehreren ausführbaren Anweisungen zumindest ausführbare Anweisungen zum Ausführen eines Prozesses auf dem einen oder den mehreren Prozessoren beinhalten.
    22. Computersystem nach einem der Ansprüche 16 bis 21, wobei der eine oder die mehreren Speicherplätze asynchron unter Verwendung einer Virtuellspeicheradresse zu allozieren sind.
    23. Computersystem nach einem der Ansprüche 16 bis 22, wobei: der eine oder die mehreren Speicherplätze asynchron zu allozieren sind, bevor ein Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird; und der eine oder die mehreren Speicherstellen asynchron zu deallozieren sind, nachdem der Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird.
    24. Maschinenlesbares Medium, auf dem ein Satz von Anweisungen gespeichert ist, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, eine Anwendungsprogrammierschnittstelle, API, auszuführen, um einen oder mehrere Speicherplätze von einem oder mehreren Prozessoren asynchron zu deallozieren.
    25. Maschinenlesbares Medium nach Anspruch 24, wobei einer oder mehrere des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, umfassen.
    26. Maschinenlesbares Medium nach Anspruch 24 oder 25, wobei der eine oder die mehreren Speicherplätze Speicherplätze in GPU-Speicher sind.
    27. Maschinenlesbares Medium nach einem der Ansprüche 24 bis 26, wobei: der eine oder die mehreren Speicherplätze asynchron unter Verwendung einer Virtuellspeicheradresse zu allozieren sind; der eine oder die mehreren Speicherplätze asynchron unter Verwendung eines aus einem Speicherpool allozierten Sicherungsspeichers zu allozieren sind; die Virtuellspeicheradresse dem Sicherungsspeicher zuzuordnen ist; und die Virtuellspeicheradresse von der API anzugeben ist.
    28. Maschinenlesbares Medium nach einem der Ansprüche 24 bis 27, wobei der eine oder die mehreren Speicherplätze zumindest teilweise auf der Grundlage einer in der API spezifizierten Streamausführungsreihenfolge bestimmt werden.
    29. Maschinenlesbares Medium nach einem der Ansprüche 24 bis 28, wobei der eine oder die mehreren Speicherplätze zumindest teilweise auf der Grundlage eines oder mehrerer Synchronisationsereignisse zwischen einer Vielzahl von Prozessen bestimmt werden, die auf dem einen oder den mehreren Prozessoren ausgeführt werden.
    30. Maschinenlesbares Medium nach einem der Ansprüche 24 bis 29, wobei: der eine oder die mehreren Speicherplätze asynchron dem einen oder den mehreren Prozessoren zu allozieren sind, bevor ein Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird; und der eine oder die mehreren Speicherplätze asynchron von dem einen oder den mehreren Prozessoren zu deallozieren sind, nachdem ein Prozess auf dem einen oder den mehreren Prozessoren ausgeführt wird.
    DE102022132008.1A 2021-12-09 2022-12-02 Asynchrone speicherdeallokation Pending DE102022132008A1 (de)

    Applications Claiming Priority (2)

    Application Number Priority Date Filing Date Title
    US17/546,979 US20230185706A1 (en) 2021-12-09 2021-12-09 Asynchronous memory deallocation
    US17/546,979 2021-12-09

    Publications (1)

    Publication Number Publication Date
    DE102022132008A1 true DE102022132008A1 (de) 2023-06-15

    Family

    ID=86498425

    Family Applications (1)

    Application Number Title Priority Date Filing Date
    DE102022132008.1A Pending DE102022132008A1 (de) 2021-12-09 2022-12-02 Asynchrone speicherdeallokation

    Country Status (3)

    Country Link
    US (1) US20230185706A1 (de)
    CN (1) CN116401039A (de)
    DE (1) DE102022132008A1 (de)

    Families Citing this family (1)

    * Cited by examiner, † Cited by third party
    Publication number Priority date Publication date Assignee Title
    US20220334898A1 (en) * 2021-04-14 2022-10-20 Nvidia Corporation Application programming interface to identify memory

    Family Cites Families (3)

    * Cited by examiner, † Cited by third party
    Publication number Priority date Publication date Assignee Title
    US11593157B2 (en) * 2020-02-05 2023-02-28 Nec Corporation Full asynchronous execution queue for accelerator hardware
    US20230080421A1 (en) * 2020-02-28 2023-03-16 Arizona Board Of Regents On Behalf Of Arizona State University Halo: a hardware-agnostic accelerator orchestration software framework for heterogeneous computing systems
    US20220051466A1 (en) * 2020-08-17 2022-02-17 Intel Corporation Apparatus and method for compressing ray tracing acceleration structure build data

    Also Published As

    Publication number Publication date
    US20230185706A1 (en) 2023-06-15
    CN116401039A (zh) 2023-07-07

    Similar Documents

    Publication Publication Date Title
    DE102021102589A1 (de) Berechnungsgraph-optimierung
    DE102021106796A1 (de) Techniken zur speicherfehlerisolierung
    DE102021103492A1 (de) Anwendungsprogrammierschnittstelle zum beschleunigen von matrixoperationen
    DE102021104561A1 (de) Asynchrone datenbewegungspipeline
    DE112021005433T5 (de) Verfahren zur leistungsbalancierung mehrerer chips
    DE112022003222T5 (de) Multi-architektur-ausführungsgraphen
    DE102021125626A1 (de) Licht-resampling mit flächenähnlichkeitsprüfung
    DE102021106797A1 (de) Techniken zur orchestrierung von phasen der thread-synchronisation
    DE112022002140T5 (de) Licht-Resampling mit Strahlenverfolgung und Sichtbarkeit im Bildschirmraum
    DE102022132008A1 (de) Asynchrone speicherdeallokation
    DE102023101893A1 (de) Graphenbasierter speicher
    DE102022131530A1 (de) Verfahren zum modifizieren von graphencode
    DE102022131708A1 (de) Anwendungsprogrammierschnittstelle zum begrenzen von speicher
    DE102022132013A1 (de) Anwendungsprogrammierschnittstellen für interoperabilität
    DE102022124362A1 (de) Benutzerkonfigurierbare speicherzuweisung
    DE112022002953T5 (de) Parallele verarbeitung von thread-gruppen
    DE112022001917T5 (de) Synchronisieren einer graphausführung
    DE102022114509A1 (de) Speicherzuweisung unter verwendung von graphen
    DE112022000425T5 (de) Gleichzeitiges einführen von code
    DE102022107673A1 (de) Räumlich-zeitliches resampling mit entkoppeltem shading und wiederverwendung
    DE112022002258T5 (de) Tensormodifikation basierend auf der verarbeitung von ressourcen
    DE102022104253A1 (de) Tonwertverwaltung unter Verwendung von Tonwertverstärkungsfunktionen für Bildgebungsanwendungen mit hohem Dynamikbereich
    DE102021122965A1 (de) Kontaktverfahren zur simulation
    DE102022131710A1 (de) Asynchrone speicherzuweisung
    DE102022123627A1 (de) Anwendungsprogrammierschnittstelle zum einrichten von graphenressourcen

    Legal Events

    Date Code Title Description
    R012 Request for examination validly filed