DE112022003222T5 - Multi-architektur-ausführungsgraphen - Google Patents

Multi-architektur-ausführungsgraphen Download PDF

Info

Publication number
DE112022003222T5
DE112022003222T5 DE112022003222.7T DE112022003222T DE112022003222T5 DE 112022003222 T5 DE112022003222 T5 DE 112022003222T5 DE 112022003222 T DE112022003222 T DE 112022003222T DE 112022003222 T5 DE112022003222 T5 DE 112022003222T5
Authority
DE
Germany
Prior art keywords
processor
different types
instructions
executed
cuda
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
DE112022003222.7T
Other languages
English (en)
Inventor
Ashok Kelur
Rahul Suresh
Karthik Raghavan Ravi
Neeraja Gubba
Priyal Rathi
Yogesh KINI
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 DE112022003222T5 publication Critical patent/DE112022003222T5/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N5/00Computing arrangements using knowledge-based models
    • G06N5/04Inference or reasoning models
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/78Architectures of general purpose stored program computers comprising a single central processing unit
    • G06F15/7807System on chip, i.e. computer system on a single chip; System in package, i.e. computer system on one or more chips in a single package
    • 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
    • G06F9/5044Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering hardware capabilities
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/06Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
    • G06N3/063Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/10Interfaces, programming languages or software development kits, e.g. for simulating neural networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • G06F15/8053Vector processors
    • G06F15/8092Array of vector units

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Evolutionary Computation (AREA)
  • Artificial Intelligence (AREA)
  • Biomedical Technology (AREA)
  • Biophysics (AREA)
  • Health & Medical Sciences (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Molecular Biology (AREA)
  • General Health & Medical Sciences (AREA)
  • Computer Hardware Design (AREA)
  • Neurology (AREA)
  • Microelectronics & Electronic Packaging (AREA)
  • Stored Programmes (AREA)
  • Multi Processors (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Vorrichtungen, Systeme und Verfahren zur Durchführung von Multi-Architektur-Ausführungsgraphen werden offenbart. Bei mindestens einer Ausführungsform erzeugt eine Parallelverarbeitungsplattform, wie z. B. die Compute Uniform Device Architecture (CUDA), Multi-Architektur-Ausführungsgraphen, die eine Vielzahl von Software-Kernels umfassen, die von einem oder mehreren Prozessorkernen, die eine oder mehrere Prozessorarchitekturen aufweisen, auszuführen sind.

Description

  • QUERVERWEIS AUF VERWANDTE ANWENDUNGEN
  • ANSPRUCH AUF PRIORITÄT
  • Diese Anmeldung beruft sich auf die US-Patentanmeldung Nr. 17/468,128 , eingereicht am 7. September 2021, mit dem Titel „MULTI-ARCHITECTURE EXECUTION GRAPHS“, die in ihrer Gesamtheit und für alle Zwecke hierin enthalten ist.
  • FACHGEBIET
  • Mindestens eine Ausführungsform bezieht sich auf Verarbeitungsressourcen, die zur Ausführung von Softwarebefehlen für eine Vielzahl von Prozessorarchitekturen unter Verwendung der Compute Uniform Device Architecture (CUDA) verwendet werden. Zum Beispiel bezieht sich mindestens eine Ausführungsform auf Prozessor- oder Rechensysteme zur Ausführung von Multi-Architektur-Ausführungsgraphen gemäß verschiedenen neuen Verfahren, die hier beschrieben sind.
  • HINTERGRUND
  • Moderne eingebettete Systeme verwenden mehrere Typen von Prozessoren, um Hochleistungsrechenoperationen durchzuführen. Programmierer verwenden verschiedene Programmierbibliotheken, um die für jeden Typ von Prozessor spezifischen Fähigkeiten zu nutzen, und diese Programmierbibliotheken verwenden oft unterschiedliche Programmierparadigmen. Um eine Aufgabe bzw. Task zu erfüllen, unterteilt ein Programmierer diese Aufgabe bzw. Task in Teilaufgaben bzw. Sub-Tasks und schreibt Softwarecode für jede Aufgabe bzw. Task unter Verwendung von Programmierbibliotheken, die für den Prozessor spezifisch sind, der für die Ausführung dieser Teilaufgabe bzw. Sub-Task ausgewählt wurde. Dabei muss der Programmierer Abhängigkeiten zwischen den Teilaufgaben bzw. Sub-Task einrichten, damit die Daten zwischen den einzelnen Teilaufgaben bzw. Sub-Tasks gemeinsam genutzt werden und die Gesamtaufgabe bzw. Tasks harmonisch funktioniert.
  • KURZE BESCHREIBUNG DER ZEICHNUNGEN
    • 1 ist ein Blockdiagramm, das einen Software-Stack für einen Deep-Learning-Beschleuniger (DLA) gemäß mindestens einer Ausführungsform darstellt;
    • 2 ist ein Blockdiagramm, das einen DLA-Compiler veranschaulicht, um gemäß mindestens einer Ausführungsform ein ladbares DLA-Modul aus einem Modell eines neuronalen Netzes zu erzeugen;
    • 3 ist ein Blockdiagramm, das eine DLA-Architektur gemäß mindestens einer Ausführungsform veranschaulicht;
    • 4A ist ein Blockdiagramm, das Schritte zur Durchführung von Inferencing gemäß mindestens einer Ausführungsform illustriert;
    • 4B ist ein Blockdiagramm, das Inferencing in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform veranschaulicht;
    • 4C ist ein Blockdiagramm, das Inferencing in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform veranschaulicht;
    • 5A ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform darstellt;
    • 5B ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform darstellt;
    • 6 ist ein Blockdiagramm, das eine vereinheitlichte Architektur zur Durchführung von Rechenoperationen unter Verwendung einer Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform darstellt;
    • 7 ist ein Blockdiagramm, das einen Ausführungsgraphen veranschaulicht, der gemäß mindestens einer Ausführungsform ausführbaren Code für eine Vielzahl von Prozessortypen umfasst;
    • 8 veranschaulicht ein Verfahren zur Ausführung von ausführbarem Code für eine Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform;
    • 9 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Rechenzentrum;
    • 10 veranschaulicht gemäß mindestens einer Ausführungsform ein Verarbeitungssystem;
    • 11 veranschaulicht gemäß mindestens einer Ausführungsform ein Computersystem ;
    • 12 veranschaulicht gemäß mindestens einer Ausführungsform ein System;
    • 13 veranschaulicht gemäß mindestens einer Ausführungsform eine beispielhafte integrierte Schaltung;
    • 14 veranschaulicht gemäß mindestens einer Ausführungsform ein Computersystem ;
    • 15 veranschaulicht gemäß mindestens einer Ausführungsform eine APU;
    • 16 veranschaulicht gemäß mindestens einer Ausführungsform eine CPU;
    • 17 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Beschleunigerintegrations-Slice;
    • 18A-18B veranschaulichen gemäß mindestens einer Ausführungsform beispielhafte Grafikprozessoren;
    • 19A veranschaulicht gemäß mindestens einer Ausführungsform einen Grafikkern;
    • 19B veranschaulicht gemäß mindestens einer Ausführungsform eine GPGPU;
    • 20A veranschaulicht gemäß mindestens einer Ausführungsform einen Parallelprozessor;
    • 20B veranschaulicht gemäß mindestens einer Ausführungsform einen Verarbeitungscluster;
    • 20C veranschaulicht gemäß mindestens einer Ausführungsform einen Grafik-Multiprozessor;
    • 21 veranschaulicht gemäß mindestens einer Ausführungsform einen Grafikprozessor;
    • 22 veranschaulicht gemäß mindestens einer Ausführungsform einen Prozessor;
    • 23 veranschaulicht gemäß mindestens einer Ausführungsform einen Prozessor;
    • 24 veranschaulicht gemäß mindestens einer Ausführungsform einen Graf ikprozessorkern;
    • 25 veranschaulicht gemäß mindestens einer Ausführungsform eine PPU;
    • 26 veranschaulicht gemäß mindestens einer Ausführungsform einen GPC;
    • 27 veranschaulicht gemäß mindestens einer Ausführungsform einen Streaming-Multiprozessor;
    • 28 veranschaulicht gemäß mindestens einer Ausführungsform einen Software-Stack einer Programmierplattform;
    • 29 veranschaulicht gemäß mindestens einer Ausführungsform eine CUDA-Implementierung eines Software-Stacks aus 28;
    • 30 veranschaulicht gemäß mindestens einer Ausführungsform eine ROCm-Implementierung eines Software-Stacks aus 28;
    • 31 veranschaulicht gemäß mindestens einer Ausführungsform eine O-penCL-Implementierung eines Software-Stacks aus 28;
    • 32 veranschaulicht gemäß mindestens einer Ausführungsform Software, die von einer Programmierplattform unterstützt wird;
    • 33 veranschaulicht gemäß mindestens einer Ausführungsform die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 28-31;
    • 34 veranschaulicht gemäß mindestens einer Ausführungsform ausführlicher die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 28-31;
    • 35 veranschaulicht gemäß mindestens einer Ausführungsform die Übersetzung von Quellcode vor der Kompilierung des Quellcodes;
    • 36A veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um CUDA-Quellcode unter Verwendung verschiedener Typen von Verarbeitungseinheiten zu kompilieren und auszuführen;
    • 36B veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um den CUDA-Quellcode von 36A unter Verwendung einer CPU und eines CUDA-fähigen Grafikprozessors zu kompilieren und auszuführen;
    • 36C veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um den CUDA-Quellcode von 36A unter Verwendung einer CPU und einer nicht CUDA-fähigen GPU zu kompilieren und auszuführen;
    • 37 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Kernel, der durch das CUDA-zu-HIP-Übersetzungswerkzeug von 36C übersetzt wurde;
    • 38 veranschaulicht gemäß mindestens einer Ausführungsform die nicht-CUDA-fähige GPU von 36C mit mehr Details;
    • 39 veranschaulicht gemäß mindestens einer Ausführungsform, wie Threads eines beispielhaften CUDA-Grids auf verschiedene Recheneinheiten von 38 abgebildet werden; und
    • 40 veranschaulicht gemäß mindestens einer Ausführungsform, wie bestehender CUDA-Code zu Data Parallel C++-Code zu migrieren ist.
  • DETAILLIERTE BESCHREIBUNG
  • 1 ist ein Blockdiagramm, das einen Software-Stack 102 für einen Deep-Learning-Beschleuniger (Deep Learning Accelerator (DLA)) 114 gemäß mindestens einer Ausführungsform darstellt. Bei mindestens einer Ausführungsform besteht die DLA-Hardware 114 aus Schaltungen, um eine oder mehrere Deep-Learning-Aufgaben bzw. Tasks durchzuführen, die eine oder mehrere Rechenoperationen umfassen. Bei mindestens einer Ausführungsform handelt es sich bei Deep-Learning-Operationen um mathematische Operationen zur Ermöglichung bzw. Erleichterung von Berechnungen, die als Teil eines neuronalen Netzes durchzuführen sind, wie z. B. eine Matrixmultiplikation und andere Operationen, die hier beschrieben sind. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 Schaltungen zur Beschleunigung von Deep-Learning-Operationen, wie z. B. mathematische Operationen. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 Beschleuniger. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 einen Beschleuniger mit fester Funktion, wie etwa einen Beschleuniger, der Schaltungen zur Durchführung spezifischer mathematischer Operationen umfasst. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 eine anwendungsspezifische integrierte Schaltung (ASIC) und zugehörige unterstützende Schaltungen, wie z. B. Speicher, um Deep-Learning-Operationen durchzuführen. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 allgemeine Rechenschaltungen, die zur Durchführung von Deep-Learning-Operationen ausgestaltet sind.
  • Bei mindestens einer Ausführungsform verwaltet eine Firmware 110 die DLA-Hardware 114. Bei mindestens einer Ausführungsform handelt es sich bei der Firmware 110 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine Schnittstelle zwischen einem oder mehreren Treibern 106, 108, die im Folgenden diskutiert werden, und der DLA-Hardware 114 bereitstellen. Bei mindestens einer Ausführungsform stellt die Firmware 110 eine API bereit, um mit der DLA-Hardware 114 zu interagieren und sie zu verwalten. Bei mindestens einer Ausführungsform stellt die Firmware 110 eine beliebige andere Schnittstelle, wie sie hier beschrieben ist, bereit, um mit der DLA-Hardware 114 zu interagieren und sie zu verwalten. Bei mindestens einer Ausführungsform läuft die Firmware 110 auf jeder Instanz der DLA-Hardware 114. Bei mindestens einer Ausführungsform stellt die Firmware 110 eine Schnittstelle zu einem oder mehreren Treibern 106, 108 bereit, um Aufgaben oder Tasks zu übermitteln, die von der DLA-Hardware 114 auszuführen sind.
  • Bei mindestens einer Ausführungsform verwendet ein Programmierer oder ein anderer Benutzer einen DLA-Software-Stack 102, um ausführbaren Code zu erstellen, der von der DLA-Hardware 114 ausgeführt wird. Bei mindestens einer Ausführungsform besteht ein DLA-Software-Stack 102 aus Softwareanweisungen, die bei ihrer Ausführung Operationen durchführen, um die Programmierung und Ausführung von ausführbarem Code zu ermöglichen, der für die DLA-Hardware 114 spezifisch ist. Bei mindestens einer Ausführungsform ist der DLA-Software-Stack 102 eine Bibliothek, die eine Vielzahl von Softwarepaketen umfasst. Bei mindestens einer Ausführungsform ist der DLA-Software-Stack 102 ein Satz von Werkzeugen zur Erzeugung und Ausführung von Softwarecode unter Verwendung der DLA-Hardware 114.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 einen Interpreter und einen Compiler 104. Bei mindestens einer Ausführungsform handelt es sich bei dem Interpreter und Compiler 104 um Softwarebefehle, die bei ihrer Ausführung einen ausführbaren Code erzeugen, der von der DLA-Hardware 114 ausgeführt wird. Bei mindestens einer Ausführungsform interpretiert der Interpreter und Compiler 104 Modelle eines neuronalen Netzes und kompiliert diese Modelle in ein ladbares Modulformat, wie es im Folgenden in Verbindung mit 2 beschrieben ist. Bei mindestens einer Ausführungsform empfängt der Interpreter und Compiler 104 als Eingabe beliebige Daten, die Informationen darstellen, wie z. B. Gleichungen, die von der DLA-Hardware 114 ausgeführt werden können. Bei mindestens einer Ausführungsform erzeugt der Interpreter und Compiler 104 einen ausführbaren Code in einem beliebigen Format, der von der DLA-Hardware 114 ausführbar ist.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 einen oder mehrere Benutzer-Mode-Treiber 106. Bei mindestens einer Ausführungsform handelt es sich bei einem Benutzer-Mode-Treiber 106 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Schnittstellen zur Durchführung von Operationen unter Verwendung der DLA-Hardware 114 bereitstellen. Bei mindestens einer Ausführungsform stellt der Benutzer-Mode-Treiber 106 eine Anwendungsprogrammierschnittstelle (API) bereit. Bei mindestens einer Ausführungsform stellt der Benutzer-Mode-Treiber 106 jeden anderen Typ von Schnittstelle bereit, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform stellt der Benutzer-Mode-Treiber 106 eine oder mehrere Schnittstellen zur Zuweisung von Speicher auf der DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform lädt der Benutzer-Mode-Treiber 106 ausführbaren Code, der von der DLA-Hardware 114 auszuführen ist, wie beispielsweise von dem Interpreter und Compiler 104 erzeugter ausführbarer Code, auf die DLA-Hardware 114. Bei mindestens einer Ausführungsform lädt der Benutzer-Mode-Treiber 106 ausführbaren Code in den Speicher der DLA-Hardware 114. Bei mindestens einer Ausführungsform übergibt der Benutzer-Mode-Treiber 106 einen von dem Interpreter und Compiler 104 erzeugten ausführbaren Code, damit dieser durch die DLA-Hardware 114 ausgeführt wird. Bei mindestens einer Ausführungsform bildet der Benutzer-Mode-Treiber 106 eine Schnittstelle zu der DLA-Hardware 114 und weist die DLA-Hardware 114 an, ausführbaren Code auszuführen.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 einen oder mehrere Kernel-Mode-Treiber 108. Bei mindestens einer Ausführungsform handelt es sich bei dem Kernel-Mode-Treiber 108 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Schnittstellen bereitstellen, um Operationen auf der DLA-Hardware 114 durchzuführen. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine API zur Verfügung, um eine Schnittstelle zu der DLA-Hardware 114 zu bilden und Operationen auf der DLA-Hardware 114 durchzuführen. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine beliebige andere Schnittstelle bereit, die hier weiter beschrieben ist, um eine Schnittstelle zu der DLA-Hardware 114 zu bilden und Operationen der DLA-Hardware 114 durchzuführen. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine begrenzte Schnittstelle bereit, die nur für privilegierte Benutzer oder Software mit der Berechtigung zum Zugriff und/oder zur Änderung der DLA-Hardware 114 zugreifbar ist. Bei mindestens einer Ausführungsform stellt der Kernelmode-Treiber 108 eine offene Schnittstelle für den Zugriff auf und/oder die Änderung der DLA-Hardware 114 bereit.
  • Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Initialisierung der DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Initialisierung von Speicher und/oder anderer DLA-Hardware 114 in einen bestimmten Zustand bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zum Zurücksetzen der DLA-Hardware 114 auf einen Ausgangszustand bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zum Abbilden des Speichers der DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zu der DLA-Hardware bereit, um einen Speicher der DLA-Hardware 114 abzubilden. Bei mindestens einer Ausführungsform verwaltet der Kernel-Mode-Treiber 108 einen oder mehrere Gerätekontexte für die DLA-Hardware 114. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Verwaltung eines oder mehrerer Gerätekontexte für die DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform empfängt der Kernel-Mode-Treiber 108 Tasks, die von der DLA-Hardware 114 auszuführen sind, und/oder verarbeitet Task-Warteschlangen für die DLA-Hardware 114. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle für den Empfang von Tasks bereit, die von der DLA-Hardware 114 auszuführen sind. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Verarbeitung von Task-Warteschlangen für die DLA-Hardware 114 bereit.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 eine oder mehrere benutzerseitige APIs 112. Bei mindestens einer Ausführungsform handelt es sich bei den benutzerseitigen APIs 112 um Softwareanweisungen, die bei ihrer Ausführung eine oder mehrere Schnittstellen zur Interaktion mit dem DLA-Software-Stack 102 bereitstellen. Bei mindestens einer Ausführungsform stellen die benutzerseitigen APIs 112 eine oder mehrere Funktionsaufrufschnittstellen bereit, um eine oder mehrere Operationen auf der DLA-Hardware 114 unter Verwendung eines oder mehrerer Treiber 106, 108 durchzuführen. Bei mindestens einer Ausführungsform stellt eine oder stellen mehrere Softwarebibliotheken, wie z. B. NvMedia, die benutzerseitigen APIs 112 bereit. Bei mindestens einer Ausführungsform stellt eine oder stellen mehrere Rechenplattformen, die Bibliotheken umfassen, wie die Compute Uniform Device Architecture (CUDA) oder andere parallele Rechenplattformen und/oder Bibliotheken, wie sie hier beschrieben sind, die benutzerseitigen APIs 112 bereit.
  • 2 ist ein Blockdiagramm, das einen Deep Learning Accelerator (DLA)-Interpreter und -Compiler 206 veranschaulicht, um gemäß mindestens einer Ausführungsform ein ladbares DLA-Modul 214 von einem Modell 204 eines neuronalen Netzes zu erzeugen. Bei mindestens einer Ausführungsform handelt es sich bei dem DLA-Interpreter und -Compiler 206 um Softwareanweisungen, die, wenn sie ausgeführt werden, ausführbaren Code erzeugen, der von der DLA-Hardware ausgeführt wird, wie es vorab in Verbindung mit 1 beschrieben ist.
  • Bei mindestens einer Ausführungsform empfängt der DLA-Interpreter und - Compiler 206 als Eingabe 202 ein Modell 204. Bei mindestens einer Ausführungsform handelt es sich bei dem Modell 204 um Datenwerte und/oder Softwareanweisungen, die bei ihrer Ausführung Operationen eines neuronalen Netzes, wie es hier weiter beschrieben ist, durchführen. Bei mindestens einer Ausführungsform handelt es sich bei dem Modell 204 um ein Modell eines neuronalen Netzes. Bei mindestens einer Ausführungsform ist das Modell 204 ein beliebiger anderer Typ von Modell, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfasst das Modell 204 einen oder mehrere Knoten. Bei mindestens einer Ausführungsform besteht ein Knoten aus Datenwerten und/oder Softwareanweisungen, die bei ihrer Ausführung eine mathematische Operation, wie eine lineare Gleichung oder eine andere mathematische Operation, wie sie hier weiter beschrieben ist, ausführen. Bei mindestens einer Ausführungsform umfasst das Modell 204 eine oder mehrere Schichten, und jede Schicht umfasst einen oder mehrere Knoten. Bei mindestens einer Ausführungsform ist eine Schicht eine logische Gruppe von Knoten zur Durchführung eines Schritts einer Operation. Bei mindestens einer Ausführungsform handelt es sich bei der Operation um eine Task, die von dem Modell 204 auszuführen ist. Bei mindestens einer Ausführungsform umfasst eine von dem Modell 204 auszuführende Operation und/oder Task ein Inferencing. Bei mindestens einer Ausführungsform umfasst das Inferencing eine Objektidentifizierung, Klassifizierung, Segmentierung oder eine andere Operation eines neuronalen Netzes, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Interpreter und - Compiler 206 einen Modell-Parser 208. Bei mindestens einer Ausführungsform handelt es sich bei dem Modell-Parser 208 um Softwareanweisungen, die, wenn sie ausgeführt werden, das Modell 204 als Eingabe 202 für den DLA-Interpreter und -Compiler 206 parsen. Bei mindestens einer Ausführungsform parst der Modell-Parser 208 Daten des Modells 204 oder zerlegt sie in eine Zwischendarstellung (IR), die als Eingabe für einen Compiler und Optimierer 210 verwendet wird. Bei mindestens einer Ausführungsform liest der Modell-Parser 208 das Modell 204 als Eingabe 202 und erzeugt eine IR, die von dem Compiler und Optimierer 210 verwendet wird, um eine Ausgabe 212 zu erzeugen.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Interpreter und - Compiler 206 einen Compiler und Optimierer 210. Bei mindestens einer Ausführungsform handelt es sich bei dem Compiler und Optimierer 210 um Softwareanweisungen, die, wenn sie ausgeführt werden, die IR des Modells 204 einlesen und eine Ausgabe 212 erzeugen, die von der DLA-Hardware, wie es vorab beschrieben ist, ausgeführt wird. Bei mindestens einer Ausführungsform erzeugt der Compiler und Optimierer 210 eine oder mehrere Ausgaben 212. Bei mindestens einer Ausführungsform führt der Compiler und Optimierer 210 eine oder mehrere Optimierungen an dem ausführbaren Code durch, der von der einen oder den mehreren eingegebenen IR von dem Modell-Parser 208 erzeugt wird.
  • Bei mindestens einer Ausführungsform erzeugt der Compiler und Optimierer 210 als Ausgabe 212 ein ladbares Modul 214, das hier als ein ladbarer Code, ein Modul und/oder ein ausführbarer Code bezeichnet wird. Bei mindestens einer Ausführungsform umfasst das ladbare Modul 214, das von dem Compiler und Optimierer 210 ausgegeben wird, ausführbaren Code, wie Maschinencode oder Objektcode, der von DLA-Hardware auszuführen ist.
  • 3 ist ein Blockdiagramm, das gemäß mindestens einer Ausführungsform eine Architektur eines Deep-Learning-Beschleunigers (Deep Learning Accelerators (DLA)) veranschaulicht. Bei mindestens einer Ausführungsform umfasst die DLA-Architektur zwei Stufen: Kompilierung 302 und Inferencing 312. Bei mindestens einer Ausführungsform ist die Kompilierung 302 ein Prozess bzw. Verfahren, bei dem ein DLA-Compiler und -Optimierer 308 aus einem Modell 304 eine ausführbare Ausgabe, wie ein ladbares Modul 310, erzeugt, wie es vorab in Verbindung mit 2 beschrieben ist. Bei mindestens einer Ausführungsform empfängt ein DLA-Compiler und -Optimierer 308 während der Kompilierung 302 einen oder mehrere Compiler-Parameter 306, um Datenwerte und/oder andere programmierbare Aspekte der Kompilierung 302 anzugeben, die von dem DLA-Compiler und -Optimierer 308 durchzuführen sind. Bei mindestens einer Ausführungsform sind die Compiler-Parameter 306 Datenwerte, die eine oder mehrere Optionen der Kompilierung 302 angeben, die von dem DLA-Compiler und -Optimierer 308 durchzuführen sind.
  • Bei mindestens einer Ausführungsform ist Inferencing 312 ein Prozess bzw. Verfahren, bei dem eine DLA-Laufzeit 314 eine oder mehrere Aufgaben bzw. Tasks oder rechnerische Operationen unter Verwendung der DLA-Hardware 324 ausführt. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 324 einen oder mehrere Beschleuniger und/oder andere Schaltungen zur Durchführung von rechnerischen Operationen, wie es vorab in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform umfassen eine oder mehrere Aufgaben bzw. Tasks, die während des Inferencing 312 auszuführen sind, Inferencing-Operationen. Bei mindestens einer Ausführungsform handelt es sich bei den Inferencing-Operationen um Operationen eines neuronalen Netzes zur Berechnung eines oder mehrerer Ergebnisse unter Verwendung eines oder mehrerer neuronaler Netze. Bei mindestens einer Ausführungsform beinhalten die Operationen des neuronalen Netzes unter anderem eine Bildsegmentierung, eine Klassifizierung, eine Objektidentifizierung und/oder jede andere Operation des neuronalen Netzes, die hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform führt die DLA-Laufzeit 314 Inferencing 312 unter Verwendung der DLA-Hardware 324 durch. Bei mindestens einer Ausführungsform handelt es sich bei der DLA-Laufzeit um Softwareanweisungen, die, wenn sie ausgeführt werden, eine Anwendung 316 laden, die von der DLA-Hardware 324 unter Verwendung eines oder mehrerer Treiber 318, 320 auszuführen ist, wie es vorab in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform ist die Anwendung 316 ein ausführbarer Code, der von der DLA-Laufzeit 314 unter Verwendung eines oder mehrerer Treiber 318, 320 ausgeführt wird, um mit der DLA-Hardware 324 zu interagieren. Bei mindestens einer Ausführungsform ist die Anwendung 316 ein ladbares Modul 310, das von dem DLA-Compiler und -Optimierer 308 während der Kompilierung 302 erzeugt wird. Bei mindestens einer Ausführungsform ist die Anwendung 316 ein beliebiger anderer ausführbarer Code, der zur Ausführung mit der DLA-Laufzeit 314 und der DLA-Hardware 324 erzeugt wird. Bei mindestens einer Ausführungsform stellt die DLA-Laufzeit eine Schnittstelle 322 bereit, um die Interaktion mit einer oder mehreren anderen Softwarebibliotheken zu ermöglichen, um Inferencing 312 durchzuführen, wie es vorab in Verbindung mit 1 beschrieben ist.
  • 4A ist ein Blockdiagramm, das Schritte zur Durchführung von Inferencing 406 gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform wird zur Durchführung von Inferencing 406 unter Verwendung eines oder mehrerer Prozessoren, wie z. B. Parallel Processing Units (PPUs) und/oder anderer Prozessortypen, die einen Deep-Learning-Beschleuniger (DLA) aufweisen, ein Originalbild 402 durch ein oder mehrere Softwareprogramme unter Verwendung der PPUs und/oder anderer Prozessoren modifiziert, um ein manipuliertes Bild 404 zu erzeugen. Bei mindestens einer Ausführungsform handelt es sich bei dem Originalbild 402 um Daten, die einen Satz von Pixeln umfassen, wobei jedes Pixel Farbinformationen zur Darstellung des Bildes umfasst. Bei mindestens einer Ausführungsform handelt es sich bei dem manipulierten Bild 404 um Daten, die Informationen aus dem Originalbild 402 umfassen, das verändert wurde.
  • Bei mindestens einer Ausführungsform verwendet ein oder verwenden mehrere Softwareprogramme während des Inferencings eine oder mehrere PPUs, wie z. B. Grafikverarbeitungseinheiten (GPUs), um das Originalbild 402 in das manipulierte Bild 404 zu verändern oder anderweitig zu verarbeiten. Bei mindestens einer Ausführungsform wird dieses manipulierte Bild 404 dann von der DLA-Software, wie es vorab beschrieben ist, oder von einer anderen Software verwendet, um Operationen eines neuronalen Netzes, wie es hier weiter beschrieben ist, bereitzustellen, um Inferencing-Operationen 406 durchzuführen, wie es vorab in Verbindung mit 3 beschrieben ist. Bei mindestens einer Ausführungsform werden die Inferencing-Operationen 406 von einer oder mehreren DLAs durchgeführt. Bei mindestens einer Ausführungsform werden die Inferencing-Operationen 406 von einer oder mehreren PPUs, wie z. B. GPUs oder einer anderen parallelen Verarbeitungsarchitektur, wie es hier weiter beschrieben ist, durchgeführt. Bei mindestens einer Ausführungsform erzeugt das Inferencing 406 ein oder mehrere Ergebnisse 408. Bei mindestens einer Ausführungsform handelt es sich bei dem Ergebnis 408 um Daten, die eine oder mehrere Ausgaben von einer oder mehreren Inferencing-Operationen 406 umfassen.
  • 4B ist ein Blockdiagramm, das Inferencing 406 in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform verwendet das segmentierte Programmiermodell getrennte Softwarebibliotheken, um Operationen unter Verwendung verschiedener Prozessoren 410, 412, 414 durchzuführen, wie z. B. einen Deep-Learning-Beschleuniger (DLA)-Softwarestack, wie es vorab in Verbindung mit 1 beschrieben ist, um Rechenoperationen mittels eines DLA 414 auszuführen, oder eine Parallelverarbeitungsbibliothek, wie sie von der Compute Uniform Device Architecture (CUDA) bereitgestellt wird, um Rechenoperationen unter Verwendung einer Parallelverarbeitungseinheit (PPU), wie z. B. einer Grafikverarbeitungseinheit (GPU) 412, durchzuführen.
  • Bei mindestens einer Ausführungsform wird während des Inferencings 406 das Originalbild 420 in einem Speicher 418 auf einem Computersystem gespeichert. Bei mindestens einer Ausführungsform entspricht der Speicher 418 Schaltungen, um eine flüchtige und/oder nichtflüchtige Datenspeicherung in einem Computersystem durchzuführen. In einer Ausführungsform wird während des Inferencings 406 das Originalbild 420 über einen Bus 416, wie es hier weiter beschrieben ist, an eine PPU, wie z.B. die GPU 412, übertragen, um eine oder mehrere Bildverarbeitungsoperationen durchzuführen, was zu dem manipulierten Bild 422 führt. Bei mindestens einer Ausführungsform überträgt die GPU 412 die Daten des manipulierten Bildes 422 über den Bus 416 zurück zu dem Speicher 418. Bei mindestens einer Ausführungsform wird das manipulierte Bild 422 über den Bus 416 von dem Speicher 418 zu dem DLA 414 übertragen, um Inferencing 406 unter Verwendung des manipulierten Bildes 422 durchzuführen. Während des Inferencings 406, das von dem DLA 414 durchgeführt wird, erfordern alle zusätzlichen Operationen, die von der GPU 412 an dem manipulierten Bild 422 und/oder an Zwischenergebnissen des Inferencings durchgeführt werden, in einer Ausführungsform das Kopieren von Daten unter Verwendung des Busses 416 von dem DLA 414 zu dem Speicher und dann zu der GPU 412 und zurück zu dem DLA 414 unter Verwendung des Busses 416 und des Speichers 418. Bei mindestens einer Ausführungsform wird, sobald der DLA 414 die Operationen des Inferencings 406 abgeschlossen hat, ein Ergebnis 424 unter Verwendung des Busses 416 in den Speicher 418 kopiert.
  • 4C ist ein Blockdiagramm, das Inferencing in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform verwendet das vereinheitlichte Programmiermodell ein einziges Paket von Softwarebibliotheken, um Operationen unter Verwendung verschiedener Prozessoren 426, 428, 430, wie z. B. einen Deep-Learning-Beschleuniger (DLA)-Software-Stack, wie er vorab in Verbindung mit 1 beschrieben ist, und eine Bibliothek für parallele Berechnungen auszuführen, die beide von dem einzigen Paket von Bibliotheken bereitgestellt werden, wie z. B. der Compute Uniform Device Architecture (CUDA), um Rechenoperationen unter Verwendung einer Parallelverarbeitungseinheit (PPU), wie z. B. einer Grafikverarbeitungseinheit (GPU) 428 und/oder einem DLA 430, durchzuführen.
  • Bei mindestens einer Ausführungsform wird während des Inferencings 406 ein Originalbild 436 in einem Speicher 434 auf einem Computersystem gespeichert. Bei mindestens einer Ausführungsform wird das Originalbild 436 über einen Bus 432 an eine PPU, wie z. B. die GPU 428, übertragen, um eine oder mehrere Bildverarbeitungsoperationen durchzuführen, was zu einem manipulierten Bild 438 führt. Bei mindestens einer Ausführungsform überträgt die GPU 428 die Daten des manipulierten Bildes 438 über den Bus 432 zurück zu dem Speicher 434. Bei mindestens einer Ausführungsform wird das manipulierte Bild 438 von dem Speicher 434 über den Bus 432 an den DLA 430 übertragen, um Inferencing 406 unter Verwendung des manipulierten Bildes 438 durchzuführen. Während des Inferencings 406, das von dem DLA 430 durchgeführt wird, verwenden alle zusätzlichen Operationen, die von der GPU 428 an dem manipulierten Bild 438 und/oder einem Zwischeninferencing durchgeführt werden, eine einheitliche Speicherarchitektur, wie z. B. eine gemeinsame Zeigeradressierung, um Daten wie z. B. Zwischendaten und/oder das manipulierte Bild 438 zwischen dem DLA 430 und der GPU 428 zu übertragen. Bei mindestens einer Ausführungsform handelt es sich bei der gemeinsamen Zeigeradressierung um Datenwerte, die Speicheradressen zu einem gemeinsam genutzten Speicherraum umfassen, der von zwei oder mehr verschiedenen Typen von Verarbeitungskernen, wie dem DLA 430 und/oder einer oder mehreren PPUs, wie der GPU 428, benutzbar ist. Bei mindestens einer Ausführungsform wird, sobald der DLA 430 Operationen des Inferencing 406 abgeschlossen hat, ein Ergebnis 440 über den Bus 432 in den Speicher 434 kopiert.
  • 5A ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Während ein Deep-Learning-Beschleuniger (DLA) -Softwarestack 512 in 5A für beispielhafte Zwecke verwendet wird, ist es dem Fachmann offensichtlich, dass andere Software und Bibliotheken zur Unterstützung anderer Prozessorhardware in einem segmentierten Programmiermodell verwendet werden können, um beschleunigte Rechenoperationen unter Verwendung einer Vielzahl von Prozessorhardwaretypen durchzuführen.
  • Bei mindestens einer Ausführungsform handelt es sich bei einer Parallelverarbeitungsplattform 502 um Softwareanweisungen, die, wenn sie ausgeführt werden, paralleles Rechnen ermöglichen oder erleichtern. Bei mindestens einer Ausführungsform ist die Parallelverarbeitungsplattform 502, wie z. B. die Compute Uniform Device Architecture (CUDA) oder eine andere hier weiter beschriebene Parallelverarbeitungsplattform, ein Satz von Softwarewerkzeugen, Bibliotheken und/oder Treibern, die es Programmierern und Systemen ermöglichen, eine Schnittstelle zu einer oder mehreren Parallelverarbeitungseinheiten (PPUs), wie z. B. Grafikverarbeitungseinheiten (GPUs), herzustellen und diese zu verwenden. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsplattform 502 eine oder mehrere Schnittstellen, wie z. B. Anwendungsprogrammierschnittstellen (APIs), zu einer Parallelverarbeitungsbibliothek 504 und/oder anderen Bibliotheken 506 als Teil der Parallelverarbeitungsplattform 502 bereit.
  • Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsplattform 502 eine Parallelverarbeitungsbibliothek 504. Bei mindestens einer Ausführungsform handelt es sich bei der Parallelverarbeitungsbibliothek 504 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Berechnungsfunktionen als Ergebnis eines oder mehrerer Funktionsaufrufe an die Parallelverarbeitungsbibliothek 504 ausführen. Bei mindestens einer Ausführungsform handelt es sich bei der Parallelverarbeitungsbibliothek 504 um eine Sammlung von Berechnungsfunktionen und eine aufrufbare Schnittstelle, wie z. B. eine API, um eine Programmierung unter Verwendung einer oder mehrerer PPUs, wie z. B. GPUs, zu ermöglichen oder erleichtern. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsbibliothek 504 eine oder mehrere Funktionen bereit, um eine Graphenausführung unter Verwendung einer oder mehrerer PPUs, wie z. B. GPUs, zu ermöglichen oder zu erleichtern, wie es im Folgenden in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsbibliothek 504 eine oder mehrere Softwarefunktionen zur Durchführung mathematischer Operationen. Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsbibliothek eine oder mehrere Softwarefunktionen zur Durchführung von mathematischen Operationen im Zusammenhang mit neuronalen Netzen und Deep Learning. Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsbibliothek 504 eine oder mehrere Softwarefunktionen, um ein neuronales Netz unter Verwendung einer oder mehrerer PPUs, wie z. B. GPUs, zu betreiben oder zu bearbeiten.
  • Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsplattform 502 andere Bibliotheken 506. Bei mindestens einer Ausführungsform handelt es sich bei den anderen Bibliotheken 506 um einen Satz von Softwarebibliotheken, der Anweisungen umfasst, die bei ihrer Ausführung Rechenoperationen durchführen. Bei mindestens einer Ausführungsform umfassen die anderen Bibliotheken 506 Funktionen zur Durchführung der Interoperation und der Kommunikation von Daten zwischen einer oder mehreren PPUs, wie z. B. GPUs, und einem oder mehreren Prozessoren, die nicht von der Parallelverarbeitungsplattform 502 unterstützt werden, wie z. B. dem DLA in 5A. Bei mindestens einer Ausführungsform umfassen die anderen Bibliotheken 506 Funktionen zur Durchführung von Operationen, die nicht von der Parallelverarbeitungsbibliothek 504 bereitgestellt werden. Bei mindestens einer Ausführungsform umfassen die anderen Bibliotheken 506 Funktionsaufrufe, die als Teil einer Schnittstelle, wie z. B. einer API, zugänglich sind, die von den anderen Bibliotheken 506 und/oder der Parallelverarbeitungsplattform 502 zur Verwendung durch Programmierer und/oder Systeme bereitgestellt wird, um Parallelverarbeitungsoperationen zu ermöglichen oder zu erleichtern.
  • Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsplattform 502 PPU-Werkzeuge und -Treiber 508. Bei mindestens einer Ausführungsform handelt es sich bei den PPU-Werkzeugen und -Treibern 508 um Softwareanweisungen, die, wenn sie ausgeführt werden, Funktionen zur Überwachung, Konfiguration und/oder anderweitigen Interaktion mit einer oder mehreren PPUs, wie z. B. GPUs, bereitstellen. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und -Treiber 508 eine oder mehrere Bibliotheken und/oder Werkzeuge bzw. Tools zur Leistungsüberwachung. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und - Treiber 508 einen oder mehrere Benutzer-Mode- und/oder Kernel-Mode-Treiber, um eine Schnittstelle zu einer oder mehreren PPUs, wie z. B. GPUs, zu bilden, um diese zu konfigurieren oder um diese anderweitig zu unterstützen. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und -Treiber 508 Firmware zur Unterstützung einer oder mehrerer PPUs, wie z. B. GPUs. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und -Treiber 508 beliebige andere Software-Werkzeuge und/oder Bibliotheken, um die Ausführung eines oder mehrerer Software-Programme unter Verwendung der einen oder der mehreren PPUs, wie z. B. GPUs, mit der Parallelverarbeitungsplattform 502 zu ermöglichen oder erleichtern.
  • Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die Parallelverarbeitungsplattform 502 die Ausführung einer oder mehrerer Berechnungs-Aufgaben oder Tasks, wie z. B. Inferencing. Bei mindestens einer Ausführungsform wird die eine oder werden die mehreren Rechen-Aufgaben oder Tasks in Teilaufgaben oder -Sub-Tasks aufgeteilt, wobei eine oder mehrere der Teilaufgaben oder Sub-Tasks von der Parallelverarbeitungsplattform 502 und eine oder mehrere der Teilaufgaben oder Sub-Tasks von anderer Rechenhardware, wie z. B. einem DLA, ausgeführt werden. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsplattform 502 eine oder mehrere Software- und/oder Hardwareschnittstellen bereit und/oder nutzt diese, um mit anderer Rechenhardware, wie z. B. einem DLA, zu interagieren und Daten auszutauschen. Bei mindestens einer Ausführungsform synchronisiert 510 die Parallelverarbeitungsplattform 502 Daten zwischen der Parallelverarbeitungsplattform 502 und Software zur Unterstützung einer anderen Hardwareplattform, wie z. B. dem DLA-Software-Stack 512, wie es vorab in Verbindung mit 1 beschrieben ist.
  • Bei mindestens einer Ausführungsform synchronisiert 510 die Parallelverarbeitungsplattform 502 Daten zwischen der Parallelverarbeitungsplattform 502 und einer oder mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, unter Verwendung einer oder mehrerer Schnittstellen, wie APIs. Bei mindestens einer Ausführungsform wird eine oder werden mehrere der Schnittstellen zum Synchronisieren 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z. B. dem DLA-Software-Stack 512, von der Parallelverarbeitungsplattform 502 bereitgestellt. Bei mindestens einer Ausführungsform wird eine oder werden mehrere der Schnittstellen zum Synchronisieren 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z. B. dem DLA-Software-Stack 512, von der einen oder den mehreren anderen Softwareplattformen bereitgestellt. Bei mindestens einer Ausführungsform wird eine oder werden mehrere der Schnittstellen zum Synchronisieren 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z.B. dem DLA-Software-Stack 512, durch Bibliotheken von Drittanbietern bereitgestellt, wie z.B. EGLStream oder jede andere Schnittstelle zum Streamen von Daten zwischen verschiedenen Prozessoren unter Verwendung eines Kommunikationsbusses, wie es hier beschrieben ist.
  • Bei mindestens einer Ausführungsform werden zur Synchronisierung 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, ein oder mehrere Aufrufe an eine Schnittstelle sowohl von der Parallelverarbeitungsplattform 502 als auch von der einen oder den mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, durchgeführt. Bei mindestens einer Ausführungsform umfasst der eine oder umfassen die mehreren Aufrufe an die Schnittstelle zum Synchronisieren von Daten Aufrufe zum Einrichten von Kommunikations- oder Datenübertragungsströmen, zum Konfigurieren der Ströme, zum Konfigurieren von zu übertragenden Daten, zum Synchronisieren der Ströme und/oder zu jeder anderen Schnittstellenoperation, die erforderlich ist, um Daten zwischen einer oder mehreren PPUs, die von der Parallelverarbeitungsplattform 502 unterstützt werden, und einem oder mehreren anderen Prozessorkernen, die von der einen oder den mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, unterstützt werden, zu übertragen.
  • 5B ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Während eine Deep-Learning-Beschleuniger-Bibliothek 522 (DLA-Bibliothek), DLA-Laufzeit und DLA-Treiber 524 in 5B für beispielhafte Zwecke verwendet werden, ist es für den Fachmann offensichtlich, dass andere Software und Bibliotheken zur Unterstützung anderer Prozessorhardware mit einer Parallelverarbeitungsplattform 514 verbunden sein können, um beschleunigte Rechenoperationen unter Verwendung einer Vielzahl von Prozessortypen in dem vereinheitlichten Programmiermodell durchzuführen.
  • Bei mindestens einer Ausführungsform sind zur Verringerung des Aufwands der Synchronisierung 510 zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z. B. dem DLA-Software-Stack 512, die eine oder die mehreren anderen Softwareplattformen, wie z. B. die Compute Uniform Device Architecture (CUDA) oder jede andere Parallelverarbeitungsplattform und/oder Bibliotheken, die hier weiter beschrieben sind, in die Parallelverarbeitungsplattform 502 für eine vereinheitlichte Parallelverarbeitungsplattform 514 integriert. Bei mindestens einer Ausführungsform vereinfacht die vereinheitlichte Parallelverarbeitungsplattform 514 die Programmierung einer oder mehrerer Rechen-Aufgaben oder Tasks, um die eine oder die mehreren Parallelverarbeitungseinheiten (PPUs), wie Grafikverarbeitungseinheiten (GPUs), sowie den einen oder die mehreren anderen Prozessorkerne, wie den DLA, zu nutzen.
  • Bei mindestens einer Ausführungsform sind die DLA-Bibliothek 522, die DLA-Laufzeit und der DLA-Treiber 524, wie es vorab in Verbindung mit 1 beschrieben ist, mit der Parallelverarbeitungsbibliothek 516, den anderen Bibliotheken 518 und den PPU-Werkzeugen und -Treibern 520 in die einheitliche Parallelverarbeitungsplattform 514 integriert. Bei mindestens einer Ausführungsform handelt es sich bei der DLA-Bibliothek 522, wie z. B. cuDLA oder einer anderen Bibliothek zur Durchführung von Berechnungen unter Verwendung eines oder mehrerer anderer Prozessorkerne, wie z. B. dem DLA, um Softwareanweisungen, die, wenn sie ausgeführt werden, die Durchführung einer oder mehrerer Rechenoperationen durch einen oder mehrere Prozessorkerne und/oder Beschleuniger, wie z. B. den DLA, ermöglichen oder erleichtern.
  • Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 benutzerseitige Schnittstellen, Datensynchronisation und Interoperabilität mit der Parallelverarbeitungsbibliothek 516 und/oder anderen Bibliotheken 518 bereit. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zur Verfügung, um den Speicher der Parallelverarbeitungsplattform 514 so zu registrieren, dass er von einem oder mehreren Prozessorkernen, wie z. B. dem DLA, benutzbar ist. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zum Starten einer asynchronen, eigenständigen Ausführung einer oder mehrerer Rechen-Aufgaben oder Tasks unter Verwendung eines oder mehrerer Prozessorkerne, wie z. B. dem DLA, bereit.
  • Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zum Starten der asynchronen Ausführung einer oder mehrerer Rechen-Aufgaben oder Tasks als Teil eines oder mehrerer Ströme oder Ausführungsgraphen bereit, die den Graphencode der Parallelverarbeitungsplattform 514 unter Verwendung eines oder mehrerer Prozessorkerne, wie etwa den DLA, umfassen. Bei mindestens einer Ausführungsform handelt es sich bei dem Graphencode um Anweisungen, die bei ihrer Ausführung den Ausführungsgraphen ausführen. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zur Bereitstellung von Signalen und/oder einer Signalisierung zwischen einem oder mehreren Prozessorkernen, wie dem DLA, und einem oder mehreren anderen Prozessorkernen, wie PPUs, bereit. Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die DLA-Bibliothek 522 eine nahtlose Integration zwischen der Programmierung für den einen oder die mehreren anderen Prozessorkerne, wie z. B. den DLA, und die eine oder die mehreren PPUs, wie z. B. den GPUs. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 eine Strom- und/oder Ereignis-basierte Synchronisierung bereit. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsbibliothek 516 eine Strom- und/oder Ereignis-basierte Synchronisierung bereit. Bei mindestens einer Ausführungsform stellt jede andere Komponente der Parallelverarbeitungsplattform 514 eine Strom- und/oder Ereignis-basierte Synchronisierung bereit. Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die DLA-Bibliothek 522 die Nutzung eines zugewiesenen Speichers in der Parallelverarbeitungsplattform 514 durch den einen oder die mehrere anderen Prozessorkerne, wie z. B. den DLA. Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die DLA-Bibliothek 522 eine einheitliche virtuelle Adressierung des von der Parallelverarbeitungsplattform 514 nutzbaren Speichers.
  • Bei mindestens einer Ausführungsform handelt es sich bei der DLA-Laufzeit und den DLA-Treibern 524 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine Daten- und Hardwareinitialisierung, ein Daten- und/oder Puffermanagement, eine Speicherabbildung, Semaphoren für die Synchronisierung zwischen dem DLA und der einen oder den mehreren PPUs, wie den GPUs, und/oder jede andere Funktion durchführen, um die Ausführung einer oder mehrerer Rechenoperationen durch den DLA zu ermöglichen oder zu erleichtern.
  • Bei mindestens einer Ausführungsform entsteht bei der vereinheitlichten Parallelverarbeitungsplattform 514 kein Zusatzaufwand bzw. Overhead beim Einrichten von Abhängigkeiten zwischen Softwarecode, der Tasks angibt, die von der einen oder den mehreren PPUs, wie z. B. den GPUs, auszuführen sind, und Softwarecode, der Tasks angibt, die von dem einen oder den mehreren anderen Prozessorkernen, wie z. B. dem DLA, auszuführen sind, weil auf Speicher, auf den als Teil der Parallelverarbeitungsplattform 514 zugreifbar ist, mit gemeinsam genutzten Zeigern (Speicheradressen) zugegriffen wird. Um die Datenkonsistenz zu verwalten, startet die Parallelverarbeitungsplattform 514 in einer Ausführungsform Tasks, die für den einen oder die mehreren anderen Prozessorkerne, wie z. B. den DLA, spezifisch sind, als Teil des einen oder der mehreren Ströme oder Ausführungsgraphen, die von der Parallelverarbeitungsplattform 514 verwendet werden, um Tasks unter Verwendung der einen oder der mehreren PPUs durchzuführen. Bei mindestens einer Ausführungsform ermöglicht das Starten der Tasks, die für den einen oder die mehreren anderen Prozessorkerne, wie z. B. den DLA, spezifisch sind, als Teil des einen oder der mehreren Ströme oder Ausführungsgraphen, die von der Parallelverarbeitungsplattform 514 verwendet werden, um die Tasks unter Verwendung der einen oder der mehreren PPUs auszuführen, der Parallelverarbeitungsplattform, optimierte Cache-Konsistenzoperationen als Teil der Ströme oder Ausführungsgraphen durchzuführen. Bei mindestens einer Ausführungsform verwendet die Parallelverarbeitungsplattform 514 keine externen Schnittstellen, um die Synchronisation zwischen Tasks, die von der einen oder den mehreren PPUs ausgeführt werden, und Tasks, die von dem einen oder den mehreren anderen Prozessorkernen, wie dem DLA, ausgeführt werden, zu verwalten, da die Tasks als Teil eines einheitlichen Stroms und/oder Ausführungsgraphen gestartet werden.
  • 6 ist ein Blockdiagramm, das eine vereinheitlichte Architektur zur Durchführung von Rechenoperationen unter Verwendung einer Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform zeigt. Während Deep Learning Accelerator (DLA)-Software 608, 620, 628 und Hardware 638 in 6 für beispielhafte Zwecke verwendet werden, ist es für den Fachmann offensichtlich, dass verschiedene andere Prozessor-Hardware und Software zur Unterstützung der anderen Prozessor-Hardware in der vereinheitlichten Architektur verwendet werden können, um Rechenoperationen unter Verwendung der Vielzahl von Prozessortypen durchzuführen.
  • Bei mindestens einer Ausführungsform umfasst die einheitliche Architektur zur Durchführung von Rechenoperationen, wie Inferencing und/oder andere Deep-Learning-Aufgaben bzw. Tasks sowie jede andere Rechen-Aufgabe bzw. Task, die in Teil-Aufgaben bzw. Tasks aufgeteilt und unter Verwendung eines oder mehrerer Prozessorkerne durchgeführt werden kann, sowohl Komponenten von Software 602 als auch Hardware 632. Bei mindestens einer Ausführungsform umfasst die Hardware 632 zur Ermöglichung oder Erleichterung der Durchführung von Rechenoperationen durch mehrere Rechen-Aufgaben bzw. Tasks und/oder Rechenoperationen unter Verwendung eines oder mehrerer unterschiedlicher Prozessorkerne zumindest einen Speicher 646, einen Kommunikationsbus 644 und eine oder mehrere zentrale Verarbeitungseinheiten (CPUs) 634, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform umfasst die Hardware 632 zur Ermöglichung oder Erleichterung der Durchführung von Rechenoperationen durch mehrere Rechen-Aufgaben bzw. Tasks und/oder Rechenoperationen unter Verwendung des einen oder der mehreren verschiedenen Prozessorkerne eine oder mehrere Parallelverarbeitungseinheiten (PPUs) 636, einen oder mehrere Deep-Learning-Beschleuniger (DLAs) 638, einen oder mehrere programmierbare Bildverarbeitungsbeschleuniger (Programmable Vision Accelerators (PVAs)) und/oder beliebige andere Prozessorkerne 642 mit einer anderen Prozessorarchitektur, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfasst die einheitliche Architektur zur Durchführung von Rechenoperationen, wie Inferencing und/oder andere Deep-Learning-Aufgaben bzw. Tasks sowie jede andere Rechen-Aufgabe bzw. Task, die in Teil-Aufgaben bzw. Sub-Tasks aufteilbar und unter Verwendung eines oder mehrerer Prozessorkerne durchführbar ist, verschiedene Software-Komponenten 602. Bei mindestens einer Ausführungsform umfassen die Software-Komponenten 602 der vereinheitlichten Architektur eine Anwendung 604. Bei mindestens einer Ausführungsform handelt es sich bei der Anwendung 604 um Softwareanweisungen, die bei ihrer Ausführung eine oder mehrere Aufgaben bzw. Tasks ausführen, wie z. B. Rechenoperationen zur Durchführung von Inferencing oder einer anderen Rechen-Aufgabe bzw. Task unter Verwendung eines oder mehrerer Prozessorkerne 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 Softwareanweisungen zur Durchführung einer oder mehrerer Aufgaben bzw. Tasks, die in eine Vielzahl von Teil-Aufgaben bzw. Sub-Tasks unterteilt werden können, die von der Vielzahl verschiedener Prozessorkerne 634, 636, 638, 640, 642 auszuführen sind. Bei mindestens einer Ausführungsform wird die Anwendung 604 unter Verwendung eines Compilers, der für die Parallelverarbeitungsplattform spezifisch ist, oder eines Compilers, der Bibliotheken verwendet, die für die Parallelverarbeitungsplattform spezifisch sind, wie z. B. die Compute Uniform Device Architecture (CUDA) oder eine andere Parallelverarbeitungsplattform und/oder Bibliothek, die hier weiter beschrieben ist, erzeugt. Bei mindestens einer Ausführungsform wird die Anwendung 604 unter Verwendung eines Compilers, der für eine bestimmte Prozessorarchitektur spezifisch ist, oder eines Compilers, der Bibliotheken verwendet, die für eine bestimmte Prozessorarchitektur spezifisch sind, wie z. B. eine bestimmte oder allgemeine GPU-Architektur, eine DLA-Architektur oder eine andere Prozessorarchitektur, wie sie hier beschrieben ist, erzeugt. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 einen ausführbaren Code. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 Objektcode. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 jeden anderen Quellcode, der zur Ausführung unter Verwendung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zu interpretieren ist.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der einheitlichen Architektur Bibliotheken und Frameworks 606. Bei mindestens einer Ausführungsform sind die Bibliotheken und Frameworks 606 Sätze von Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Operationen durchführen, um die Ausführung einer oder mehrerer Berechnungs-Aufgaben bzw. Tasks unter Verwendung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zu ermöglichen oder zu erleichtern. Bei mindestens einer Ausführungsform umfassen die Bibliotheken und Frameworks 606 Softwarecode zur Ermöglichung oder Erleichterung der Programmierung der Anwendung 604 für den einen oder die mehreren Prozessorkerne 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform umfassen die Bibliotheken und Frameworks 606 Softwarecode zur Durchführung verschiedener hier beschriebener Rechenoperationen, wie z. B. Bildverarbeitung durch eine Bildverarbeitungsbibliothek 610 und/oder Deep-Learning-Operationen, die durch den DLA 638 unter Verwendung einer DLA-Bibliothek 608 zu beschleunigen sind, wie es vorab in Verbindung mit 5A und 5B beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Bibliotheken und Frameworks 606 Bibliotheken zur allgemeinen Unterstützung, wie verschiedene CUDA-Bibliotheken, die hier weiter beschrieben sind, um paralleles Rechnen unter Verwendung der verschiedenen Prozessoren 634, 636, 638, 640, 642, einschließlich der einen oder der mehreren PPUs 636, wie den GPUs, durchzuführen.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der vereinheitlichten Architektur Stream-Bibliotheken bzw. Strom-Bibliotheken 612, 614. Bei mindestens einer Ausführungsform entsprechen die Strom-Bibliotheken 612, 614 Softwareanweisungen, die, wenn sie ausgeführt werden, Operationen zur Ermöglichung oder Erleichterung von Stream-Operationen bzw. Strom-Operationen zur Übertragung von Daten zwischen Prozessoren oder zwischen Anwendungen durchführen, die von den verschiedenen Prozessoren 634, 636, 638, 640, 642 ausgeführt werden. Bei mindestens einer Ausführungsform umfassen die Strombibliotheken 612, 614 eine Bibliothek zur Stromsynchronisation 612. Bei mindestens einer Ausführungsform umfasst die Bibliothek zur Stromsynchronisation 612 Softwareanweisungen, die bei ihrer Ausführung die Datensynchronisation zwischen einer oder mehreren Aufgaben bzw. Tasks ermöglichen oder erleichtern, die von dem einen oder den mehreren Prozessorkernen 634, 636, 638, 640, 642 ausgeführt werden. Bei mindestens einer Ausführungsform umfassen die Strombibliotheken 612, 614 eine Bibliothek für einen EGL-Strom 614. Bei mindestens einer Ausführungsform handelt es sich bei der Bibliothek für einen EGL-Strom 614 um Softwareanweisungen, die, wenn sie ausgeführt werden, die Übertragung von Bild-Frame-Sequenzen zwischen Softwarekomponenten unter Verwendung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 ermöglichen oder erleichtern.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der einheitlichen Architektur Benutzer-Mode-Treiber 616 und/oder andere Benutzer-Mode-Software und/oder Schichten. Bei mindestens einer Ausführungsform sind die Benutzer-Mode-Treiber 616 Softwareanweisungen, die, wenn sie ausgeführt werden, Schnittstellen zur Verwaltung von Ressourcen bereitstellen, die von dem einen oder den mehreren Prozessorkernen 634, 636, 638, 640, 642 verwendet werden. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 Softwareanweisungen zur Ermöglichung oder Erleichterung der Programmierung der einen oder der mehreren Anwendungen 604 zur Nutzung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 Softwareanweisungen zur Ermöglichung oder Erleichterung der Programmierung von Abschnitten der einen oder der mehreren Anwendungen 604 oder anderer ausführbarer Codes zur Verwendung eines ersten Prozessorkerntyps des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zur Ausführung eines ersten Abschnitts des ausführbaren Codes der einen oder der mehreren Anwendungen 604 und eines zweiten Prozessorkerntyps des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zur Ausführung eines zweiten Abschnitts des ausführbaren Codes der einen oder der mehreren Anwendungen 604. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 einen Parallelrechentreiber 618, wie z. B. einen CUDA-Benutzer-Mode-Treiber oder einen anderen Parallelrechentreiber, der hier weiter beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 die DLA-Laufzeit 620, wie sie vorab in Verbindung mit den 5A und 5B beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 eine PVA-Laufzeit 622, um eine Schnittstelle bereitzustellen, um eine Interaktion mit Hardwarekernen zur PVA 640 zu ermöglichen oder zu erleichtern.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der einheitlichen Architektur Komponenten auf der Ebene des Betriebssystems (OS), wie z. B. Kernel und/oder Kernel-Mode-Treiber 624. Bei mindestens einer Ausführungsform sind die Komponenten auf Betriebssystemebene wie Kernel und/oder Kernel-Mode-Treiber Softwareanweisungen, die, wenn sie ausgeführt werden, die Interaktion mit einer oder mehreren Ressourcen des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 durch den einen oder die mehreren Benutzer-Mode-Treiber 616 und/oder die eine oder die mehreren Bibliotheken und Frameworks 606 sowie die eine oder die mehreren Anwendungen 604 ermöglichen oder erleichtern. Bei mindestens einer Ausführungsform handelt es sich bei den Kernels und Kernel-Mode-Treibern (KMDs) 624 um systemseitige Software, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfassen der Kernel und die KMDs 624 Softwareanweisungen, die, wenn sie ausgeführt werden, die Ressourcenverwaltung für einen oder mehrere Typen der Prozessoren 634, 636, 638, 640, 642 ermöglichen oder erleichtern und eine Schnittstelle für den Benutzer-Mode-Treiber 616 und/oder Benutzerraumbibliotheken und Frameworks 606 bereitstellen, um mit dem einen oder den mehreren Typen der Prozessoren 634, 636, 638, 640, 642 zu interagieren. Bei mindestens einer Ausführungsform übernehmen der Kernel und die KMDs 624 die Aufgaben- bzw. Task-Verwaltung für den einen oder die mehreren Typen der Prozessoren 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform führen der Kernel und die KMDs 624 eine Aufgaben- bzw. Task-Ablaufsteuerung und Warteschlangenverwaltung (Queueing) durch, was von einem oder mehreren Kernen der Prozessoren 634, 636, 638, 640, 642 ausgeführt wird. Bei mindestens einer Ausführungsform erstellen und verwalten der Kernel und die KMDs 624 Aufgaben- bzw. Task-Deskriptoren, die alle erforderlichen Ressourcen und Aktionen zur Ausführung einzelner Aufgaben bzw. Tasks angeben.
  • Bei mindestens einer Ausführungsform weisen der Kernel und die KMDs 624 Puffer zu und verwalten sie, um die Eingabe und Ausgabe von Daten, wie z. B. Tensoren, an Aufgaben bzw. Tasks zu ermöglichen oder zu erleichtern, die von einem oder mehreren Kernen der Prozessoren 634, 636, 638, 640, 642 auszuführen sind. Bei mindestens einer Ausführungsform übermitteln der Kernel und die KMDs 624 Aufgaben bzw. Tasks und/oder Aufgaben- bzw. Task-Deskriptoren an eine Firmware für einen oder mehrere Typen der Prozessoren 634, 636, 638, 640, 642, um die Aufgaben bzw. Tasks unter Verwendung des einen oder der mehreren Kerne der Prozessoren 634, 636, 638, 640, 642 durchzuführen. Bei mindestens einer Ausführungsform handhaben der Kernel und die KMDs 624 Benutzer-Mode-Übermittlungen, wobei ein oder mehrere der Benutzer-Mode-Treiber 616 eine Arbeit direkt an die Firmware für den einen oder die mehrere Typen der Prozessoren 634, 636, 638, 640, 642 übermitteln, und der Kernel und die KMDs 624 Befehlspuffer zur Kommunikation zwischen den Benutzer-Mode-Treibern 616 und der Firmware zuweisen.
  • Bei mindestens einer Ausführungsform umfassen die Kernel und die KMDs 624 Parallelrechen-Treiber und -Werkzeuge 626, wie z. B. einen CUDA-Kernel-Mode-Treiber und/oder CUDA-Werkzeuge für die Leistungsüberwachung und/oder andere PPU-bezogene Operationen, wie sie hier beschrieben sind. Bei mindestens einer Ausführungsform umfassen die Kernel und KMDs 624 alle anderen Treiber und/oder Tools für die parallele Datenverarbeitung, die hier weiter beschrieben sind. Bei mindestens einer Ausführungsform umfassen die Kernel und KMDs 624 DLA-KMDs 628, wie es vorab in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Kernel und KMDs 624 PVA-KMDs 630, wie es hier weiter beschrieben ist.
  • 7 ist ein Blockdiagramm, das einen Ausführungsgraphen 700 zur Ausführung von ausführbarem Code, wie z.B. Kernel 704, 706, 708, 710, 712, 714, 716, unter Verwendung einer Vielzahl von Prozessorkernen mit verschiedenen Architekturen, einschließlich Parallelverarbeitungseinheiten (PPUs), wie z.B. Grafikverarbeitungseinheiten (GPUs), Beschleunigern, wie z.B. Deep-Learning-Beschleunigern (DLAs), und/oder jedem anderen Typ von Prozessortyp oder Architektur, wie er hier weiter beschrieben ist, gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform erstellt eine Parallelverarbeitungsplattform, wie CUDA oder eine andere Parallelverarbeitungsplattform oder ein Satz von Bibliotheken, die hier weiter beschrieben sind, einen oder mehrere Ausführungsgraphen 700, der bzw. die ausführbaren Code 704, 706, 708, 710, 712, 714, 716 angibt bzw. angeben, der von einem oder mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen auszuführen ist. Bei mindestens einer Ausführungsform handelt es sich bei dem Ausführungsgraphen 700 um Softwareanweisungen, die bei ihrer Ausführung bewirken, dass ein oder mehrere Segmente des ausführbaren Codes 704, 706, 708, 710, 712, 714, 716 von einem oder mehreren Prozessorkernen in einer bestimmten Reihenfolge ausgeführt werden. Die Segmente des ausführbaren Codes 704, 706, 708, 710, 712, 714, 716 werden hier als Kernel bezeichnet. Bei mindestens einer Ausführungsform gibt der Ausführungsgraph 700 eine oder mehrere Ressourcen eines oder mehrerer Prozessorkerne an, die vor und während der Ausführung des einen oder der mehreren Kernel 704, 706, 708, 710, 712, 714, 716 zu initialisieren sind.
  • Bei mindestens einer Ausführungsform startet eine Zentraleinheit (CPU) 702 den Ausführungsgraphen 700 und initialisiert eine oder mehrere Ressourcen, wie z. B. Speicher, Register, Caches und/oder jede andere Prozessorressource, die von dem einen oder den mehreren Kernels 704, 706, 708, 710, 712, 714, 716 während der Ausführung auf einem oder mehreren Prozessorkernen zu verwenden sind. Bei mindestens einer Ausführungsform werden nach der Initialisierung der eine oder die mehreren Kernels 704, 706, 708, 710, 712, 714, 716 von einem oder mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen seriell ausgeführt, bis jeder des einen oder der mehreren Kernels 704, 706, 708, 710, 712, 714, 716 die Ausführung abgeschlossen hat. Bei mindestens einer Ausführungsform werden nach der Initialisierung der eine oder die mehreren Kernels 704, 706, 708, 710, 712, 714, 716 von dem einen oder den mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen parallel ausgeführt, bis jeder von dem einen oder den mehreren Kernels 704, 706, 708, 710, 712, 714, 716 die Ausführung abgeschlossen hat. Bei mindestens einer Ausführungsform werden nach der Initialisierung der eine oder die mehreren Kernels 704, 706, 708, 710, 712, 714, 716 von dem einen oder den mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen in einer durch den Ausführungsgraphen 700 angegebenen Reihenfolge ausgeführt, bis jeder von dem einen oder den mehreren Kernels 704, 706, 708, 710, 712, 714, 716 die Ausführung abgeschlossen hat. Bei mindestens einer Ausführungsform gibt der Ausführungsgraph 700 eine Teilmenge der Kernels 704, 706, 708, 710, 712, 714, 716, die seriell auszuführen sind, und eine Teilmenge der Kernels 704, 706, 708, 710, 712, 714, 716, die parallel auszuführen sind, an.
  • Eine Ausführungsreihenfolge bei dem Ausführungsgraphen 700 ist in 7 beispielhaft dargestellt, und der Fachmann versteht, dass die Kernels 704, 706, 708, 710, 712, 714, 716 des Ausführungsgraphen 700 in jeder beliebigen Reihenfolge ausgeführt werden können, die anderweitig durch den Ausführungsgraphen 700 angegeben ist, um eine oder mehrere Rechen-Aufgaben bzw. Tasks unter Verwendung der Kernels 704, 706, 708, 710, 712, 714, 716 auszuführen. In mindestens einer Ausführungsform wird, nachdem die CPU 702 den Ausführungsgraphen 700 gestartet hat, ein erster Kernel 704 von einem oder mehreren Prozessorkernen ausgeführt, die einen ersten Architekturtyp haben, wie z. B. eine CPU, GPU, einen DLA oder einen anderen Architekturtyp, der hier weiter beschrieben ist. Bei mindestens einer Ausführungsform werden, nachdem der eine oder die mehreren Prozessorkerne mit dem ersten Architekturtyp den ersten Kernel 704 ausgeführt haben, ein zweiter 706 und ein dritter 708 Kernel von dem einen oder den mehreren Prozessorkernen mit dem ersten Architekturtyp parallel zu einem vierten Kernel 710, der von einem oder mehreren Prozessorkernen mit einem zweiten Architekturtyp, wie einer CPU, GPU, einem DLA oder einem anderen Architekturtyp, der hier weiter beschrieben ist, ausgeführt wird, ausgeführt. Bei mindestens einer Ausführungsform stehen die von dem ersten Kernel 704, dem zweiten Kernel 706, dem dritten Kernel 708 und dem vierten Kernel 710 erzeugten Daten einem fünften Kernel 712 zur Verfügung, wobei gemeinsam genutzte Speicherzeiger der Parallelverarbeitungsplattform verwendet werden, wie es vorab in Verbindung mit den 5A, 5B und 6 beschrieben ist.
  • Bei mindestens einer Ausführungsform wird, sobald der zweite Kernel 706 und der dritte Kernel 708 von dem einen oder den mehreren Prozessorkernen mit der ersten Architektur parallel zu dem vierten Kernel 710, der von dem einen oder den mehreren Prozessorkernen mit der zweiten Architektur ausgeführt wird, ausgeführt werden, ein fünfter Kernel 712 seriell zu dem einen oder den mehreren Prozessorkernen mit der ersten Architektur ausgeführt. Die von dem fünften Kernel 712 erzeugten Daten stehen in einer Ausführungsform einem sechsten Kernel 714 und einem siebten Kernel 716 über gemeinsam genutzte Speicherzeiger der Parallelverarbeitungsplattform zur Verfügung, wie es vorab in Verbindung mit den 5A, 5B und 6 erläutert ist. Bei mindestens einer Ausführungsform wird nach der Ausführung des fünften Kernels 712 durch den einen oder die mehreren Prozessorkerne mit der ersten Architektur, wie es hier beschrieben ist, ein sechster Kernel 714 durch einen oder mehrere Prozessorkerne mit einer dritten Architektur, wie z. B. einer CPU, GPU, einem DLA oder einem anderen Architekturtyp, der hier weiter beschrieben ist, ausgeführt. Bei mindestens einer Ausführungsform stehen die von dem sechsten Kernel 714 erzeugten Daten einem siebten Kernel 716 zur Verfügung, wobei gemeinsam genutzte Speicherzeiger der Parallelverarbeitungsplattform verwendet werden, wie es vorab in Verbindung mit den 5A, 5B und 6 beschrieben ist.
  • Bei mindestens einer Ausführungsform wird, sobald der sechste Kernel 714 von dem einen oder den mehreren Prozessorkernen mit der dritten Architektur ausgeführt wurde, ein siebter Kernel 716 von dem einen oder den mehreren Prozessorkernen mit der ersten Architektur ausgeführt, wie es vorab beschrieben ist. Bei mindestens einer Ausführungsform ist, sobald der eine oder die mehreren Prozessorkerne mit der ersten Architektur den siebten Kernel 716 ausgeführt haben, der Ausführungsgraph 700 abgeschlossen 718 und die Ausführung kehrt zu der CPU zurück.
  • 8 veranschaulicht ein Verfahren 800 zur Ausführung von ausführbarem Code für eine Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform beginnt das Verfahren 800 bei 802, indem ein Ausführungsgraph gestartet wird, wie es vorab in Verbindung mit 7 beschrieben ist. Während der Ausführung umfasst bei einer Ausführungsform jeder Knoten des Ausführungsgraphen ausführbaren Code, wie z. B. einen Kernel, der von einem oder mehreren Prozessorkernen einer bestimmten Architektur oder eines bestimmten Typs 804 auszuführen ist, wie es vorab in Verbindung mit 7 beschrieben ist.
  • Wenn der Kernel von einem Typ 804 einer Prozessorarchitektur wie einer Parallelverarbeitungseinheit (PPU) auszuführen ist, dann führt eine oder führen mehrere PPUs und/oder PPU-Kerne bei mindestens einer Ausführungsform von einer PPU beschleunigte Operationen 806 aus, die durch ausführbaren Code und/oder Operationen in dem Kernel angegeben sind. Wenn der Kernel von einem Typ 804 einer Prozessorarchitektur wie einem Deep-Learning-Beschleuniger (DLA) auszuführen ist, dann führt ein oder führen mehrere DLAs und/oder DLA-Kerne bei mindestens einer Ausführungsform von einem DLA beschleunigte Operationen 808 aus, die durch ausführbaren Code und/oder Operationen in dem Kernel angegeben sind. Wenn ein Kernel von einem anderen Typ 804 einer Prozessorarchitektur, wie sie hier weiter beschrieben ist, auszuführen ist, dann führt ein oder führen mehrere Prozessorkerne dieses anderen Architekturtyps bei mindestens einer Ausführungsform Rechenoperationen 810 aus, die durch ausführbaren Code und/oder Operationen in einem Kernel angegeben sind.
  • Sobald der eine oder die mehreren Kernels 806, 808, 810 von einem oder mehreren Kernen von einer oder mehreren Architekturtypen 804 ausgeführt worden sind, werden bei mindestens einer Ausführungsform von jedem des einen oder der mehreren Kernels optional Daten und/oder andere Berechnungsergebnisse zwischen jedem des einen oder der mehreren Kerne unter Verwendung von gemeinsam genutzten Zeigern mittels eines von der Parallelverarbeitungsplattform verwalteten Speichers synchronisiert 812, wie es vorab in Verbindung mit den 5B, 6 und 7 beschrieben ist. Wenn keine weiteren Kernel in dem Ausführungsgraphen auszuführen sind, wird bei mindestens einer Ausführungsform der Ausführungsgraph beendet 814 und das Verfahren 800 endet 816. Wenn zusätzliche Kernels in dem Ausführungsgraphen auszuführen sind, wird bei mindestens einer Ausführungsform das Verfahren 800 fortgesetzt, indem bestimmt wird, welcher oder welche Prozessorkerne mit einem spezifischen Architekturtyp 804 den jeweils nachfolgenden Kernel 806, 808, 810 in dem Ausführungsgraphen auszuführen hat bzw. haben.
  • In der folgenden Beschreibung werden zahlreiche spezifische Details dargelegt, um ein gründlicheres Verständnis von mindestens einer Ausführungsform zu ermöglichen. Dem Fachmann ist jedoch klar, dass die erfindungsgemäßen Konzepte auch ohne eines oder mehrere dieser spezifischen Details ausgeführt werden können.
  • Rechenzentrum
  • 9 veranschaulicht ein beispielhaftes Rechenzentrum 900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Rechenzentrum 900, ohne darauf beschränkt zu sein, eine Rechenzentrum-Infrastrukturschicht 910, eine Frameworkschicht 920, eine Softwareschicht 930 und eine Anwendungsschicht 940.
  • In mindestens einer Ausführungsform, wie in 9 gezeigt, kann die Rechenzentrum-Infrastrukturschicht 910 einen Ressourcenorchestrator 912, gruppierte Rechenressourcen 914 und Knoten-Rechenressourcen („Knoten-C.R.s“) 916(1)-916(N) beinhalten, wobei „N“ eine beliebige ganze, positive Zahl darstellt. In mindestens einer Ausführungsform können die Knoten-C.R.s 916(1)-916(N), ohne darauf beschränkt zu sein, eine beliebige Anzahl von Zentralverarbeitungseinheiten („CPUs“) oder anderen Prozessoren (einschließlich Beschleunigern, feldprogrammierbaren Gate-Arrays („FPGAs“), Datenverarbeitungseinheiten bzw. Data Processing Units („DPUs“) in Netzwerkeinrichtungen, 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 916(1)-916(N) ein Server mit einer oder mehreren der vorstehend erwähnten Rechenressourcen sein.
  • In mindestens einer Ausführungsform können die gruppierten Rechenressourcen 914 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 914 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 912 einen oder mehrere Knoten-CRs 916(1)-916(N) und/oder gruppierte Rechenressourcen 914 konfigurieren oder anderweitig steuern. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 912 eine Software-Design-Infrastruktur („SDI“)-Verwaltungseinheit für das Rechenzentrum 900 beinhalten. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 912 Hardware, Software oder eine Kombination davon umfassen.
  • In mindestens einer Ausführungsform, wie in 9 gezeigt, beinhaltet die Frameworkschicht 920, ohne Beschränkung darauf, einen Job-Scheduler 932, einen Konfigurationsmanager 934, einen Ressourcen-Manager 936 und ein verteiltes Dateisystem 938. In mindestens einer Ausführungsform kann die Frameworkschicht 920 ein Framework zur Unterstützung der Software 952 der Softwareschicht 930 und/oder einer oder mehrerer Anwendung(en) 942 der Anwendungsschicht 940 beinhalten. In mindestens einer Ausführungsform können die Software 952 oder die Anwendung(en) 942 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 920 eine Art von freiem und quelloffenem Software-Webanwendungs-Framework wie Apache SparkTM (nachstehend „Spark“) sein, das ein verteiltes Dateisystem 938 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 932 einen Spark-Treiber enthalten, um die Planung von Arbeitslasten zu erleichtern, die von verschiedenen Schichten des Rechenzentrums 900 unterstützt werden. In mindestens einer Ausführungsform kann der Konfigurationsmanager 934 in der Lage sein, verschiedene Schichten zu konfigurieren, wie beispielsweise die Softwareschicht 930 und die Frameworkschicht 920, einschließlich Spark und das verteilte Dateisystem 938 zur Unterstützung der Verarbeitung großer Datenmengen. In mindestens einer Ausführungsform kann der Ressourcen-Manager 936 in der Lage sein, geclusterte oder gruppierte Rechenressourcen zu verwalten, die zur Unterstützung des verteilten Dateisystems 938 und des Job-Schedulers 932 gemappt oder zugeordnet sind. In mindestens einer Ausführungsform können geclusterte oder gruppierte Rechenressourcen die gruppierten Rechenressourcen 914 auf der Rechenzentrums-Infrastrukturschicht 910 umfassen. In mindestens einer Ausführungsform kann sich der Ressourcen-Manager 936 mit dem Ressourcenorchestrator 912 koordinieren, um diese gemappten oder zugeordneten Rechenressourcen zu verwalten.
  • In mindestens einer Ausführungsform kann die in der Softwareschicht 930 enthaltene Software 952 Software enthalten, die von mindestens Teilen der Knoten C.R.s 916(1)-916(N), den gruppierten Rechenressourcen 914 und/oder dem verteilten Dateisystem 938 der Frameworkschicht 920 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 940 enthaltene(n) Anwendung(en) 942 eine oder mehrere Arten von Anwendungen beinhalten, die von mindestens Teilen der Knoten C.R.s 916(1)-916(N), den gruppierten Rechenressourcen 914 und/oder dem verteilten Dateisystem 938 der Frameschicht 920 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 934, der Ressourcen-Manager 936 und der Ressourcenorchestrator 912 eine beliebige Anzahl und Art von selbstmodifizierenden Aktionen ausführen, 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 900 davon entlasten, möglicherweise schlechte Konfigurationsentscheidungen zu treffen und möglicherweise nicht ausgelastete und/oder schlecht leistende Teile eines Rechenzentrums zu vermeiden.
  • Computergestützte Systeme
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte computergestützte Systeme, die zur Ausführung mindestens einer Ausführungsform verwendet werden können.
  • 10 veranschaulicht ein Verarbeitungssystem 1000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform weist das Verarbeitungssystem einen oder mehrere Prozessoren 1002 und einen oder mehrere Grafikprozessoren 1008 auf, und kann ein Einzelprozessor-Desktop-System, ein Multiprozessor-Workstation-System oder ein Serversystem mit einer großen Anzahl von Prozessoren 1002 oder Prozessorkernen 1007 sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 1000 eine Verarbeitungsplattform, die in eine integrierte System-on-a-Chip („SoC“)-Schaltung zur Verwendung in mobilen, tragbaren oder eingebetteten Geräten integriert ist.
  • In mindestens einer Ausführungsform kann das Verarbeitungssystem 1000 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 1000 ein Mobiltelefon, ein Smartphone, ein Tablet-Computergerät oder ein mobiles Internetgerät. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1000 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 1000 ein Fernseh- oder Set-Top-Box-Gerät mit einem oder mehreren Prozessoren 1002 und einer grafischen Oberfläche, die von einem oder mehreren Grafikprozessoren 1008 erzeugt wird.
  • In mindestens einer Ausführungsform enthalten ein oder mehrere Prozessoren 1002 jeweils einen oder mehrere Prozessorkerne 1007 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 1007 so konfiguriert, dass er einen bestimmten Befehlssatz 1009 verarbeitet. In mindestens einer Ausführungsform kann der Befehlssatz 1009 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 1007 jeweils einen anderen Befehlssatz 1009 verarbeiten, der Anweisungen enthalten kann, um die Emulation anderer Befehlssätze zu erleichtern. In mindestens einer Ausführungsform kann der Prozessorkern 1007 auch andere Verarbeitungsvorrichtungen enthalten, wie z.B. einen digitalen Signalprozessor („DSP“).
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 1002 einen Cachespeicher („Cache“) 1004. In mindestens einer Ausführungsform kann der Prozessor 1002 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform wird der Cachespeicher von verschiedenen Komponenten des Prozessors 1002 gemeinsam genutzt. In mindestens einer Ausführungsform verwendet der Prozessor 1002 auch einen externen Cache (z.B. einen Level 3 („L3“)-Cache oder Last Level Cache („LLC“)) (nicht dargestellt), der von den Prozessorkernen 1007 unter Verwendung bekannter Cache-Kohärenztechniken gemeinsam genutzt werden kann. In mindestens einer Ausführungsform ist zusätzlich eine Registerdatei 1006 in dem Prozessor 1002 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 1006 Universalregister oder andere Register enthalten.
  • In mindestens einer Ausführungsform ist/sind ein oder mehrere Prozessor(en) 1002 mit einem oder mehreren Schnittstellenbus(en) 1010 gekoppelt, um Kommunikationssignale wie Adress-, Daten- oder Steuersignale zwischen dem Prozessor 1002 und anderen Komponenten in dem Verarbeitungssystem 1000 zu übertragen. In mindestens einer Ausführungsform kann der Schnittstellenbus 1010 ein Prozessorbus sein, wie z.B. eine Version eines Direct Media Interface („DMI“)-Busses. In mindestens einer Ausführungsform ist der Schnittstellenbus 1010 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) 1002 eine integrierte Speichersteuerung 1016 und einen Plattformsteuerungs-Hub 1030. In mindestens einer Ausführungsform erleichtert die Speichersteuerung 1016 die Kommunikation zwischen einem Speichervorrichtung und anderen Komponenten des Verarbeitungssystems 1000, während der Plattformsteuerungs-Hub („PCH“) 1030 Verbindungen zu Eingabe/Ausgabe-Geräten („I/O“) über einen lokalen I/O-Bus bereitstellt.
  • In mindestens einer Ausführungsform kann die Speichervorrichtung 1020 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 1020 als Systemspeicher für das Verarbeitungssystem 1000 arbeiten, um Daten 1022 und Anweisungen 1021 zur Verwendung zu speichern, wenn ein oder mehrere Prozessoren 1002 eine Anwendung oder einen Prozess ausführen. In mindestens einer Ausführungsform koppelt die Speichersteuerung 1016 auch mit einem optionalen externen Grafikprozessor 1012, der mit einem oder mehreren Grafikprozessoren 1008 in den Prozessoren 1002 kommunizieren kann, um Grafik- und Medienoperationen durchzuführen. In mindestens einer Ausführungsform kann eine Anzeigevorrichtung 1011 mit dem/den Prozessor(en) 1002 verbunden sein. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 1011 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 1011 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 Plattformsteuerungs-Hub 1030 die Verbindung von Peripheriegeräten mit der Speichervorrichtung 1020 und dem Prozessor 1002 über einen Hochgeschwindigkeits-I/O-Bus. In mindestens einer Ausführungsform beinhalten die I/O-Peripheriegeräte, ohne darauf beschränkt zu sein, eine Audiosteuerung 1046, eine Netzwerksteuerung 1034, eine Firmware-Schnittstelle 1028, einen drahtlosen Transceiver 1026, Berührungssensoren 1025 und eine Datenspeichervorrichtung 1024 (z.B. ein Festplattenlaufwerk, einen Flash-Speicher usw.). In mindestens einer Ausführungsform kann die Datenspeichervorrichtung 1024 ü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 1025 Touchscreen-Sensoren, Drucksensoren oder Fingerabdrucksensoren beinhalten. In mindestens einer Ausführungsform kann der drahtlose Transceiver 1026 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 1028 eine Kommunikation mit System-Firmware und kann z.B. eine einheitliche erweiterbare Firmware-Schnittstelle („UEFI“) sein. In mindestens einer Ausführungsform kann die Netzwerksteuerung 1034 eine Netzwerkverbindung zu einem kabelgebundenen Netzwerk ermöglichen. In mindestens einer Ausführungsform koppelt eine Hochleistungs-Netzwerksteuerung (nicht dargestellt) mit dem Schnittstellenbus 1010. In mindestens einer Ausführungsform ist die Audiosteuerung 1046 eine Mehrkanal-High-Definition-Audiosteuerung. In mindestens einer Ausführungsform enthält das Verarbeitungssystem 1000 einen optionalen Legacy-I/O-Controller 1040 zur Kopplung von Legacy-Geräten (z.B. Personal System 2 („PS/2“)) mit dem Verarbeitungssystem 1000. In mindestens einer Ausführungsform kann der Plattformsteuerungs-Hub 1030 auch mit einem oder mehreren Universal Serial Bus („USB“)-Controllern 1042 verbinden, die Eingabevorrichtungen, wie z.B. Tastatur- und Mauskombinationen 1043, eine Kamera 1044 oder andere USB-Eingabevorrichtungen verbinden.
  • In mindestens einer Ausführungsform kann eine Instanz der Speichersteuerung 1016 und des Plattformsteuerungs-Hubs 1030 in einen diskreten externen Grafikprozessor, wie beispielsweise den externen Grafikprozessor 1012, integriert sein. In mindestens einer Ausführungsform können der Plattformsteuerungs-Hub 1030 und/oder die Speichersteuerung 1016 extern zu einem oder mehreren Prozessor(en) 1002 sein. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1000 beispielsweise eine externe Speichersteuerung 1016 und einen Plattformsteuerungs-Hub 1030 enthalten, der als ein Speichersteuerungs-Hub und Peripheriesteuerungs-Hub innerhalb eines System-Chipsatzes konfiguriert sein kann, der mit dem/den Prozessor(en) 1002 in Verbindung steht.
  • 11 veranschaulicht ein Computersystem 1100 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann das Computersystem 1100 ein System mit miteinander verbundenen Vorrichtungen und Komponenten, ein SOC oder eine Kombination davon sein. In mindestens einer Ausführungsform ist das Computersystem 1100 mit einem Prozessor 1102 ausgebildet, der Ausführungseinheiten zum Ausführen einer Anweisung enthalten kann. In mindestens einer Ausführungsform kann das Computersystem 1100, ohne Beschränkung darauf, eine Komponente, wie beispielsweise den Prozessor 1102, 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 1100 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 1100 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 1100 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 1100, ohne Beschränkung darauf, einen Prozessor 1102 enthalten, der, ohne Beschränkung darauf, eine oder mehrere Ausführungseinheiten 1108 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 1100 ein Einzelprozessor-Desktop- oder ein Serversystem. In mindestens einer Ausführungsform kann das Computersystem 1100 ein Multiprozessorsystem sein. In mindestens einer Ausführungsform kann der Prozessor 1102, ohne Beschränkung darauf, einen CISC-Mikroprozessor, einen RISC-Mikroprozessor, einen VLIW-Mikroprozessor, einen Prozessor, der eine Kombination von Befehlssätzen aufweist, oder eine beliebige andere Prozessoreinheit, wie z.B. einen digitalen Signalprozessor, beinhalten. In mindestens einer Ausführungsform kann der Prozessor 1102 mit einem Prozessorbus 1110 gekoppelt sein, der Datensignale zwischen dem Prozessor 1102 und anderen Komponenten in dem Computersystem 1100 übertragen kann.
  • In mindestens einer Ausführungsform kann der Prozessor 1102, ohne Beschränkung darauf, einen internen Level 1 („L1“)-Cachespeicher („Cache“) 1104 enthalten. In mindestens einer Ausführungsform kann der Prozessor 1102 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform kann sich der Cachespeicher außerhalb des Prozessors 1102 befinden. In mindestens einer Ausführungsform kann der Prozessor 1102 auch eine Kombination aus sowohl internen als auch externen Caches enthalten. In mindestens einer Ausführungsform kann eine Registerdatei 1106 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 1108, einschließlich, ohne Beschränkung darauf, von Logik zur Durchführung von Ganzzahl- und Gleitkommaoperationen, ebenfalls in dem Prozessor 1102. Der Prozessor 1102 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 1108 Logik zur Verarbeitung eines gepackten Befehlssatzes 1109 enthalten. In mindestens einer Ausführungsform können durch Aufnahme des gepackten Befehlssatzes 1109 in einen Befehlssatz eines Universalprozessors 1102 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 1102 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.
  • In mindestens einer Ausführungsform kann die Ausführungseinheit 1108 auch in Mikrocontrollern, eingebetteten Prozessoren, Grafikvorrichtungen, DSPs und anderen Arten von Logikschaltungen verwendet werden. In mindestens einer Ausführungsform kann das Computersystem 1100, ohne Beschränkung darauf, einen Speicher 1120 enthalten. In mindestens einer Ausführungsform kann der Speicher 1120 eine DRAM-Vorrichtung, eine SRAM-Vorrichtung, eine Flash-Speicher-Vorrichtung oder eine andere Speichervorrichtung sein. Der Speicher 1120 kann Anweisung(en) 1119 und/oder Daten 1121 speichern, die durch Datensignale repräsentiert werden, die von dem Prozessor 1102 ausgeführt werden können.
  • In mindestens einer Ausführungsform kann ein Systemlogikchip mit dem Prozessorbus 1110 und dem Speicher 1120 gekoppelt sein. In mindestens einer Ausführungsform kann der Systemlogikchip, ohne Beschränkung darauf, einen Speichersteuerungs-Hub („MCH“) 1116 enthalten, und kann der Prozessor 1102 mit dem MCH 1116 über den Prozessorbus 1110 kommunizieren. In mindestens einer Ausführungsform kann der MCH 1116 einen Speicherpfad 1118 mit hoher Bandbreite zu dem Speicher 1120 zur Befehls- und Datenspeicherung und zur Speicherung von Grafikbefehlen, Daten und Texturen bereitstellen. In mindestens einer Ausführungsform kann der MCH 1116 Datensignale zwischen dem Prozessor 1102, dem Speicher 1120 und anderen Komponenten in dem Computersystem 1100 leiten und Datensignale zwischen dem Prozessorbus 1110, dem Speicher 1120 und einer System-I/O 1122 überbrücken. In mindestens einer Ausführungsform kann der Systemlogikchip einen Grafik-Port zur Kopplung mit einer Grafiksteuerung bereitstellen. In mindestens einer Ausführungsform kann der MCH 1116 über einen Speicherpfad 1118 mit hoher Bandbreite mit dem Speicher 1120 gekoppelt sein, und kann die Grafik-/ Videokarte 1112 über eine Accelerated Graphics Port („AGP“)-Verbindung bzw. Zwischenverbindung bzw. Interconnect 1114 mit dem MCH 1116 gekoppelt sein.
  • In mindestens einer Ausführungsform kann das Computersystem 1100 einen System-I/O-Bus 1122 verwenden, der ein proprietärer Hub-Schnittstellenbus ist, um den MCH 1116 mit dem I/O-Controller-Hub („ICH“) 1130 zu koppeln. In mindestens einer Ausführungsform kann der ICH 1130 direkte Verbindungen zu einigen I/O-Geräten über einen lokalen I/O-Bus bereitstellen. In mindestens einer Ausführungsform kann der lokale I/O-Bus, ohne Beschränkung darauf, einen Hochgeschwindigkeits-I/O-Bus zur Verbindung von Peripheriegeräten mit dem Speicher 1120, einem Chipsatz und dem Prozessor 1102 umfassen. Beispiele können, ohne Beschränkung darauf, eine Audiosteuerung 1129, einen Firmware-Hub („Flash-BIOS“) 1128, einen drahtlosen Transceiver 1126, einen Datenspeicher 1124, einen Legacy-I/O-Controller 1123, der eine Benutzereingabeschnittstelle 1125 und eine Tastaturschnittstelle enthält, einen seriellen Erweiterungs-Port 1127, wie z.B. ein USB, und eine Netzwerksteuerung 1134 beinhalten. Der Datenspeicher 1124 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 11 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 11 ein beispielhaftes SoC veranschaulichen. In mindestens einer Ausführungsform können in 11 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 1100 unter Verwendung von Compute-Express-Link („CXL“)-Interconnects miteinander verbunden.
  • 12 veranschaulicht ein System 1200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist das System 1200 eine elektronische Vorrichtung, das einen Prozessor 1210 verwendet. In mindestens einer Ausführungsform kann das System 1200 zum Beispiel, und ohne Beschränkung darauf, ein Notebook, ein Tower-Server, ein Rack-Server, ein Blade-Server, eine Edge-Einrichtung, die kommunikativ mit einem oder mit mehreren On-Premise- oder Cloud-Dienstanbietern gekoppelt ist, 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 1200, ohne Beschränkung darauf, einen Prozessor 1210 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 1210 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 12 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 12 ein beispielhaftes SoC darstellen. In mindestens einer Ausführungsform können die in 12 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 12 unter Verwendung von CXL-Interconnects miteinander verbunden.
  • In mindestens einer Ausführungsform kann 12 eine Anzeige 1224, einen Touchscreen 1225, ein Touchpad 1230, eine Near Field Communications („NFC“)-Einheit 1245, einen Sensor-Hub 1240, einen Wärmesensor 1246, einen Express-Chipsatz („EC“) 1235, ein Trusted Platform Module („TPM“) 1238, BIOS/Firmware/Flash-Speicher („BIOS, FW Flash“) 1222, einen DSP 1260, eine Solid State Disk („SSD“) oder eine Festplatte („HDD“) 1220, eine Wireless Local Area Network („WLAN“)-Einheit 1250, eine Bluetooth-Einheit 1252, eine Wireless Wide Area Network („WWAN“)-Einheit 1256, ein Global Positioning System („GPS“) 1255, eine Kamera („USB 3.0-Kamera“) 1254, wie z.B. eine USB 3.0-Kamera, oder eine Low Power Double Data Rate („LPDDR“)-Speichereinheit („LPDDR3“) 1215, die z.B. den LPDDR3-Standard benutzt, 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 1210 verbunden sein. In mindestens einer Ausführungsform können ein Beschleunigungsmesser 1241, ein Umgebungslichtsensor („ALS“) 1242, ein Kompass 1243 und ein Gyroskop 1244 kommunikativ mit dem Sensor-Hub 1240 gekoppelt sein. In mindestens einer Ausführungsform können ein Wärmesensor 1239, ein Lüfter 1237, eine Tastatur 1246 und ein Touchpad 1230 kommunikativ mit dem EC 1235 gekoppelt sein. In mindestens einer Ausführungsform können ein Lautsprecher 1263, ein Kopfhörer 1264 und ein Mikrofon („mic“) 1265 kommunikativ mit einer Audioeinheit („audio codec and dass d amp“) 1264 gekoppelt sein, die ihrerseits kommunikativ mit dem DSP 1260 gekoppelt sein kann. In mindestens einer Ausführungsform kann die Audioeinheit 1264 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“) 1257 kommunikativ mit der WWAN-Einheit 1256 gekoppelt sein. In mindestens einer Ausführungsform können Komponenten wie beispielsweise die WLAN-Einheit 1250 und die Bluetooth-Einheit 1252 sowie die WWAN-Einheit 1256 einen Next Generation Form Factor („NGFF“) benutzen.
  • 13 veranschaulicht eine beispielhafte integrierte Schaltung 1300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die beispielhafte integrierte Schaltung 1300 ein SoC, das unter Verwendung eines oder mehrerer IP-Cores hergestellt sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 1300 einen oder mehrere Anwendungsprozessor(en) 1305 (z.B. CPUs), mindestens einen Grafikprozessor 1310 und kann zusätzlich einen Bildprozessor 1315 und/oder einen Videoprozessor 1320 enthalten, von denen jeder ein modularer IP-Kern sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 1300 eine Peripherie- oder Bus-Logik einschließlich eines USB-Controllers 1325, eines UART-Controllers 1330, eines SPI/SDIO-Controllers 1335 und eines I2S/I2C-Controllers 1340. In mindestens einer Ausführungsform kann die integrierte Schaltung 1300 eine Anzeigevorrichtung 1345 enthalten, die mit einem oder mehreren eines High-Definition Multimedia Interface („HDMI“)-Controllers 1350 und einer Mobile Industry Processor Interface („MIPI“)-Anzeigeschnittstelle 1355 verbunden ist. In mindestens einer Ausführungsform kann der Speicher durch ein Flash-Speicher-Subsystem 1360 mit Flash-Speicher und einer Flash-Speichersteuerung bereitgestellt sein. In mindestens einer Ausführungsform kann eine Speicherschnittstelle über eine Speichersteuerung 1365 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 1370.
  • 14 veranschaulicht ein Computer- bzw. Rechensystem 1400, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das Rechensystem 1400 ein Verarbeitungssubsystem 1401 mit einem oder mehreren Prozessor(en) 1402 und einem Systemspeicher 1404, der über einen Zwischenverbindungspfad bzw. Verbindungspfad kommuniziert, der einen Speicher-Hub 1405 enthalten kann. In mindestens einer Ausführungsform kann der Speicher-Hub 1405 eine separate Komponente innerhalb einer Chipsatzkomponente sein oder in einen oder mehrere Prozessor(en) 1402 integriert sein. In mindestens einer Ausführungsform ist der Speicher-Hub 1405 mit einem I/O-Subsystem 1411 über eine Kommunikationsverbindung 1406 gekoppelt. In mindestens einer Ausführungsform beinhaltet das I/O-Subsystem 1411 einen I/O-Hub 1407, der es dem Rechensystem 1400 ermöglichen kann, Eingaben von einer oder mehreren Eingabevorrichtung(en) 1408 zu empfangen. In mindestens einer Ausführungsform kann der I/O-Hub 1407 eine Anzeigesteuerung, der in einem oder mehreren Prozessor(en) 1402 enthalten sein kann, in die Lage versetzen, Ausgaben an eine oder mehrere Anzeigevorrichtung(en) 1410A zu liefern. In mindestens einer Ausführungsform kann/können ein oder mehrere Anzeigevorrichtung(en) 1410A, die mit dem I/O-Hub 1407 gekoppelt sind, eine lokale, interne oder eingebettete Anzeigevorrichtung beinhalten.
  • In mindestens einer Ausführungsform beinhaltet das Verarbeitungssubsystem 1401 einen oder mehrere Parallelprozessor(en) 1412, der/die über einen Bus oder eine andere Kommunikationsverbindung 1413 mit dem Speicher-Hub 1405 verbunden ist/sind. In mindestens einer Ausführungsform kann die Kommunikationsverbindung 1413 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) 1412 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) 1412 ein Grafikverarbeitungs-Subsystem, das Pixel an eine oder mehrere Anzeigevorrichtung(en) 1410A ausgeben kann, die über den I/O-Hub 1407 gekoppelt sind. In mindestens einer Ausführungsform können ein oder mehrere Parallelprozessor(en) 1412 auch eine Anzeigesteuerung und eine Anzeigeschnittstelle (nicht dargestellt) enthalten, um eine direkte Verbindung zu einer oder mehreren Anzeigevorrichtung(en) 1410B zu ermöglichen.
  • In mindestens einer Ausführungsform kann eine Systemspeichereinheit 1414 mit dem I/O-Hub 1407 verbunden sein, um einen Speichermechanismus für das Rechensystem 1400 bereitzustellen. In mindestens einer Ausführungsform kann ein I/O-Switch 1416 verwendet werden, um einen Schnittstellenmechanismus bereitzustellen, der Verbindungen zwischen dem I/O-Hub 1407 und anderen Komponenten ermöglicht, wie z.B. einem Netzwerkadapter 1418 und/oder einem drahtlosen Netzwerkadapter 1419, der in eine Plattform integriert sein kann, und verschiedenen anderen Vorrichtungen, die über ein oder mehrere Add-in-Vorrichtungen 1420 hinzugefügt werden können. In mindestens einer Ausführungsform kann der Netzwerkadapter 1418 ein Ethernet-Adapter oder ein anderer kabelgebundener Netzwerkadapter sein. In mindestens einer Ausführungsform kann der drahtlose Netzwerkadapter 1419 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 1400 weitere, nicht explizit dargestellte Komponenten enthalten, darunter USB- oder andere Portverbindungen, optische Speicherlaufwerke, Videoaufnahmevorrichtungen und dergleichen, die ebenfalls mit dem I/O-Hub 1407 verbunden sein können. In mindestens einer Ausführungsform können Kommunikationspfade, die verschiedene Komponenten in 14 miteinander verbinden, beliebige geeignete Protokolle benutzen, wie z.B. PCI-basierte Protokolle (z.B. PCIe) oder andere Bus- oder Punkt-zu-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) 1412 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 Parallelprozessor(en) 1412 Schaltkreise, die für allgemeine Verarbeitung optimiert sind. In mindestens einer Ausführungsform können Komponenten des Rechensystems 1400 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) 1412, der Speicher-Hub 1405, der/die Prozessor(en) 1402 und der I/O-Hub 1407 in eine integrierte SoC-Schaltung integriert sein. In mindestens einer Ausführungsform können Komponenten des Rechensystems 1400 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 1400 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 I/O-Subsystem 1411 und die Anzeigevorrichtungen 1410B nicht in dem Rechensystem 1400 enthalten.
  • Verarbeitungssysteme
  • Die folgenden Figuren stellen, ohne Beschränkung darauf, beispielhafte Verarbeitungssysteme dar, die zur Ausführung mindestens einer Ausführungsform verwendet werden können.
  • 15 veranschaulicht eine beschleunigte Verarbeitungseinheit („APU“; accelerated processing unit) 1500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die APU 1500 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die APU 1500 so konfiguriert sein, dass sie ein Anwendungsprogramm, wie z.B. ein CUDA-Programm, ausführt. In mindestens einer Ausführungsform umfasst die APU 1500, ohne Beschränkung darauf, einen Kernkomplex 1510, einen Grafikkomplex 1540, eine Struktur bzw. ein Fabric 1560, I/O-Schnittstellen 1570, Speichersteuerungen 1580, eine Anzeigesteuerung 1592 und eine Multimedia-Engine 1594. In mindestens einer Ausführungsform kann die APU 1500, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 1510, eine beliebige Anzahl von Grafikkomplexen 1550, eine beliebige Anzahl von Anzeigesteuerungen 1592 und eine beliebige Anzahl von Multimedia-Engines 1594 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 1510 eine CPU, ist der Grafikkomplex 1540 eine GPU und ist die APU 1500 eine Verarbeitungseinheit, die, ohne Beschränkung darauf, 1510 und 1540 auf einem einzigen Chip integriert. In mindestens einer Ausführungsform können einige Aufgaben dem Kernkomplex 1510 und andere Aufgaben dem Grafikkomplex 1540 zugewiesen werden. In mindestens einer Ausführungsform ist der Kernkomplex 1510 so konfiguriert, dass er eine Hauptsteuerungssoftware ausführt, die der APU 1500 zugeordnet ist, wie z.B. ein Betriebssystem. In mindestens einer Ausführungsform ist der Kernkomplex 1510 der Hauptprozessor der APU 1500, der Operationen bzw. Betriebsabläufe der anderen Prozessoren steuert und koordiniert. In mindestens einer Ausführungsform gibt der Kernkomplex 1510 Befehle aus, die den Betrieb des Grafikkomplexes 1540 steuern. In mindestens einer Ausführungsform kann der Kernkomplex 1510 so konfiguriert sein, dass er von dem CUDA-Quellcode abgeleiteten ausführbaren Host-Code ausführt, und kann der Grafikkomplex 1540 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 1510, ohne Beschränkung darauf, Kerne 1520(1)-1520(4) und einen L3-Cache 1530. In mindestens einer Ausführungsform kann der Kernkomplex 1510, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 1520 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 1520 so konfiguriert, dass sie Anweisungen einer bestimmten Befehlssatzarchitektur („ISA“) ausführen. In mindestens einer Ausführungsform ist jeder Kern 1520 ein CPU-Kern.
  • In mindestens einer Ausführungsform enthält jeder Kern 1520, ohne Beschränkung darauf, eine Abhol-/Decodier-Einheit 1522, eine Ganzzahlausführungsmaschine 1524, eine Gleitkommaausführungsmaschine 1526 und einen L2-Cache 1528. In mindestens einer Ausführungsform holt die Abhol-/Decodier-Einheit 1522 Anweisungen ab, decodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungsmaschine 1524 und die Gleitkommaausführungsmaschine 1526. In mindestens einer Ausführungsform kann die Abhol-/Decodier-Einheit 1522 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 1524 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 1526 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 1524, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 1526, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Decodier-Einheit 1522 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 1524 als auch die Gleitkommaausführungsmaschine 1526 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 1520(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 1520 repräsentiert, auf den L2-Cache 1528(i) zugreifen, der in dem Kern 1520(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 1510(j) enthaltene Kern 1520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1510 repräsentiert, mit anderen in dem Kernkomplex 1510(j) enthaltenen Kernen 1520 über den in dem Kernkomplex 1510(j) enthaltenen L3-Cache 1530(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 1510(j) enthaltenen Kerne 1520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1510 repräsentiert, auf den gesamten L3-Cache 1530(j) zugreifen, der in dem Kernkomplex 1510(j) enthalten ist. In mindestens einer Ausführungsform kann der L3-Cache 1530, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform kann der Grafikkomplex 1540 so konfiguriert sein, dass er Rechenoperationen hochparallel ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 1540 so konfiguriert, dass er Grafikpipelineoperationen wie beispielsweise Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen im Zusammenhang mit dem Rendern eines Frames auf einer Anzeige ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 1540 so konfiguriert, dass er Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist der Grafikkomplex 1540 so konfiguriert, dass er sowohl grafikbezogene als auch grafikfremde Operationen ausführt.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1540, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 1550 und einen L2-Cache 1542. In mindestens einer Ausführungsform teilen sich die Recheneinheiten 1550 den L2-Cache 1542. In mindestens einer Ausführungsform ist der L2-Cache 1542 partitioniert. In mindestens einer Ausführungsform umfasst der Grafikkomplex 1540, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 1550 und eine beliebige Anzahl (einschließlich Null) und Art von Caches. In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1540, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 1550, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 1552 und einen gemeinsamen Speicher 1554. In mindestens einer Ausführungsform benutzt jede SIMD-Einheit 1552 eine SIMD-Architektur und ist für die parallele Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform kann jede Recheneinheit 1550 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 1550 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 1552 einen anderen Warp aus. In mindestens einer Ausführungsform ist ein Warp eine Gruppe von Threads (z.B. 19 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 1554 kommunizieren.
  • In mindestens einer Ausführungsform ist die Struktur 1560 eine Systemverbindung bzw. ein System-Interconnect, die bzw. der Daten- und Steuerungs-Übertragungen zwischen dem Kernkomplex 1510, dem Grafikkomplex 1540, den I/O-Schnittstellen 1570, den Speichersteuerungen 1580, der Anzeigesteuerung 1592 und der Multimedia-Engine 1594 ermöglicht. In mindestens einer Ausführungsform kann die APU 1500, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 1560 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 1500 sein können. In mindestens einer Ausführungsform sind die I/O-Schnittstellen 1570 repräsentativ für eine beliebige Anzahl und Art von I/O-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 I/O-Schnittstellen 1570 gekoppelt. Die Peripheriegeräte, die mit den I/O-Schnittstellen 1570 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 zeigt die Anzeigesteuerung AMD92 Bilder auf einer oder mehreren Anzeigevorrichtungen an, z.B. auf einer Flüssigkristallanzeige („LCD“). In mindestens einer Ausführungsform umfasst die Multimedia-Engine 1594, ohne Beschränkung darauf, eine beliebige Menge und Art von Schaltkreisen, die sich auf Multimedia beziehen, wie z.B. einen Video-Dekoder, einen Video-Enkoder, einen Bildsignalprozessor usw. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 1580 die Datenübertragung zwischen der APU 1500 und einem einheitlichen Systemspeicher 1590. In mindestens einer Ausführungsform teilen sich der Kernkomplex 1510 und der Grafikkomplex 1540 den vereinheitlichten Systemspeicher 1590.
  • In mindestens einer Ausführungsform umfasst die APU 1500 ein SpeicherSubsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichersteuerungen 1580 und Speichervorrichtungen (z.B. den gemeinsam genutzten Speicher 1554) enthält, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform umfasst die APU 1500 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 1628, L3-Cache 1530 und L2-Cache 1542) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 1520, Kernkomplex 1510, SIMD-Einheiten 1552, Recheneinheiten 1550 und Grafikkomplex 1540) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • 16 zeigt eine CPU 1600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die CPU 1600 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die CPU 1600 so konfiguriert sein, dass sie ein Anwendungsprogramm ausführt. In mindestens einer Ausführungsform ist die CPU 1600 so konfiguriert, dass sie eine Hauptsteuerungssoftware, wie z.B. ein Betriebssystem, ausführt. In mindestens einer Ausführungsform gibt die CPU 1600 Befehle aus, die den Betrieb einer externen GPU (nicht dargestellt) steuern. In mindestens einer Ausführungsform kann die CPU 1600 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 1600, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 1610, ein Fabric 1660, I/O-Schnittstellen 1670 und Speichersteuerungen 1680.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 1610, ohne Beschränkung darauf, Kerne 1620(1)-1620(4) und einen L3-Cache 1630. In mindestens einer Ausführungsform kann der Kernkomplex 1610, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 1620 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 1620 so konfiguriert, dass sie Anweisungen eines bestimmten ISA ausführen. In mindestens einer Ausführungsform ist jeder Kern 1620 ein CPU-Kern.
  • In mindestens einer Ausführungsform beinhaltet jeder Kern 1620, ohne Beschränkung darauf, eine Abhol-/Decodier-Einheit 1622, eine Ganzzahlausführungsmaschine 1624, eine Gleitkommaausführungsmaschine 1626 und einen L2-Cache 1628. In mindestens einer Ausführungsform holt die Abhol-/Decodier-Einheit 1622 Anweisungen ab, decodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungs-Engine 1624 und die Gleitkommaausführungsmaschine 1626. In mindestens einer Ausführungsform kann die Abhol-/Decodier-Einheit 1622 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 1624 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 1626 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 1624, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 1626, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Decodier-Einheit 1622 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 1624 als auch die Gleitkommaausführungsmaschine 1626 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 1620(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 1620 repräsentiert, auf den L2-Cache 1628(i) zugreifen, der in dem Kern 1620(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 1610(j) enthaltene Kern 1620, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1610 repräsentiert, mit anderen Kernen 1620 in dem Kernkomplex 1610(j) über den in dem Kernkomplex 1610(j) enthaltenen L3-Cache 1630(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 1610(j) enthaltenen Kerne 1620, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1610 repräsentiert, auf den gesamten in dem Kernkomplex 1610(j) enthaltenen L3-Cache 1630(j) zugreifen. In mindestens einer Ausführungsform kann der L3-Cache 1630, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform ist das Fabric 1660 eine Systemverbindung, die Daten- und Steuerungs-Übertragungen über die Kernkomplexe 1610(1)-1610(N) (wobei N eine ganze Zahl größer als Null ist), I/O-Schnittstellen 1670 und Speichersteuerungen 1680 erleichtert. In mindestens einer Ausführungsform kann die CPU 1600, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 1660 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 1600 sein können. In mindestens einer Ausführungsform sind die I/O-Schnittstellen 1670 repräsentativ für eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCI , PCI-X, PCIe, GBE, USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den I/O-Schnittstellen 1670 gekoppelt. Zu den Peripheriegeräten, die mit den I/O-Schnittstellen 1670 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 Speichersteuerung 1680 Datenübertragungen zwischen der CPU 1600 und einem Systemspeicher 1690. In mindestens einer Ausführungsform teilen sich der Kernkomplex 1610 und der Grafikkomplex 1640 den Systemspeicher 1690. In mindestens einer Ausführungsform umfasst die CPU 1600 ein Speichersubsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichersteuerungen 1680 und Speichervorrichtungen beinhaltet, die einer Komponente zugeordnet sein oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform umfasst die CPU 1600 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 1628 und L3-Caches 1630) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 1620 und Kernkomplexe 1610) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • 17 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice 1790, 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 Grafikverarbeitungs-Engines 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-Enkoder/Dekoder), 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 1782 innerhalb eines Systemspeichers 1714 speichert Prozesselemente 1783. In einer Ausführungsform werden die Prozesselemente 1783 im Ansprechen auf GPU-Aufrufe 1781 von Anwendungen 1780, die auf dem Prozessor 1707 ausgeführt werden, gespeichert. Ein Prozesselement 1783 enthält den Prozessstatus für die entsprechende Anwendung 1780. Ein in dem Prozesselement 1783 enthaltener Arbeits- bzw. Workdeskriptor („WD“) 1784 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 1784 ein Zeiger auf eine Auftragsanforderungswarteschlange in dem effektiven Adressraum 1782 der Anwendung.
  • Das Grafikbeschleunigungsmodul 1746 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 1784 an das Grafikbeschleunigungsmodul 1746 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 1746 oder eine individuelle Grafikverarbeitungs-Engine. Weil das Grafikbeschleunigungsmodul 1746 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 1746 zugewiesen wird.
  • Im Betrieb holt eine WD-Abholeinheit 1791 in dem Beschleunigerintegrations-Slice 1790 den nächsten WD 1784 ab, der eine Angabe der Arbeit enthält, die von einer oder mehreren Grafikverarbeitungsmaschinen des Grafikbeschleunigungsmoduls 1746 zu erledigen ist. Daten aus dem WD 1784 können in Registern 1745 gespeichert und von einer Speicherverwaltungseinheit („MMU“) 1739, einer Unterbrechungs- bzw. Interrupt-Verwaltungsschaltung 1747 und/oder einer Kontextverwaltungsschaltung 1748 verwendet werden, wie dargestellt. Eine Ausführungsform der MMU 1739 beinhaltet beispielsweise einen Segment-/Seitenlauf-Schaltkreis für den Zugriff auf Segment-/Seitentabellen 1786 innerhalb des virtuellen Betriebssystemadressraums 1785. Die Interrupt-Verwaltungsschaltung 1747 kann von dem Grafikbeschleunigungsmodul 1746 empfangene Interrupt-Ereignisse („INT“) 1792 verarbeiten. Bei der Durchführung von Grafikoperationen wird eine von einer Grafikverarbeitungsmaschine erzeugte effektive Adresse 1793 von der MMU 1739 in eine reale Adresse übersetzt.
  • In einer Ausführungsform wird für jede Grafikverarbeitungs-Engine und/oder jedes Grafikbeschleunigungsmodul 1746 ein gleicher Satz von Registern 1745 dupliziert und kann von einem Hypervisor oder Betriebssystem initialisiert werden. Jedes dieser duplizierten Register kann in dem Beschleunigerintegrations-Slice 1790 enthalten sein. Beispielhafte Register, die von einem Hypervisor initialisiert werden können, sind in Tabelle 1 gezeigt. Tabelle 1 -Hervisor-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 Virtuelladresse (VA)-Beschleunigernutzungsaufzeichnungs-Zeiger
    4 Virtuelladresse (VA)-Speichersegmenttabellenzeiger
    5 Autoritätsmaske
    6 Arbeitsdeskriptor
  • In einer Ausführungsform ist jeder WD 1784 spezifisch für ein bestimmtes Grafikbeschleunigungsmodul 1746 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.
  • 18A und 18B 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, Peripherieschnittstellensteuerungen oder Universalprozessorkerne. In mindestens einer Ausführungsform sind die beispielhaften Grafikprozessoren zur Verwendung innerhalb eines SoC vorgesehen.
  • 18A zeigt einen beispielhaften Grafikprozessor 1810 einer integrierten SoC-Schaltung, die gemäß mindestens einer Ausführungsform unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein kann. 18B veranschaulicht einen weiteren beispielhaften Grafikprozessor 1810 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 1810 von 18A ein stromsparender Grafikprozessorkern. In mindestens einer Ausführungsform ist der Grafikprozessor 1840 von 18B ein Grafikprozessorkern mit höherer Leistung. In mindestens einer Ausführungsform kann jeder der Grafikprozessoren 1810, 1840 eine Variante des Grafikprozessors 1310 von 13 sein.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1810 einen Vertex-Prozessor 1805 und einen oder mehrere Fragment-Prozessor(en) 1815A-1815N (z.B. 1815A, 1815B, 1815C, 1815D, bis 1815N-1 und 1815N). In mindestens einer Ausführungsform kann der Grafikprozessor 1810 verschiedene Shader-Programme über eine separate Logik ausführen, so dass der Vertex-Prozessor 1805 für die Ausführung von Operationen für Vertex-Shader-Programme optimiert ist, während ein oder mehrere Fragment-Prozessor(en) 1815A-1815N 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 1805 eine Vertex-Verarbeitungsstufe einer 3D-Grafik-Pipeline aus und erzeugt Primitive und Vertex-Daten. In mindestens einer Ausführungsform verwenden Fragmentprozessor(en) 1815A-1815N die von dem Vertexprozessor 1805 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) 1815A-1815N 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 1810 zusätzlich eine oder mehrere MMU(s) 1820A-1820B, Cache(s) 1825A-1825B und Schaltungsverbindung(en) bzw. Interconnect(s) 1830A-1830B. In mindestens einer Ausführungsform sorgen eine oder mehrere MMU(s) 1820A-1820B für die Zuordnung von virtuellen zu physikalischen Adressen für den Grafikprozessor 1810, einschließlich für den Vertex-Prozessor 1805 und/oder den/die Fragment-Prozessor(en) 1815A-1815N, der/die auf in dem Speicher gespeicherte Vertex- oder Bild/Textur-Daten verweisen kann/können, zusätzlich zu Vertex- oder Bild/TexturDaten, die in einem oder mehreren Cache(s) 1825A-1825B gespeichert sind. In mindestens einer Ausführungsform können eine oder mehrere MMU(s) 1820A-1820B mit anderen MMUs innerhalb eines Systems synchronisiert werden, einschließlich einer oder mehrerer MMUs, die einem oder mehreren Anwendungsprozessor(en) 1305, Bildprozessor(en) 1315 und/oder Videoprozessor(en) 1320 von 13 zugeordnet sind, so dass jeder Prozessor 1305-1320 an einem gemeinsamen oder vereinheitlichten virtuellen Speichersystem teilhaben kann. In mindestens einer Ausführungsform ermöglichen eine oder mehrere Schaltungsverbindung(en) 1830A-1830B dem Grafikprozessor 1810 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 1840 eine oder mehrere MMU(s) 1820A-1820B, Caches 1825A-1825B und Schaltungsverbindungen 1830A-1830B des Grafikprozessors 1810 von 18A. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1840 einen oder mehrere Shader-Kerne 1855A-1855N (z.B. 1855A, 1855B, 1855C, 1855D, 1855E, 1855F bis 1855N-1 und 1855N), 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 Ausführung 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 1840 einen Zwischenkern-Task-Manager bzw. Intercore-Task-Manager 1845, der als ein Thread-Dispatcher bzw. -Versender fungiert, um Ausführungs-Threads an einen oder mehrere Shader-Kerne 1855A-1855N zu verteilen, und eine Kacheleinheit 1858, 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.
  • 19A veranschaulicht einen Grafikkern 1900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Grafikkern 1900 in dem Grafikprozessor 1310 von 13 enthalten sein. In mindestens einer Ausführungsform kann der Grafikkern 1900 ein einheitlicher Shader-Kern 1855A-1855N wie in 18B sein. In mindestens einer Ausführungsform beinhaltet der Grafikkern 1900 einen gemeinsam genutzten Befehlscache 1902, eine Textureinheit 1932 und einen Cache/gemeinsamen Speicher 1920, die den Ausführungsressourcen innerhalb des Grafikkerns 1900 gemeinsam sind. In mindestens einer Ausführungsform kann der Grafikkern 1900 mehrere Slices 1901A-1901N oder Partitionen für jeden Kern enthalten, und kann ein Grafikprozessor mehrere Instanzen des Grafikkerns 1900 enthalten. Die Slices 1901A-1901N können eine Unterstützungslogik enthalten, die einen lokalen Befehlscache 1904A-1904N, einen Thread-Planer bzw. Thread-Scheduler 1906A-1906N, einen Thread-Versender bzw. Thread-Dispatcher 1908A-1908N und einen Satz von Registern 1910A-1910N beinhaltet. In mindestens einer Ausführungsform können die Slices 1901A-1901N einen Satz zusätzlicher Funktionseinheiten („AFUs“) 1912A-1912N, Gleitkommaeinheiten („FPUs“) 1914A-1914N, ganzzahlige arithmetische Logikeinheiten („ALUs“) 1916-1916N, Adressberechnungseinheiten („ACUs“) 1913A-1913N, doppeltpräzise Gleitkommaeinheiten („DPFPUs“) 1915A-1915N und Matrixverarbeitungseinheiten („MPUs“) 1917A-1917N beinhalten.
  • In mindestens einer Ausführungsform können die FPUs 1914A-1914N Gleitkommaoperationen mit einfacher Genauigkeit (32 Bit) und halber Genauigkeit (16 Bit) durchführen, während die DPFPUs 1915A-1915N Gleitkommaoperationen mit doppelter Genauigkeit (64 Bit) durchführen. In mindestens einer Ausführungsform können die ALUs 1916A-1916N 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 1917A-1917N 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 1917-1917N 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 1912A-1912N zusätzliche logische Operationen durchführen, die nicht von Gleitkomma- oder Ganzzahleinheiten unterstützt werden, einschließlich trigonometrischer Operationen (z.B. Sinus, Cosinus usw.).
  • 19B veranschaulicht eine Universal-Grafikverarbeitungseinheit („GPGPU“) 1930, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die GPGPU 1930 hochparallel und für den Einsatz auf einem Multi-Chip-Modul geeignet. In mindestens einer Ausführungsform kann die GPGPU 1930 so konfiguriert sein, dass hochparallele Rechenoperationen von einem Array von GPUs durchgeführt werden können. In mindestens einer Ausführungsform kann die GPGPU 1930 direkt mit anderen Instanzen der GPGPU 1930 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 1930 eine Host-Schnittstelle 1932, um eine Verbindung mit einem Hostprozessor zu ermöglichen. In mindestens einer Ausführungsform ist die Host-Schnittstelle 1932 eine PCIe-Schnittstelle. In mindestens einer Ausführungsform kann die Host-Schnittstelle 1932 eine herstellerspezifische Kommunikationsschnittstelle oder ein Kommunikations-Fabric sein. In mindestens einer Ausführungsform empfängt die GPGPU 1930 Befehle von einem Hostprozessor und verwendet einen globalen Planer bzw. Scheduler 1934, um Ausführungs-Threads, die mit diesen Befehlen verbunden sind, an einen Satz von Rechenclustern 1936A-1936H zu verteilen. In mindestens einer Ausführungsform teilen sich die Rechencluster 1936A-1936H einen Cachespeicher 1938. In mindestens einer Ausführungsform kann der Cachespeicher 1938 als ein übergeordneter Cache für Cachespeicher innerhalb von Rechenclustern 1936A-1936H dienen.
  • In mindestens einer Ausführungsform umfasst die GPGPU 1930 einen Speicher 1944A-1944B, der über eine Reihe von Speichersteuerungen 1942A-1942B mit den Rechenclustern 1936A-1936H verbunden ist. In mindestens einer Ausführungsform kann der Speicher 1944A-1944B 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 1936A-1936H jeweils einen Satz von Grafikkernen, wie z.B. den Grafikkern 1900 von 19A, 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 1936A-1936H 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 1930 so konfiguriert sein, dass sie als Rechencluster arbeiten. Die Rechencluster 1936A-1936H können beliebige technisch machbare Kommunikationstechniken zur Synchronisation und zum Datenaustausch benutzen. In mindestens einer Ausführungsform kommunizieren mehrere Instanzen der GPGPU 1930 über die Host-Schnittstelle 1932. In mindestens einer Ausführungsform enthält die GPGPU 1930 einen I/O-Hub 1939, der die GPGPU 1930 mit einer GPU-Verbindung 1940 koppelt, die eine direkte Verbindung zu anderen Instanzen der GPGPU 1930 ermöglicht. In mindestens einer Ausführungsform ist die GPU-Verbindung 1940 mit einer dedizierten GPU-zu-GPU-Brücke gekoppelt, die die Kommunikation und Synchronisation die zwischen mehreren Instanzen der GPGPU 1930 ermöglicht. In mindestens einer Ausführungsform koppelt die GPU-Verbindung 1940 mit einem Hochgeschwindigkeits-Interconnect, um Daten an andere GPGPUs 1930 oder Parallelprozessoren zu senden und von diesen zu empfangen. In mindestens einer Ausführungsform befinden sich mehrere Instanzen der GPGPU 1930 in separaten Datenverarbeitungssystemen und kommunizieren über eine Netzwerkvorrichtung, die über die Host-Schnittstelle 1932 zugänglich ist. In mindestens einer Ausführungsform kann die GPU-Verbindung 1940 so konfiguriert sein, dass sie zusätzlich oder alternativ zu der Host-Schnittstelle 1932 eine Verbindung zu einem Hostprozessor ermöglicht. In mindestens einer Ausführungsform kann die GPGPU 1930 so konfiguriert sein, dass sie ein CUDA-Programm ausführt.
  • FIG. 120A veranschaulicht einen Parallelprozessor 2000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform können verschiedene Komponenten des Parallelprozessors 2000 einen oder mehrere integrierte Schaltkreisen, wie z.B. programmierbare Prozessore, anwendungsspezifische integrierte Schaltkreise („ASICs“) oder FPGAs, benutzen.
  • In mindestens einer Ausführungsform enthält der Parallelprozessor 2000 eine Parallelverarbeitungseinheit 2002. In mindestens einer Ausführungsform enthält die Parallelverarbeitungseinheit 2002 eine I/O-Einheit 2004, die die Kommunikation mit anderen Vorrichtungen ermöglicht, einschließlich anderer Instanzen der Parallelverarbeitungseinheit 2002. In mindestens einer Ausführungsform kann die I/O-Einheit 2004 direkt mit anderen Vorrichtungen verbunden sein. In mindestens einer Ausführungsform ist die I/O-Einheit 2004 über eine Hub- oder Switch-Schnittstelle, wie z.B. den Speicher-Hub 2005, mit anderen Vorrichtungen verbunden. In mindestens einer Ausführungsform bilden die Verbindungen zwischen dem Speicher-Hub 2005 und der I/O-Einheit 2004 eine Kommunikationsverbindung. In mindestens einer Ausführungsform ist die I/O-Einheit 2004 mit einer Host-Schnittstelle 2006 und einer Speicherkreuzschiene 2016 verbunden, wobei die Host-Schnittstelle 2006 Befehle zur Durchführung von Verarbeitungsvorgängen und die Speicherkreuzschiene 2016 Befehle zur Durchführung von Speicheroperationen empfängt.
  • In mindestens einer Ausführungsform kann die Host-Schnittstelle 2006 dann, wenn die Host-Schnittstelle einen Befehlspuffer über die I/O-Einheit 2004 empfängt, Arbeitsoperationen zur Ausführung dieser Befehle an ein Frontend 2008 leiten. In mindestens einer Ausführungsform ist das Frontend 2008 mit einem Planer bzw. Scheduler 2010 gekoppelt, der so konfiguriert ist, dass er Befehle oder andere Arbeitselemente an ein Verarbeitungsfeld bzw. Verarbeitungs-Array 2012 verteilt. In mindestens einer Ausführungsform stellt der Scheduler 2010 sicher, dass das Verarbeitungs-Array 2012 richtig konfiguriert ist und sich in einem gültigen Zustand befindet, bevor Aufgaben an das Verarbeitungs-Array 2012 verteilt werden. In mindestens einer Ausführungsform wird der Scheduler 2010 über Firmware-Logik ausgeführt, die auf einem Mikrocontroller ausgeführt wird. In mindestens einer Ausführungsform ist der in einem Mikrocontroller implementierte Scheduler 2010 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 2012 ausgeführt werden. In mindestens einer Ausführungsform kann die Hostsoftware Arbeitslasten für die Planung auf dem Verarbeitungs-Array 2012 über eine von mehreren Grafikverarbeitungs-Doorbells nachweisen. In mindestens einer Ausführungsform können die Arbeitslasten dann automatisch über das Verarbeitungs-Array 2012 durch die Logik des Schedulers 2010 in einem Mikrocontroller mit Scheduler 2010 verteilt werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 bis zu „N“ Cluster umfassen (z.B. Cluster 2014A, Cluster 2014B bis Cluster 2014N). In mindestens einer Ausführungsform kann jeder Cluster 2014A-2014N des Verarbeitungs-Arrays 2012 eine große Anzahl gleichzeitiger Threads ausführen. In mindestens einer Ausführungsform kann der Scheduler 2010 den Clustern 2014A-2014N des Verarbeitungs-Arrays 2012 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 2010 gehandhabt werden, oder kann teilweise durch die Compilerlogik während der Kompilierung der Programmlogik, die für die Ausführung durch das Verarbeitungs-Array 2012 konfiguriert ist, unterstützt werden. In mindestens einer Ausführungsform können verschiedene Cluster 2014A-2014N des Verarbeitungs-Arrays 2012 für die Verarbeitung verschiedener Arten von Programmen oder für die Durchführung verschiedener Arten von Berechnungen zugewiesen werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 so konfiguriert sein, dass es verschiedene Arten von parallelen Verarbeitungsoperationen durchführt. In mindestens einer Ausführungsform ist das Verarbeitungs-Array 2012 so konfiguriert, dass es parallele Universalrechenoperationen durchführt. Zum Beispiel kann in mindestens einer Ausführungsform das Verarbeitungs-Array 2012 Logik zur Ausführung von Verarbeitungs-Tasks 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 2012 so konfiguriert, dass es parallele Grafikverarbeitungsoperationen durchführt. In mindestens einer Ausführungsform kann das Verarbeitungsarray 2012 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 Vertex-Verarbeitungslogik. In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 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 2002 Daten aus dem Systemspeicher über die I/O-Einheit 2004 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 2022) gespeichert und dann in den Systemspeicher zurückgeschrieben werden.
  • In mindestens einer Ausführungsform kann dann, wenn die Parallelverarbeitungseinheit 2002 zur Durchführung der Grafikverarbeitung verwendet wird, der Scheduler 2010 so konfiguriert sein, dass er eine Verarbeitungslast in ungefähr gleich große Aufgaben aufteilt, um eine bessere Verteilung der Grafikverarbeitungsoperationen auf mehrere Cluster 2014A-2014N des Verarbeitungsarrays 2012 zu ermöglichen. In mindestens einer Ausführungsform können Teile des Verarbeitungs-Arrays 2012 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 2014A-2014N erzeugt werden, in Puffern gespeichert werden, damit Zwischendaten zur weiteren Verarbeitung zwischen den Clustern 2014A-2014N übertragen werden können.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 Verarbeitungs-Tasks empfangen, die über den Scheduler 2010 auszuführen sind, der Befehle zur Definition von Verarbeitungs-Tasks von dem Frontend 2008 empfängt. In mindestens einer Ausführungsform können die Verarbeitungs-Tasks 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 2010 so konfiguriert sein, dass er den Aufgaben entsprechende Indizes abruft oder Indizes von dem Frontend 2008 empfängt. In mindestens einer Ausführungsform kann das Frontend 2008 so konfiguriert sein, dass es sicherstellt, dass das Verarbeitungs-Array 2012 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 2002 mit dem Parallelprozessorspeicher 2022 gekoppelt sein. In mindestens einer Ausführungsform kann auf den Parallelprozessorspeicher 2022 über eine Speicherkreuzschiene 2016 zugegriffen werden, die Speicheranforderungen von dem Verarbeitungs-Array 2012 sowie von der I/O-Einheit 2004 empfangen kann. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2016 über eine Speicherschnittstelle 2018 auf den Parallelprozessorspeicher 2022 zugreifen. In mindestens einer Ausführungsform kann die Speicherschnittstelle 2018 mehrere Partitionseinheiten (z.B. eine Partitionseinheit 2020A, eine Partitionseinheit 2020B bis eine Partitionseinheit 2020N) beinhalten, die jeweils mit einem Teil (z.B. einer Speichereinheit) des Parallelprozessorspeichers 2022 gekoppelt sein können. In mindestens einer Ausführungsform ist eine Anzahl von Partitionseinheiten 2020A-2020N so konfiguriert, dass sie gleich einer Anzahl von Speichereinheiten ist, so dass eine erste Partitionseinheit 2020A eine entsprechende erste Speichereinheit 2024A hat, eine zweite Partitionseinheit 2020B eine entsprechende Speichereinheit 2024B hat und eine N-te Partitionseinheit 2020N eine entsprechende N-te Speichereinheit 2024N hat. In mindestens einer Ausführungsform kann die Anzahl der Partitionseinheiten 2020A-2020N nicht gleich der Anzahl der Speichereinheiten sein.
  • In mindestens einer Ausführungsform können die Speichereinheiten 2024A-2024N 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 2024A-2024N 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 2024A-2024N hinweg gespeichert werden, so dass die Partitionseinheiten 2020A-2020N Teile jedes Renderingziels parallel schreiben können, um die verfügbare Bandbreite des Parallelprozessorspeichers 2022 effizient zu nutzen. In mindestens einer Ausführungsform kann eine lokale Instanz des Parallelprozessorspeichers 2022 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 2014A-2014N des Verarbeitungs-Arrays 2012 Daten verarbeiten, die in jede der Speichereinheiten 2024A-2024N in dem Parallelprozessorspeicher 2022 geschrieben werden. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2016 so konfiguriert sein, dass sie eine Ausgabe jedes Clusters 2014A-2014N an eine beliebige Partitionseinheit 2020A-2020N oder an einen anderen Cluster 2014A-2014N überträgt, der zusätzliche Verarbeitungsoperationen an einer Ausgabe durchführen kann. In mindestens einer Ausführungsform kann jeder Cluster 2014A-2014N mit der Speicherschnittstelle 2018 über die Speicherkreuzschiene 2016 kommunizieren, um von verschiedenen externen Speichervorrichtungen zu lesen oder in diese zu schreiben. In mindestens einer Ausführungsform hat die Speicherkreuzschiene 2016 eine Verbindung zu der Speicherschnittstelle 2018, um mit der I/O-Einheit 2004 zu kommunizieren, sowie eine Verbindung zu einer lokalen Instanz des Parallelprozessorspeichers 2022, so dass die Verarbeitungseinheiten in den verschiedenen Clustern 2014A-2014N mit dem Systemspeicher oder einem anderen Speicher kommunizieren können, der nicht lokal zur Parallelverarbeitungseinheit 2002 ist. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2016 virtuelle Kanäle verwenden, um Verkehrsstreams zwischen Clustern 2014A-2014N und Partitionseinheiten 2020A-2020N zu trennen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der Parallelverarbeitungseinheit 2002 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 2002 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 2002 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 2002 oder des Parallelprozessors 2000 enthalten, in einer Vielzahl von Konfigurationen und Formfaktoren ausgeführt werden, einschließlich, aber nicht beschränkt auf, Desktop-, Laptop- oder Handheld-Personal Computer, Server, Workstations, Spielkonsolen und/oder eingebettete Systeme.
  • 20B zeigt einen Verarbeitungscluster 2094, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2094 in einer Parallelverarbeitungseinheit enthalten. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2094 einer der Verarbeitungscluster 2014A-2014N von 20. In mindestens einer Ausführungsform kann der Verarbeitungscluster 2094 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 Verarbeitungsmaschinen innerhalb jedes Verarbeitungsclusters 2094 ausgibt.
  • In mindestens einer Ausführungsform kann der Betrieb des Verarbeitungsclusters 2094 über einen Pipeline-Manager 2032 gesteuert werden, der Verarbeitungs-Tasks auf parallele SIMT-Prozessoren verteilt. In mindestens einer Ausführungsform empfängt der Pipeline-Manager 2032 Anweisungen von dem Scheduler 2010 von 20 und verwaltet die Ausführung dieser Anweisungen über einen Grafik-Multiprozessor 2034 und/oder eine Textureinheit 2036. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2034 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 2094 enthalten sein. In mindestens einer Ausführungsform können eine oder mehrere Instanzen des Grafik-Multiprozessors 2034 in dem Verarbeitungscluster 2094 enthalten sein. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2034 Daten verarbeiten und kann eine Datenkreuzschiene 2040 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 2032 die Verteilung der verarbeiteten Daten erleichtern, indem er Ziele für die verarbeiteten Daten angibt, die über die Datenkreuzschiene 2040 zu verteilen sind.
  • In mindestens einer Ausführungsform kann jeder Grafik-Multiprozessor 2034 innerhalb des Verarbeitungsclusters 2094 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 2094 übertragenen Anweisungen einen Thread. In mindestens einer Ausführungsform ist ein Satz von Threads, die über einen Satz von Parallelverarbeitungsmaschinen 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 2034 zugewiesen sein. In mindestens einer Ausführungsform kann eine Thread-Gruppe weniger Threads umfassen als die Anzahl der Verarbeitungs-Engines innerhalb des Grafik-Multiprozessors 2034. 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 2034 enthalten. Wenn eine Thread-Gruppe mehr Threads umfasst als die Anzahl der Verarbeitungs-Engines in dem Grafik-Multiprozessor 2034, 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 2034 ausgeführt werden.
  • In mindestens einer Ausführungsform enthält der Grafik-Multiprozessor 2034 einen internen Cachespeicher, um Lade- und Speicheroperationen durchzuführen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2034 auf einen internen Cache verzichten und einen Cachespeicher (z.B. L1 -Cache 2048) innerhalb des Verarbeitungsclusters 2094 verwenden. In mindestens einer Ausführungsform hat jeder Grafik-Multiprozessor 2034 auch Zugriff auf Level-2 („L2“)-Caches innerhalb von Partitionseinheiten (z.B. den Partitionseinheiten 2020A-2020N von 20A), die von allen Verarbeitungsclustern 2094 gemeinsam genutzt werden und zur Datenübertragung zwischen Threads verwendet werden können. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2034 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 2002 als globaler Speicher verwendet werden. In mindestens einer Ausführungsform umfasst der Verarbeitungscluster 2094 mehrere Instanzen des Grafik-Multiprozessors 2034, die sich gemeinsame Anweisungen und Daten teilen können, die in dem L1-Cache 2048 gespeichert sein können.
  • In mindestens einer Ausführungsform kann jeder Verarbeitungscluster 2094 eine MMU 2045 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 2045 innerhalb der Speicherschnittstelle 2018 von 20 befinden. In mindestens einer Ausführungsform enthält die MMU 2045 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 2045 Adressübersetzungs-Lookaside-Puffer („TLBs“) oder Caches enthalten, die sich in dem Grafik-Multiprozessor 2034 oder in dem L1-Cache 2048 oder in dem Verarbeitungscluster 2094 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 2094 so konfiguriert sein, dass jeder Grafik-Multiprozessor 2034 mit einer Textureinheit 2036 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 2034 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 2034 eine verarbeitete Aufgabe an die Datenkreuzschiene 2040 aus, um die verarbeitete Aufgabe einem anderen Verarbeitungscluster 2094 zur weiteren Verarbeitung bereitzustellen oder um die verarbeitete Aufgabe in einem L2-Cache, einem lokalen Parallelprozessorspeicher oder einem Systemspeicher über die Speicherkreuzschiene 2016 zu speichern. In mindestens einer Ausführungsform ist eine Pre-Raster-Operations-Einheit („preROP“) 2042 so konfiguriert, dass sie Daten von dem Grafik-Multiprozessor 2034 empfängt und Daten an ROP-Einheiten weiterleitet, die sich bei den hierin beschriebenen Partitionseinheiten (z.B. den Partitionseinheiten 2020A-2020N in 20) befinden können. In mindestens einer Ausführungsform kann die PreROP 2042 Optimierungen für die Farbmischung durchführen, Pixelfarbdaten organisieren und Adressübersetzungen vornehmen.
  • 20C veranschaulicht einen Grafik-Multiprozessor 2096, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2096 der Grafik-Multiprozessor 2034 von 20B. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2096 mit dem Pipeline-Manager 2032 des Verarbeitungsclusters 2094 gekoppelt. In mindestens einer Ausführungsform hat der Grafik-Multiprozessor 2096 eine Ausführungs-Pipeline, die unter anderem einen Anweisungscache 2052, eine Anweisungseinheit 2054, eine Adressabbildungseinheit 2056, eine Registerdatei 2058, einen oder mehrere GPGPU-Kerne 2062 und eine oder mehrere LSUs 2066 beinhaltet. Die GPGPU-Kerne 2062 und die LSUs 2066 sind über eine Speicher- und Cache-Verbindung 2068 mit dem Cachespeicher 2072 und dem gemeinsamen Speicher 2070 gekoppelt.
  • In mindestens einer Ausführungsform empfängt der Anweisungscache 2052 einen Stream bzw. Strom von auszuführenden Befehlen von dem Pipeline-Manager 2032. In mindestens einer Ausführungsform werden die Befehle in dem Anweisungscache 2052 zwischengespeichert und von der Anweisungseinheit 2054 zur Ausführung bereitgestellt. In mindestens einer Ausführungsform kann die Anweisungseinheit 2054 Anweisungen als Thread-Gruppen (z.B. Warps) versenden, wobei jeder Thread einer Thread-Gruppe einer anderen Ausführungseinheit innerhalb des GPGPU-Kerns 2062 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 2056 verwendet werden, um Adressen in einem vereinheitlichten Adressraum in eine eindeutige Speicheradresse zu übersetzen, auf die die LSUs 2066 zugreifen können.
  • In mindestens einer Ausführungsform stellt die Registerdatei 2058 einen Satz von Registern für Funktionseinheiten des Grafik-Multiprozessors 2096 bereit. In mindestens einer Ausführungsform stellt die Registerdatei 2058 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten (z.B. GPGPU-Kerne 2062, LSUs 2066) des Grafik-Multiprozessors 2096 verbunden sind. In mindestens einer Ausführungsform ist die Registerdatei 2058 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 2058 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 2058 zwischen verschiedenen Thread-Gruppen aufgeteilt, die von dem Grafik-Multiprozessor 2096 ausgeführt werden.
  • In mindestens einer Ausführungsform können die GPGPU-Kerne 2062 jeweils FPUs und/oder Integer-ALUs enthalten, die zur Ausführung von Anweisungen des Grafik-Multiprozessors 2096 verwendet werden. Die GPGPU-Kerne 2062 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 2062 eine FPU mit einfacher Genauigkeit und eine Integer-ALU, während ein zweiter Teil der GPGPU-Kerne 2062 eine FPU mit doppelter Genauigkeit enthält. In mindestens einer Ausführungsform können die FPUs den IEEE 754-2008-Standard für Gleitkommaarithmetik benutzen oder Gleitkommaarithmetik mit variabler Genauigkeit ermöglichen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2096 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 2062 auch eine Logik mit fester oder spezieller Funktion enthalten.
  • In mindestens einer Ausführungsform enthalten die GPGPU-Kerne 2062 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 2062 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 2062 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 2068 ein Verbindungsnetzwerk, das jede Funktionseinheit des Grafik-Multiprozessors 2096 mit der Registerdatei 2058 und dem gemeinsamen Speicher 2070 verbindet. In mindestens einer Ausführungsform ist die Speicher- und Cache-Verbindung 2068 eine Koppelfeldverbindung, die es der LSU 2066 ermöglicht, Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher 2070 und der Registerdatei 2058 durchzuführen. In mindestens einer Ausführungsform kann die Registerdatei 2058 mit derselben Frequenz arbeiten wie die GPGPU-Kerne 2062, so dass die Datenübertragung zwischen den GPGPU-Kernen 2062 und der Registerdatei 2058 eine sehr geringe Latenz aufweist. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2070 verwendet werden, um die Kommunikation zwischen Threads zu ermöglichen, die auf Funktionseinheiten innerhalb des Grafik-Multiprozessors 2096 ausgeführt werden. In mindestens einer Ausführungsform kann der Cachespeicher 2072 z. B. als Datencache verwendet werden, um Texturdaten zu cachen, die zwischen Funktionseinheiten und der Textureinheit 2036 kommuniziert werden. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2070 auch als programmverwalteter Cache verwendet werden. In mindestens einer Ausführungsform können Threads, die auf den GPGPU-Kernen 2062 ausgeführt werden, zusätzlich zu den automatisch zwischengespeicherten Daten, die in dem Cachespeicher 2072 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, Musteranalyse-operationen 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.
  • 21 zeigt einen Grafikprozessor 2100, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst der Grafikprozessor 2100 eine Ringverbindung 2102, ein Pipeline-Frontend 2104, eine Medien Engine 2137 und Grafikkerne 2180A-2180N. In mindestens einer Ausführungsform verbindet die Ringverbindung 2102 den Grafikprozessor 2100 mit anderen Verarbeitungseinheiten, einschließlich anderer Grafikprozessoren oder eines oder mehrerer Mehrzweckprozessorkerne. In mindestens einer Ausführungsform ist der Grafikprozessor 2100 einer von vielen Prozessoren, die in ein Multikern-Verarbeitungssystem integriert sind.
  • In mindestens einer Ausführungsform empfängt der Grafikprozessor 2100 Stapel von Befehlen über die Ringverbindung 2102. In mindestens einer Ausführungsform werden die eingehenden Befehle von einem Befehlsstreamer 2103 in dem Pipeline-Frontend 2104 interpretiert. In mindestens einer Ausführungsform enthält der Grafikprozessor 2100 eine skalierbare Ausführungslogik zur Durchführung der 3D-Geometrieverarbeitung und der Medienverarbeitung über den/die Grafikkern(e) 2180A-2180N. In mindestens einer Ausführungsform liefert der Befehlsstreamer 2103 für 3D-Geometrieverarbeitungsbefehle Befehle an die Geometrie-Pipeline 2136. In mindestens einer Ausführungsform liefert der Befehlsstreamer 2103 für mindestens einige Medienverarbeitungsbefehle Befehle an ein Video-Frontend 2134, das mit einer Medien-Engine 2137 gekoppelt ist. In mindestens einer Ausführungsform umfasst die Medien-Engine 2137 eine Video Quality Engine („VQE“) 2130 für die Video- und Bildnachbearbeitung und eine Multiformat-Codier-/ Decodier-Engine („MFX“) 2133 für die hardwarebeschleunigte Codierung und Decodierung von Mediendaten. In mindestens einer Ausführungsform erzeugen die Geometrie-Pipeline 2136 und die Medien-Engine 2137 jeweils Ausführungs-Threads für Thread-Ausführungsressourcen, die von mindestens einem Grafikkern 2180A bereitgestellt werden.
  • In mindestens einer Ausführungsform enthält der Grafikprozessor 2100 skalierbare Thread-Ausführungsressourcen mit modularen Grafikkernen 2180A-2180N (manchmal als Kern-Slices bezeichnet), die jeweils mehrere Subkerne 2150A-2150N, 2160A-2160N (manchmal als Kern-Sub-Slices bezeichnet) aufweisen. In mindestens einer Ausführungsform kann der Grafikprozessor 2100 eine beliebige Anzahl von Grafikkernen 2180A bis 2180N aufweisen. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2100 einen Grafikkern 2180A mit mindestens einem ersten Subkern 2150A und einem zweiten Subkern 2160A. In mindestens einer Ausführungsform ist der Grafikprozessor 2100 ein Prozessor mit geringem Stromverbrauch und einem einzigen Subkern (z.B. dem Subkern 2150A). In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2100 mehrere Grafikkerne 2180A-2180N, die jeweils einen Satz erster Subkerne 2150A-2150N und einen Satz zweiter Subkerne 2160A-2160N umfassen. In mindestens einer Ausführungsform enthält jeder Subkern in den ersten Subkernen 2150A-2150N mindestens einen ersten Satz von Ausführungseinheiten („EUs“) 2152A-2152N und Medien-/Textur-Sampler 2154A-2154N. In mindestens einer Ausführungsform enthält jeder Subkern in den zweiten Subkernen 2160A-2160N mindestens einen zweiten Satz von Ausführungseinheiten 2162A-2162N und Samplern 2164A-2164N. In mindestens einer Ausführungsform teilt sich jeder Subkern 2150A-2150N, 2160A-2160N einen Satz von gemeinsam genutzten Ressourcen 2170A-2170N. In mindestens einer Ausführungsform umfassen die gemeinsam genutzten Ressourcen 2170 den gemeinsam genutzten Cachespeicher und die Pixeloperationslogik.
  • 22 veranschaulicht einen Prozessor 2200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Prozessor 2200, ohne Beschränkung darauf, Logikschaltungen zur Ausführung von Befehlen enthalten. In mindestens einer Ausführungsform kann der Prozessor 2200 Befehle ausführen, einschließlich x86-Befehle, ARM-Befehle, spezielle Befehle für ASICs usw. In mindestens einer Ausführungsform kann der Prozessor 2210 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 2210 Anweisungen zur Beschleunigung von CUDA-Programmen ausführen.
  • In mindestens einer Ausführungsform enthält der Prozessor 2200 ein In-Order-Front-End („Front-End“) 2201 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 2201 mehrere Einheiten beinhalten. In mindestens einer Ausführungsform holt ein Anweisungs-Vorabrufer bzw. -Prefetcher 2226 Anweisungen aus dem Speicher und leitet sie an einen Anweisungs-Decodierer 2228 weiter, der seinerseits Anweisungen decodiert oder interpretiert. In mindestens einer Ausführungsform decodiert der Anweisungs-Decodierer 2228 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 2228 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 2230 decodierte Uops in programmgeordnete Sequenzen oder Traces in einer Uop-Warteschlange 2234 zur Ausführung zusammenstellen. In mindestens einer Ausführungsform stellt dann, wenn der Trace-Cache 2230 auf eine komplexe Anweisung stößt, ein Mikrocode-ROM 2232 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 2228 auf den Mikrocode-ROM 2232 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 2228 decodiert werden. In mindestens einer Ausführungsform kann eine Anweisung in dem Mikrocode-ROM 2232 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 2230 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 2232 zu vervollständigen. In mindestens einer Ausführungsform kann das Front-End 2201 der Maschine, nachdem der Mikrocode-ROM 2232 die Sequenzierung von Mikro-Ops für eine Anweisung beendet hat, das Abrufen von Mikro-Ops aus dem Trace-Cache 2230 wieder aufnehmen.
  • In mindestens einer Ausführungsform kann die Out-of-Order-Ausführungs-Engine („Out of Order Engine“) 2203 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 2203 beinhaltet, ohne darauf beschränkt zu sein, einen Allokator/Register-Umbenenner 2240, eine Speicher-Uop-Warteschlange 2242, eine Ganzzahl-/Gleitkomma-Uop-Warteschlange 2244, einen Speicher-Scheduler 2246, einen schnellen Scheduler 2202, einen langsamen/allgemeinen Gleitkomma-Scheduler („langsamer/allgemeiner FP-Scheduler“) 2204 und einen einfachen Gleitkomma-Scheduler („einfacher FP-Scheduler“) 2206. In mindestens einer Ausführungsform werden der schnelle Scheduler 2202, der langsame/allgemeine Gleitkomma-Scheduler 2204 und der einfache Gleitkomma-Scheduler 2206 hierin auch gemeinsam als „Uop-Scheduler 2202, 2204, 2206“ bezeichnet. Der Allocator/Register-Umbenenner 2240 weist Maschinenpuffer und Ressourcen zu, die jede Uop zur Ausführung benötigt. In mindestens einer Ausführungsform benennt der Allocator/Register-Umbenenner 2240 logische Register auf Einträge in einer Registerdatei um. In mindestens einer Ausführungsform weist der Allocator/Register-Umbenenner 2240 auch einen Eintrag für jede Uop in einer von zwei Uop-Warteschlangen zu, der Speicher-Uop-Warteschlange 2242 für Speicheroperationen und der Ganzzahl-/Gleitkomma-Uop-Warteschlange 2244 für Nicht-Speicheroperationen, und zwar vor dem Speicher-Scheduler 2246 und den Uop-Schedulern 2202, 2204, 2206. In mindestens einer Ausführungsform bestimmen die Uop-Scheduler 2202, 2204, 2206, 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 2202 in jeder Hälfte des Haupttaktzyklus terminieren, während der langsame/allgemeine Gleitkomma-Scheduler 2204 und der einfache Gleitkomma-Scheduler 2206 einmal pro Hauptprozessortaktzyklus terminieren können. In mindestens einer Ausführungsform arbitrieren die Uop-Scheduler 2202, 2204, 2206 für Versende- bzw. Dispatch-Ports, um Uops für die Ausführung zu planen.
  • In mindestens einer Ausführungsform beinhaltet der Ausführungsblock 2211, ohne Beschränkung darauf, eine Ganzzahl-Registerdatei/ein Bypass-Netzwerk 2208, eine Gleitkommaregisterdatei/ein Bypass-Netzwerk („FP-Registerdatei/ein Bypass-Netzwerk“) 2210, Adressgenerierungseinheiten („AGUs“) 2212 und 2214, schnelle ALUs bzw. S-ALUSs 2216 und 2218, eine langsame ALU bzw. L-ALU 2220, eine Gleitkomma-ALU („FP“) 2222 und eine Gleitkomma-Bewegungseinheit („FP-Move“) 2224. In mindestens einer Ausführungsform werden die Ganzzahl-Registerdatei/das Bypass-Netzwerk 2208 und die Gleitkomma-Registerdatei/das Bypass-Netzwerk 2210 hierin auch als „Registerdateien 2208, 2210“ bezeichnet. In mindestens einer Ausführungsform werden die AGUs 2212 und 2214, die schnellen ALUs 2216 und 2218, die langsame ALU 2220, die Gleitkomma-ALU 2222 und die Gleitkomma-Bewegungseinheit 2224 hierin auch als „Ausführungseinheiten 2212, 2214, 2216, 2218, 2220, 2222 und 2224“ 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 2208, 2210 zwischen den Uop-Schedulern 2202, 2204, 2206 und den Ausführungseinheiten 2212, 2214, 2216, 2218, 2220, 2222 und 2224 angeordnet sein. In mindestens einer Ausführungsform führt das Ganzzahl-Registerdatei/das Bypass-Netzwerk 2208 Ganzzahloperationen durch. In mindestens einer Ausführungsform führt die Gleitkommaregisterdatei/das Bypass-Netzwerk 2210 Gleitkommaoperationen durch. In mindestens einer Ausführungsform kann jede der Registerdateien 2208, 2210, 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 2208, 2210 Daten miteinander austauschen. In mindestens einer Ausführungsform kann das Ganzzahl-Registerdatei/das Bypass-Netzwerk 2208, 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 2210, 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 2212, 2214, 2216, 2218, 2220, 2222, 2224 Anweisungen ausführen. In mindestens einer Ausführungsform speichern Registerdateien 2208, 2210 Ganzzahl- und Gleitkomma-Daten-Operandenwerte, die Mikroanweisungen ausführen müssen. In mindestens einer Ausführungsform kann der Prozessor 2200, ohne Beschränkung darauf, eine beliebige Anzahl und Kombination von Ausführungseinheiten 2212, 2214, 2216, 2218, 2220, 2222, 2224 enthalten. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2222 und die Gleitkomma-Bewegungseinheit 2224 Gleitkomma-, MMX-, SIMD-, AVX- und SSE- oder andere Operationen ausführen. In mindestens einer Ausführungsform kann die Gleitkomma-ALU 2222, ohne Beschränkung darauf, einen 64-Bit-mal-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 2216, 2218 übergeben werden. In mindestens einer Ausführungsform können die schnellen ALUS 2216, 2218 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 2220, da die langsame ALU 2220, 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 2212, 2214 ausgeführt werden. In mindestens einer Ausführungsform können die schnelle ALU 2216, die schnelle ALU 2218 und die langsame ALU 2220 Ganzzahloperationen an 64-Bit-Datenoperanden durchführen. In mindestens einer Ausführungsform können die schnelle ALU 2216, die schnelle ALU 2218 und die langsame ALU 2220 so benutzt werden, 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 2222 und die Gleitkomma-Bewegungseinheit („FP MOVE“) 2224 so benutzt werden, dass sie einen Bereich von Operanden mit Bits unterschiedlicher Breite unterstützen. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2222 und die Gleitkomma-Bewegungseinheit 2224 mit 128 Bit breiten gepackten Datenoperanden in Verbindung mit SIMD- und Multimedia-Anweisungen arbeiten.
  • In mindestens einer Ausführungsform versenden die Uop-Scheduler 2202, 2204, 2206 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 2200 ausgeführt werden können, kann der Prozessor 2200 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 Schaltkreise innerhalb eines Prozessors unter Verwendung einer beliebigen Anzahl verschiedener Techniken 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.
  • 23 zeigt einen Prozessor 2300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet der Prozessor 2300, ohne Beschränkung darauf, einen oder mehrere Prozessorkerne („Kerne“) 2302A-2302N, eine integrierte Speichersteuerung 2314 und einen integrierten Grafikprozessor 2308. In mindestens einer Ausführungsform kann der Prozessor 2300 zusätzliche Kerne bis hin zu und einschließlich des zusätzlichen Prozessorkerns 2302N enthalten, der durch gestrichelte, linierte Kästen dargestellt ist. In mindestens einer Ausführungsform enthält jeder der Prozessorkerne 2302A-2302N eine oder mehrere interne Cacheeinheiten 2304A-2304N. In mindestens einer Ausführungsform hat jeder Prozessorkern auch Zugriff auf eine oder mehrere gemeinsam genutzte Cacheeinheiten 2306.
  • In mindestens einer Ausführungsform repräsentieren die internen Cacheeinheiten 2304A-2304N und die gemeinsam genutzten Cacheeinheiten 2306 eine Cachespeicherhierarchie innerhalb des Prozessors 2300. In mindestens einer Ausführungsform können die Cachespeichereinheiten 2304A-2304N 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 2306 und 2304A-2304N aufrecht.
  • In mindestens einer Ausführungsform kann der Prozessor 2300 auch einen Satz von einer oder mehreren Bussteuereinheiten 2316 und einen Systemagent-Kern 2310 enthalten. In mindestens einer Ausführungsform verwalten eine oder mehrere Bussteuereinheiten 2316 einen Satz von Peripheriebussen, wie z.B. einen oder mehrere PCI- oder PCI-Express-Busse. In mindestens einer Ausführungsform stellt der Systemagent-Kern 2310 Verwaltungsfunktionen für verschiedene Prozessorkomponenten bereit. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2310 einen oder mehrere integrierte Speichersteuerungen 2314 zur Verwaltung des Zugriffs auf verschiedene externe Speichervorrichtungen (nicht gezeigt).
  • In mindestens einer Ausführungsform beinhalten einer oder mehrere der Prozessorkerne 2302A-2302N Unterstützung für gleichzeitiges Multithreading. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2310 Komponenten zum Koordinieren und Betreiben der Prozessorkerne 2302A-2302N während der Multithreading-Verarbeitung. In mindestens einer Ausführungsform kann der Systemagent-Kern 2310 zusätzlich eine Leistungssteuerungseinheit („PCU“) enthalten, die Logik und Komponenten zur Regelung eines oder mehrerer Leistungszustände der Prozessorkerne 2302A-2302N und des Grafikprozessors 2308 beinhaltet.
  • In mindestens einer Ausführungsform enthält der Prozessor 2300 zusätzlich einen Grafikprozessor 2308 zur Ausführung von Grafikverarbeitungsoperationen. In m indestens einer Ausführungsform ist der Grafikprozessor 2308 mit gemeinsam genutzten Cacheeinheiten 2306 und dem Systemagent-Kern 2310 gekoppelt, einschließlich einer oder mehrerer integrierter Speichersteuerungen 2314. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2310 auch eine Anzeigesteuerung 2311, um die Ausgabe des Grafikprozessors an ein oder mehrere gekoppelte Anzeigen zu steuern. In mindestens einer Ausführungsform kann die Anzeigesteuerung 2311 auch ein separates Modul sein, das über mindestens eine Verbindung bzw. einen Interconnect mit dem Grafikprozessor 2308 gekoppelt ist, oder kann in den Grafikprozessor 2308 integriert sein.
  • In mindestens einer Ausführungsform wird eine ringbasierte Verbindungseinheit 2312 verwendet, um interne Komponenten des Prozessors 2300 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 2308 über eine I/O-Verbindung 2313 mit der Ringverbindung 2312 gekoppelt.
  • In mindestens einer Ausführungsform repräsentiert die I/O-Verbindung 2313 mindestens eine von mehreren Arten von I/O-Verbindungen, einschließlich einer On-Package-I/O-Verbindung, die die Kommunikation zwischen verschiedenen Prozessorkomponenten und einem eingebetteten Hochleistungsspeichermodul 2318, wie z.B. einem eDRAM-Modul, erleichtert. In mindestens einer Ausführungsform verwenden jeder der Prozessorkerne 2302A-2302N und der Grafikprozessor 2308 eingebettete Speichermodule 2318 als gemeinsame LLC.
  • In mindestens einer Ausführungsform sind die Prozessorkerne 2302A-2302N homogene Kerne, die eine gemeinsame Befehlssatzarchitektur ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2302A-2302N heterogen in Bezug auf die ISA, wobei ein oder mehrere Prozessorkerne 2302A-2302N einen gemeinsamen Befehlssatz ausführen, während ein oder mehrere andere Kerne der Prozessorkerne 2302A-2302N eine Teilmenge eines gemeinsamen Befehlssatzes oder einen anderen Befehlssatz ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2302A-2302N 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 2300 auf einem oder mehreren Chips oder als integrierte SoC-Schaltung vorhanden sein.
  • 24 veranschaulicht einen Grafikprozessorkern 2400, gemäß mindestens einer beschriebenen Ausführungsform. In mindestens einer Ausführungsform ist der Grafikprozessorkern 2400 in einem Grafikkern-Array enthalten. In mindestens einer Ausführungsform kann der Grafikprozessorkern 2400, 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 2400 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 2400 einen Festfunktionsblock 2430 enthalten, der mit mehreren Subkernen 2401A-2401 F 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 2430 eine Geometrie/Festfunktions-Pipeline 2436, die von allen Subkernen in dem Grafikprozessor 2400, z.B. in Grafikprozessor-Variationen mit geringerer Leistung und/oder geringerem Energieverbrauch, gemeinsam genutzt werden kann. In mindestens einer Ausführungsform beinhaltet die Geometrie/Festfunktions-Pipeline 2436 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 2430 darüber hinaus eine Grafik-SoC-Schnittstelle 2437, einen Grafik-Mikrocontroller 2438 und eine Medienpipeline 2439. Die Grafik-SoC-Schnittstelle 2437 stellt eine Schnittstelle zwischen dem Grafikkern 2400 und anderen Prozessorkernen innerhalb einer integrierten SoC-Schaltung bereit. In mindestens einer Ausführungsform ist der Grafik-Mikrocontroller 2438 ein programmierbarer Subprozessor, der so konfiguriert werden kann, dass er verschiedene Funktionen des Grafikprozessors 2400 verwaltet, einschließlich Thread-Versendung, Planung und Präemption. In mindestens einer Ausführungsform enthält die Medienpipeline 2439 Logik zur Erleichterung der Decodierung, Codierung, Vorverarbeitung und/oder Nachverarbeitung von Multimediadaten, einschließlich Bild- und Videodaten. In mindestens einer Ausführungsform führt die Medienpipeline 2439 Medienoperationen über Anforderungen an die Rechen- oder Abtastlogik innerhalb der Subkerne 2401-2401 F aus.
  • In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2437 dem Grafikkern 2400 die Kommunikation mit Mehrzweck-Anwendungsprozessorkernen (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 2437 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 führt globale(n) Speicheratome(n) aus, die von einem Grafikkern 2400 und CPUs innerhalb eines SoCs gemeinsam genutzt werden können. In mindestens einer Ausführungsform kann die SoC-Schnittstelle 2437 auch Energieverwaltungssteuerungen für den Grafikkern 2400 ausführen und eine Schnittstelle zwischen einer Taktdomäne des Grafikkerns 2400 und anderen Taktdomänen innerhalb eines SoCs ermöglichen. In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2437 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 2439 gesendet werden, wenn Medienoperationen durchzuführen sind, oder an eine Geometrie- und Festfunktions-Pipeline (z.B. die Geometrie- und Festfunktions-Pipeline 2436, die Geometrie- und Festfunktions-Pipeline 2414), wenn Grafikverarbeitungsoperationen durchzuführen sind.
  • In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2438 so konfiguriert sein, dass er verschiedene Planungs- und Verwaltungs-Tasks für den Grafikkern 2400 durchführt. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2438 die Planung von Grafik- und/oder Rechenlasten auf verschiedenen parallelen Grafik-Engines in den Arrays 2402A-2402F, 2404A-2404F der Ausführungseinheiten (EU) in den Subkernen 2401A-2401 F durchführen. In mindestens einer Ausführungsform kann Hostsoftware, die auf einem CPU-Kern eines SoC mit Grafikkern 2400 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 Planungsvorgänge 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 2438 auch Stromsparzustände oder Leerlaufzustände für den Grafikkern 2400 erleichtern, indem er dem Grafikkern 2400 eine Fähigkeit bereitstellt, Register innerhalb des Grafikkerns 2400 ü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 2400 mehr oder weniger als die dargestellten Subkerne 2401A-2401F haben, bis hin zu N modularen Subkernen. Für jeden Satz von N Subkernen kann der Grafikkern 2400 in mindestens einer Ausführungsform auch eine gemeinsam genutzte Funktionslogik 2410, einen gemeinsam genutzten Speicher und/oder Cachespeicher 2412, eine Geometrie-/ Festfunktions-Pipeline 2414 sowie eine zusätzliche Festfunktionslogik 2416 zur Beschleunigung verschiedener Grafik- und Rechenverarbeitungsvorgänge beinhalten. In mindestens einer Ausführungsform kann die gemeinsam genutzte Funktionslogik 2410 Logikeinheiten (z.B. Sampler-, Mathematik- und/oder Inter-Thread-Kommunikationslogik) umfassen, die von allen N Subkernen innerhalb des Grafikkerns 2400 gemeinsam genutzt werden können. Der gemeinsam genutzte Speicher und/oder Cachespeicher 2412 kann ein LLC für N Subkerne 2401 A-2401 F innerhalb des Grafikkerns 2400 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 2414 anstelle der Geometrie-/Festfunktions-Pipeline 2436 innerhalb des Festfunktionsblocks 2430 enthalten sein und kann gleiche oder ähnliche Logikeinheiten beinhalten.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkern 2400 zusätzliche feste Funktionslogik 2416, die verschiedene feste Funktionsbeschleunigungslogik zur Verwendung durch den Grafikkern 2400 enthalten kann. In mindestens einer Ausführungsform umfasst die zusätzliche Festfunktionslogik 2416 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 2416, 2436, und eine Cull-Pipeline, bei der es sich um eine zusätzliche Geometrie-Pipeline handelt, die in der zusätzlichen Festfunktionslogik 2416 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 2416 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 2416 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 2401A-2401 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 2401A-2401F mehrere EU-Arrays 2402A-2402F, 2404A-2404F, Thread-Dispatch- und Inter-Thread-Kommunikationslogik („TD/IC“) 2403A-2403F, einen 3D (z.B. Textur-)- Sampler 2405A-2405F, einen Media-Sampler 2406A-2406F, einen Shader-Prozessor 2407A-2407F und gemeinsam genutzten lokalen Speicher („SLM“) 2408A-2408F. Die EU-Arrays 2402A-2402F, 2404A-2404F 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 2403A-2403F 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 2405A-2405F 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 2406A-2406F ähnliche Lesevorgänge auf der Grundlage eines Typs und eines Formats durchführen, die mit den Mediendaten verbunden sind. In mindestens einer Ausführungsform kann jeder Grafik-Subkern 2401A-2401 F abwechselnd einen vereinheitlichten 3D- und Medien-Sampler enthalten. In mindestens einer Ausführungsform können Threads, die auf Ausführungseinheiten innerhalb jedes der Subkerne 2401 A-2401 F ausgeführt werden, den gemeinsamen lokalen Speicher 2408A-2408F 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.
  • 25 veranschaulicht eine Parallelverarbeitungseinheit („PPU“) 2500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die PPU 2500 mit maschinenlesbarem Code konfiguriert, der, wenn er von der PPU 2500 ausgeführt wird, die PPU 2500 veranlasst, einige oder alle der hierin beschriebenen Prozesse und Techniken durchzuführen. In mindestens einer Ausführungsform ist die PPU 2500 ein Multi-Thread-Prozessor auf einer oder mehreren Vorrichtungen mit integrierten Schaltkreisen und benutzt Multithreading als eine latenzverbergende Technik, 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 2500 konfiguriert sind. In mindestens einer Ausführungsform ist die PPU 2500 eine GPU, die so konfiguriert ist, dass sie eine Grafik-Rendering-Pipeline zur Verarbeitung dreidimensionaler („3D“) Grafikdaten ausführt, 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 2500 verwendet, um Berechnungen wie lineare Algebra-Operationen und Machine-Learning-Operationen durchzuführen. 21 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 ausgeführt werden kann.
  • In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2500 so konfiguriert, dass sie High Performance Computing („HPC“)-, Rechenzentrums- und Machine Learning-Anwendungen beschleunigen. In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2500 für die Beschleunigung von CUDA-Programmen konfiguriert. In mindestens einer Ausführungsform beinhaltet die PPU 2500, ohne Beschränkung darauf, eine I/O-Einheit 2506, eine Frontend-Einheit 2510, eine Scheduler-Einheit 2512, eine Arbeitsverteilungseinheit 2514, einen Hub 2516, eine Kreuzschiene bzw. Crossbar („Xbar“) 2520, einen oder mehrere Universalverarbeitungscluster („GPCs“) 2518 und eine oder mehrere Partitionseinheiten („Speicherpartitionseinheiten“) 2522. In mindestens einer Ausführungsform ist die PPU 2500 mit einem Hostprozessor oder anderen PPUs 2500 über eine oder mehrere Hochgeschwindigkeits-GPU-Verbindungen („GPU-Interconnects“) 2508 verbunden. In mindestens einer Ausführungsform ist die PPU 2500 über eine Zwischenverbindung bzw. einen Interconnect 2502 mit einem Hostprozessor oder anderen Peripheriegeräten verbunden. In mindestens einer Ausführungsform ist die PPU 2500 mit einem lokalen Speicher verbunden, der ein oder mehrere Speichervorrichtungen („Speicher“) 2504 umfasst. In mindestens einer Ausführungsform beinhalten die Speichervorrichtungen 2504, 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 2508 auf eine drahtgebundene Mehrspur-Kommunikations-verbindung beziehen, die von Systemen verwendet wird, um zu skalieren und die eine oder mehrere PPUs 2500 in Kombination mit einer oder mehreren CPUs umfassen, die Cache-Kohärenz zwischen PPUs 2500 und CPUs sowie CPU-Mastering unterstützen. In mindestens einer Ausführungsform werden Daten und/oder Befehle über die Hochgeschwindigkeits-GPU-Verbindung 2508 durch den Hub 2516 zu/von anderen Einheiten der PPU 2500, wie z.B. einer oder mehreren Kopiermaschinen, Videocodierern, Video-Decodierern, Energieverwaltungs-einheiten und anderen Komponenten, die in 25 möglicherweise nicht explizit dargestellt sind, übertragen.
  • In mindestens einer Ausführungsform ist die I/O-Einheit 2506 so konfiguriert, dass sie Kommunikationen (z.B. Befehle, Daten) von einem Hostprozessor (in 25 nicht dargestellt) über den Systembus 2502 sendet und empfängt. In mindestens einer Ausführungsform kommuniziert die I/O-Einheit 2506 mit dem Hostprozessor direkt über den Systembus 2502 oder über ein oder mehrere Zwischenvorrichtungen, wie z.B. eine Speicherbrücke. In mindestens einer Ausführungsform kann die I/O-Einheit 2506 über den Systembus 2502 mit einem oder mehreren anderen Prozessoren kommunizieren, z.B. mit einer oder mehreren der PPUs 2500. In mindestens einer Ausführungsform umfasst die I/O-Einheit 2506 eine PCIe-Schnittstelle für die Kommunikation über einen PCIe-Bus. In mindestens einer Ausführungsform umfasst die I/O-Einheit 2506 Schnittstellen für die Kommunikation mit externen Geräten.
  • In mindestens einer Ausführungsform decodiert die I/O-Einheit 2506 über den Systembus 2502 empfangene Pakete. In mindestens einer Ausführungsform repräsentieren mindestens einige Pakete Befehle, die so konfiguriert sind, dass sie die PPU 2500 veranlassen, verschiedene Operationen durchzuführen. In mindestens einer Ausführungsform sendet die I/O-Einheit 2506 decodierte Befehle an verschiedene andere Einheiten der PPU 2500, wie durch Befehle vorgegeben. In mindestens einer Ausführungsform werden Befehle an die Frontend-Einheit 2510 und/oder an den Hub 2516 oder andere Einheiten der PPU 2500, wie z.B. eine oder mehrere Kopiermaschinen, einen Videocodierer, einen Video-Decodierer, eine Energieverwaltungseinheit usw., (in 25 nicht explizit dargestellt) übertragen. In mindestens einer Ausführungsform ist die I/O-Einheit 2506 so konfiguriert, dass sie die Kommunikation zwischen und unter verschiedenen logischen Einheiten der PPU 2500 routet bzw. leitet.
  • In mindestens einer Ausführungsform codiert ein von dem Hostprozessor ausgeführtes Programm einen Befehlsstrom in einem Puffer, der der PPU 2500 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 2500 zugreifen können (z.B. Lesen/Schreiben) - eine Host-Schnittstelleneinheit kann so konfiguriert sein, dass sie auf einen Puffer in einem mit dem Systembus 2502 verbundenen Systemspeicher über Speicheranforderungen zugreift, die über den Systembus 2502 von der I/O-Einheit 2506 ü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 2500, so dass die Frontend-Einheit 2510 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 2500 weiterleitet.
  • In mindestens einer Ausführungsform ist die Frontend-Einheit 2510 mit der Scheduler-Einheit 2512 gekoppelt, die verschiedene GPCs 2518 zur Verarbeitung von Aufgaben konfiguriert, die durch einen oder mehrere Befehlsströme definiert sind. In mindestens einer Ausführungsform ist die Scheduler-Einheit 2512 so konfiguriert, dass sie Zustandsinformationen mit Bezug zu verschiedenen Aufgaben nachverfolgt, die von der Scheduler-Einheit 2512 verwaltet werden, wobei die Zustandsinformationen angeben können, welchem der GPCs 2518 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 2512 die Ausführung einer Vielzahl von Aufgaben auf einem oder mehreren GPCs 2518.
  • In mindestens einer Ausführungsform ist die Scheduler-Einheit 2512 mit der Arbeitsverteilungseinheit 2514 gekoppelt, die so konfiguriert ist, dass sie Aufgaben zur Ausführung auf den GPCs 2518 versendet. In mindestens einer Ausführungsform nachverfolgt die Arbeitsverteilungseinheit 2514 eine Anzahl geplanter Aufgaben, die von der Scheduler-Einheit 2512 empfangen wurden, und verwaltet die Arbeitsverteilungseinheit 2514 einen Pool ausstehender Aufgaben und einen Pool aktiver Aufgaben für jeden GPC 2518. 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 2518 zugewiesen sind; der Pool aktiver Aufgaben kann eine Anzahl von Slots (z.B. 4 Slots) für Aufgaben umfassen, die aktiv von den GPCs 2518 verarbeitet werden, so dass dann, wenn einer der GPCs 2518 die Ausführung einer Aufgabe abschließt, diese Aufgabe aus dem Pool aktiver Aufgaben für den GPC 2518 entfernt wird und eine der anderen Aufgaben aus dem Pool anstehender Aufgaben ausgewählt und zur Ausführung auf dem GPC 2518 eingeplant wird. In mindestens einer Ausführungsform wird dann, wenn eine aktive Aufgabe auf dem GPC 2518 im Leerlauf ist, z.B. während auf die Auflösung einer Datenabhängigkeit gewartet wird, die aktive Aufgabe aus dem GPC 2518 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 2518 eingeplant wird.
  • In mindestens einer Ausführungsform kommuniziert die Arbeitsverteilungseinheit 2514 mit einem oder mehreren GPCs 2518 über die Kreuzschiene bzw. XBar 2520. In mindestens einer Ausführungsform ist die XBar 2520 ein Interconnect- bzw. Verbindungsnetzwerk, das viele Einheiten der PPU 2500 mit anderen Einheiten der PPU 2500 koppelt und so konfiguriert sein kann, dass es die Arbeitsverteilungseinheit 2514 mit einem bestimmten GPC 2518 koppelt. In mindestens einer Ausführungsform können auch eine oder mehrere andere Einheiten der PPU 2500 über den Hub 2516 mit der XBar 2520 verbunden sein.
  • In mindestens einer Ausführungsform werden Aufgaben von der Scheduler-Einheit 2512 verwaltet und von der Arbeitsverteilungseinheit 2514 an einen der GPCs 2518 weitergeleitet. Der GPC 2518 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 2518 verbraucht, über die XBar 2520 an einen anderen GPC 2518 weitergeleitet oder in dem Speicher 2504 gespeichert werden. In mindestens einer Ausführungsform können Ergebnisse in den Speicher 2504 über Partitionseinheiten 2522 geschrieben werden, die eine Speicherschnittstelle zum Lesen und Schreiben von Daten in/aus dem Speicher 2504 umfassen. In mindestens einer Ausführungsform können die Ergebnisse über die Hochgeschwindigkeits-GPU-Verbindung 2508 an eine andere PPU 2504 oder CPU übertragen werden. In mindestens einer Ausführungsform umfasst die PPU 2500, ohne Beschränkung darauf, eine Anzahl U von Partitionseinheiten 2522, die gleich der Anzahl der mit der PPU 2500 verbundenen separaten und unterschiedlichen Speichervorrichtungen 2504 ist.
  • In mindestens einer Ausführungsform führt ein Hostprozessor einen Treiberkern aus, der eine Anwendungsprogrammierschnittstelle („API“) ausführt, die es einer oder mehreren auf dem Hostprozessor ausgeführten Anwendungen ermöglicht, Operationen zur Ausführung auf der PPU 2500 zu planen. In mindestens einer Ausführungsform werden mehrere Rechenanwendungen gleichzeitig von der PPU 2500 ausgeführt und stellt die PPU 2500 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 2500 zu generieren, und gibt der Treiberkern Aufgaben an einen oder mehrere Streams aus, die von der PPU 2500 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.
  • 26 veranschaulicht einen GPC 2600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der GPC 2600 der GPC 2518 von 25. In mindestens einer Ausführungsform beinhaltet jeder GPC 2600, ohne Beschränkung darauf, eine Anzahl von Hardware-Einheiten zur Verarbeitung von Aufgaben, und beinhaltet jeder GPC 2600, ohne Beschränkung darauf, einen Pipeline-Manager 2602, eine Pre-Raster-Operationseinheit („PROP“) 2604, eine Raster-Engine 2608, eine Arbeitsverteilungs-Kreuzschiene („WDX“) 2616, eine MMU 2618, einen oder mehrere Datenverarbeitungscluster („DPCs“) 2606 und jede geeignete Kombination von Teilen.
  • In mindestens einer Ausführungsform wird der Betriebsablauf des GPC 2600 von dem Pipeline-Manager 2602 gesteuert. In mindestens einer Ausführungsform verwaltet der Pipeline-Manager 2602 die Konfiguration eines oder mehrerer DPCs 2606 zur Verarbeitung von Aufgaben, die dem GPC 2600 zugewiesen sind. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 2602 mindestens eine des einen oder der mehreren DPCs 2606, um mindestens einen Teil einer Grafik-Rendering-Pipeline auszuführen. In mindestens einer Ausführungsform ist der DPC 2606 so konfiguriert, dass er ein Vertex-Shader-Programm auf einem programmierbaren Streaming-Multiprozessor („SM“) 2614 ausführt. In mindestens einer Ausführungsform ist der Pipeline-Manager 2602 so konfiguriert, dass er von einer Arbeitsverteilungseinheit empfangene Pakete an entsprechende logische Einheiten innerhalb des GPC 2600 weiterleitet, und in mindestens einer Ausführungsform können einige Pakete an Hardwareeinheiten mit fester Funktion in dem PROP 2604 und/oder in der Raster-Engine 2608 weitergeleitet werden, während andere Pakete an die DPCs 2606 zur Verarbeitung durch eine Primitiv-Engine 2612 oder den SM 2614 weitergeleitet werden können. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 2602 mindestens einen der DPCs 2606, um eine Rechenpipeline auszuführen. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 2602 mindestens einen der DPCs 2606, um mindestens einen Teil eines CUDA-Programms auszuführen.
  • In mindestens einer Ausführungsform ist die PROP-Einheit 2604 so konfiguriert, dass sie von der Raster-Engine 2608 und den DPCs 2606 erzeugte Daten an eine Raster Operations („ROP“)-Einheit in einer Partitionseinheit weiterleitet, wie z.B. die vorstehend in Verbindung mit 25 näher beschriebene Speicherpartitionseinheit 2522. In mindestens einer Ausführungsform ist die PROP-Einheit 2604 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 2608, 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 2608, 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 mit einem durch Vertices definierten geometrischen Primitiv verbunden 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 mit einem Primitiv verbunden 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 2608 Fragmente, die von einer geeigneten Einheit zu verarbeiten sind, z.B. von einem Fragment-Shader in dem DPC 2606.
  • In mindestens einer Ausführungsform umfasst jeder in dem GPC 2600 enthaltene DPC 2606, ohne Beschränkung darauf, einen M-Pipe-Controller („MPC“) 2610, eine Primitiv-Engine 2612, einen oder mehrere SMs 2614 und jede geeignete Kombination davon. In mindestens einer Ausführungsform steuert der MPC 2610 den Betriebsablauf des DPC 2606, indem er von dem Pipeline-Manager 2602 empfangene Pakete an entsprechende Einheiten in dem DPC 2606 weiterleitet. In mindestens einer Ausführungsform werden Pakete, die einem Vertex zugeordnet sind, an die Primitive Engine 2612 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 2614 übertragen werden.
  • In mindestens einer Ausführungsform umfasst der SM 2614, 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 2614 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 benutzt, 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 umfasst der SM 2614 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 2614 wird in Verbindung mit 26 ausführlicher beschrieben.
  • In mindestens einer Ausführungsform stellt die MMU 2618 eine Schnittstelle zwischen dem GPC 2600 und einer Speicherpartitionseinheit (z.B. der Partitionseinheit 2522 in 25) bereit, und stellt die MMU 2618 eine Übersetzung virtueller Adressen in physische Adressen, einen Speicherschutz und eine Arbitrierung von Speicheranforderungen bereit. In mindestens einer Ausführungsform stellt die MMU 2618 einen oder mehrere Übersetzungs-Lookaside-Puffer (TLBs) zur Durchführung der Übersetzung virtueller Adressen in physische Adressen im Speicher bereit.
  • 26 veranschaulicht einen Streaming-Multiprozessor („SM“) 2700, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der SM 2700 der SM 2614 von 26. In mindestens einer Ausführungsform beinhaltet der SM 2700, ohne Beschränkung darauf, einen Anweisungscache 2702; eine oder mehrere Schedulereinheiten 2704; eine Registerdatei 2708; einen oder mehrere Verarbeitungskerne („Cores“) 2710; eine oder mehrere Spezialfunktionseinheiten („SFUs“) 2712; eine oder mehrere LSUs 2714; ein Verbindungsnetzwerk 2716; einen gemeinsamen Speicher/L1-Cache 2718; 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 2700 zugewiesen. In mindestens einer Ausführungsform empfängt die Schedulereinheit 2704 Aufgaben von einer Arbeitsverteilungseinheit und verwaltet die Befehlsplanung für einen oder mehrere Thread-Blöcke, die dem SM 2700 zugewiesen sind. In mindestens einer Ausführungsform plant die Schedulereinheit 2704 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 2704 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 2710, SFUs 2712 und LSUs 2714) 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 bzw. Grid von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist eine Dispatcheinheit 2706 so konfiguriert, dass sie Befehle an eine oder mehrere Funktionseinheiten überträgt, und beinhaltet die Schedulereinheit 2704, ohne Beschränkung darauf, zwei Dispatcheinheiten 2706, 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 2704 eine einzelne Dispatcheinheit 2706 oder zusätzliche Dispatcheinheiten 2706.
  • In mindestens einer Ausführungsform enthält jeder SM 2700, ohne Beschränkung darauf, eine Registerdatei 2708, die einen Satz von Registern für Funktionseinheiten des SM 2700 bereitstellt. In mindestens einer Ausführungsform ist die Registerdatei 2708 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 2708 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 2708 zwischen verschiedenen Warps aufgeteilt, die von dem SM 2700 ausgeführt werden, und stellt die Registerdatei 2708 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten verbunden sind. In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, eine Vielzahl von L Verarbeitungskernen 2710. In mindestens einer Ausführungsform beinhaltet der SM 2700, ohne Beschränkung darauf, eine große Anzahl (z.B. 128 oder mehr) von unterschiedlichen Verarbeitungskernen 2710. In mindestens einer Ausführungsform beinhaltet jeder Verarbeitungskern 2710, ohne Beschränkung darauf, eine voll gepipelte, einfachpräzise, doppeltpräzise und/oder gemischtpräzise Verarbeitungseinheit, die, ohne Beschränkung darauf, eine arithmetische Gleitkomma-Logikeinheit und eine arithmetische Ganzzahl-Logikeinheit umfasst. In mindestens einer Ausführungsform benutzen die Gleitkomma-Arithmetik-Logikeinheiten den Standard IEEE 754-2008 für Gleitkomma-Arithmetik. In mindestens einer Ausführungsform beinhalten die Verarbeitungskerne 2710, 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 2710 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 4×4-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 2700, ohne Beschränkung darauf, M SFUs 2712, die spezielle Funktionen ausführen (z.B. Attributauswertung, reziproke Quadratwurzel und dergleichen). In mindestens einer Ausführungsform beinhalten die SFUs 2712, 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 2712, 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 2700 ausgeführt werden. In mindestens einer Ausführungsform werden die Texturkarten in dem gemeinsamen Speicher/L1-Cache 2718 gespeichert. In mindestens einer Ausführungsform führen Textureinheiten Texturoperationen, wie z.B. Filteroperationen unter Verwendung von Mip-Maps (z.B. Texturkarten mit unterschiedlichen Detailstufen) aus. In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, zwei Textureinheiten.
  • In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, N LSUs 2714, die Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher/L1-Cache 2718 und der Registerdatei 2708 ausführen. In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, ein Verbindungsnetzwerk 2716, das jede der Funktionseinheiten mit der Registerdatei 2708 und die LSU 2714 mit der Registerdatei 2708 und dem gemeinsamen Speicher/L1-Cache 2718 verbindet. In mindestens einer Ausführungsform ist das Verbindungsnetzwerk 2716 eine Kreuzschiene, die so konfiguriert werden kann, dass sie jede der Funktionseinheiten mit jedem der Register in der Registerdatei 2708 verbindet und die LSUs 2714 mit der Registerdatei 2708 und Speicherplätzen in dem gemeinsamen Speicher/L1-Cache 2718 verbindet.
  • In mindestens einer Ausführungsform ist der gemeinsam genutzte Speicher/L1-Cache 2718 ein Array von On-Chip-Speicher, der die Datenspeicherung und Kommunikation zwischen dem SM 2700 und einer Primitiv-Engine sowie zwischen Threads in dem SM 2700 ermöglicht. In mindestens einer Ausführungsform umfasst der gemeinsam genutzte Speicher/L1-Cache 2718, ohne Beschränkung darauf, 128 KB Speicherkapazität und befindet sich in einem Pfad von dem SM 2700 zu einer Partitionseinheit. In mindestens einer Ausführungsform wird der gemeinsame Speicher/L1-Cache 2718 zum Zwischenspeichern von Lese- und Schreibvorgängen verwendet. In mindestens einer Ausführungsform sind einer oder mehrere von gemeinsamem Speicher/L1-Cache 2718, 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 2718, dass der gemeinsam genutzte Speicher/L1-Cache 2718 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 2700 zur Ausführung eines Programms und zur Durchführung von Berechnungen, der gemeinsame Speicher/L1-Cache 2718 zur Kommunikation zwischen Threads und die LSU 2714 zum Lesen und Schreiben des globalen Speichers über den gemeinsamen Speicher/L1-Cache 2718 und eine Speicherpartitionseinheit verwendet werden. In mindestens einer Ausführungsform schreibt der SM 2700, wenn er für allgemeine parallele Berechnungen konfiguriert ist, Befehle, die die Schedulereinheit 2704 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.
  • Softwarekonstruktionen für Universalcomputing
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte Softwarekonstrukte zur Ausführung mindestens einer Ausführungsform.
  • 28 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 Berechnungs-Tasks zu beschleunigen. In mindestens einer Ausführungsform kann eine Programmierplatt-form 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 2800 einer Programmierplattform eine Ausführungsumgebung für eine Anwendung 2801 bereit. In mindestens einer Ausführungsform kann die Anwendung 2801 jede beliebige Computersoftware umfassen, die auf dem Software-Stack 2800 gestartet werden kann. In mindestens einer Ausführungsform kann die Anwendung 2801 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 2801 und der Software-Stack 2800 auf Hardware 2807. Die Hardware 2807 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 2800 herstellerspezifisch und nur mit Vorrichtungen bestimmter Hersteller kompatibel sein. In mindestens einer Ausführungsform, wie beispielsweise bei OpenCL, kann der Softwarestack 2800 mit Vorrichtungen verschiedener Hersteller verwendet werden. In mindestens einer Ausführungsform umfasst die Hardware 2807 einen Host, der mit einer oder mehreren Vorrichtungen verbunden ist, auf die zugegriffen werden kann, um Berechnungs-Tasks über API (Application Programming Interface)-Aufrufe durchzuführen. Eine Vorrichtung innerhalb der Hardware 2807 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 2807, 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 2800 einer Programmierplattform, ohne Beschränkung darauf, eine Reihe von Bibliotheken 2803, eine Laufzeit 2805 und einen Gerätekerneltreiber 2806. Jede der Bibliotheken 2803 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 2803 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 2803 Funktionen, die für die Ausführung auf einer oder mehreren Vorrichtungsarten optimiert sind. In mindestens einer Ausführungsform können die Bibliotheken 2803 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 2903 entsprechenden APIs 2902 zugeordnet, die eine oder mehrere APIs enthalten können, die Funktionen in den Bibliotheken 2903 offenlegen.
  • In mindestens einer Ausführungsform ist die Anwendung 2801 als Quellcode geschrieben, der in ausführbaren Code kompiliert wird, wie nachstehend in Verbindung mit 31 - 33 näher erläutert wird. In mindestens einer Ausführungsform kann ausführbarer Code der Anwendung 2801 zumindest teilweise auf einer Ausführungsumgebung laufen, die von dem Software-Stack 2800 bereitgestellt wird. In mindestens einer Ausführungsform kann während der Ausführung der Anwendung 2801 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 Laufzeit 2805 aufgerufen werden, um den erforderlichen Code auf das Gerät zu laden und zu starten. In mindestens einer Ausführungsform kann die Laufzeit 2805 jedes technisch machbare Laufzeitsystem umfassen, das die Ausführung der Anwendung S01 unterstützen kann.
  • In mindestens einer Ausführungsform ist die Laufzeit 2805 eine oder mehrere Laufzeitbibliotheken, die mit entsprechenden APIs verbunden sind, die als API(s) 2804 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, Fehlerbehand-lung 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) 2804 auf jede technisch machbare Weise ausgeführt werden. 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 2806 so konfiguriert, dass er Kommunikation mit einem zugrunde liegenden Gerät erleichtert. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 2806 Low-Level-Funktionalitäten bereitstellen, auf die sich APIs, wie z.B. die API(s) 2804, und/oder andere Software stützen. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 2806 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 2806 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 2806 den IR-Code zur Laufzeit kompilieren muss.
  • 29 veranschaulicht eine CUDA-Implementierung des Software-Stacks 2800 von 28, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein CUDA-Software-Stack 2900, auf dem eine Anwendung 2901 gestartet werden kann, CUDA-Bibliotheken 2903, eine CUDA-Laufzeit 2905, einen CUDA-Treiber 2907 und einen Gerätekerneltreiber 2908. In mindestens einer Ausführungsform wird der CUDA-Software-Stack 2900 auf der Hardware 2909 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 2901, die CUDA-Laufzeit 2905 und der Gerätekerneltreiber 2908 ähnliche Funktionalitäten wie die Anwendung 2801, die Laufzeit 2805 bzw. der Gerätekerneltreiber 2806 ausführen, die vorstehend in Verbindung mit 28 beschrieben sind. In mindestens einer Ausführungsform umfasst der CUDA-Treiber 2907 eine Bibliothek (libcuda.so), die eine CUDA-Treiber-API 2906 ausführt. Ähnlich zu einer CUDA-Laufzeit-API 2904, die von einer CUDA-Laufzeitbibliothek (cudart) ausgeführt wird, kann die CUDA-Treiber-API 2906 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 2906 von der CUDA-Laufzeit-API 2904 dadurch, dass die CUDA-Laufzeit-API 2904 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 2904 ist die CUDA-Treiber-API 2906 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 2906 Funktionen zur Kontextverwaltung bereitstellen, die von der CUDA-Laufzeit-API 2904 nicht bereitgestellt werden. In mindestens einer Ausführungsform ist die CUDA-Treiber-API 2906 auch sprachunabhängig und unterstützt z.B. OpenCL zusätzlich zu der CUDA-Laufzeit-API 2904. Ferner können in mindestens einer Ausführungsform die Entwicklungsbibliotheken, einschließlich der CUDA-Laufzeit 2905, als getrennt von den Treiberkomponenten betrachtet werden, einschließlich des Benutzer-Mode-CUDA-Treibers 2907 und des Kernel-Mode-Gerätetreibers 2908 (manchmal auch als „Anzeige“-Treiber bezeichnet).
  • In mindestens einer Ausführungsform können die CUDA-Bibliotheken 2903 mathematische Bibliotheken, Deep-Learning-Bibliotheken, Bibliotheken paralleler Algorithmen und/oder Bibliotheken für Signal-/Bild-/Videoverarbeitung beinhalten, die von parallelen Rechenanwendungen wie der Anwendung 2901 verwendet werden können, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 2903 mathematische Bibliotheken wie beispielsweise eine cuBLAS-Bibliothek, die Basic Linear Algebra Subprograms („BLAS“) zur Durchführung linearer Algebraoperationen umfasst, 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 2903 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.
  • 30 veranschaulicht eine ROCm-Implementierung des Software-Stacks 2800 von 28, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein ROCm-Software-Stack 3000, auf dem eine Anwendung 3001 gestartet werden kann, eine Laufzeitumgebung 3003, eine Systemlaufzeit 3005, einen Thunk 3007, einen ROCm-Kerneltreiber 3008 und einen Gerätekerneltreiber. In mindestens einer Ausführungsform wird der ROCm-Software-Stack 3000 auf der Hardware 3009 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 3001 ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 28 besprochene Anwendung 2801. Darüber hinaus können die Laufzeitumgebung 3003 und das Laufzeitsystem 3005 in mindestens einer Ausführungsform ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 28 beschriebene Laufzeit 2805. In mindestens einer Ausführungsform unterscheiden sich die Laufzeitumgebung 3003 und das Laufzeitsystem 3005 dadurch, dass das Laufzeitsystem 3005 eine sprachunabhängige Laufzeitumgebung ist, die eine ROCr-Systemlaufzeit-API 3004 umfasst und eine Heterogeneous System Architecture („HAS“) Laufzeit-API verwendet. Die H28-Laufzeit-API ist eine schlanke API für den Benutzer-Mode, 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 zum Laufzeitsystem 3005 umfasst die Laufzeitumgebung 3003 in mindestens einer Ausführungsform eine sprachspezifische Laufzeitumgebungs-API 3002, die auf der ROCr-Laufzeitsystem-API 3004 aufliegt. In mindestens einer Ausführungsform kann die Laufzeitsystem-API unter anderem eine Heterogeneous Compute Interface for Portability („HIP“)-Laufzeitsystem-API, eine Heterogeneous Compute Compiler („HCC“)-Laufzeitumgebungs-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 29 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) 3007 eine Schnittstelle, die zur Interaktion mit dem zugrunde liegenden ROCm-Treiber 3008 verwendet werden kann. In mindestens einer Ausführungsform ist der ROCm-Treiber 3008 ein ROCk-Treiber, der eine Kombination aus einem AMDGPU-Treiber und einem HSA-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 2 besprochene Gerätekerneltreiber 2806 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 3000 oberhalb der Laufzeitumgebung 3003 enthalten sein und eine ähnliche Funktionalität wie die CUDA-Bibliotheken 2903, die vorstehend in Verbindung mit 29 besprochen wurden, bereitstellen. In mindestens einer Ausführungsform können verschiedene Bibliotheken mathematische, Deep-Learning- und/oder andere Bibliotheken enthalten, wie z.B. eine hip-BLAS-Bibliothek, die Funktionen ähnlich denen von CUDA cuBLAS umfasst, eine rocFFT-Bibliothek zur Berechnung von FFTs, die CUDA cuFFT ähnlich ist, und andere.
  • 31 veranschaulicht eine OpenCL-Implementierung des Software-Stacks 2800 von 28, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein OpenCL-Software-Stack 3100, auf dem eine Anwendung 3101 gestartet werden kann, ein OpenCL-Framework 3110, eine OpenCL-Laufzeitumgebung 3106 und einen Treiber 3107. In mindestens einer Ausführungsform wird der OpenCL-Software-Stack 3100 auf der Hardware 2909 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 3101, die OpenCL-Laufzeitumgebung 3106, der Gerätekerneltreiber 3107 und die Hardware 3108 ähnliche Funktionen ausführen wie die Anwendung 2801, die Laufzeit 2805, der Gerätekerneltreiber 2806 bzw. die Hardware 2807, die vorstehend in Verbindung mit 28 beschrieben sind. In mindestens einer Ausführungsform enthält die Anwendung 3101 außerdem einen OpenCL-Kernel 3102 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 3103 und Laufzeit-API 3105, bereit. In mindestens einer Ausführungsform verwendet die Laufzeit-API 3105 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 3105 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 3103 Funktionen zur Verfügung, 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 3104 in dem OpenCL-Framewerk 3110 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 3104 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.
  • 32 veranschaulicht Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform 3204 so konfiguriert, dass sie verschiedene Programmiermodelle 3203, Middlewares und/oder Bibliotheken 3202 und Frameworks 3201 unterstützt, auf die sich eine Anwendung 3200 stützen kann. In mindestens einer Ausführungsform kann die Anwendung 3200 eine KI/ML-Anwendung sein, die beispielsweise ein Deep-Learning-Framework wie MXNet, PyTorch oder TensorFlow verwendet, 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 3204 eine der vorstehend in Verbindung mit 29, 30 bzw. 31 beschriebenen CUDA-, ROCm- oder OpenCL-Plattformen sein. In mindestens einer Ausführungsform unterstützt die Programmierplattform 3204 mehrere Programmiermodelle 3203, die Abstraktionen eines zugrunde liegenden Rechensystems sind, die Ausdrücke von Algorithmen und Datenstrukturen erlauben. In mindestens einer Ausführungsform können Programmiermodelle 3203 Merkmale zugrunde liegender Hardware offenlegen, um die Leistung zu verbessern. In mindestens einer Ausführungsform können die Programmiermodelle 3203 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 3202 Abstraktionen von Programmiermodellen 3204 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 3204 verfügbaren Dienste hinausgehen. In mindestens einer Ausführungsform können die Bibliotheken und/oder Middlewares 3202 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 3202 in mindestens einer Ausführungsform NCCL- und ROCm Communication Collectives Library („RCCL“)-Bibliotheken, die Kommunikationsroutinen für GPUs bereitstellen, eine MIOpen-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 3201 von Bibliotheken und/oder Middlewares 3202 ab. In mindestens einer Ausführungsform ist jedes der Anwendungsframeworks 3201 ein Softwareframework, das für eine 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 Frameworks wie Caffe, Caffe2, TensorFlow, Keras, PyTorch oder MxNet Deep Learning Frameworks verwenden.
  • 33 veranschaulicht die Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 28 - 31, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform empfängt ein Compiler 3301 Quellcode 3300, der sowohl Host-Code als auch Geräte-Code enthält. In mindestens einer Ausführungsform ist der Compiler 3301 so konfiguriert, dass er den Quellcode 3300 in einen ausführbaren Host-Code 3302 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 3303 zur Ausführung auf einem Gerät umwandelt. In mindestens einer Ausführungsform kann der Quellcode 3300 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 3300 Code in einer beliebigen, von dem Compiler 3301 unterstützten Programmiersprache enthalten, wie z.B. C++, C, Fortran usw. In mindestens einer Ausführungsform kann der Quellcode 3300 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 3300 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 3301 so konfiguriert, dass er den Quellcode 3300 in einen ausführbaren Host-Code 3302 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 3303 zur Ausführung auf einem Gerät kompiliert. In mindestens einer Ausführungsform führt der Compiler 3301 Operationen durch, darunter ein Parsen des Quellcodes 3300 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 3300 eine Single-Source-Datei enthält, kann der Compiler 3301 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 3303 bzw. den ausführbaren Host-Code 3302 kompilieren und den ausführbaren Geräte-Code 3303 und den ausführbaren Host-Code 3302 in einer einzigen Datei miteinander verknüpfen, wie nachstehend unter Bezugnahme auf 34 ausführlicher erläutert.
  • In mindestens einer Ausführungsform können der ausführbare Host-Code 3302 und der ausführbare Geräte-Code 3303 in jedem geeigneten Format vorliegen, z.B. als Binärcode und/oder IR-Code. Im Fall von CUDA kann der ausführbare Host-Code 3302 in mindestens einer Ausführungsform nativen Objektcode beinhalten und kann der ausführbare Geräte-Code 3303 Code in PTX-Zwischendarstellung beinhalten. Im Fall von ROCm können sowohl der ausführbare Host-Code 3302 als auch der ausführbare Geräte-Code 3303 in mindestens einer Ausführungsform einen Ziel-Binärcode enthalten.
  • 34 ist eine detailliertere Darstellung der Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 28 - 31, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist ein Compiler 3401 so konfiguriert, dass er Quellcode 3400 empfängt, Quellcode 3400 kompiliert und eine ausführbare Datei 3408 ausgibt. In mindestens einer Ausführungsform ist der Quellcode 3400 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 3401 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 3401 ein Compiler-Frontend 3402, einen Host-Compiler 3405, einen Geräte-Compiler 3406 und einen Linker 3409. In mindestens einer Ausführungsform ist das Compiler-Frontend 3402 so konfiguriert, dass es den Geräte-Code 3404 von dem Host-Code 3403 in dem Quellcode 3400 trennt. Geräte-Code 3404 wird von dem Gerätecompiler 3406 in ausführbaren Geräte-Code 3408 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 3403 von dem Host-Compiler 3405 in ausführbaren Host-Code 3407 kompiliert. In mindestens einer Ausführungsform kann für NVCC der Host-Compiler 3405, ohne darauf beschränkt zu sein, ein universeller C/C++-Compiler sein, der nativen Objektcode ausgibt, während der Geräte-Compiler 3406, 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 3405 als auch der Geräte-Compiler 3406 LLVM-basierte Compiler sein, die Ziel-Binärcode ausgeben, sind aber nicht darauf beschränkt.
  • Nach der Kompilierung des Quellcodes 3400 in einen ausführbaren Host-Code 3407 und einen ausführbaren Geräte-Code 3408 verknüpft der Linker 3409 in mindestens einer Ausführungsform den ausführbaren Host- und Geräte-Code 3407 und 3408 in einer ausführbaren Datei 3410. 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.
  • 35 veranschaulicht ein Übersetzen von Quellcode vor der Kompilierung des Quellcodes, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird Quellcode 3500 durch ein Übersetzungswerkzeug 3501 geleitet, das den Quellcode 3500 in übersetzten Quellcode 3502 übersetzt. In mindestens einer Ausführungsform wird ein Compiler 3503 verwendet, um den übersetzten Quellcode 3502 in einen ausführbaren Host-Code 3504 und einen ausführbaren Geräte-Code 3505 zu kompilieren, in einem Prozess, der der Kompilierung des Quellcodes 3300 durch den Compiler 3301 in einen ausführbaren Host-Code 3302 und einen ausführbaren Geräte-Code 3303 ähnelt, wie vorstehend in Verbindung mit 33 beschrieben wurde.
  • In mindestens einer Ausführungsform wird eine von dem Übersetzungswerkzeug 3501 durchgeführte Übersetzung verwendet, um den Quellcode 3500 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 3501 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 3500 ein Parsen des Quellcodes 3500 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 36A und 37 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 3501 durchgeführt werden, manchmal unvollständig sein, so dass zusätzlicher, manueller Aufwand erforderlich ist, um den Quellcode 3500 vollständig zu portieren.
  • Konfigurieren von GPUs für Universalberechnungen
  • 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.
  • 36A veranschaulicht ein System 3600, das so konfiguriert ist, dass es CUDA-Quellcode 3610 unter Verwendung verschiedener Arten von Verarbeitungseinheiten kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das System 3600, ohne Beschränkung darauf, CUDA-Quellcode 3610, einen CUDA-Compiler 3650, ausführbaren Host-Code 3670(1), ausführbaren Host-Code 3670(2), ausführbaren CUDA-Geräte-Code 3684, eine CPU 3690, eine CUDA-fähige GPU 3694, eine GPU 3692, ein CUDA-zu-HIP-Übersetzungswerkzeug 3620, HIP-Quellcode 3630, einen HIP-Compilertreiber 3640, einen HCC 3660 und ausführbaren HCC-Geräte-Code 3682.
  • In mindestens einer Ausführungsform ist der CUDA-Quellcode 3610 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 3690, eine GPU 3692 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 3690.
  • In mindestens einer Ausführungsform enthält der CUDA-Quellcode 3610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Hostfunktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform können globale Funktionen 3612, Gerätefunktionen 3614, Hostfunktionen 3616 und Host/Geräte-Funktionen 3618 in dem CUDA-Quellcode 3610 gemischt sein. In mindestens einer Ausführungsform ist jede der globalen Funktionen 3612 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 3612 als Einstiegspunkte zu einem Gerät dienen. In mindestens einer Ausführungsform ist jede der globalen Funktionen 3612 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 3612 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 3614 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 3616 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 3616 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 3610 auch, ohne Beschränkung darauf, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die über eine CUDA-Laufzeit-API 3602 definiert sind. In mindestens einer Ausführungsform kann die CUDA-Laufzeit-API 3602, 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 3610 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 3602, 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 3602 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 u sw.
  • In mindestens einer Ausführungsform kompiliert der CUDA-Compiler 3650 den eingegebenen CUDA-Code (z.B. den CUDA-Quellcode 3610), um den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 zu erzeugen. In mindestens einer Ausführungsform ist der CUDA-Compiler 3650 ein NVCC. In mindestens einer Ausführungsform ist der ausführbare Host-Code 3670(1) eine kompilierte Version des Host-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CPU 3690 ausführbar ist. In mindestens einer Ausführungsform kann die CPU 3690 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 3684 eine kompilierte Version des Geräte-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CUDA-fähigen GPU 3694 ausführbar ist. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684, ohne Beschränkung darauf, Binärcode. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, 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 3694) kompiliert wird. In mindestens einer Ausführungsform kann der CUDA-fähige Grafikprozessor 3694 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 3694 von der NVIDIA Corporation in Santa Clara, CA, entwickelt.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 3620 so konfiguriert, dass es den CUDA-Quellcode 3610 in einen funktionell ähnlichen HIP-Quellcode 3630 übersetzt. In mindestens einer Ausführungsform ist der HIP-Quellcode 3630 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 3612, 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 3612 nur von einem Host aus aufrufbar sein.
  • In mindestens einer Ausführungsform enthält der HIP-Quellcode 3630, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform kann der HIP-Quellcode 3630 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die in einer HIP-Laufzeit-API 3632 angegeben sind. In mindestens einer Ausführungsform enthält die HIP-Laufzeit-API 3632, ohne Beschränkung darauf, funktionell ähnliche Versionen einer Teilmenge von Funktionen, die in der CUDA-Laufzeit-API 3602 enthalten sind. In mindestens einer Ausführungsform kann der HIP-Quellcode 3630 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 3632, eine HIP-Treiber-API, APIs für eine beliebige Anzahl von HIP-Bibliotheken, APIs für eine beliebige Anzahl von ROCm-Bibliotheken, u sw.
  • In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 3620 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 3620 eine beliebige Anzahl von Aufrufen zu Funktionen, die in der CUDA-Laufzeit-API 3602 angegeben sind, in eine beliebige Anzahl von Aufrufen zu Funktionen, die in der HIP-Laufzeit-API 3632 angegeben sind, um.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 3620 ein als hipify-perl bekanntes Werkzeug, das einen textbasierten Übersetzungsprozess ausführt. In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 3620 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 3620 durchgeführt werden, erfordern.
  • In mindestens einer Ausführungsform ist der HIP-Compilertreiber 3640 ein Frontend, das ein Zielgerät 3646 bestimmt und dann einen mit dem Zielgerät 3646 kompatiblen Compiler konfiguriert, um den HIP-Quellcode 3630 zu kompilieren. In mindestens einer Ausführungsform ist das Zielgerät 3646 ein Prozessor, der für die parallele Befehlsverarbeitung optimiert ist. In mindestens einer Ausführungsform kann der HIP-Compilertreiber 3640 das Zielgerät 3646 auf jede technisch machbare Weise bestimmen.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 3646 mit CUDA kompatibel ist (z.B. die CUDA-fähige GPU 3694), der HIP-Compilertreiber 3640 einen HIP/NVCC-Kompilierungsbefehl 3642. In mindestens einer Ausführungsform und wie in Verbindung mit 36B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 3642 den CUDA-Compiler 3650 zum Kompilieren des HIP-Quellcodes 3630 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 3642 erzeugt der CUDA-Compiler 3650 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 3646 nicht mit CUDA kompatibel ist, der HIP-Compilertreiber 3640 einen HIP/HCC-Kompilierungsbefehl 3644. In mindestens einer Ausführungsform und wie in Verbindung mit 36C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 3644 den HCC 3660 zum Kompilieren von HIP-Quellcode 3630 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 3644 erzeugt der HCC 3660 ausführbaren Host-Code 3670(2) und ausführbaren HCC-Geräte-Code 3682. In mindestens einer Ausführungsform ist der ausführbare HCC-Geräte-Code 3682 eine kompilierte Version des in dem HIP-Quellcode 3630 enthaltenen Geräte-Codes, der auf der GPU 3692 ausführbar ist. In mindestens einer Ausführungsform kann die GPU 3692 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 3692 von der AMD Corporation in Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform ist GPU, 3692 eine nicht CUDA-fähige GPU 3692.
  • Nur zu Erläuterungszwecken sind in 36A drei verschiedene Abläufe dargestellt, die in mindestens einer Ausführungsform ausgeführt werden können, um den CUDA-Quellcode 3610 für die Ausführung auf der CPU 3690 und verschiedenen Geräten zu kompilieren. In mindestens einer Ausführungsform kompiliert ein direkter CUDA-Ablauf den CUDA-Quellcode 3610 für die Ausführung auf der CPU 3690 und der CUDA-fähigen GPU 3694, ohne den CUDA-Quellcode 3610 in den HIP-Quellcode 3630 zu übersetzen. In mindestens einer Ausführungsform übersetzt ein indirekter CUDA-Ablauf den CUDA-Quellcode 3610 in den HIP-Quellcode 3630 und kompiliert dann den HIP-Quellcode 3630 zur Ausführung auf der CPU 3690 und der CUDA-fähigen GPU 3694. In mindestens einer Ausführungsform übersetzt ein CUDA/HCC-Ablauf den CUDA-Quellcode 3610 in HIP-Quellcode 3630 und kompiliert dann den HIP-Quellcode 3630 für die Ausführung auf der CPU 3690 und der GPU 3692.
  • Ein direkter CUDA-Ablauf, der in mindestens einer Ausführungsform ausgeführt werden 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 3650 den CUDA-Quellcode 3610 und einen CUDA-Kompilierbefehl 3648, der den CUDA-Compiler 3650 für die Kompilierung des CUDA-Quellcodes 3610 konfiguriert. In mindestens einer Ausführungsform ist der CUDA-Quellcode 3610, 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 3648 generiert der CUDA-Compiler 3650 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 (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 3670(1) und der ausführbare CUDA-Geräte-Code 3684 auf der CPU 3690 bzw. der CUDA-fähigen GPU 3694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, 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 ausgeführt werden 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 3620 den CUDA-Quellcode 3610. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung B2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform und wie in der mit B3 bezeichneten Blase dargestellt, empfängt der HIP-Compilertreiber 3640 den HIP-Quellcode 3630 und bestimmt, dass das Zielgerät 3646 CUDA-fähig ist.
  • In mindestens einer Ausführungsform und wie mit der mit B4 bezeichneten Blase dargestellt, erzeugt der HIP-Compilertreiber 3640 den HIP/NVCC-Kompilierbefehl 3642 und überträgt sowohl den HIP/NVCC-Kompilierbefehl 3642 als auch den HIP-Quellcode 3630 an den CUDA-Compiler 3650. In mindestens einer Ausführungsform und wie in Verbindung mit 36B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 3642 den CUDA-Compiler 3650 zum Kompilieren des HIP-Quellcodes 3630 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 3642 erzeugt der CUDA-Compiler 3650 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 (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 3670(1) und der ausführbare CUDA-Geräte-Code 3684 auf der CPU 3690 bzw. der CUDA-fähigen GPU 3694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, 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 ausgeführt werden 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 3620 den CUDA-Quellcode 3610. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung C2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform und wie mit der Blase C3 dargestellt, empfängt der HIP-Compilertreiber 3640 den HIP-Quellcode 3630 und bestimmt, dass das Zielgerät 3646 nicht CUDA-fähig ist.
  • In mindestens einer Ausführungsform erzeugt der HIP-Compilertreiber 3640 den HIP/HCC-Kompilierbefehl 3644 und überträgt sowohl den HIP/HCC-Kompilierbefehl 3644 als auch den HIP-Quellcode 3630 an den HCC 3660 (dargestellt durch die mit C4 bezeichnete Blase). In mindestens einer Ausführungsform und wie in Verbindung mit 36C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 3644 den HCC 3660, um den HIP-Quellcode 3630 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 3644 erzeugt der HCC 3660 einen ausführbaren Host-Code 3670(2) und einen ausführbaren HCC-Geräte-Code 3682 (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 3670(2) und der ausführbare HCC-Geräte-Code 3682 auf der CPU 3690 bzw. der GPU 3692 ausgeführt werden.
  • In mindestens einer Ausführungsform kann, nachdem der CUDA-Quellcode 3610 in HIP-Quellcode 3630 übersetzt wurde, der HIP-Compilertreiber 3640 anschließend verwendet werden, um ausführbaren Code entweder für die CUDA-fähige GPU 3694 oder die GPU 3692 zu erzeugen, ohne CUDA-HIP-Übersetzungswerkzeug 3620 erneut auszuführen. In mindestens einer Ausführungsform übersetzt das CUDA-zu-HIP-Übersetzungswerkzeug 3620 den CUDA-Quellcode 3610 in HIP-Quellcode 3630, der dann im Speicher abgelegt wird. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 dann den HCC 3660, um den ausführbaren Host-Code 3670(2) und den ausführbaren HCC-Geräte-Code 3682 basierend auf dem HIP-Quellcode 3630 zu erzeugen. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 anschließend den CUDA-Compiler 3650, um auf der Grundlage des gespeicherten HIP-Quellcodes 3630 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 zu erzeugen.
  • 36B veranschaulicht ein System 3604, das so konfiguriert ist, dass es den CUDA-Quellcode 3610 von 36A unter Verwendung der CPU 3690 und der CUDA-fähigen GPU 3694 gemäß mindestens einer Ausführungsform kompiliert und ausführt. In mindestens einer Ausführungsform umfasst das System 3604, ohne Beschränkung darauf, den CUDA-Quellcode 3610, das CUDA-HIP-Übersetzungswerkzeug 3620, den HIP-Quellcode 3630, den HIP-Compilertreiber 3640, den CUDA-Compiler 3650, den ausführbaren Host-Code 3670(1), den ausführbaren CUDA-Geräte-Code 3684, die CPU 3690 und die CUDA-fähige GPU 3694.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 36A beschrieben, enthält der CUDA-Quellcode 3610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 3610 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 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 3620 jeden Kernel-Aufruf in dem CUDA-Quellcode 3610 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem CUDA-Quellcode 3610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt HIP-Compilertreiber 3640, dass das Zielgerät 3646 CUDA-fähig ist, und erzeugt den HIP/NVCC-Kompilierungsbefehl 3642. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 dann den CUDA-Compiler 3650 über den HIP/NVCC-Kompilierbefehl 3642, um den HIP-Quellcode 3630 zu kompilieren. In mindestens einer Ausführungsform stellt der HIP-Compilertreiber 3640 Zugriff auf einen HIP-zu-CUDA-Übersetzungsheader 3652 als Teil der Konfiguration des CUDA-Compilers 3650 bereit. In mindestens einer Ausführungsform übersetzt der HIP-zu-CUDA-Übersetzungsheader 3652 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 3650 den HIP-zu-CUDA-Übersetzungsheader 3652 in Verbindung mit einer CUDA-Laufzeitbibliothek 3654, die der CUDA-Laufzeit-API 3602 entspricht, um den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 zu erzeugen. In mindestens einer Ausführungsform können der ausführbare Host-Code 3670(1) und der ausführbare CUDA-Geräte-Code 3684 dann auf der CPU 3690 bzw. der CUDA-fähigen GPU 3694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, ohne Beschränkung darauf, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • 36C zeigt ein System 3606, das so konfiguriert ist, dass es den CUDA-Quellcode 3610 von 36A unter Verwendung einer CPU 3690 und einer nicht-CUDA-fähigen GPU 3692 kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das System 3606, ohne Beschränkung darauf, den CUDA-Quellcode 3610, das CUDA-zu-HIP-Übersetzungswerkzeug 3620, den HIP-Quellcode 3630, den HIP-Compilertreiber 3640, den HCC 3660, den ausführbaren Host-Code 3670(2), den ausführbaren HCC-Geräte-Code 3682, die CPU 3690 und die GPU 3692.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 36A beschrieben, enthält der CUDA-Quellcode 3610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 3610 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 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 3620 jeden Kernel-Aufruf in dem CUDA-Quellcode 3610 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 3610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt der HIP-Compilertreiber 3640 anschließend, dass das Zielgerät 3646 nicht CUDA-fähig ist, und erzeugt den HIP/HCC-Kompilierbefehl 3644. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 dann den HCC 3660, um den HIP/HCC-Kompilierbefehl 3644 auszuführen, um den HIP-Quellcode 3630 zu kompilieren. In mindestens einer Ausführungsform konfiguriert der HIP/HCC-Kompilierbefehl 3644 den HCC 3660 so, dass er, ohne Beschränkung darauf, eine HIP/HCC-Laufzeitbibliothek 3658 und einen HCC-Header 3656 verwendet, um ausführbaren Host-Code 3670(2) und ausführbaren HCC-Geräte-Code 3682 zu erzeugen. In mindestens einer Ausführungsform entspricht die HIP/HCC-Laufzeitbibliothek 3658 der HIP-Laufzeit-API 3632. In mindestens einer Ausführungsform enthält der HCC-Header 3656, 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 3670(2) und der ausführbare HCC-Geräte-Code 3682 auf der CPU 3690 bzw. der GPU 3692 ausgeführt werden.
  • 37 veranschaulicht einen beispielhaften Kernel, der von dem CUDA-zu-HIP-Übersetzungswerkzeug 3620 von 36C übersetzt wurde, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform unterteilt der CUDA-Quellcode 3610 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 3610 Thread-Blöcke, die einem bestimmten Kernel zugeordnet sind, in ein eindimensionales, zweidimensionales oder dreidimensionales Gitter bzw. Grid 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 bzw. Grid, 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 bzw. Grids, das einen Kernel für einen bestimmten Kernelaufruf ausführt, und zugehörige Streams unter Verwendung einer CUDA-Kernel-Startsyntax 3710 spezifiziert. In mindestens einer Ausführungsform wird die CUDA-Kernel-Start-Syntax 3710 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 Kernelparametern („KernelArguments“) eingefügt wird. In mindestens einer Ausführungsform umfasst die CUDA-Kernel-Startsyntax 3710, 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 bzw. Grids. 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 bzw. Grid 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 3710 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 3710 ist „SharedMemorySize“ standardmäßig auf null gesetzt. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 3710 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 3610, 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 3710 wird der Kernel MatAdd unter Verwendung eines Gitters bzw. Grids 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 bzw. Grid mit genügend Blöcken erstellt, um einen Thread pro Matrixelement zu haben, und führt jeder Thread in einem solchen Gitter bzw. Grid den Kernel MatAdd aus, um eine paarweise Addition durchzuführen.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 3620 während des Übersetzens von CUDA-Quellcode 3610 in HIP-Quellcode 3630 jeden Kernelaufruf in dem CUDA-Quellcode 3610 von der CUDA-Kernel-Start-Syntax 3710 in eine HIP-Kernel-Start-Syntax 3720 und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 3610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe. In mindestens einer Ausführungsform ist die HIP-Kernel-Start-Syntax 3720 als „hipLaunch-KernelGGL(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 3720 die gleiche Bedeutung wie in der CUDA-Kernel-Start-Syntax 3710 (hierin zuvor beschrieben). In mindestens einer Ausführungsform sind die Argumente SharedMemorySize und Stream in der HIP-Kernel-Startsyntax 3720 erforderlich und in der CUDA-Kernel-Startsyntax 3710 optional.
  • In mindestens einer Ausführungsform ist ein Teil des in 37 dargestellten HIP-Quellcodes 3630 identisch mit einem Teil des in 37 dargestellten CUDA-Quellcodes 3610, 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 3630 mit demselben Deklarationsbezeichner „_global_“ definiert, mit dem der Kernel MatAdd in dem CUDA-Quellcode 3610 definiert ist. In mindestens einer Ausführungsform lautet ein Kernelaufruf in dem HIP-Quellcode 3630 „hipLaunchKernelGGL(MatAdd, numBlocks, threadsPerBlock, 0, 0, A, B, C);“, während ein entsprechender Kernelaufruf in dem CUDA-Quellcode 3610 „MatAdd«<numBlocks, threadsPerBlock»(A, B, C);“ lautet.
  • 38 veranschaulicht die nicht-CUDA-fähige GPU 3692 von 36C in größerem Detail, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird die GPU 3692 von der AMD Corporation in Santa Clara entwickelt. In mindestens einer Ausführungsform kann die GPU 3692 so konfiguriert sein, dass sie Rechenoperationen hochparallel durchführt. In mindestens einer Ausführungsform ist die GPU 3692 so konfiguriert, dass sie Grafikpipelineoperationen wie Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen ausführt, die mit dem Rendern eines Frames auf einer Anzeige verbunden sind. In mindestens einer Ausführungsform ist die GPU 3692 so konfiguriert, dass sie Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist die GPU 3692 so konfiguriert, dass sie sowohl grafikbezogene als auch grafikfremde Operationen ausführt. In mindestens einer Ausführungsform kann die GPU 3692 so konfiguriert sein, dass sie Geräte-Code ausführt, der in dem HIP-Quellcode 3630 enthalten ist.
  • In mindestens einer Ausführungsform umfasst die GPU 3692, ohne Beschränkung darauf, eine beliebige Anzahl von programmierbaren Verarbeitungseinheiten 3820, einen Befehlsprozessor 3810, einen L2-Cache 3822, Speichersteuerungen 3870, DMA-Engines 3880(1), Systemspeichersteuerungen 3882, DMA-Engines 3880(2) und GPU-Controller 3884. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 3820, ohne Beschränkung darauf, einen Arbeitslast-Manager 3830 und eine beliebige Anzahl von Recheneinheiten 3840. In mindestens einer Ausführungsform liest der Befehlsprozessor 3810 Befehle aus einer oder mehreren Befehlswarteschlangen (nicht dargestellt) und verteilt die Befehle an Arbeitslast-Manager 3830. In mindestens einer Ausführungsform verteilt der zugehörige Arbeitslast-Manager 3830 für jede programmierbare Verarbeitungseinheit 3820 Arbeit an in der programmierbaren Verarbeitungseinheit 3820 enthaltene Recheneinheiten 3840. In mindestens einer Ausführungsform kann jede Recheneinheit 3840 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 3840 ausgeführt. In mindestens einer Ausführungsform ist eine Arbeitsgruppe ein Thread-Block.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 3840, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 3850 und einen gemeinsamen Speicher 3860. In mindestens einer Ausführungsform umfasst jede SIMD-Einheit 3850 eine SIMD-Architektur und ist zur parallelen Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform beinhaltet jede SIMD-Einheit 3850, ohne Beschränkung darauf, eine Vektor-ALU 3852 und eine Vektorregisterdatei 3854. In mindestens einer Ausführungsform führt jede SIMD-Einheit 3850 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 3860 kommunizieren.
  • In mindestens einer Ausführungsform werden programmierbare Verarbeitungseinheiten 3820 als „Shader-Engines“ bezeichnet. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 3820, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware zusätzlich zu Recheneinheiten 3840. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 3820, 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 Arbeitslast-Manager 3830 und eine beliebige Anzahl von Recheneinheiten 3840.
  • In mindestens einer Ausführungsform teilen sich die Recheneinheiten 3840 einen L2-Cache 3822. In mindestens einer Ausführungsform ist der L2-Cache 3822 partitioniert. In mindestens einer Ausführungsform ist ein GPU-Speicher 3890 für alle Recheneinheiten 3840 in der GPU 3692 zugänglich. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 3870 und Systemspeichersteuerungen 3882 die Datenübertragung zwischen der GPU 3692 und einem Host, und ermöglichen die DMA-Engines 3880(1) asynchrone Speicherübertragungen zwischen der GPU 3692 und einem solchen Host. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 3870 und GPU-Controller 3884 Datenübertragungen zwischen der GPU 3692 und anderen GPUs 3692, und ermöglichen DMA-Engines 3880(2) asynchrone Speicherübertragungen zwischen der GPU 3692 und anderen GPUs 3692.
  • In mindestens einer Ausführungsform beinhaltet die GPU 3692, 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 3692 sein können, hinweg erleichtern. In mindestens einer Ausführungsform beinhaltet die GPU 3692, ohne Beschränkung darauf, eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCIe), die mit einer beliebigen Anzahl und Art von Peripheriegeräten gekoppelt sind. In mindestens einer Ausführungsform kann die GPU 3692, 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 umfasst die GPU 3692 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und eine beliebige Art von Speichersteuerungen (z.B. Speichersteuerung 3870 und Systemspeichersteuerung 3882) und Speichervorrichtungen (z.B. gemeinsam genutzte Speicher 3860) umfasst, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform umfasst die GPU 3692 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z. B. L2-Cache 3822) umfasst, die jeweils für eine beliebige Anzahl von Komponenten (z.B. SIMD-Einheiten 3850, Recheneinheiten 3840 und programmierbare Verarbeitungseinheiten 3820) reserviert oder von diesen gemeinsam genutzt werden können.
  • 39 veranschaulicht, wie Threads eines beispielhaften CUDA-Grids 3920 gemäß mindestens einer Ausführungsform auf verschiedene Recheneinheiten 3840 von 38 abgebildet werden. In mindestens einer Ausführungsform und nur zu Erläuterungszwecken hat das Raster 3920 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 3920 daher, ohne Beschränkung darauf, (BX * BY) Thread-Blöcke 3930 und umfasst jeder Thread-Block 3930, ohne Beschränkung darauf, (TX * TY) Threads 3940. Die Threads 3940 sind in 39 als verschnörkelte Pfeile dargestellt.
  • In mindestens einer Ausführungsform wird das Raster 3920 auf die programmierbare Verarbeitungseinheit 3820(1) abgebildet, die, ohne Beschränkung darauf, die Recheneinheiten 3840(1)-3840(C) umfasst. In mindestens einer Ausführungsform und wie gezeigt werden (BJ * BY) Thread-Blöcke 3930 auf die Recheneinheit 3840(1) abgebildet, und werden die restlichen Thread-Blöcke 3930 auf die Recheneinheit 3840(2) abgebildet. In mindestens einer Ausführungsform kann jeder Thread-Block 3930, ohne Beschränkung darauf, eine beliebige Anzahl von Warps enthalten, und ist jeder Warp einer anderen SIMD-Einheit 3850 von 38 zugeordnet.
  • In mindestens einer Ausführungsform können Warps in einem gegebenen Thread-Block 3930 zusammen synchronisieren und über gemeinsam genutzten Speicher 3860 in der zugeordneten Recheneinheit 3840 kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 3930(BJ,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 3860(1) kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 3930(BJ+1,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 3860(2) kommunizieren.
  • 40 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 4000 als Eingabe für ein DPC++-Kompatibilitätstool 4002 bereitgestellt, um menschenlesbares DPC++ 4004 zu erzeugen. In mindestens einer Ausführungsform enthält der für den Menschen lesbare DPC++ 4004 Inline-Kommentare, die vom DPC++-Kompatibilitätstool 4002 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 4006 abzuschließen und dadurch den DPC++-Quellcode 4008 zu erzeugen.
  • In mindestens einer Ausführungsform ist oder enthält der CUDA-Quellcode 4000 eine Sammlung von menschenlesbarem Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Quellcode 4000 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 Einschrä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 sequentielle Anweisungsverarbeitung optimiert ist, wie beispielsweise eine CPU. Der in Verbindung mit 40 beschriebene CUDA-Quellcode 4000 kann mit den an anderer Stelle in diesem Dokument beschriebenen Quellcodes übereinstimmen.
  • In mindestens einer Ausführungsform bezieht sich das DPC++-Kompatibilitätswerkzeug 4002 auf ein ausführbares Werkzeug, ein Programm, eine Anwendung oder eine andere geeignete Art von Werkzeug, das zur Erleichterung der Migration von CUDA-Quellcode 4000 zu DPC++-Quellcode 4008 verwendet wird. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 4002 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 4002 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++ 4004 bezeichnet wird. In mindestens einer Ausführungsform enthält das menschenlesbare DPC++ 4004 Kommentare, die vom DPC++-Kompatibilitätswerkzeug 4002 erzeugt werden, um anzuzeigen, wo ein Benutzereingriff erforderlich sein kann. In mindestens einer Ausführungsform ist ein Benutzereingriff erforderlich, wenn der CUDA-Quellcode 4000 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 4000 (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 4002; das Abschließen der Migration und das Überprüfen der Korrektheit, wodurch DPC++-Quellcode 4008 erzeugt wird; und das Kompilieren von DPC++-Quellcode 4008 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 4002 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 4002 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 4002 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 4002 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 4002 menschenlesbaren DPC++ 4004, bei dem es sich um DPC++-Code handeln kann, der in der vom DPC++-Kompatibilitätstool 4002 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 4002 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 4002 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 4002 direkt DPC++-Quellcode 4008, der von einem DPC++-Compiler kompiliert wird, ohne dass ein menschliches Eingreifen erforderlich ist oder genutzt wird, um den vom DPC++-Kompatibilitätswerkzeug 4002 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 4002 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++ {
         wenn (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 4002 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 4002 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 4002 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 VectorAdd-Kernel() 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 4002 geändert zu werden. In mindestens einer Ausführungsform modifiziert das DPC++-Kompatibilitätswerkzeug 4002 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++ 4004 (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++ 4004 auf die vom DPC++-Kompatibilitätswerkzeug 4002 erzeugte Ausgabe und kann auf die eine oder andere Weise optimiert werden. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätstool 4002 erzeugte, für den Menschen lesbare DPC++ 4004 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 43002 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 4002 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 4002 ü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 4002 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 4002; 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 Einschrä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.
  • Zumindest eine Ausführungsform der Erfindung kann im Hinblick auf die nachstehenden Sätze beschrieben werden:
    1. 1. Prozessor umfassend:
      • eine oder mehrere Schaltungen, um zu veranlassen, dass mindestens zwei verschiedene Typen von Verarbeitungskernen eine Inferencing-Operation mittels mindestens eines neuronalen Netzes ausführen.
    2. 2. Prozessor nach Satz 1, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern, umfassen.
    3. 3. Prozessor nach Satz 2, wobei es sich bei dem mindestens einen PPU-Kern um Grafikverarbeitungseinheits-Kerne, GPU-Kerne, handelt.
    4. 4. Prozessor nach einem der Sätze 1-3, wobei mindestens ein Softwareprogramm Anweisungen umfasst, um zu bewirken, dass die mindestens zwei verschiedenen Typen von Verarbeitungskernen die Inferencing-Operation ausführen, wobei das mindestens eine Softwareprogramm einen ersten Satz von Anweisungen, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Satz von Anweisungen, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    5. 5. Prozessor nach einem der Sätze 1-4, wobei die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen ist, wobei die Parallelverarbeitungsbibliothek Anweisungen umfasst, um einen ersten Abschnitt der Inferencing-Operation auf einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen und einen zweiten Abschnitt der Inferencing-Operation auf einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen.
    6. 6. Prozessor nach einem der Sätze 1-5, wobei die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen ist, um zumindest das mindestens eine neuronale Netz anzugeben, wobei die Parallelverarbeitungsbibliothek eine gemeinsame Zeigeradressierung für die mindestens zwei verschiedenen Typen von Verarbeitungskernen bereitstellt, um die Inferencing-Operation auszuführen.
    7. 7. Prozessor umfassend:
      • mindestens eine Schaltung, um einen Graphencode zu verwenden, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    8. 8. Prozessor nach Satz 7, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern umfassen.
    9. 9. Prozessor nach Satz 7 oder 8, wobei der Graphencode einen von einer Parallelverarbeitungsbibliothek erzeugten Ausführungsgraphen angibt.
    10. 10. Prozessor nach einem der Sätze 7-9, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation auszuführen.
    11. 11. Prozessor nach einem der Sätze 7-10, wobei das Softwareprogramm einen Satz von Anweisungen umfasst und der Graphencode eine erste Teilmenge des Satzes von Anweisungen und eine zweite Teilmenge des Satzes von Anweisungen umfasst, wobei die erste Teilmenge von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist und die zweite Teilmenge von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist.
    12. 12. Prozessor nach einem der Sätze 7-11, wobei eine Parallelverarbeitungsbibliothek den Graphencode als Ergebnis mindestens eines Funktionsaufrufs an eine von der Parallelverarbeitungsbibliothek bereitgestellte Schnittstelle erzeugt, und wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um mindestens einen Software-Kernel für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um mindestens einen Software-Kernel für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    13. 13. Prozessor nach einem der Sätze 7-12, wobei der Graphencode mindestens einen ersten Software-Kernel, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Kernel, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    14. 14. Maschinenlesbares Medium, auf dem mindestens eine Anweisung gespeichert ist, die, wenn sie von mindestens einem Prozessor ausgeführt wird, den mindestens einen Prozessor veranlasst, zumindest:
      • mindestens zwei verschiedene Typen von Verarbeitungskernen zu veranlassen, eine Inferencing-Operation mittels mindestens eines neuronalen Netzes auszuführen.
    15. 15. Maschinenlesbares Medium nach Satz 14, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern, und mindestens einen Deep-Learning-Beschleuniger, DLA, umfassen.
    16. 16. Maschinenlesbares Medium nach Satz 15, wobei es sich bei dem mindestens einen PPU-Kern um Grafikverarbeitungseinheits-Kerne, GPU-Kerne handelt.
    17. 17. Maschinenlesbares Medium nach einem der Sätze 14-16, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgestaltet sind, um einen Ausführungsgraphen auszuführen, wobei der Ausführungsgraph einen ersten Kernel, um einen ersten Teil der Inferencing-Operation auszuführen, und einen zweiten Kernel, um einen zweiten Teil der Inferencing-Operation auszuführen, umfasst.
    18. 18. Maschinenlesbares Medium nach einem der Sätze 14-17-, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, ein Softwareprogramm auszuführen, das Anweisungen umfasst, um die mindestens zwei verschiedenen Typen von Verarbeitungskernen zu veranlassen, die Inferencing-Operation auszuführen, wobei das Softwareprogramm einen ersten Satz von Anweisungen, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Satz von Anweisungen, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    19. 19. Maschinenlesbares Medium nach einem der Sätze 14-18, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, das mindestens eine neuronale Netz als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek zu empfangen, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um zu bewirken, dass ein erster Teil der Inferencing-Operation von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird, und einen zweiten Satz von Anweisungen, um zu bewirken, dass ein zweiter Teil der Inferencing-Operation von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird, umfasst.
    20. 20. Maschinenlesbares Medium nach einem der Sätze 14-19, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, die mindestens zwei verschiedenen Typen von Verarbeitungskernen veranlassen, die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen.
    21. 21. Maschinenlesbares Medium nach einem der Sätze 14-20, wobei mindestens ein Funktionsaufruf an eine Anwendungsprogrammierschnittstelle, API, die von der Parallelverarbeitungsbibliothek bereitgestellt wird, ausgestaltet ist, um das mindestens eine neuronale Netz anzugeben.
    22. 22. Maschinenlesbares Medium, auf dem mindestens eine Anweisung gespeichert ist, die, wenn sie von mindestens einem Prozessor ausgeführt wird, den mindestens einen Prozessor veranlasst, zumindest:
      • einen Graphencode zu verwenden, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    23. 23. Maschinenlesbares Medium nach Satz 22, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens eine Grafikverarbeitungseinheit-Kern, GPU-Kern, umfassen.
    24. 24. Maschinenlesbares Medium nach Satz 22 oder 23, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation mittels mindestens eines neuronalen Netzes auszuführen.
    25. 25. Maschinenlesbares Medium nach einem der Sätze 22-24, wobei der Graphencode einen Ausführungsgraphen angibt, der von einer Parallelverarbeitungsbibliothek als Ergebnis mindestens eines Funktionsaufrufs an die Parallelverarbeitungsbibliothek erzeugt wird, was das Softwareprogramm angibt, das von den mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist.
    26. 26. Maschinenlesbares Medium nach einem der Sätze 22-25, wobei das Softwareprogramm einen Satz von Rechenoperationen angibt, die von den mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, und wobei der Graphencode einen ersten Kernel, um eine erste Teilmenge der Rechenoperationen unter Verwendung eines ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen, und einen zweiten Kernel, um eine zweite Teilmenge der Rechenoperationen unter Verwendung eines zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen, umfasst.
    27. 27. Maschinenlesbares Medium nach einem der Sätze 22-26, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, den Graphencode als Ergebnis mindestens eines Funktionsaufrufs an eine Anwendungsprogrammierschnittstelle, API, zu erzeugen, die von einer Parallelverarbeitungsbibliothek bereitgestellt wird, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um einen ersten Abschnitt des Graphencodes für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um einen zweiten Abschnitt des Graphencodes für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    28. 28. Maschinenlesbares Medium nach einem der Sätze 22-27, wobei der Graphencode einen ersten Satz von Softwareanweisungen umfasst, die von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, und einen zweiten Satz von Softwareanweisungen, die von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, umfasst.
    29. 29. Verfahren umfassend:
      • Verwenden von Graphencode, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    30. 30. Verfahren nach Satz 29, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Grafikverarbeitungseinheits-Kern, GPU-Kern, und einen Deep-Learning-Beschleuniger, DLA, umfassen.
    31. 31. Verfahren nach Satz 29 oder 30, wobei das Softwareprogramm einen Satz von Operationen umfasst und der Graphencode einen Ausführungsgraphen angibt, der einen ersten Kernel, der eine erste Teilmenge eines Satzes von Operationen umfasst, die von einem ersten der mindestens zwei verschiedenen Typen von Prozessorkernen auszuführen sind, und einen zweiten Kernel, der eine zweite Teilmenge des Satzes von Operationen umfasst, die von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, umfasst.
    32. 32. Verfahren nach einem der Sätze 29-31, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation unter Verwendung der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen.
    33. 33. Verfahren nach einem der Sätze 29-32, wobei der Graphencode von einer Parallelverarbeitungsbibliothek als Ergebnis mindestens eines Funktionsaufrufs an eine Anwendungsprogrammierschnittstelle, API, die von der Parallelverarbeitungsbibliothek bereitgestellt wird, erzeugt wird.
    34. 34. Verfahren nach einem der Sätze 29-33, wobei der Graphencode von einer Parallelverarbeitungsbibliothek erzeugt wird, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um einen ersten Abschnitt des Graphencodes für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um einen zweiten Abschnitt des Graphencodes für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    35. 35. Verfahren nach einem der Sätze 29-34, wobei der Graphencode einen ersten Abschnitt des Softwareprogramms, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Abschnitt des Softwareprogramms, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, angibt.
    36. 36. Verfahren nach einem der Sätze 29-35, wobei eine Parallelverarbeitungsbibliothek eine gemeinsame Zeigeradressierung für die mindestens zwei verschiedenen Typen von Verarbeitungskernen bereitstellt, um mindestens eine durch das Softwareprogramm angegebene Rechenoperation auszuführen.
  • 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 Frame 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, zeigt der Begriff „Mehrzahl“ einen Zustand an, in dem er plural ist (z.B. „eine Mehrzahl von Elementen“ zeigt 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) ausgeführt werden, 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 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 auszuführen, 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 ausführt, 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 Einschrä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 einschrä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 „Methode“ werden hierin insofern synonym verwendet, als ein System eine oder mehrere Methoden umfassen kann und Methoden als System betrachtet werden können.
  • Bei mindestens einer Ausführungsform handelt es sich bei einer arithmetischen Logikeinheit um einen Satz kombinatorischer Logikschaltungen, die eine oder mehrere Eingaben verarbeiten, um ein Ergebnis zu erzeugen. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit von einem Prozessor verwendet, um mathematische Operationen wie Addition, Subtraktion oder Multiplikation auszuführen. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit verwendet, um logische Operationen wie logisches UND/ODER oder XOR auszuführen. Bei mindestens einer Ausführungsform ist eine arithmetische Logikeinheit zustandslos und besteht aus physikalischen Schaltkomponenten wie Halbleitertransistoren, die zur Ausbildung logischer Gatter angeordnet sind. Bei mindestens einer Ausführungsform kann eine arithmetische Logikeinheit intern als zustandsabhängige logische Schaltung mit einem zugehörigen Taktgeber arbeiten. Bei mindestens einer Ausführungsform kann eine arithmetische Logikeinheit als asynchrone logische Schaltung aufgebaut sein, deren interner Zustand nicht in einem zugehörigen Registersatz gehalten wird. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit 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.
  • Bei mindestens einer Ausführungsform übergibt der Prozessor als Ergebnis der Verarbeitung eines vom Prozessor abgerufenen Befehls einen oder mehrere Eingaben oder Operanden an eine arithmetische Logikeinheit, wodurch die arithmetische Logikeinheit veranlasst wird, ein Ergebnis zu erzeugen, das zumindest teilweise auf einem Befehlscode basiert, der den Eingängen der arithmetischen Logikeinheit bereitgestellt wird. Bei mindestens einer Ausführungsform basieren die vom Prozessor an die ALU gelieferten Befehlscodes zumindest teilweise auf dem vom Prozessor ausgeführten Befehl. Bei mindestens einer Ausführungsform verarbeitet die kombinatorische Logik in der ALU die Eingaben und erzeugt eine Ausgabe, die auf einen Bus innerhalb des Prozessors gelegt wird. Bei mindestens einer Ausführungsform wählt der Prozessor ein Zielregister, einen Speicherplatz, eine Ausgabeeinrichtung oder einen Ausgabespeicherplatz auf dem Ausgangsbus aus, so dass die Taktung 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 Ausführungsformen 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 Ausführungsformen 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 beispielhafte Ausführungsformen der beschriebenen Techniken darlegt, können auch andere Architekturen verwendet werden, um die beschriebene Funktionalität auszuführen, 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 Ausführung der Ansprüche offenbart.
  • MULTI-ARCHITEKTUR-AUSFÜHRUNGSGRAPHEN
  • QUERVERWEIS AUF VERWANDTE ANWENDUNGEN
  • ANSPRUCH AUF PRIORITÄT
  • Diese Anmeldung beruft sich auf die US-Patentanmeldung Nr. 17/468,128 , eingereicht am 7. September 2021, mit dem Titel „MULTI-ARCHITECTURE EXECUTION GRAPHS“, die in ihrer Gesamtheit und für alle Zwecke hierin enthalten ist.
  • FACHGEBIET
  • Mindestens eine Ausführungsform bezieht sich auf Verarbeitungsressourcen, die zur Ausführung von Softwarebefehlen für eine Vielzahl von Prozessorarchitekturen unter Verwendung der Compute Uniform Device Architecture (CUDA) verwendet werden. Zum Beispiel bezieht sich mindestens eine Ausführungsform auf Prozessor- oder Rechensysteme zur Ausführung von Multi-Architektur-Ausführungsgraphen gemäß verschiedenen neuen Verfahren, die hier beschrieben sind.
  • HINTERGRUND
  • Moderne eingebettete Systeme verwenden mehrere Typen von Prozessoren, um Hochleistungsrechenoperationen durchzuführen. Programmierer verwenden verschiedene Programmierbibliotheken, um die für jeden Typ von Prozessor spezifischen Fähigkeiten zu nutzen, und diese Programmierbibliotheken verwenden oft unterschiedliche Programmierparadigmen. Um eine Aufgabe bzw. Task zu erfüllen, unterteilt ein Programmierer diese Aufgabe bzw. Task in Teilaufgaben bzw. Sub-Tasks und schreibt Softwarecode für jede Aufgabe bzw. Task unter Verwendung von Programmierbibliotheken, die für den Prozessor spezifisch sind, der für die Ausführung dieser Teilaufgabe bzw. Sub-Task ausgewählt wurde. Dabei muss der Programmierer Abhängigkeiten zwischen den Teilaufgaben bzw. Sub-Task einrichten, damit die Daten zwischen den einzelnen Teilaufgaben bzw. Sub-Tasks gemeinsam genutzt werden und die Gesamtaufgabe bzw. Tasks harmonisch funktioniert.
  • KURZE BESCHREIBUNG DER ZEICHNUNGEN
    • 1 ist ein Blockdiagramm, das einen Software-Stack für einen Deep-Learning-Beschleuniger (DLA) gemäß mindestens einer Ausführungsform darstellt;
    • 2 ist ein Blockdiagramm, das einen DLA-Compiler veranschaulicht, um gemäß mindestens einer Ausführungsform ein ladbares DLA-Modul aus einem Modell eines neuronalen Netzes zu erzeugen;
    • 3 ist ein Blockdiagramm, das eine DLA-Architektur gemäß mindestens einer Ausführungsform veranschaulicht;
    • 4A ist ein Blockdiagramm, das Schritte zur Durchführung von Inferencing gemäß mindestens einer Ausführungsform illustriert;
    • 4B ist ein Blockdiagramm, das Inferencing in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform veranschaulicht;
    • 4C ist ein Blockdiagramm, das Inferencing in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform veranschaulicht;
    • 5A ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform darstellt;
    • 5B ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform darstellt;
    • 6 ist ein Blockdiagramm, das eine vereinheitlichte Architektur zur Durchführung von Rechenoperationen unter Verwendung einer Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform darstellt;
    • 7 ist ein Blockdiagramm, das einen Ausführungsgraphen veranschaulicht, der gemäß mindestens einer Ausführungsform ausführbaren Code für eine Vielzahl von Prozessortypen umfasst;
    • 8 veranschaulicht ein Verfahren zur Ausführung von ausführbarem Code für eine Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform;
    • 9 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Rechenzentrum;
    • 10 veranschaulicht gemäß mindestens einer Ausführungsform ein Verarbeitungssystem;
    • 11 veranschaulicht gemäß mindestens einer Ausführungsform ein Computersystem ;
    • 12 veranschaulicht gemäß mindestens einer Ausführungsform ein System;
    • 13 veranschaulicht gemäß mindestens einer Ausführungsform eine beispielhafte integrierte Schaltung;
    • 14 veranschaulicht gemäß mindestens einer Ausführungsform ein Computersystem ;
    • 15 veranschaulicht gemäß mindestens einer Ausführungsform eine APU;
    • 16 veranschaulicht gemäß mindestens einer Ausführungsform eine CPU;
    • 17 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Beschleunigerintegrations-Slice;
    • 18A-18B veranschaulichen gemäß mindestens einer Ausführungsform beispielhafte Grafikprozessoren;
    • 19A veranschaulicht gemäß mindestens einer Ausführungsform einen Grafikkern;
    • 19B veranschaulicht gemäß mindestens einer Ausführungsform eine GPGPU;
    • 20A veranschaulicht gemäß mindestens einer Ausführungsform einen Parallelprozessor;
    • 20B veranschaulicht gemäß mindestens einer Ausführungsform einen Verarbeitungscluster;
    • 20C veranschaulicht gemäß mindestens einer Ausführungsform einen Grafik-Multiprozessor;
    • 21 veranschaulicht gemäß mindestens einer Ausführungsform einen Grafikprozessor;
    • 22 veranschaulicht gemäß mindestens einer Ausführungsform einen Prozessor;
    • 23 veranschaulicht gemäß mindestens einer Ausführungsform einen Prozessor;
    • 24 veranschaulicht gemäß mindestens einer Ausführungsform einen Graf ikprozessorkern;
    • 25 veranschaulicht gemäß mindestens einer Ausführungsform eine PPU;
    • 26 veranschaulicht gemäß mindestens einer Ausführungsform einen GPC;
    • 27 veranschaulicht gemäß mindestens einer Ausführungsform einen Streaming-Multiprozessor;
    • 28 veranschaulicht gemäß mindestens einer Ausführungsform einen Software-Stack einer Programmierplattform;
    • 29 veranschaulicht gemäß mindestens einer Ausführungsform eine CUDA-Implementierung eines Software-Stacks aus 28;
    • 30 veranschaulicht gemäß mindestens einer Ausführungsform eine ROCm-Implementierung eines Software-Stacks aus 28;
    • 31 veranschaulicht gemäß mindestens einer Ausführungsform eine O-penCL-Implementierung eines Software-Stacks aus 28;
    • 32 veranschaulicht gemäß mindestens einer Ausführungsform Software, die von einer Programmierplattform unterstützt wird;
    • 33 veranschaulicht gemäß mindestens einer Ausführungsform die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 28-31;
    • 34 veranschaulicht gemäß mindestens einer Ausführungsform ausführlicher die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 28-31;
    • 35 veranschaulicht gemäß mindestens einer Ausführungsform die Übersetzung von Quellcode vor der Kompilierung des Quellcodes;
    • 36A veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um CUDA-Quellcode unter Verwendung verschiedener Typen von Verarbeitungseinheiten zu kompilieren und auszuführen;
    • 36B veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um den CUDA-Quellcode von 36A unter Verwendung einer CPU und eines CUDA-fähigen Grafikprozessors zu kompilieren und auszuführen;
    • 36C veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um den CUDA-Quellcode von 36A unter Verwendung einer CPU und einer nicht CUDA-fähigen GPU zu kompilieren und auszuführen;
    • 37 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Kernel, der durch das CUDA-zu-HIP-Übersetzungswerkzeug von 36C übersetzt wurde;
    • 38 veranschaulicht gemäß mindestens einer Ausführungsform die nicht-CUDA-fähige GPU von 36C mit mehr Details;
    • 39 veranschaulicht gemäß mindestens einer Ausführungsform, wie Threads eines beispielhaften CUDA-Grids auf verschiedene Recheneinheiten von 38 abgebildet werden; und
    • 40 veranschaulicht gemäß mindestens einer Ausführungsform, wie bestehender CUDA-Code zu Data Parallel C++-Code zu migrieren ist.
  • DETAILLIERTE BESCHREIBUNG
  • 1 ist ein Blockdiagramm, das einen Software-Stack 102 für einen Deep-Learning-Beschleuniger (Deep Learning Accelerator (DLA)) 114 gemäß mindestens einer Ausführungsform darstellt. Bei mindestens einer Ausführungsform besteht die DLA-Hardware 114 aus Schaltungen, um eine oder mehrere Deep-Learning-Aufgaben bzw. Tasks durchzuführen, die eine oder mehrere Rechenoperationen umfassen. Bei mindestens einer Ausführungsform handelt es sich bei Deep-Learning-Operationen um mathematische Operationen zur Ermöglichung bzw. Erleichterung von Berechnungen, die als Teil eines neuronalen Netzes durchzuführen sind, wie z. B. eine Matrixmultiplikation und andere Operationen, die hier beschrieben sind. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 Schaltungen zur Beschleunigung von Deep-Learning-Operationen, wie z. B. mathematische Operationen. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 Beschleuniger. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 einen Beschleuniger mit fester Funktion, wie etwa einen Beschleuniger, der Schaltungen zur Durchführung spezifischer mathematischer Operationen umfasst. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 eine anwendungsspezifische integrierte Schaltung (ASIC) und zugehörige unterstützende Schaltungen, wie z. B. Speicher, um Deep-Learning-Operationen durchzuführen. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 114 allgemeine Rechenschaltungen, die zur Durchführung von Deep-Learning-Operationen ausgestaltet sind.
  • Bei mindestens einer Ausführungsform verwaltet eine Firmware 110 die DLA-Hardware 114. Bei mindestens einer Ausführungsform handelt es sich bei der Firmware 110 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine Schnittstelle zwischen einem oder mehreren Treibern 106, 108, die im Folgenden diskutiert werden, und der DLA-Hardware 114 bereitstellen. Bei mindestens einer Ausführungsform stellt die Firmware 110 eine API bereit, um mit der DLA-Hardware 114 zu interagieren und sie zu verwalten. Bei mindestens einer Ausführungsform stellt die Firmware 110 eine beliebige andere Schnittstelle, wie sie hier beschrieben ist, bereit, um mit der DLA-Hardware 114 zu interagieren und sie zu verwalten. Bei mindestens einer Ausführungsform läuft die Firmware 110 auf jeder Instanz der DLA-Hardware 114. Bei mindestens einer Ausführungsform stellt die Firmware 110 eine Schnittstelle zu einem oder mehreren Treibern 106, 108 bereit, um Aufgaben oder Tasks zu übermitteln, die von der DLA-Hardware 114 auszuführen sind.
  • Bei mindestens einer Ausführungsform verwendet ein Programmierer oder ein anderer Benutzer einen DLA-Software-Stack 102, um ausführbaren Code zu erstellen, der von der DLA-Hardware 114 ausgeführt wird. Bei mindestens einer Ausführungsform besteht ein DLA-Software-Stack 102 aus Softwareanweisungen, die bei ihrer Ausführung Operationen durchführen, um die Programmierung und Ausführung von ausführbarem Code zu ermöglichen, der für die DLA-Hardware 114 spezifisch ist. Bei mindestens einer Ausführungsform ist der DLA-Software-Stack 102 eine Bibliothek, die eine Vielzahl von Softwarepaketen umfasst. Bei mindestens einer Ausführungsform ist der DLA-Software-Stack 102 ein Satz von Werkzeugen zur Erzeugung und Ausführung von Softwarecode unter Verwendung der DLA-Hardware 114.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 einen Interpreter und einen Compiler 104. Bei mindestens einer Ausführungsform handelt es sich bei dem Interpreter und Compiler 104 um Softwarebefehle, die bei ihrer Ausführung einen ausführbaren Code erzeugen, der von der DLA-Hardware 114 ausgeführt wird. Bei mindestens einer Ausführungsform interpretiert der Interpreter und Compiler 104 Modelle eines neuronalen Netzes und kompiliert diese Modelle in ein ladbares Modulformat, wie es im Folgenden in Verbindung mit 2 beschrieben ist. Bei mindestens einer Ausführungsform empfängt der Interpreter und Compiler 104 als Eingabe beliebige Daten, die Informationen darstellen, wie z. B. Gleichungen, die von der DLA-Hardware 114 ausgeführt werden können. Bei mindestens einer Ausführungsform erzeugt der Interpreter und Compiler 104 einen ausführbaren Code in einem beliebigen Format, der von der DLA-Hardware 114 ausführbar ist.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 einen oder mehrere Benutzer-Mode-Treiber 106. Bei mindestens einer Ausführungsform handelt es sich bei einem Benutzer-Mode-Treiber 106 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Schnittstellen zur Durchführung von Operationen unter Verwendung der DLA-Hardware 114 bereitstellen. Bei mindestens einer Ausführungsform stellt der Benutzer-Mode-Treiber 106 eine Anwendungsprogrammierschnittstelle (API) bereit. Bei mindestens einer Ausführungsform stellt der Benutzer-Mode-Treiber 106 jeden anderen Typ von Schnittstelle bereit, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform stellt der Benutzer-Mode-Treiber 106 eine oder mehrere Schnittstellen zur Zuweisung von Speicher auf der DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform lädt der Benutzer-Mode-Treiber 106 ausführbaren Code, der von der DLA-Hardware 114 auszuführen ist, wie beispielsweise von dem Interpreter und Compiler 104 erzeugter ausführbarer Code, auf die DLA-Hardware 114. Bei mindestens einer Ausführungsform lädt der Benutzer-Mode-Treiber 106 ausführbaren Code in den Speicher der DLA-Hardware 114. Bei mindestens einer Ausführungsform übergibt der Benutzer-Mode-Treiber 106 einen von dem Interpreter und Compiler 104 erzeugten ausführbaren Code, damit dieser durch die DLA-Hardware 114 ausgeführt wird. Bei mindestens einer Ausführungsform bildet der Benutzer-Mode-Treiber 106 eine Schnittstelle zu der DLA-Hardware 114 und weist die DLA-Hardware 114 an, ausführbaren Code auszuführen.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 einen oder mehrere Kernel-Mode-Treiber 108. Bei mindestens einer Ausführungsform handelt es sich bei dem Kernel-Mode-Treiber 108 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Schnittstellen bereitstellen, um Operationen auf der DLA-Hardware 114 durchzuführen. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine API zur Verfügung, um eine Schnittstelle zu der DLA-Hardware 114 zu bilden und Operationen auf der DLA-Hardware 114 durchzuführen. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine beliebige andere Schnittstelle bereit, die hier weiter beschrieben ist, um eine Schnittstelle zu der DLA-Hardware 114 zu bilden und Operationen der DLA-Hardware 114 durchzuführen. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine begrenzte Schnittstelle bereit, die nur für privilegierte Benutzer oder Software mit der Berechtigung zum Zugriff und/oder zur Änderung der DLA-Hardware 114 zugreifbar ist. Bei mindestens einer Ausführungsform stellt der Kernelmode-Treiber 108 eine offene Schnittstelle für den Zugriff auf und/oder die Änderung der DLA-Hardware 114 bereit.
  • Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Initialisierung der DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Initialisierung von Speicher und/oder anderer DLA-Hardware 114 in einen bestimmten Zustand bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zum Zurücksetzen der DLA-Hardware 114 auf einen Ausgangszustand bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zum Abbilden des Speichers der DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zu der DLA-Hardware bereit, um einen Speicher der DLA-Hardware 114 abzubilden. Bei mindestens einer Ausführungsform verwaltet der Kernel-Mode-Treiber 108 einen oder mehrere Gerätekontexte für die DLA-Hardware 114. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Verwaltung eines oder mehrerer Gerätekontexte für die DLA-Hardware 114 bereit. Bei mindestens einer Ausführungsform empfängt der Kernel-Mode-Treiber 108 Tasks, die von der DLA-Hardware 114 auszuführen sind, und/oder verarbeitet Task-Warteschlangen für die DLA-Hardware 114. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle für den Empfang von Tasks bereit, die von der DLA-Hardware 114 auszuführen sind. Bei mindestens einer Ausführungsform stellt der Kernel-Mode-Treiber 108 eine Schnittstelle zur Verarbeitung von Task-Warteschlangen für die DLA-Hardware 114 bereit.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Software-Stack 102 eine oder mehrere benutzerseitige APIs 112. Bei mindestens einer Ausführungsform handelt es sich bei den benutzerseitigen APIs 112 um Softwareanweisungen, die bei ihrer Ausführung eine oder mehrere Schnittstellen zur Interaktion mit dem DLA-Software-Stack 102 bereitstellen. Bei mindestens einer Ausführungsform stellen die benutzerseitigen APIs 112 eine oder mehrere Funktionsaufrufschnittstellen bereit, um eine oder mehrere Operationen auf der DLA-Hardware 114 unter Verwendung eines oder mehrerer Treiber 106, 108 durchzuführen. Bei mindestens einer Ausführungsform stellt eine oder stellen mehrere Softwarebibliotheken, wie z. B. NvMedia, die benutzerseitigen APIs 112 bereit. Bei mindestens einer Ausführungsform stellt eine oder stellen mehrere Rechenplattformen, die Bibliotheken umfassen, wie die Compute Uniform Device Architecture (CUDA) oder andere parallele Rechenplattformen und/oder Bibliotheken, wie sie hier beschrieben sind, die benutzerseitigen APIs 112 bereit.
  • 2 ist ein Blockdiagramm, das einen Deep Learning Accelerator (DLA)-Interpreter und -Compiler 206 veranschaulicht, um gemäß mindestens einer Ausführungsform ein ladbares DLA-Modul 214 von einem Modell 204 eines neuronalen Netzes zu erzeugen. Bei mindestens einer Ausführungsform handelt es sich bei dem DLA-Interpreter und -Compiler 206 um Softwareanweisungen, die, wenn sie ausgeführt werden, ausführbaren Code erzeugen, der von der DLA-Hardware ausgeführt wird, wie es vorab in Verbindung mit 1 beschrieben ist.
  • Bei mindestens einer Ausführungsform empfängt der DLA-Interpreter und - Compiler 206 als Eingabe 202 ein Modell 204. Bei mindestens einer Ausführungsform handelt es sich bei dem Modell 204 um Datenwerte und/oder Softwareanweisungen, die bei ihrer Ausführung Operationen eines neuronalen Netzes, wie es hier weiter beschrieben ist, durchführen. Bei mindestens einer Ausführungsform handelt es sich bei dem Modell 204 um ein Modell eines neuronalen Netzes. Bei mindestens einer Ausführungsform ist das Modell 204 ein beliebiger anderer Typ von Modell, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfasst das Modell 204 einen oder mehrere Knoten. Bei mindestens einer Ausführungsform besteht ein Knoten aus Datenwerten und/oder Softwareanweisungen, die bei ihrer Ausführung eine mathematische Operation, wie eine lineare Gleichung oder eine andere mathematische Operation, wie sie hier weiter beschrieben ist, ausführen. Bei mindestens einer Ausführungsform umfasst das Modell 204 eine oder mehrere Schichten, und jede Schicht umfasst einen oder mehrere Knoten. Bei mindestens einer Ausführungsform ist eine Schicht eine logische Gruppe von Knoten zur Durchführung eines Schritts einer Operation. Bei mindestens einer Ausführungsform handelt es sich bei der Operation um eine Task, die von dem Modell 204 auszuführen ist. Bei mindestens einer Ausführungsform umfasst eine von dem Modell 204 auszuführende Operation und/oder Task ein Inferencing. Bei mindestens einer Ausführungsform umfasst das Inferencing eine Objektidentifizierung, Klassifizierung, Segmentierung oder eine andere Operation eines neuronalen Netzes, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Interpreter und - Compiler 206 einen Modell-Parser 208. Bei mindestens einer Ausführungsform handelt es sich bei dem Modell-Parser 208 um Softwareanweisungen, die, wenn sie ausgeführt werden, das Modell 204 als Eingabe 202 für den DLA-Interpreter und -Compiler 206 parsen. Bei mindestens einer Ausführungsform parst der Modell-Parser 208 Daten des Modells 204 oder zerlegt sie in eine Zwischendarstellung (IR), die als Eingabe für einen Compiler und Optimierer 210 verwendet wird. Bei mindestens einer Ausführungsform liest der Modell-Parser 208 das Modell 204 als Eingabe 202 und erzeugt eine IR, die von dem Compiler und Optimierer 210 verwendet wird, um eine Ausgabe 212 zu erzeugen.
  • Bei mindestens einer Ausführungsform umfasst der DLA-Interpreter und - Compiler 206 einen Compiler und Optimierer 210. Bei mindestens einer Ausführungsform handelt es sich bei dem Compiler und Optimierer 210 um Softwareanweisungen, die, wenn sie ausgeführt werden, die IR des Modells 204 einlesen und eine Ausgabe 212 erzeugen, die von der DLA-Hardware, wie es vorab beschrieben ist, ausgeführt wird. Bei mindestens einer Ausführungsform erzeugt der Compiler und Optimierer 210 eine oder mehrere Ausgaben 212. Bei mindestens einer Ausführungsform führt der Compiler und Optimierer 210 eine oder mehrere Optimierungen an dem ausführbaren Code durch, der von der einen oder den mehreren eingegebenen IR von dem Modell-Parser 208 erzeugt wird.
  • Bei mindestens einer Ausführungsform erzeugt der Compiler und Optimierer 210 als Ausgabe 212 ein ladbares Modul 214, das hier als ein ladbarer Code, ein Modul und/oder ein ausführbarer Code bezeichnet wird. Bei mindestens einer Ausführungsform umfasst das ladbare Modul 214, das von dem Compiler und Optimierer 210 ausgegeben wird, ausführbaren Code, wie Maschinencode oder Objektcode, der von DLA-Hardware auszuführen ist.
  • 3 ist ein Blockdiagramm, das gemäß mindestens einer Ausführungsform eine Architektur eines Deep-Learning-Beschleunigers (Deep Learning Accelerators (DLA)) veranschaulicht. Bei mindestens einer Ausführungsform umfasst die DLA-Architektur zwei Stufen: Kompilierung 302 und Inferencing 312. Bei mindestens einer Ausführungsform ist die Kompilierung 302 ein Prozess bzw. Verfahren, bei dem ein DLA-Compiler und -Optimierer 308 aus einem Modell 304 eine ausführbare Ausgabe, wie ein ladbares Modul 310, erzeugt, wie es vorab in Verbindung mit 2 beschrieben ist. Bei mindestens einer Ausführungsform empfängt ein DLA-Compiler und -Optimierer 308 während der Kompilierung 302 einen oder mehrere Compiler-Parameter 306, um Datenwerte und/oder andere programmierbare Aspekte der Kompilierung 302 anzugeben, die von dem DLA-Compiler und -Optimierer 308 durchzuführen sind. Bei mindestens einer Ausführungsform sind die Compiler-Parameter 306 Datenwerte, die eine oder mehrere Optionen der Kompilierung 302 angeben, die von dem DLA-Compiler und -Optimierer 308 durchzuführen sind.
  • Bei mindestens einer Ausführungsform ist Inferencing 312 ein Prozess bzw. Verfahren, bei dem eine DLA-Laufzeit 314 eine oder mehrere Aufgaben bzw. Tasks oder rechnerische Operationen unter Verwendung der DLA-Hardware 324 ausführt. Bei mindestens einer Ausführungsform umfasst die DLA-Hardware 324 einen oder mehrere Beschleuniger und/oder andere Schaltungen zur Durchführung von rechnerischen Operationen, wie es vorab in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform umfassen eine oder mehrere Aufgaben bzw. Tasks, die während des Inferencing 312 auszuführen sind, Inferencing-Operationen. Bei mindestens einer Ausführungsform handelt es sich bei den Inferencing-Operationen um Operationen eines neuronalen Netzes zur Berechnung eines oder mehrerer Ergebnisse unter Verwendung eines oder mehrerer neuronaler Netze. Bei mindestens einer Ausführungsform beinhalten die Operationen des neuronalen Netzes unter anderem eine Bildsegmentierung, eine Klassifizierung, eine Objektidentifizierung und/oder jede andere Operation des neuronalen Netzes, die hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform führt die DLA-Laufzeit 314 Inferencing 312 unter Verwendung der DLA-Hardware 324 durch. Bei mindestens einer Ausführungsform handelt es sich bei der DLA-Laufzeit um Softwareanweisungen, die, wenn sie ausgeführt werden, eine Anwendung 316 laden, die von der DLA-Hardware 324 unter Verwendung eines oder mehrerer Treiber 318, 320 auszuführen ist, wie es vorab in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform ist die Anwendung 316 ein ausführbarer Code, der von der DLA-Laufzeit 314 unter Verwendung eines oder mehrerer Treiber 318, 320 ausgeführt wird, um mit der DLA-Hardware 324 zu interagieren. Bei mindestens einer Ausführungsform ist die Anwendung 316 ein ladbares Modul 310, das von dem DLA-Compiler und -Optimierer 308 während der Kompilierung 302 erzeugt wird. Bei mindestens einer Ausführungsform ist die Anwendung 316 ein beliebiger anderer ausführbarer Code, der zur Ausführung mit der DLA-Laufzeit 314 und der DLA-Hardware 324 erzeugt wird. Bei mindestens einer Ausführungsform stellt die DLA-Laufzeit eine Schnittstelle 322 bereit, um die Interaktion mit einer oder mehreren anderen Softwarebibliotheken zu ermöglichen, um Inferencing 312 durchzuführen, wie es vorab in Verbindung mit 1 beschrieben ist.
  • 4A ist ein Blockdiagramm, das Schritte zur Durchführung von Inferencing 406 gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform wird zur Durchführung von Inferencing 406 unter Verwendung eines oder mehrerer Prozessoren, wie z. B. Parallel Processing Units (PPUs) und/oder anderer Prozessortypen, die einen Deep-Learning-Beschleuniger (DLA) aufweisen, ein Originalbild 402 durch ein oder mehrere Softwareprogramme unter Verwendung der PPUs und/oder anderer Prozessoren modifiziert, um ein manipuliertes Bild 404 zu erzeugen. Bei mindestens einer Ausführungsform handelt es sich bei dem Originalbild 402 um Daten, die einen Satz von Pixeln umfassen, wobei jedes Pixel Farbinformationen zur Darstellung des Bildes umfasst. Bei mindestens einer Ausführungsform handelt es sich bei dem manipulierten Bild 404 um Daten, die Informationen aus dem Originalbild 402 umfassen, das verändert wurde.
  • Bei mindestens einer Ausführungsform verwendet ein oder verwenden mehrere Softwareprogramme während des Inferencings eine oder mehrere PPUs, wie z. B. Grafikverarbeitungseinheiten (GPUs), um das Originalbild 402 in das manipulierte Bild 404 zu verändern oder anderweitig zu verarbeiten. Bei mindestens einer Ausführungsform wird dieses manipulierte Bild 404 dann von der DLA-Software, wie es vorab beschrieben ist, oder von einer anderen Software verwendet, um Operationen eines neuronalen Netzes, wie es hier weiter beschrieben ist, bereitzustellen, um Inferencing-Operationen 406 durchzuführen, wie es vorab in Verbindung mit 3 beschrieben ist. Bei mindestens einer Ausführungsform werden die Inferencing-Operationen 406 von einer oder mehreren DLAs durchgeführt. Bei mindestens einer Ausführungsform werden die Inferencing-Operationen 406 von einer oder mehreren PPUs, wie z. B. GPUs oder einer anderen parallelen Verarbeitungsarchitektur, wie es hier weiter beschrieben ist, durchgeführt. Bei mindestens einer Ausführungsform erzeugt das Inferencing 406 ein oder mehrere Ergebnisse 408. Bei mindestens einer Ausführungsform handelt es sich bei dem Ergebnis 408 um Daten, die eine oder mehrere Ausgaben von einer oder mehreren Inferencing-Operationen 406 umfassen.
  • 4B ist ein Blockdiagramm, das Inferencing 406 in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform verwendet das segmentierte Programmiermodell getrennte Softwarebibliotheken, um Operationen unter Verwendung verschiedener Prozessoren 410, 412, 414 durchzuführen, wie z. B. einen Deep-Learning-Beschleuniger (DLA)-Softwarestack, wie es vorab in Verbindung mit 1 beschrieben ist, um Rechenoperationen mittels eines DLA 414 auszuführen, oder eine Parallelverarbeitungsbibliothek, wie sie von der Compute Uniform Device Architecture (CUDA) bereitgestellt wird, um Rechenoperationen unter Verwendung einer Parallelverarbeitungseinheit (PPU), wie z. B. einer Grafikverarbeitungseinheit (GPU) 412, durchzuführen.
  • Bei mindestens einer Ausführungsform wird während des Inferencings 406 das Originalbild 420 in einem Speicher 418 auf einem Computersystem gespeichert. Bei mindestens einer Ausführungsform entspricht der Speicher 418 Schaltungen, um eine flüchtige und/oder nichtflüchtige Datenspeicherung in einem Computersystem durchzuführen. In einer Ausführungsform wird während des Inferencings 406 das Originalbild 420 über einen Bus 416, wie es hier weiter beschrieben ist, an eine PPU, wie z.B. die GPU 412, übertragen, um eine oder mehrere Bildverarbeitungsoperationen durchzuführen, was zu dem manipulierten Bild 422 führt. Bei mindestens einer Ausführungsform überträgt die GPU 412 die Daten des manipulierten Bildes 422 über den Bus 416 zurück zu dem Speicher 418. Bei mindestens einer Ausführungsform wird das manipulierte Bild 422 über den Bus 416 von dem Speicher 418 zu dem DLA 414 übertragen, um Inferencing 406 unter Verwendung des manipulierten Bildes 422 durchzuführen. Während des Inferencings 406, das von dem DLA 414 durchgeführt wird, erfordern alle zusätzlichen Operationen, die von der GPU 412 an dem manipulierten Bild 422 und/oder an Zwischenergebnissen des Inferencings durchgeführt werden, in einer Ausführungsform das Kopieren von Daten unter Verwendung des Busses 416 von dem DLA 414 zu dem Speicher und dann zu der GPU 412 und zurück zu dem DLA 414 unter Verwendung des Busses 416 und des Speichers 418. Bei mindestens einer Ausführungsform wird, sobald der DLA 414 die Operationen des Inferencings 406 abgeschlossen hat, ein Ergebnis 424 unter Verwendung des Busses 416 in den Speicher 418 kopiert.
  • 4C ist ein Blockdiagramm, das Inferencing in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform verwendet das vereinheitlichte Programmiermodell ein einziges Paket von Softwarebibliotheken, um Operationen unter Verwendung verschiedener Prozessoren 426, 428, 430, wie z. B. einen Deep-Learning-Beschleuniger (DLA)-Software-Stack, wie er vorab in Verbindung mit 1 beschrieben ist, und eine Bibliothek für parallele Berechnungen auszuführen, die beide von dem einzigen Paket von Bibliotheken bereitgestellt werden, wie z. B. der Compute Uniform Device Architecture (CUDA), um Rechenoperationen unter Verwendung einer Parallelverarbeitungseinheit (PPU), wie z. B. einer Grafikverarbeitungseinheit (GPU) 428 und/oder einem DLA 430, durchzuführen.
  • Bei mindestens einer Ausführungsform wird während des Inferencings 406 ein Originalbild 436 in einem Speicher 434 auf einem Computersystem gespeichert. Bei mindestens einer Ausführungsform wird das Originalbild 436 über einen Bus 432 an eine PPU, wie z. B. die GPU 428, übertragen, um eine oder mehrere Bildverarbeitungsoperationen durchzuführen, was zu einem manipulierten Bild 438 führt. Bei mindestens einer Ausführungsform überträgt die GPU 428 die Daten des manipulierten Bildes 438 über den Bus 432 zurück zu dem Speicher 434. Bei mindestens einer Ausführungsform wird das manipulierte Bild 438 von dem Speicher 434 über den Bus 432 an den DLA 430 übertragen, um Inferencing 406 unter Verwendung des manipulierten Bildes 438 durchzuführen. Während des Inferencings 406, das von dem DLA 430 durchgeführt wird, verwenden alle zusätzlichen Operationen, die von der GPU 428 an dem manipulierten Bild 438 und/oder einem Zwischeninferencing durchgeführt werden, eine einheitliche Speicherarchitektur, wie z. B. eine gemeinsame Zeigeradressierung, um Daten wie z. B. Zwischendaten und/oder das manipulierte Bild 438 zwischen dem DLA 430 und der GPU 428 zu übertragen. Bei mindestens einer Ausführungsform handelt es sich bei der gemeinsamen Zeigeradressierung um Datenwerte, die Speicheradressen zu einem gemeinsam genutzten Speicherraum umfassen, der von zwei oder mehr verschiedenen Typen von Verarbeitungskernen, wie dem DLA 430 und/oder einer oder mehreren PPUs, wie der GPU 428, benutzbar ist. Bei mindestens einer Ausführungsform wird, sobald der DLA 430 Operationen des Inferencing 406 abgeschlossen hat, ein Ergebnis 440 über den Bus 432 in den Speicher 434 kopiert.
  • 5A ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem segmentierten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Während ein Deep-Learning-Beschleuniger (DLA) -Softwarestack 512 in 5A für beispielhafte Zwecke verwendet wird, ist es dem Fachmann offensichtlich, dass andere Software und Bibliotheken zur Unterstützung anderer Prozessorhardware in einem segmentierten Programmiermodell verwendet werden können, um beschleunigte Rechenoperationen unter Verwendung einer Vielzahl von Prozessorhardwaretypen durchzuführen.
  • Bei mindestens einer Ausführungsform handelt es sich bei einer Parallelverarbeitungsplattform 502 um Softwareanweisungen, die, wenn sie ausgeführt werden, paralleles Rechnen ermöglichen oder erleichtern. Bei mindestens einer Ausführungsform ist die Parallelverarbeitungsplattform 502, wie z. B. die Compute Uniform Device Architecture (CUDA) oder eine andere hier weiter beschriebene Parallelverarbeitungsplattform, ein Satz von Softwarewerkzeugen, Bibliotheken und/oder Treibern, die es Programmierern und Systemen ermöglichen, eine Schnittstelle zu einer oder mehreren Parallelverarbeitungseinheiten (PPUs), wie z. B. Grafikverarbeitungseinheiten (GPUs), herzustellen und diese zu verwenden. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsplattform 502 eine oder mehrere Schnittstellen, wie z. B. Anwendungsprogrammierschnittstellen (APIs), zu einer Parallelverarbeitungsbibliothek 504 und/oder anderen Bibliotheken 506 als Teil der Parallelverarbeitungsplattform 502 bereit.
  • Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsplattform 502 eine Parallelverarbeitungsbibliothek 504. Bei mindestens einer Ausführungsform handelt es sich bei der Parallelverarbeitungsbibliothek 504 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Berechnungsfunktionen als Ergebnis eines oder mehrerer Funktionsaufrufe an die Parallelverarbeitungsbibliothek 504 ausführen. Bei mindestens einer Ausführungsform handelt es sich bei der Parallelverarbeitungsbibliothek 504 um eine Sammlung von Berechnungsfunktionen und eine aufrufbare Schnittstelle, wie z. B. eine API, um eine Programmierung unter Verwendung einer oder mehrerer PPUs, wie z. B. GPUs, zu ermöglichen oder erleichtern. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsbibliothek 504 eine oder mehrere Funktionen bereit, um eine Graphenausführung unter Verwendung einer oder mehrerer PPUs, wie z. B. GPUs, zu ermöglichen oder zu erleichtern, wie es im Folgenden in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsbibliothek 504 eine oder mehrere Softwarefunktionen zur Durchführung mathematischer Operationen. Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsbibliothek eine oder mehrere Softwarefunktionen zur Durchführung von mathematischen Operationen im Zusammenhang mit neuronalen Netzen und Deep Learning. Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsbibliothek 504 eine oder mehrere Softwarefunktionen, um ein neuronales Netz unter Verwendung einer oder mehrerer PPUs, wie z. B. GPUs, zu betreiben oder zu bearbeiten.
  • Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsplattform 502 andere Bibliotheken 506. Bei mindestens einer Ausführungsform handelt es sich bei den anderen Bibliotheken 506 um einen Satz von Softwarebibliotheken, der Anweisungen umfasst, die bei ihrer Ausführung Rechenoperationen durchführen. Bei mindestens einer Ausführungsform umfassen die anderen Bibliotheken 506 Funktionen zur Durchführung der Interoperation und der Kommunikation von Daten zwischen einer oder mehreren PPUs, wie z. B. GPUs, und einem oder mehreren Prozessoren, die nicht von der Parallelverarbeitungsplattform 502 unterstützt werden, wie z. B. dem DLA in 5A. Bei mindestens einer Ausführungsform umfassen die anderen Bibliotheken 506 Funktionen zur Durchführung von Operationen, die nicht von der Parallelverarbeitungsbibliothek 504 bereitgestellt werden. Bei mindestens einer Ausführungsform umfassen die anderen Bibliotheken 506 Funktionsaufrufe, die als Teil einer Schnittstelle, wie z. B. einer API, zugänglich sind, die von den anderen Bibliotheken 506 und/oder der Parallelverarbeitungsplattform 502 zur Verwendung durch Programmierer und/oder Systeme bereitgestellt wird, um Parallelverarbeitungsoperationen zu ermöglichen oder zu erleichtern.
  • Bei mindestens einer Ausführungsform umfasst die Parallelverarbeitungsplattform 502 PPU-Werkzeuge und -Treiber 508. Bei mindestens einer Ausführungsform handelt es sich bei den PPU-Werkzeugen und -Treibern 508 um Softwareanweisungen, die, wenn sie ausgeführt werden, Funktionen zur Überwachung, Konfiguration und/oder anderweitigen Interaktion mit einer oder mehreren PPUs, wie z. B. GPUs, bereitstellen. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und -Treiber 508 eine oder mehrere Bibliotheken und/oder Werkzeuge bzw. Tools zur Leistungsüberwachung. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und - Treiber 508 einen oder mehrere Benutzer-Mode- und/oder Kernel-Mode-Treiber, um eine Schnittstelle zu einer oder mehreren PPUs, wie z. B. GPUs, zu bilden, um diese zu konfigurieren oder um diese anderweitig zu unterstützen. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und -Treiber 508 Firmware zur Unterstützung einer oder mehrerer PPUs, wie z. B. GPUs. Bei mindestens einer Ausführungsform umfassen die PPU-Werkzeuge und -Treiber 508 beliebige andere Software-Werkzeuge und/oder Bibliotheken, um die Ausführung eines oder mehrerer Software-Programme unter Verwendung der einen oder der mehreren PPUs, wie z. B. GPUs, mit der Parallelverarbeitungsplattform 502 zu ermöglichen oder erleichtern.
  • Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die Parallelverarbeitungsplattform 502 die Ausführung einer oder mehrerer Berechnungs-Aufgaben oder Tasks, wie z. B. Inferencing. Bei mindestens einer Ausführungsform wird die eine oder werden die mehreren Rechen-Aufgaben oder Tasks in Teilaufgaben oder -Sub-Tasks aufgeteilt, wobei eine oder mehrere der Teilaufgaben oder Sub-Tasks von der Parallelverarbeitungsplattform 502 und eine oder mehrere der Teilaufgaben oder Sub-Tasks von anderer Rechenhardware, wie z. B. einem DLA, ausgeführt werden. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsplattform 502 eine oder mehrere Software- und/oder Hardwareschnittstellen bereit und/oder nutzt diese, um mit anderer Rechenhardware, wie z. B. einem DLA, zu interagieren und Daten auszutauschen. Bei mindestens einer Ausführungsform synchronisiert 510 die Parallelverarbeitungsplattform 502 Daten zwischen der Parallelverarbeitungsplattform 502 und Software zur Unterstützung einer anderen Hardwareplattform, wie z. B. dem DLA-Software-Stack 512, wie es vorab in Verbindung mit 1 beschrieben ist.
  • Bei mindestens einer Ausführungsform synchronisiert 510 die Parallelverarbeitungsplattform 502 Daten zwischen der Parallelverarbeitungsplattform 502 und einer oder mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, unter Verwendung einer oder mehrerer Schnittstellen, wie APIs. Bei mindestens einer Ausführungsform wird eine oder werden mehrere der Schnittstellen zum Synchronisieren 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z. B. dem DLA-Software-Stack 512, von der Parallelverarbeitungsplattform 502 bereitgestellt. Bei mindestens einer Ausführungsform wird eine oder werden mehrere der Schnittstellen zum Synchronisieren 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z. B. dem DLA-Software-Stack 512, von der einen oder den mehreren anderen Softwareplattformen bereitgestellt. Bei mindestens einer Ausführungsform wird eine oder werden mehrere der Schnittstellen zum Synchronisieren 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z.B. dem DLA-Software-Stack 512, durch Bibliotheken von Drittanbietern bereitgestellt, wie z.B. EGLStream oder jede andere Schnittstelle zum Streamen von Daten zwischen verschiedenen Prozessoren unter Verwendung eines Kommunikationsbusses, wie es hier beschrieben ist.
  • Bei mindestens einer Ausführungsform werden zur Synchronisierung 510 von Daten zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, ein oder mehrere Aufrufe an eine Schnittstelle sowohl von der Parallelverarbeitungsplattform 502 als auch von der einen oder den mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, durchgeführt. Bei mindestens einer Ausführungsform umfasst der eine oder umfassen die mehreren Aufrufe an die Schnittstelle zum Synchronisieren von Daten Aufrufe zum Einrichten von Kommunikations- oder Datenübertragungsströmen, zum Konfigurieren der Ströme, zum Konfigurieren von zu übertragenden Daten, zum Synchronisieren der Ströme und/oder zu jeder anderen Schnittstellenoperation, die erforderlich ist, um Daten zwischen einer oder mehreren PPUs, die von der Parallelverarbeitungsplattform 502 unterstützt werden, und einem oder mehreren anderen Prozessorkernen, die von der einen oder den mehreren anderen Softwareplattformen, wie dem DLA-Software-Stack 512, unterstützt werden, zu übertragen.
  • 5B ist ein Blockdiagramm, das eine Architektur zur Durchführung von Rechenoperationen in einem vereinheitlichten Programmiermodell gemäß mindestens einer Ausführungsform zeigt. Während eine Deep-Learning-Beschleuniger-Bibliothek 522 (DLA-Bibliothek), DLA-Laufzeit und DLA-Treiber 524 in 5B für beispielhafte Zwecke verwendet werden, ist es für den Fachmann offensichtlich, dass andere Software und Bibliotheken zur Unterstützung anderer Prozessorhardware mit einer Parallelverarbeitungsplattform 514 verbunden sein können, um beschleunigte Rechenoperationen unter Verwendung einer Vielzahl von Prozessortypen in dem vereinheitlichten Programmiermodell durchzuführen.
  • Bei mindestens einer Ausführungsform sind zur Verringerung des Aufwands der Synchronisierung 510 zwischen der Parallelverarbeitungsplattform 502 und der einen oder den mehreren anderen Softwareplattformen, wie z. B. dem DLA-Software-Stack 512, die eine oder die mehreren anderen Softwareplattformen, wie z. B. die Compute Uniform Device Architecture (CUDA) oder jede andere Parallelverarbeitungsplattform und/oder Bibliotheken, die hier weiter beschrieben sind, in die Parallelverarbeitungsplattform 502 für eine vereinheitlichte Parallelverarbeitungsplattform 514 integriert. Bei mindestens einer Ausführungsform vereinfacht die vereinheitlichte Parallelverarbeitungsplattform 514 die Programmierung einer oder mehrerer Rechen-Aufgaben oder Tasks, um die eine oder die mehreren Parallelverarbeitungseinheiten (PPUs), wie Grafikverarbeitungseinheiten (GPUs), sowie den einen oder die mehreren anderen Prozessorkerne, wie den DLA, zu nutzen.
  • Bei mindestens einer Ausführungsform sind die DLA-Bibliothek 522, die DLA-Laufzeit und der DLA-Treiber 524, wie es vorab in Verbindung mit 1 beschrieben ist, mit der Parallelverarbeitungsbibliothek 516, den anderen Bibliotheken 518 und den PPU-Werkzeugen und -Treibern 520 in die einheitliche Parallelverarbeitungsplattform 514 integriert. Bei mindestens einer Ausführungsform handelt es sich bei der DLA-Bibliothek 522, wie z. B. cuDLA oder einer anderen Bibliothek zur Durchführung von Berechnungen unter Verwendung eines oder mehrerer anderer Prozessorkerne, wie z. B. dem DLA, um Softwareanweisungen, die, wenn sie ausgeführt werden, die Durchführung einer oder mehrerer Rechenoperationen durch einen oder mehrere Prozessorkerne und/oder Beschleuniger, wie z. B. den DLA, ermöglichen oder erleichtern.
  • Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 benutzerseitige Schnittstellen, Datensynchronisation und Interoperabilität mit der Parallelverarbeitungsbibliothek 516 und/oder anderen Bibliotheken 518 bereit. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zur Verfügung, um den Speicher der Parallelverarbeitungsplattform 514 so zu registrieren, dass er von einem oder mehreren Prozessorkernen, wie z. B. dem DLA, benutzbar ist. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zum Starten einer asynchronen, eigenständigen Ausführung einer oder mehrerer Rechen-Aufgaben oder Tasks unter Verwendung eines oder mehrerer Prozessorkerne, wie z. B. dem DLA, bereit.
  • Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zum Starten der asynchronen Ausführung einer oder mehrerer Rechen-Aufgaben oder Tasks als Teil eines oder mehrerer Ströme oder Ausführungsgraphen bereit, die den Graphencode der Parallelverarbeitungsplattform 514 unter Verwendung eines oder mehrerer Prozessorkerne, wie etwa den DLA, umfassen. Bei mindestens einer Ausführungsform handelt es sich bei dem Graphencode um Anweisungen, die bei ihrer Ausführung den Ausführungsgraphen ausführen. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 einen oder mehrere Mechanismen zur Bereitstellung von Signalen und/oder einer Signalisierung zwischen einem oder mehreren Prozessorkernen, wie dem DLA, und einem oder mehreren anderen Prozessorkernen, wie PPUs, bereit. Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die DLA-Bibliothek 522 eine nahtlose Integration zwischen der Programmierung für den einen oder die mehreren anderen Prozessorkerne, wie z. B. den DLA, und die eine oder die mehreren PPUs, wie z. B. den GPUs. Bei mindestens einer Ausführungsform stellt die DLA-Bibliothek 522 eine Strom- und/oder Ereignis-basierte Synchronisierung bereit. Bei mindestens einer Ausführungsform stellt die Parallelverarbeitungsbibliothek 516 eine Strom- und/oder Ereignis-basierte Synchronisierung bereit. Bei mindestens einer Ausführungsform stellt jede andere Komponente der Parallelverarbeitungsplattform 514 eine Strom- und/oder Ereignis-basierte Synchronisierung bereit. Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die DLA-Bibliothek 522 die Nutzung eines zugewiesenen Speichers in der Parallelverarbeitungsplattform 514 durch den einen oder die mehrere anderen Prozessorkerne, wie z. B. den DLA. Bei mindestens einer Ausführungsform ermöglicht oder erleichtert die DLA-Bibliothek 522 eine einheitliche virtuelle Adressierung des von der Parallelverarbeitungsplattform 514 nutzbaren Speichers.
  • Bei mindestens einer Ausführungsform handelt es sich bei der DLA-Laufzeit und den DLA-Treibern 524 um Softwareanweisungen, die, wenn sie ausgeführt werden, eine Daten- und Hardwareinitialisierung, ein Daten- und/oder Puffermanagement, eine Speicherabbildung, Semaphoren für die Synchronisierung zwischen dem DLA und der einen oder den mehreren PPUs, wie den GPUs, und/oder jede andere Funktion durchführen, um die Ausführung einer oder mehrerer Rechenoperationen durch den DLA zu ermöglichen oder zu erleichtern.
  • Bei mindestens einer Ausführungsform entsteht bei der vereinheitlichten Parallelverarbeitungsplattform 514 kein Zusatzaufwand bzw. Overhead beim Einrichten von Abhängigkeiten zwischen Softwarecode, der Tasks angibt, die von der einen oder den mehreren PPUs, wie z. B. den GPUs, auszuführen sind, und Softwarecode, der Tasks angibt, die von dem einen oder den mehreren anderen Prozessorkernen, wie z. B. dem DLA, auszuführen sind, weil auf Speicher, auf den als Teil der Parallelverarbeitungsplattform 514 zugreifbar ist, mit gemeinsam genutzten Zeigern (Speicheradressen) zugegriffen wird. Um die Datenkonsistenz zu verwalten, startet die Parallelverarbeitungsplattform 514 in einer Ausführungsform Tasks, die für den einen oder die mehreren anderen Prozessorkerne, wie z. B. den DLA, spezifisch sind, als Teil des einen oder der mehreren Ströme oder Ausführungsgraphen, die von der Parallelverarbeitungsplattform 514 verwendet werden, um Tasks unter Verwendung der einen oder der mehreren PPUs durchzuführen. Bei mindestens einer Ausführungsform ermöglicht das Starten der Tasks, die für den einen oder die mehreren anderen Prozessorkerne, wie z. B. den DLA, spezifisch sind, als Teil des einen oder der mehreren Ströme oder Ausführungsgraphen, die von der Parallelverarbeitungsplattform 514 verwendet werden, um die Tasks unter Verwendung der einen oder der mehreren PPUs auszuführen, der Parallelverarbeitungsplattform, optimierte Cache-Konsistenzoperationen als Teil der Ströme oder Ausführungsgraphen durchzuführen. Bei mindestens einer Ausführungsform verwendet die Parallelverarbeitungsplattform 514 keine externen Schnittstellen, um die Synchronisation zwischen Tasks, die von der einen oder den mehreren PPUs ausgeführt werden, und Tasks, die von dem einen oder den mehreren anderen Prozessorkernen, wie dem DLA, ausgeführt werden, zu verwalten, da die Tasks als Teil eines einheitlichen Stroms und/oder Ausführungsgraphen gestartet werden.
  • 6 ist ein Blockdiagramm, das eine vereinheitlichte Architektur zur Durchführung von Rechenoperationen unter Verwendung einer Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform zeigt. Während Deep Learning Accelerator (DLA)-Software 608, 620, 628 und Hardware 638 in 6 für beispielhafte Zwecke verwendet werden, ist es für den Fachmann offensichtlich, dass verschiedene andere Prozessor-Hardware und Software zur Unterstützung der anderen Prozessor-Hardware in der vereinheitlichten Architektur verwendet werden können, um Rechenoperationen unter Verwendung der Vielzahl von Prozessortypen durchzuführen.
  • Bei mindestens einer Ausführungsform umfasst die einheitliche Architektur zur Durchführung von Rechenoperationen, wie Inferencing und/oder andere Deep-Learning-Aufgaben bzw. Tasks sowie jede andere Rechen-Aufgabe bzw. Task, die in Teil-Aufgaben bzw. Tasks aufgeteilt und unter Verwendung eines oder mehrerer Prozessorkerne durchgeführt werden kann, sowohl Komponenten von Software 602 als auch Hardware 632. Bei mindestens einer Ausführungsform umfasst die Hardware 632 zur Ermöglichung oder Erleichterung der Durchführung von Rechenoperationen durch mehrere Rechen-Aufgaben bzw. Tasks und/oder Rechenoperationen unter Verwendung eines oder mehrerer unterschiedlicher Prozessorkerne zumindest einen Speicher 646, einen Kommunikationsbus 644 und eine oder mehrere zentrale Verarbeitungseinheiten (CPUs) 634, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform umfasst die Hardware 632 zur Ermöglichung oder Erleichterung der Durchführung von Rechenoperationen durch mehrere Rechen-Aufgaben bzw. Tasks und/oder Rechenoperationen unter Verwendung des einen oder der mehreren verschiedenen Prozessorkerne eine oder mehrere Parallelverarbeitungseinheiten (PPUs) 636, einen oder mehrere Deep-Learning-Beschleuniger (DLAs) 638, einen oder mehrere programmierbare Bildverarbeitungsbeschleuniger (Programmable Vision Accelerators (PVAs)) und/oder beliebige andere Prozessorkerne 642 mit einer anderen Prozessorarchitektur, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfasst die einheitliche Architektur zur Durchführung von Rechenoperationen, wie Inferencing und/oder andere Deep-Learning-Aufgaben bzw. Tasks sowie jede andere Rechen-Aufgabe bzw. Task, die in Teil-Aufgaben bzw. Sub-Tasks aufteilbar und unter Verwendung eines oder mehrerer Prozessorkerne durchführbar ist, verschiedene Software-Komponenten 602. Bei mindestens einer Ausführungsform umfassen die Software-Komponenten 602 der vereinheitlichten Architektur eine Anwendung 604. Bei mindestens einer Ausführungsform handelt es sich bei der Anwendung 604 um Softwareanweisungen, die bei ihrer Ausführung eine oder mehrere Aufgaben bzw. Tasks ausführen, wie z. B. Rechenoperationen zur Durchführung von Inferencing oder einer anderen Rechen-Aufgabe bzw. Task unter Verwendung eines oder mehrerer Prozessorkerne 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 Softwareanweisungen zur Durchführung einer oder mehrerer Aufgaben bzw. Tasks, die in eine Vielzahl von Teil-Aufgaben bzw. Sub-Tasks unterteilt werden können, die von der Vielzahl verschiedener Prozessorkerne 634, 636, 638, 640, 642 auszuführen sind. Bei mindestens einer Ausführungsform wird die Anwendung 604 unter Verwendung eines Compilers, der für die Parallelverarbeitungsplattform spezifisch ist, oder eines Compilers, der Bibliotheken verwendet, die für die Parallelverarbeitungsplattform spezifisch sind, wie z. B. die Compute Uniform Device Architecture (CUDA) oder eine andere Parallelverarbeitungsplattform und/oder Bibliothek, die hier weiter beschrieben ist, erzeugt. Bei mindestens einer Ausführungsform wird die Anwendung 604 unter Verwendung eines Compilers, der für eine bestimmte Prozessorarchitektur spezifisch ist, oder eines Compilers, der Bibliotheken verwendet, die für eine bestimmte Prozessorarchitektur spezifisch sind, wie z. B. eine bestimmte oder allgemeine GPU-Architektur, eine DLA-Architektur oder eine andere Prozessorarchitektur, wie sie hier beschrieben ist, erzeugt. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 einen ausführbaren Code. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 Objektcode. Bei mindestens einer Ausführungsform umfasst die Anwendung 604 jeden anderen Quellcode, der zur Ausführung unter Verwendung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zu interpretieren ist.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der einheitlichen Architektur Bibliotheken und Frameworks 606. Bei mindestens einer Ausführungsform sind die Bibliotheken und Frameworks 606 Sätze von Softwareanweisungen, die, wenn sie ausgeführt werden, eine oder mehrere Operationen durchführen, um die Ausführung einer oder mehrerer Berechnungs-Aufgaben bzw. Tasks unter Verwendung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zu ermöglichen oder zu erleichtern. Bei mindestens einer Ausführungsform umfassen die Bibliotheken und Frameworks 606 Softwarecode zur Ermöglichung oder Erleichterung der Programmierung der Anwendung 604 für den einen oder die mehreren Prozessorkerne 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform umfassen die Bibliotheken und Frameworks 606 Softwarecode zur Durchführung verschiedener hier beschriebener Rechenoperationen, wie z. B. Bildverarbeitung durch eine Bildverarbeitungsbibliothek 610 und/oder Deep-Learning-Operationen, die durch den DLA 638 unter Verwendung einer DLA-Bibliothek 608 zu beschleunigen sind, wie es vorab in Verbindung mit 5A und 5B beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Bibliotheken und Frameworks 606 Bibliotheken zur allgemeinen Unterstützung, wie verschiedene CUDA-Bibliotheken, die hier weiter beschrieben sind, um paralleles Rechnen unter Verwendung der verschiedenen Prozessoren 634, 636, 638, 640, 642, einschließlich der einen oder der mehreren PPUs 636, wie den GPUs, durchzuführen.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der vereinheitlichten Architektur Stream-Bibliotheken bzw. Strom-Bibliotheken 612, 614. Bei mindestens einer Ausführungsform entsprechen die Strom-Bibliotheken 612, 614 Softwareanweisungen, die, wenn sie ausgeführt werden, Operationen zur Ermöglichung oder Erleichterung von Stream-Operationen bzw. Strom-Operationen zur Übertragung von Daten zwischen Prozessoren oder zwischen Anwendungen durchführen, die von den verschiedenen Prozessoren 634, 636, 638, 640, 642 ausgeführt werden. Bei mindestens einer Ausführungsform umfassen die Strombibliotheken 612, 614 eine Bibliothek zur Stromsynchronisation 612. Bei mindestens einer Ausführungsform umfasst die Bibliothek zur Stromsynchronisation 612 Softwareanweisungen, die bei ihrer Ausführung die Datensynchronisation zwischen einer oder mehreren Aufgaben bzw. Tasks ermöglichen oder erleichtern, die von dem einen oder den mehreren Prozessorkernen 634, 636, 638, 640, 642 ausgeführt werden. Bei mindestens einer Ausführungsform umfassen die Strombibliotheken 612, 614 eine Bibliothek für einen EGL-Strom 614. Bei mindestens einer Ausführungsform handelt es sich bei der Bibliothek für einen EGL-Strom 614 um Softwareanweisungen, die, wenn sie ausgeführt werden, die Übertragung von Bild-Frame-Sequenzen zwischen Softwarekomponenten unter Verwendung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 ermöglichen oder erleichtern.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der einheitlichen Architektur Benutzer-Mode-Treiber 616 und/oder andere Benutzer-Mode-Software und/oder Schichten. Bei mindestens einer Ausführungsform sind die Benutzer-Mode-Treiber 616 Softwareanweisungen, die, wenn sie ausgeführt werden, Schnittstellen zur Verwaltung von Ressourcen bereitstellen, die von dem einen oder den mehreren Prozessorkernen 634, 636, 638, 640, 642 verwendet werden. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 Softwareanweisungen zur Ermöglichung oder Erleichterung der Programmierung der einen oder der mehreren Anwendungen 604 zur Nutzung des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 Softwareanweisungen zur Ermöglichung oder Erleichterung der Programmierung von Abschnitten der einen oder der mehreren Anwendungen 604 oder anderer ausführbarer Codes zur Verwendung eines ersten Prozessorkerntyps des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zur Ausführung eines ersten Abschnitts des ausführbaren Codes der einen oder der mehreren Anwendungen 604 und eines zweiten Prozessorkerntyps des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 zur Ausführung eines zweiten Abschnitts des ausführbaren Codes der einen oder der mehreren Anwendungen 604. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 einen Parallelrechentreiber 618, wie z. B. einen CUDA-Benutzer-Mode-Treiber oder einen anderen Parallelrechentreiber, der hier weiter beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 die DLA-Laufzeit 620, wie sie vorab in Verbindung mit den 5A und 5B beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Benutzer-Mode-Treiber 616 eine PVA-Laufzeit 622, um eine Schnittstelle bereitzustellen, um eine Interaktion mit Hardwarekernen zur PVA 640 zu ermöglichen oder zu erleichtern.
  • Bei mindestens einer Ausführungsform umfassen die Softwarekomponenten 602 der einheitlichen Architektur Komponenten auf der Ebene des Betriebssystems (OS), wie z. B. Kernel und/oder Kernel-Mode-Treiber 624. Bei mindestens einer Ausführungsform sind die Komponenten auf Betriebssystemebene wie Kernel und/oder Kernel-Mode-Treiber Softwareanweisungen, die, wenn sie ausgeführt werden, die Interaktion mit einer oder mehreren Ressourcen des einen oder der mehreren Prozessorkerne 634, 636, 638, 640, 642 durch den einen oder die mehreren Benutzer-Mode-Treiber 616 und/oder die eine oder die mehreren Bibliotheken und Frameworks 606 sowie die eine oder die mehreren Anwendungen 604 ermöglichen oder erleichtern. Bei mindestens einer Ausführungsform handelt es sich bei den Kernels und Kernel-Mode-Treibern (KMDs) 624 um systemseitige Software, wie es hier weiter beschrieben ist.
  • Bei mindestens einer Ausführungsform umfassen der Kernel und die KMDs 624 Softwareanweisungen, die, wenn sie ausgeführt werden, die Ressourcenverwaltung für einen oder mehrere Typen der Prozessoren 634, 636, 638, 640, 642 ermöglichen oder erleichtern und eine Schnittstelle für den Benutzer-Mode-Treiber 616 und/oder Benutzerraumbibliotheken und Frameworks 606 bereitstellen, um mit dem einen oder den mehreren Typen der Prozessoren 634, 636, 638, 640, 642 zu interagieren. Bei mindestens einer Ausführungsform übernehmen der Kernel und die KMDs 624 die Aufgaben- bzw. Task-Verwaltung für den einen oder die mehreren Typen der Prozessoren 634, 636, 638, 640, 642. Bei mindestens einer Ausführungsform führen der Kernel und die KMDs 624 eine Aufgaben- bzw. Task-Ablaufsteuerung und Warteschlangenverwaltung (Queueing) durch, was von einem oder mehreren Kernen der Prozessoren 634, 636, 638, 640, 642 ausgeführt wird. Bei mindestens einer Ausführungsform erstellen und verwalten der Kernel und die KMDs 624 Aufgaben- bzw. Task-Deskriptoren, die alle erforderlichen Ressourcen und Aktionen zur Ausführung einzelner Aufgaben bzw. Tasks angeben.
  • Bei mindestens einer Ausführungsform weisen der Kernel und die KMDs 624 Puffer zu und verwalten sie, um die Eingabe und Ausgabe von Daten, wie z. B. Tensoren, an Aufgaben bzw. Tasks zu ermöglichen oder zu erleichtern, die von einem oder mehreren Kernen der Prozessoren 634, 636, 638, 640, 642 auszuführen sind. Bei mindestens einer Ausführungsform übermitteln der Kernel und die KMDs 624 Aufgaben bzw. Tasks und/oder Aufgaben- bzw. Task-Deskriptoren an eine Firmware für einen oder mehrere Typen der Prozessoren 634, 636, 638, 640, 642, um die Aufgaben bzw. Tasks unter Verwendung des einen oder der mehreren Kerne der Prozessoren 634, 636, 638, 640, 642 durchzuführen. Bei mindestens einer Ausführungsform handhaben der Kernel und die KMDs 624 Benutzer-Mode-Übermittlungen, wobei ein oder mehrere der Benutzer-Mode-Treiber 616 eine Arbeit direkt an die Firmware für den einen oder die mehrere Typen der Prozessoren 634, 636, 638, 640, 642 übermitteln, und der Kernel und die KMDs 624 Befehlspuffer zur Kommunikation zwischen den Benutzer-Mode-Treibern 616 und der Firmware zuweisen.
  • Bei mindestens einer Ausführungsform umfassen die Kernel und die KMDs 624 Parallelrechen-Treiber und -Werkzeuge 626, wie z. B. einen CUDA-Kernel-Mode-Treiber und/oder CUDA-Werkzeuge für die Leistungsüberwachung und/oder andere PPU-bezogene Operationen, wie sie hier beschrieben sind. Bei mindestens einer Ausführungsform umfassen die Kernel und KMDs 624 alle anderen Treiber und/oder Tools für die parallele Datenverarbeitung, die hier weiter beschrieben sind. Bei mindestens einer Ausführungsform umfassen die Kernel und KMDs 624 DLA-KMDs 628, wie es vorab in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform umfassen die Kernel und KMDs 624 PVA-KMDs 630, wie es hier weiter beschrieben ist.
  • 7 ist ein Blockdiagramm, das einen Ausführungsgraphen 700 zur Ausführung von ausführbarem Code, wie z.B. Kernel 704, 706, 708, 710, 712, 714, 716, unter Verwendung einer Vielzahl von Prozessorkernen mit verschiedenen Architekturen, einschließlich Parallelverarbeitungseinheiten (PPUs), wie z.B. Grafikverarbeitungseinheiten (GPUs), Beschleunigern, wie z.B. Deep-Learning-Beschleunigern (DLAs), und/oder jedem anderen Typ von Prozessortyp oder Architektur, wie er hier weiter beschrieben ist, gemäß mindestens einer Ausführungsform zeigt. Bei mindestens einer Ausführungsform erstellt eine Parallelverarbeitungsplattform, wie CUDA oder eine andere Parallelverarbeitungsplattform oder ein Satz von Bibliotheken, die hier weiter beschrieben sind, einen oder mehrere Ausführungsgraphen 700, der bzw. die ausführbaren Code 704, 706, 708, 710, 712, 714, 716 angibt bzw. angeben, der von einem oder mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen auszuführen ist. Bei mindestens einer Ausführungsform handelt es sich bei dem Ausführungsgraphen 700 um Softwareanweisungen, die bei ihrer Ausführung bewirken, dass ein oder mehrere Segmente des ausführbaren Codes 704, 706, 708, 710, 712, 714, 716 von einem oder mehreren Prozessorkernen in einer bestimmten Reihenfolge ausgeführt werden. Die Segmente des ausführbaren Codes 704, 706, 708, 710, 712, 714, 716 werden hier als Kernel bezeichnet. Bei mindestens einer Ausführungsform gibt der Ausführungsgraph 700 eine oder mehrere Ressourcen eines oder mehrerer Prozessorkerne an, die vor und während der Ausführung des einen oder der mehreren Kernel 704, 706, 708, 710, 712, 714, 716 zu initialisieren sind.
  • Bei mindestens einer Ausführungsform startet eine Zentraleinheit (CPU) 702 den Ausführungsgraphen 700 und initialisiert eine oder mehrere Ressourcen, wie z. B. Speicher, Register, Caches und/oder jede andere Prozessorressource, die von dem einen oder den mehreren Kernels 704, 706, 708, 710, 712, 714, 716 während der Ausführung auf einem oder mehreren Prozessorkernen zu verwenden sind. Bei mindestens einer Ausführungsform werden nach der Initialisierung der eine oder die mehreren Kernels 704, 706, 708, 710, 712, 714, 716 von einem oder mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen seriell ausgeführt, bis jeder des einen oder der mehreren Kernels 704, 706, 708, 710, 712, 714, 716 die Ausführung abgeschlossen hat. Bei mindestens einer Ausführungsform werden nach der Initialisierung der eine oder die mehreren Kernels 704, 706, 708, 710, 712, 714, 716 von dem einen oder den mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen parallel ausgeführt, bis jeder von dem einen oder den mehreren Kernels 704, 706, 708, 710, 712, 714, 716 die Ausführung abgeschlossen hat. Bei mindestens einer Ausführungsform werden nach der Initialisierung der eine oder die mehreren Kernels 704, 706, 708, 710, 712, 714, 716 von dem einen oder den mehreren Prozessorkernen mit einer oder mehreren Prozessorarchitekturen in einer durch den Ausführungsgraphen 700 angegebenen Reihenfolge ausgeführt, bis jeder von dem einen oder den mehreren Kernels 704, 706, 708, 710, 712, 714, 716 die Ausführung abgeschlossen hat. Bei mindestens einer Ausführungsform gibt der Ausführungsgraph 700 eine Teilmenge der Kernels 704, 706, 708, 710, 712, 714, 716, die seriell auszuführen sind, und eine Teilmenge der Kernels 704, 706, 708, 710, 712, 714, 716, die parallel auszuführen sind, an.
  • Eine Ausführungsreihenfolge bei dem Ausführungsgraphen 700 ist in 7 beispielhaft dargestellt, und der Fachmann versteht, dass die Kernels 704, 706, 708, 710, 712, 714, 716 des Ausführungsgraphen 700 in jeder beliebigen Reihenfolge ausgeführt werden können, die anderweitig durch den Ausführungsgraphen 700 angegeben ist, um eine oder mehrere Rechen-Aufgaben bzw. Tasks unter Verwendung der Kernels 704, 706, 708, 710, 712, 714, 716 auszuführen. In mindestens einer Ausführungsform wird, nachdem die CPU 702 den Ausführungsgraphen 700 gestartet hat, ein erster Kernel 704 von einem oder mehreren Prozessorkernen ausgeführt, die einen ersten Architekturtyp haben, wie z. B. eine CPU, GPU, einen DLA oder einen anderen Architekturtyp, der hier weiter beschrieben ist. Bei mindestens einer Ausführungsform werden, nachdem der eine oder die mehreren Prozessorkerne mit dem ersten Architekturtyp den ersten Kernel 704 ausgeführt haben, ein zweiter 706 und ein dritter 708 Kernel von dem einen oder den mehreren Prozessorkernen mit dem ersten Architekturtyp parallel zu einem vierten Kernel 710, der von einem oder mehreren Prozessorkernen mit einem zweiten Architekturtyp, wie einer CPU, GPU, einem DLA oder einem anderen Architekturtyp, der hier weiter beschrieben ist, ausgeführt wird, ausgeführt. Bei mindestens einer Ausführungsform stehen die von dem ersten Kernel 704, dem zweiten Kernel 706, dem dritten Kernel 708 und dem vierten Kernel 710 erzeugten Daten einem fünften Kernel 712 zur Verfügung, wobei gemeinsam genutzte Speicherzeiger der Parallelverarbeitungsplattform verwendet werden, wie es vorab in Verbindung mit den 5A, 5B und 6 beschrieben ist.
  • Bei mindestens einer Ausführungsform wird, sobald der zweite Kernel 706 und der dritte Kernel 708 von dem einen oder den mehreren Prozessorkernen mit der ersten Architektur parallel zu dem vierten Kernel 710, der von dem einen oder den mehreren Prozessorkernen mit der zweiten Architektur ausgeführt wird, ausgeführt werden, ein fünfter Kernel 712 seriell zu dem einen oder den mehreren Prozessorkernen mit der ersten Architektur ausgeführt. Die von dem fünften Kernel 712 erzeugten Daten stehen in einer Ausführungsform einem sechsten Kernel 714 und einem siebten Kernel 716 über gemeinsam genutzte Speicherzeiger der Parallelverarbeitungsplattform zur Verfügung, wie es vorab in Verbindung mit den 5A, 5B und 6 erläutert ist. Bei mindestens einer Ausführungsform wird nach der Ausführung des fünften Kernels 712 durch den einen oder die mehreren Prozessorkerne mit der ersten Architektur, wie es hier beschrieben ist, ein sechster Kernel 714 durch einen oder mehrere Prozessorkerne mit einer dritten Architektur, wie z. B. einer CPU, GPU, einem DLA oder einem anderen Architekturtyp, der hier weiter beschrieben ist, ausgeführt. Bei mindestens einer Ausführungsform stehen die von dem sechsten Kernel 714 erzeugten Daten einem siebten Kernel 716 zur Verfügung, wobei gemeinsam genutzte Speicherzeiger der Parallelverarbeitungsplattform verwendet werden, wie es vorab in Verbindung mit den 5A, 5B und 6 beschrieben ist.
  • Bei mindestens einer Ausführungsform wird, sobald der sechste Kernel 714 von dem einen oder den mehreren Prozessorkernen mit der dritten Architektur ausgeführt wurde, ein siebter Kernel 716 von dem einen oder den mehreren Prozessorkernen mit der ersten Architektur ausgeführt, wie es vorab beschrieben ist. Bei mindestens einer Ausführungsform ist, sobald der eine oder die mehreren Prozessorkerne mit der ersten Architektur den siebten Kernel 716 ausgeführt haben, der Ausführungsgraph 700 abgeschlossen 718 und die Ausführung kehrt zu der CPU zurück.
  • 8 veranschaulicht ein Verfahren 800 zur Ausführung von ausführbarem Code für eine Vielzahl von Prozessortypen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform beginnt das Verfahren 800 bei 802, indem ein Ausführungsgraph gestartet wird, wie es vorab in Verbindung mit 7 beschrieben ist. Während der Ausführung umfasst bei einer Ausführungsform jeder Knoten des Ausführungsgraphen ausführbaren Code, wie z. B. einen Kernel, der von einem oder mehreren Prozessorkernen einer bestimmten Architektur oder eines bestimmten Typs 804 auszuführen ist, wie es vorab in Verbindung mit 7 beschrieben ist.
  • Wenn der Kernel von einem Typ 804 einer Prozessorarchitektur wie einer Parallelverarbeitungseinheit (PPU) auszuführen ist, dann führt eine oder führen mehrere PPUs und/oder PPU-Kerne bei mindestens einer Ausführungsform von einer PPU beschleunigte Operationen 806 aus, die durch ausführbaren Code und/oder Operationen in dem Kernel angegeben sind. Wenn der Kernel von einem Typ 804 einer Prozessorarchitektur wie einem Deep-Learning-Beschleuniger (DLA) auszuführen ist, dann führt ein oder führen mehrere DLAs und/oder DLA-Kerne bei mindestens einer Ausführungsform von einem DLA beschleunigte Operationen 808 aus, die durch ausführbaren Code und/oder Operationen in dem Kernel angegeben sind. Wenn ein Kernel von einem anderen Typ 804 einer Prozessorarchitektur, wie sie hier weiter beschrieben ist, auszuführen ist, dann führt ein oder führen mehrere Prozessorkerne dieses anderen Architekturtyps bei mindestens einer Ausführungsform Rechenoperationen 810 aus, die durch ausführbaren Code und/oder Operationen in einem Kernel angegeben sind.
  • Sobald der eine oder die mehreren Kernels 806, 808, 810 von einem oder mehreren Kernen von einer oder mehreren Architekturtypen 804 ausgeführt worden sind, werden bei mindestens einer Ausführungsform von jedem des einen oder der mehreren Kernels optional Daten und/oder andere Berechnungsergebnisse zwischen jedem des einen oder der mehreren Kerne unter Verwendung von gemeinsam genutzten Zeigern mittels eines von der Parallelverarbeitungsplattform verwalteten Speichers synchronisiert 812, wie es vorab in Verbindung mit den 5B, 6 und 7 beschrieben ist. Wenn keine weiteren Kernel in dem Ausführungsgraphen auszuführen sind, wird bei mindestens einer Ausführungsform der Ausführungsgraph beendet 814 und das Verfahren 800 endet 816. Wenn zusätzliche Kernels in dem Ausführungsgraphen auszuführen sind, wird bei mindestens einer Ausführungsform das Verfahren 800 fortgesetzt, indem bestimmt wird, welcher oder welche Prozessorkerne mit einem spezifischen Architekturtyp 804 den jeweils nachfolgenden Kernel 806, 808, 810 in dem Ausführungsgraphen auszuführen hat bzw. haben.
  • In der folgenden Beschreibung werden zahlreiche spezifische Details dargelegt, um ein gründlicheres Verständnis von mindestens einer Ausführungsform zu ermöglichen. Dem Fachmann ist jedoch klar, dass die erfindungsgemäßen Konzepte auch ohne eines oder mehrere dieser spezifischen Details ausgeführt werden können.
  • Rechenzentrum
  • 9 veranschaulicht ein beispielhaftes Rechenzentrum 900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Rechenzentrum 900, ohne darauf beschränkt zu sein, eine Rechenzentrum-Infrastrukturschicht 910, eine Frameworkschicht 920, eine Softwareschicht 930 und eine Anwendungsschicht 940.
  • In mindestens einer Ausführungsform, wie in 9 gezeigt, kann die Rechenzentrum-Infrastrukturschicht 910 einen Ressourcenorchestrator 912, gruppierte Rechenressourcen 914 und Knoten-Rechenressourcen („Knoten-C.R.s“) 916(1)-916(N) beinhalten, wobei „N“ eine beliebige ganze, positive Zahl darstellt. In mindestens einer Ausführungsform können die Knoten-C.R.s 916(1)-916(N), ohne darauf beschränkt zu sein, eine beliebige Anzahl von Zentralverarbeitungseinheiten („CPUs“) oder anderen Prozessoren (einschließlich Beschleunigern, feldprogrammierbaren Gate-Arrays („FPGAs“), Datenverarbeitungseinheiten bzw. Data Processing Units („DPUs“) in Netzwerkeinrichtungen, 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 916(1)-916(N) ein Server mit einer oder mehreren der vorstehend erwähnten Rechenressourcen sein.
  • In mindestens einer Ausführungsform können die gruppierten Rechenressourcen 914 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 914 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 912 einen oder mehrere Knoten-CRs 916(1)-916(N) und/oder gruppierte Rechenressourcen 914 konfigurieren oder anderweitig steuern. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 912 eine Software-Design-Infrastruktur („SDI“)-Verwaltungseinheit für das Rechenzentrum 900 beinhalten. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 912 Hardware, Software oder eine Kombination davon umfassen.
  • In mindestens einer Ausführungsform, wie in 9 gezeigt, beinhaltet die Frameworkschicht 920, ohne Beschränkung darauf, einen Job-Scheduler 932, einen Konfigurationsmanager 934, einen Ressourcen-Manager 936 und ein verteiltes Dateisystem 938. In mindestens einer Ausführungsform kann die Frameworkschicht 920 ein Framework zur Unterstützung der Software 952 der Softwareschicht 930 und/oder einer oder mehrerer Anwendung(en) 942 der Anwendungsschicht 940 beinhalten. In mindestens einer Ausführungsform können die Software 952 oder die Anwendung(en) 942 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 920 eine Art von freiem und quelloffenem Software-Webanwendungs-Framework wie Apache SparkTM (nachstehend „Spark“) sein, das ein verteiltes Dateisystem 938 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 932 einen Spark-Treiber enthalten, um die Planung von Arbeitslasten zu erleichtern, die von verschiedenen Schichten des Rechenzentrums 900 unterstützt werden. In mindestens einer Ausführungsform kann der Konfigurationsmanager 934 in der Lage sein, verschiedene Schichten zu konfigurieren, wie beispielsweise die Softwareschicht 930 und die Frameworkschicht 920, einschließlich Spark und das verteilte Dateisystem 938 zur Unterstützung der Verarbeitung großer Datenmengen. In mindestens einer Ausführungsform kann der Ressourcen-Manager 936 in der Lage sein, geclusterte oder gruppierte Rechenressourcen zu verwalten, die zur Unterstützung des verteilten Dateisystems 938 und des Job-Schedulers 932 gemappt oder zugeordnet sind. In mindestens einer Ausführungsform können geclusterte oder gruppierte Rechenressourcen die gruppierten Rechenressourcen 914 auf der Rechenzentrums-Infrastrukturschicht 910 umfassen. In mindestens einer Ausführungsform kann sich der Ressourcen-Manager 936 mit dem Ressourcenorchestrator 912 koordinieren, um diese gemappten oder zugeordneten Rechenressourcen zu verwalten.
  • In mindestens einer Ausführungsform kann die in der Softwareschicht 930 enthaltene Software 952 Software enthalten, die von mindestens Teilen der Knoten C.R.s 916(1)-916(N), den gruppierten Rechenressourcen 914 und/oder dem verteilten Dateisystem 938 der Frameworkschicht 920 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.
  • [0116] In mindestens einer Ausführungsform kann (können) die in der Anwendungsschicht 940 enthaltene(n) Anwendung(en) 942 eine oder mehrere Arten von Anwendungen beinhalten, die von mindestens Teilen der Knoten C.R.s 916(1)-916(N), den gruppierten Rechenressourcen 914 und/oder dem verteilten Dateisystem 938 der Frameschicht 920 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 934, der Ressourcen-Manager 936 und der Ressourcenorchestrator 912 eine beliebige Anzahl und Art von selbstmodifizierenden Aktionen ausführen, 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 900 davon entlasten, möglicherweise schlechte Konfigurationsentscheidungen zu treffen und möglicherweise nicht ausgelastete und/oder schlecht leistende Teile eines Rechenzentrums zu vermeiden.
  • Computergestützte Systeme
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte computergestützte Systeme, die zur Ausführung mindestens einer Ausführungsform verwendet werden können.
  • 10 veranschaulicht ein Verarbeitungssystem 1000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform weist das Verarbeitungssystem einen oder mehrere Prozessoren 1002 und einen oder mehrere Grafikprozessoren 1008 auf, und kann ein Einzelprozessor-Desktop-System, ein Multiprozessor-Workstation-System oder ein Serversystem mit einer großen Anzahl von Prozessoren 1002 oder Prozessorkernen 1007 sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 1000 eine Verarbeitungsplattform, die in eine integrierte System-on-a-Chip („SoC“)-Schaltung zur Verwendung in mobilen, tragbaren oder eingebetteten Geräten integriert ist.
  • In mindestens einer Ausführungsform kann das Verarbeitungssystem 1000 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 1000 ein Mobiltelefon, ein Smartphone, ein Tablet-Computergerät oder ein mobiles Internetgerät. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1000 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 1000 ein Fernseh- oder Set-Top-Box-Gerät mit einem oder mehreren Prozessoren 1002 und einer grafischen Oberfläche, die von einem oder mehreren Grafikprozessoren 1008 erzeugt wird.
  • In mindestens einer Ausführungsform enthalten ein oder mehrere Prozessoren 1002 jeweils einen oder mehrere Prozessorkerne 1007 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 1007 so konfiguriert, dass er einen bestimmten Befehlssatz 1009 verarbeitet. In mindestens einer Ausführungsform kann der Befehlssatz 1009 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 1007 jeweils einen anderen Befehlssatz 1009 verarbeiten, der Anweisungen enthalten kann, um die Emulation anderer Befehlssätze zu erleichtern. In mindestens einer Ausführungsform kann der Prozessorkern 1007 auch andere Verarbeitungsvorrichtungen enthalten, wie z.B. einen digitalen Signalprozessor („DSP“).
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 1002 einen Cachespeicher („Cache“) 1004. In mindestens einer Ausführungsform kann der Prozessor 1002 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform wird der Cachespeicher von verschiedenen Komponenten des Prozessors 1002 gemeinsam genutzt. In mindestens einer Ausführungsform verwendet der Prozessor 1002 auch einen externen Cache (z.B. einen Level 3 („L3“)-Cache oder Last Level Cache („LLC“)) (nicht dargestellt), der von den Prozessorkernen 1007 unter Verwendung bekannter Cache-Kohärenztechniken gemeinsam genutzt werden kann. In mindestens einer Ausführungsform ist zusätzlich eine Registerdatei 1006 in dem Prozessor 1002 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 1006 Universalregister oder andere Register enthalten.
  • In mindestens einer Ausführungsform ist/sind ein oder mehrere Prozessor(en) 1002 mit einem oder mehreren Schnittstellenbus(en) 1010 gekoppelt, um Kommunikationssignale wie Adress-, Daten- oder Steuersignale zwischen dem Prozessor 1002 und anderen Komponenten in dem Verarbeitungssystem 1000 zu übertragen. In mindestens einer Ausführungsform kann der Schnittstellenbus 1010 ein Prozessorbus sein, wie z.B. eine Version eines Direct Media Interface („DMI“)-Busses. In mindestens einer Ausführungsform ist der Schnittstellenbus 1010 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) 1002 eine integrierte Speichersteuerung 1016 und einen Plattformsteuerungs-Hub 1030. In mindestens einer Ausführungsform erleichtert die Speichersteuerung 1016 die Kommunikation zwischen einem Speichervorrichtung und anderen Komponenten des Verarbeitungssystems 1000, während der Plattformsteuerungs-Hub („PCH“) 1030 Verbindungen zu Eingabe/Ausgabe-Geräten („I/O“) über einen lokalen I/O-Bus bereitstellt.
  • In mindestens einer Ausführungsform kann die Speichervorrichtung 1020 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 1020 als Systemspeicher für das Verarbeitungssystem 1000 arbeiten, um Daten 1022 und Anweisungen 1021 zur Verwendung zu speichern, wenn ein oder mehrere Prozessoren 1002 eine Anwendung oder einen Prozess ausführen. In mindestens einer Ausführungsform koppelt die Speichersteuerung 1016 auch mit einem optionalen externen Grafikprozessor 1012, der mit einem oder mehreren Grafikprozessoren 1008 in den Prozessoren 1002 kommunizieren kann, um Grafik- und Medienoperationen durchzuführen. In mindestens einer Ausführungsform kann eine Anzeigevorrichtung 1011 mit dem/den Prozessor(en) 1002 verbunden sein. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 1011 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 1011 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 Plattformsteuerungs-Hub 1030 die Verbindung von Peripheriegeräten mit der Speichervorrichtung 1020 und dem Prozessor 1002 über einen Hochgeschwindigkeits-I/O-Bus. In mindestens einer Ausführungsform beinhalten die I/O-Peripheriegeräte, ohne darauf beschränkt zu sein, eine Audiosteuerung 1046, eine Netzwerksteuerung 1034, eine Firmware-Schnittstelle 1028, einen drahtlosen Transceiver 1026, Berührungssensoren 1025 und eine Datenspeichervorrichtung 1024 (z.B. ein Festplattenlaufwerk, einen Flash-Speicher usw.). In mindestens einer Ausführungsform kann die Datenspeichervorrichtung 1024 ü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 1025 Touchscreen-Sensoren, Drucksensoren oder Fingerabdrucksensoren beinhalten. In mindestens einer Ausführungsform kann der drahtlose Transceiver 1026 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 1028 eine Kommunikation mit System-Firmware und kann z.B. eine einheitliche erweiterbare Firmware-Schnittstelle („UEFI“) sein. In mindestens einer Ausführungsform kann die Netzwerksteuerung 1034 eine Netzwerkverbindung zu einem kabelgebundenen Netzwerk ermöglichen. In mindestens einer Ausführungsform koppelt eine Hochleistungs-Netzwerksteuerung (nicht dargestellt) mit dem Schnittstellenbus 1010. In mindestens einer Ausführungsform ist die Audiosteuerung 1046 eine Mehrkanal-High-Definition-Audiosteuerung. In mindestens einer Ausführungsform enthält das Verarbeitungssystem 1000 einen optionalen Legacy-I/O-Controller 1040 zur Kopplung von Legacy-Geräten (z.B. Personal System 2 („PS/2“)) mit dem Verarbeitungssystem 1000. In mindestens einer Ausführungsform kann der Plattformsteuerungs-Hub 1030 auch mit einem oder mehreren Universal Serial Bus („USB“)-Controllern 1042 verbinden, die Eingabevorrichtungen, wie z.B. Tastatur- und Mauskombinationen 1043, eine Kamera 1044 oder andere USB-Eingabevorrichtungen verbinden.
  • In mindestens einer Ausführungsform kann eine Instanz der Speichersteuerung 1016 und des Plattformsteuerungs-Hubs 1030 in einen diskreten externen Grafikprozessor, wie beispielsweise den externen Grafikprozessor 1012, integriert sein. In mindestens einer Ausführungsform können der Plattformsteuerungs-Hub 1030 und/oder die Speichersteuerung 1016 extern zu einem oder mehreren Prozessor(en) 1002 sein. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1000 beispielsweise eine externe Speichersteuerung 1016 und einen Plattformsteuerungs-Hub 1030 enthalten, der als ein Speichersteuerungs-Hub und Peripheriesteuerungs-Hub innerhalb eines System-Chipsatzes konfiguriert sein kann, der mit dem/den Prozessor(en) 1002 in Verbindung steht.
  • 11 veranschaulicht ein Computersystem 1100 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann das Computersystem 1100 ein System mit miteinander verbundenen Vorrichtungen und Komponenten, ein SOC oder eine Kombination davon sein. In mindestens einer Ausführungsform ist das Computersystem 1100 mit einem Prozessor 1102 ausgebildet, der Ausführungseinheiten zum Ausführen einer Anweisung enthalten kann. In mindestens einer Ausführungsform kann das Computersystem 1100, ohne Beschränkung darauf, eine Komponente, wie beispielsweise den Prozessor 1102, 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 1100 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 1100 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 1100 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 1100, ohne Beschränkung darauf, einen Prozessor 1102 enthalten, der, ohne Beschränkung darauf, eine oder mehrere Ausführungseinheiten 1108 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 1100 ein Einzelprozessor-Desktop- oder ein Serversystem. In mindestens einer Ausführungsform kann das Computersystem 1100 ein Multiprozessorsystem sein. In mindestens einer Ausführungsform kann der Prozessor 1102, ohne Beschränkung darauf, einen CISC-Mikroprozessor, einen RISC-Mikroprozessor, einen VLIW-Mikroprozessor, einen Prozessor, der eine Kombination von Befehlssätzen aufweist, oder eine beliebige andere Prozessoreinheit, wie z.B. einen digitalen Signalprozessor, beinhalten. In mindestens einer Ausführungsform kann der Prozessor 1102 mit einem Prozessorbus 1110 gekoppelt sein, der Datensignale zwischen dem Prozessor 1102 und anderen Komponenten in dem Computersystem 1100 übertragen kann.
  • In mindestens einer Ausführungsform kann der Prozessor 1102, ohne Beschränkung darauf, einen internen Level 1 („L1“)-Cachespeicher („Cache“) 1104 enthalten. In mindestens einer Ausführungsform kann der Prozessor 1102 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform kann sich der Cachespeicher außerhalb des Prozessors 1102 befinden. In mindestens einer Ausführungsform kann der Prozessor 1102 auch eine Kombination aus sowohl internen als auch externen Caches enthalten. In mindestens einer Ausführungsform kann eine Registerdatei 1106 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 1108, einschließlich, ohne Beschränkung darauf, von Logik zur Durchführung von Ganzzahl- und Gleitkommaoperationen, ebenfalls in dem Prozessor 1102. Der Prozessor 1102 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 1108 Logik zur Verarbeitung eines gepackten Befehlssatzes 1109 enthalten. In mindestens einer Ausführungsform können durch Aufnahme des gepackten Befehlssatzes 1109 in einen Befehlssatz eines Universalprozessors 1102 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 1102 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.
  • In mindestens einer Ausführungsform kann die Ausführungseinheit 1108 auch in Mikrocontrollern, eingebetteten Prozessoren, Grafikvorrichtungen, DSPs und anderen Arten von Logikschaltungen verwendet werden. In mindestens einer Ausführungsform kann das Computersystem 1100, ohne Beschränkung darauf, einen Speicher 1120 enthalten. In mindestens einer Ausführungsform kann der Speicher 1120 eine DRAM-Vorrichtung, eine SRAM-Vorrichtung, eine Flash-SpeicherVorrichtung oder eine andere Speichervorrichtung sein. Der Speicher 1120 kann Anweisung(en) 1119 und/oder Daten 1121 speichern, die durch Datensignale repräsentiert werden, die von dem Prozessor 1102 ausgeführt werden können.
  • In mindestens einer Ausführungsform kann ein Systemlogikchip mit dem Prozessorbus 1110 und dem Speicher 1120 gekoppelt sein. In mindestens einer Ausführungsform kann der Systemlogikchip, ohne Beschränkung darauf, einen Speichersteuerungs-Hub („MCH“) 1116 enthalten, und kann der Prozessor 1102 mit dem MCH 1116 über den Prozessorbus 1110 kommunizieren. In mindestens einer Ausführungsform kann der MCH 1116 einen Speicherpfad 1118 mit hoher Bandbreite zu dem Speicher 1120 zur Befehls- und Datenspeicherung und zur Speicherung von Grafikbefehlen, Daten und Texturen bereitstellen. In mindestens einer Ausführungsform kann der MCH 1116 Datensignale zwischen dem Prozessor 1102, dem Speicher 1120 und anderen Komponenten in dem Computersystem 1100 leiten und Datensignale zwischen dem Prozessorbus 1110, dem Speicher 1120 und einer System-l/O 1122 überbrücken. In mindestens einer Ausführungsform kann der Systemlogikchip einen Grafik-Port zur Kopplung mit einer Grafiksteuerung bereitstellen. In mindestens einer Ausführungsform kann der MCH 1116 über einen Speicherpfad 1118 mit hoher Bandbreite mit dem Speicher 1120 gekoppelt sein, und kann die Grafik-/ Videokarte 1112 über eine Accelerated Graphics Port („AGP“)-Verbindung bzw. Zwischenverbindung bzw. Interconnect 1114 mit dem MCH 1116 gekoppelt sein.
  • In mindestens einer Ausführungsform kann das Computersystem 1100 einen System-I/O-Bus 1122 verwenden, der ein proprietärer Hub-Schnittstellenbus ist, um den MCH 1116 mit dem I/O-Controller-Hub („ICH“) 1130 zu koppeln. In mindestens einer Ausführungsform kann der ICH 1130 direkte Verbindungen zu einigen I/O-Geräten über einen lokalen I/O-Bus bereitstellen. In mindestens einer Ausführungsform kann der lokale I/O-Bus, ohne Beschränkung darauf, einen Hochgeschwindigkeits-I/O-Bus zur Verbindung von Peripheriegeräten mit dem Speicher 1120, einem Chipsatz und dem Prozessor 1102 umfassen. Beispiele können, ohne Beschränkung darauf, eine Audiosteuerung 1129, einen Firmware-Hub („Flash-BIOS“) 1128, einen drahtlosen Transceiver 1126, einen Datenspeicher 1124, einen Legacy-I/O-Controller 1123, der eine Benutzereingabeschnittstelle 1125 und eine Tastaturschnittstelle enthält, einen seriellen Erweiterungs-Port 1127, wie z.B. ein USB, und eine Netzwerksteuerung 1134 beinhalten. Der Datenspeicher 1124 kann ein Festplattenlaufwerk, ein Diskettenlaufwerk, ein CD-ROM-Gerät, eine Flash-SpeicherVorrichtung oder eine andere Massenspeichervorrichtung beinhalten.
  • In mindestens einer Ausführungsform veranschaulicht 11 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 11 ein beispielhaftes SoC veranschaulichen. In mindestens einer Ausführungsform können in 11 dargestellte Vorrichtungen mit proprietären Zwischenverbindungen bzw. Interconnects, standardisierten Interconnects (z.B. PCle) oder einer Kombination davon verbunden sein. In mindestens einer Ausführungsform sind eine oder mehrere Komponenten des Systems 1100 unter Verwendung von Compute-Express-Link („CXL“)-Interconnects miteinander verbunden.
  • 12 veranschaulicht ein System 1200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist das System 1200 eine elektronische Vorrichtung, das einen Prozessor 1210 verwendet. In mindestens einer Ausführungsform kann das System 1200 zum Beispiel, und ohne Beschränkung darauf, ein Notebook, ein Tower-Server, ein Rack-Server, ein Blade-Server, eine Edge-Einrichtung, die kommunikativ mit einem oder mit mehreren On-Premise- oder Cloud-Dienstanbietern gekoppelt ist, 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 1200, ohne Beschränkung darauf, einen Prozessor 1210 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 1210 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 12 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 12 ein beispielhaftes SoC darstellen. In mindestens einer Ausführungsform können die in 12 dargestellten Vorrichtungen mit proprietären Interconnects, standardisierten Interconnects (z.B. PCle) oder einer Kombination davon miteinander verbunden sein. In mindestens einer Ausführungsform sind eine oder mehrere Komponenten von 12 unter Verwendung von CXL-Interconnects miteinander verbunden.
  • In mindestens einer Ausführungsform kann 12 eine Anzeige 1224, einen Touchscreen 1225, ein Touchpad 1230, eine Near Field Communications („NFC“)-Einheit 1245, einen Sensor-Hub 1240, einen Wärmesensor 1246, einen Express-Chipsatz („EC“) 1235, ein Trusted Platform Module („TPM“) 1238, BIOS/Firmware/Flash-Speicher („BIOS, FW Flash“) 1222, einen DSP 1260, eine Solid State Disk („SSD“) oder eine Festplatte („HDD“) 1220, eine Wireless Local Area Network („WLAN“)-Einheit 1250, eine Bluetooth-Einheit 1252, eine Wireless Wide Area Network („WWAN“)-Einheit 1256, ein Global Positioning System („GPS“) 1255, eine Kamera („USB 3.0-Kamera“) 1254, wie z.B. eine USB 3.0-Kamera, oder eine Low Power Double Data Rate („LPDDR“)-Speichereinheit („LPDDR3“) 1215, die z.B. den LPDDR3-Standard benutzt, 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 1210 verbunden sein. In mindestens einer Ausführungsform können ein Beschleunigungsmesser 1241, ein Umgebungslichtsensor („ALS“) 1242, ein Kompass 1243 und ein Gyroskop 1244 kommunikativ mit dem Sensor-Hub 1240 gekoppelt sein. In mindestens einer Ausführungsform können ein Wärmesensor 1239, ein Lüfter 1237, eine Tastatur 1246 und ein Touchpad 1230 kommunikativ mit dem EC 1235 gekoppelt sein. In mindestens einer Ausführungsform können ein Lautsprecher 1263, ein Kopfhörer 1264 und ein Mikrofon („mic“) 1265 kommunikativ mit einer Audioeinheit („audio codec and dass d amp“) 1264 gekoppelt sein, die ihrerseits kommunikativ mit dem DSP 1260 gekoppelt sein kann. In mindestens einer Ausführungsform kann die Audioeinheit 1264 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“) 1257 kommunikativ mit der WWAN-Einheit 1256 gekoppelt sein. In mindestens einer Ausführungsform können Komponenten wie beispielsweise die WLAN-Einheit 1250 und die Bluetooth-Einheit 1252 sowie die WWAN-Einheit 1256 einen Next Generation Form Factor („NGFF“) benutzen.
  • 13 veranschaulicht eine beispielhafte integrierte Schaltung 1300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die beispielhafte integrierte Schaltung 1300 ein SoC, das unter Verwendung eines oder mehrerer IP-Cores hergestellt sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 1300 einen oder mehrere Anwendungsprozessor(en) 1305 (z.B. CPUs), mindestens einen Grafikprozessor 1310 und kann zusätzlich einen Bildprozessor 1315 und/oder einen Videoprozessor 1320 enthalten, von denen jeder ein modularer IP-Kern sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 1300 eine Peripherie- oder Bus-Logik einschließlich eines USB-Controllers 1325, eines UART-Controllers 1330, eines SPI/SDIO-Controllers 1335 und eines I2S/I2C-Controllers 1340. In mindestens einer Ausführungsform kann die integrierte Schaltung 1300 eine Anzeigevorrichtung 1345 enthalten, die mit einem oder mehreren eines High-Definition Multimedia Interface („HDMI“)-Controllers 1350 und einer Mobile Industry Processor Interface („MIPI“)-Anzeigeschnittstelle 1355 verbunden ist. In mindestens einer Ausführungsform kann der Speicher durch ein Flash-Speicher-Subsystem 1360 mit Flash-Speicher und einer Flash-Speichersteuerung bereitgestellt sein. In mindestens einer Ausführungsform kann eine Speicherschnittstelle über eine Speichersteuerung 1365 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 1370.
  • 14 veranschaulicht ein Computer- bzw. Rechensystem 1400, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das Rechensystem 1400 ein Verarbeitungssubsystem 1401 mit einem oder mehreren Prozessor(en) 1402 und einem Systemspeicher 1404, der über einen Zwischenverbindungspfad bzw. Verbindungspfad kommuniziert, der einen Speicher-Hub 1405 enthalten kann. In mindestens einer Ausführungsform kann der Speicher-Hub 1405 eine separate Komponente innerhalb einer Chipsatzkomponente sein oder in einen oder mehrere Prozessor(en) 1402 integriert sein. In mindestens einer Ausführungsform ist der Speicher-Hub 1405 mit einem I/O-Subsystem 1411 über eine Kommunikationsverbindung 1406 gekoppelt. In mindestens einer Ausführungsform beinhaltet das l/O-Subsystem 1411 einen I/O-Hub 1407, der es dem Rechensystem 1400 ermöglichen kann, Eingaben von einer oder mehreren Eingabevorrichtung(en) 1408 zu empfangen. In mindestens einer Ausführungsform kann der I/O-Hub 1407 eine Anzeigesteuerung, der in einem oder mehreren Prozessor(en) 1402 enthalten sein kann, in die Lage versetzen, Ausgaben an eine oder mehrere Anzeigevorrichtung(en) 1410A zu liefern. In mindestens einer Ausführungsform kann/können ein oder mehrere Anzeigevorrichtung(en) 1410A, die mit dem I/O-Hub 1407 gekoppelt sind, eine lokale, interne oder eingebettete Anzeigevorrichtung beinhalten.
  • In mindestens einer Ausführungsform beinhaltet das Verarbeitungssubsystem 1401 einen oder mehrere Parallelprozessor(en) 1412, der/die über einen Bus oder eine andere Kommunikationsverbindung 1413 mit dem Speicher-Hub 1405 verbunden ist/sind. In mindestens einer Ausführungsform kann die Kommunikationsverbindung 1413 eine einer beliebigen Anzahl von standardbasierten Kommunikationsverbindungstechnologien oder -protokollen sein, wie z.B., aber nicht beschränkt auf, PCle, oder kann eine herstellerspezifische Kommunikationsschnittstelle oder eine Kommunikationsstruktur bzw. ein Kommunikations-Fabric sein. In mindestens einer Ausführungsform bilden ein oder mehrere Parallelprozessor(en) 1412 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) 1412 ein Grafikverarbeitungs-Subsystem, das Pixel an eine oder mehrere Anzeigevorrichtung(en) 1410A ausgeben kann, die über den I/O-Hub 1407 gekoppelt sind. In mindestens einer Ausführungsform können ein oder mehrere Parallelprozessor(en) 1412 auch eine Anzeigesteuerung und eine Anzeigeschnittstelle (nicht dargestellt) enthalten, um eine direkte Verbindung zu einer oder mehreren Anzeigevorrichtung(en) 1410B zu ermöglichen.
  • In mindestens einer Ausführungsform kann eine Systemspeichereinheit 1414 mit dem I/O-Hub 1407 verbunden sein, um einen Speichermechanismus für das Rechensystem 1400 bereitzustellen. In mindestens einer Ausführungsform kann ein I/O-Switch 1416 verwendet werden, um einen Schnittstellenmechanismus bereitzustellen, der Verbindungen zwischen dem I/O-Hub 1407 und anderen Komponenten ermöglicht, wie z.B. einem Netzwerkadapter 1418 und/oder einem drahtlosen Netzwerkadapter 1419, der in eine Plattform integriert sein kann, und verschiedenen anderen Vorrichtungen, die über ein oder mehrere Add-in-Vorrichtungen 1420 hinzugefügt werden können. In mindestens einer Ausführungsform kann der Netzwerkadapter 1418 ein Ethernet-Adapter oder ein anderer kabelgebundener Netzwerkadapter sein. In mindestens einer Ausführungsform kann der drahtlose Netzwerkadapter 1419 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 1400 weitere, nicht explizit dargestellte Komponenten enthalten, darunter USB- oder andere Portverbindungen, optische Speicherlaufwerke, Videoaufnahmevorrichtungen und dergleichen, die ebenfalls mit dem I/O-Hub 1407 verbunden sein können. In mindestens einer Ausführungsform können Kommunikationspfade, die verschiedene Komponenten in 14 miteinander verbinden, beliebige geeignete Protokolle benutzen, wie z.B. PCI-basierte Protokolle (z.B. PCle) oder andere Bus- oder Punkt-zu-Punkt-Kommunikationsschnittstellen und/oder Protokolle, wie z.B. ein NVLink-Hochgeschwindigkeits-Interconnect oder Interconnect-Protokolle.
  • In mindestens einer Ausführungsform integrieren ein oder mehrere Parallelprozessoren) 1412 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 Parallelprozessor(en) 1412 Schaltkreise, die für allgemeine Verarbeitung optimiert sind. In mindestens einer Ausführungsform können Komponenten des Rechensystems 1400 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) 1412, der Speicher-Hub 1405, der/die Prozessor(en) 1402 und der I/O-Hub 1407 in eine integrierte SoC-Schaltung integriert sein. In mindestens einer Ausführungsform können Komponenten des Rechensystems 1400 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 1400 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 l/O-Subsystem 1411 und die Anzeigevorrichtungen 1410B nicht in dem Rechensystem 1400 enthalten.
  • Verarbeitungssysteme
  • Die folgenden Figuren stellen, ohne Beschränkung darauf, beispielhafte Verarbeitungssysteme dar, die zur Ausführung mindestens einer Ausführungsform verwendet werden können.
  • 15 veranschaulicht eine beschleunigte Verarbeitungseinheit („APU“; accelerated processing unit) 1500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die APU 1500 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die APU 1500 so konfiguriert sein, dass sie ein Anwendungsprogramm, wie z.B. ein CUDA-Programm, ausführt. In mindestens einer Ausführungsform umfasst die APU 1500, ohne Beschränkung darauf, einen Kernkomplex 1510, einen Grafikkomplex 1540, eine Struktur bzw. ein Fabric 1560, I/O-Schnittstellen 1570, Speichersteuerungen 1580, eine Anzeigesteuerung 1592 und eine Multimedia-Engine 1594. In mindestens einer Ausführungsform kann die APU 1500, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 1510, eine beliebige Anzahl von Grafikkomplexen 1550, eine beliebige Anzahl von Anzeigesteuerungen 1592 und eine beliebige Anzahl von Multimedia-Engines 1594 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 1510 eine CPU, ist der Grafikkomplex 1540 eine GPU und ist die APU 1500 eine Verarbeitungseinheit, die, ohne Beschränkung darauf, 1510 und 1540 auf einem einzigen Chip integriert. In mindestens einer Ausführungsform können einige Aufgaben dem Kernkomplex 1510 und andere Aufgaben dem Grafikkomplex 1540 zugewiesen werden. In mindestens einer Ausführungsform ist der Kernkomplex 1510 so konfiguriert, dass er eine Hauptsteuerungssoftware ausführt, die der APU 1500 zugeordnet ist, wie z.B. ein Betriebssystem. In mindestens einer Ausführungsform ist der Kernkomplex 1510 der Hauptprozessor der APU 1500, der Operationen bzw. Betriebsabläufe der anderen Prozessoren steuert und koordiniert. In mindestens einer Ausführungsform gibt der Kernkomplex 1510 Befehle aus, die den Betrieb des Grafikkomplexes 1540 steuern. In mindestens einer Ausführungsform kann der Kernkomplex 1510 so konfiguriert sein, dass er von dem CUDA-Quellcode abgeleiteten ausführbaren Host-Code ausführt, und kann der Grafikkomplex 1540 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 1510, ohne Beschränkung darauf, Kerne 1520(1)-1520(4) und einen L3-Cache 1530. In mindestens einer Ausführungsform kann der Kernkomplex 1510, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 1520 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 1520 so konfiguriert, dass sie Anweisungen einer bestimmten Befehlssatzarchitektur („ISA“) ausführen. In mindestens einer Ausführungsform ist jeder Kern 1520 ein CPU-Kern.
  • In mindestens einer Ausführungsform enthält jeder Kern 1520, ohne Beschränkung darauf, eine Abhol-/Decodier-Einheit 1522, eine Ganzzahlausführungsmaschine 1524, eine Gleitkommaausführungsmaschine 1526 und einen L2-Cache 1528. In mindestens einer Ausführungsform holt die Abhol-/Decodier-Einheit 1522 Anweisungen ab, decodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungsmaschine 1524 und die Gleitkommaausführungsmaschine 1526. In mindestens einer Ausführungsform kann die Abhol-/Decodier-Einheit 1522 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 1524 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 1526 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 1524, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 1526, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Decodier-Einheit 1522 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 1524 als auch die Gleitkommaausführungsmaschine 1526 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 1520(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 1520 repräsentiert, auf den L2-Cache 1528(i) zugreifen, der in dem Kern 1520(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 1510(j) enthaltene Kern 1520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1510 repräsentiert, mit anderen in dem Kernkomplex 1510(j) enthaltenen Kernen 1520 über den in dem Kernkomplex 1510(j) enthaltenen L3-Cache 1530(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 1510(j) enthaltenen Kerne 1520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1510 repräsentiert, auf den gesamten L3-Cache 1530(j) zugreifen, der in dem Kernkomplex 1510(j) enthalten ist. In mindestens einer Ausführungsform kann der L3-Cache 1530, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform kann der Grafikkomplex 1540 so konfiguriert sein, dass er Rechenoperationen hochparallel ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 1540 so konfiguriert, dass er Grafikpipelineoperationen wie beispielsweise Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen im Zusammenhang mit dem Rendern eines Frames auf einer Anzeige ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 1540 so konfiguriert, dass er Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist der Grafikkomplex 1540 so konfiguriert, dass er sowohl grafikbezogene als auch grafikfremde Operationen ausführt.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1540, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 1550 und einen L2-Cache 1542. In mindestens einer Ausführungsform teilen sich die Recheneinheiten 1550 den L2-Cache 1542. In mindestens einer Ausführungsform ist der L2-Cache 1542 partitioniert. In mindestens einer Ausführungsform umfasst der Grafikkomplex 1540, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 1550 und eine beliebige Anzahl (einschließlich Null) und Art von Caches. In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1540, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 1550, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 1552 und einen gemeinsamen Speicher 1554. In mindestens einer Ausführungsform benutzt jede SIMD-Einheit 1552 eine SIMD-Architektur und ist für die parallele Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform kann jede Recheneinheit 1550 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 1550 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 1552 einen anderen Warp aus. In mindestens einer Ausführungsform ist ein Warp eine Gruppe von Threads (z.B. 19 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 1554 kommunizieren.
  • In mindestens einer Ausführungsform ist die Struktur 1560 eine Systemverbindung bzw. ein System-Interconnect, die bzw. der Daten- und Steuerungs-Übertragungen zwischen dem Kernkomplex 1510, dem Grafikkomplex 1540, den I/O-Schnittstellen 1570, den Speichersteuerungen 1580, der Anzeigesteuerung 1592 und der Multimedia-Engine 1594 ermöglicht. In mindestens einer Ausführungsform kann die APU 1500, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 1560 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 1500 sein können. In mindestens einer Ausführungsform sind die I/O-Schnittstellen 1570 repräsentativ für eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCI, PCI-Extended („PCI-X“), PCle, Gigabit-Ethernet („GBE“), USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den I/O-Schnittstellen 1570 gekoppelt. Die Peripheriegeräte, die mit den I/O-Schnittstellen 1570 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 zeigt die Anzeigesteuerung AMD92 Bilder auf einer oder mehreren Anzeigevorrichtungen an, z.B. auf einer Flüssigkristallanzeige („LCD“). In mindestens einer Ausführungsform umfasst die Multimedia-Engine 1594, ohne Beschränkung darauf, eine beliebige Menge und Art von Schaltkreisen, die sich auf Multimedia beziehen, wie z.B. einen Video-Dekoder, einen Video-Enkoder, einen Bildsignalprozessor usw. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 1580 die Datenübertragung zwischen der APU 1500 und einem einheitlichen Systemspeicher 1590. In mindestens einer Ausführungsform teilen sich der Kernkomplex 1510 und der Grafikkomplex 1540 den vereinheitlichten Systemspeicher 1590.
  • In mindestens einer Ausführungsform umfasst die APU 1500 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichersteuerungen 1580 und Speichervorrichtungen (z.B. den gemeinsam genutzten Speicher 1554) enthält, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform umfasst die APU 1500 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 1628, L3-Cache 1530 und L2-Cache 1542) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 1520, Kernkomplex 1510, SIMD-Einheiten 1552, Recheneinheiten 1550 und Grafikkomplex 1540) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • 16 zeigt eine CPU 1600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die CPU 1600 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die CPU 1600 so konfiguriert sein, dass sie ein Anwendungsprogramm ausführt. In mindestens einer Ausführungsform ist die CPU 1600 so konfiguriert, dass sie eine Hauptsteuerungssoftware, wie z.B. ein Betriebssystem, ausführt. In mindestens einer Ausführungsform gibt die CPU 1600 Befehle aus, die den Betrieb einer externen GPU (nicht dargestellt) steuern. In mindestens einer Ausführungsform kann die CPU 1600 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 1600, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 1610, ein Fabric 1660, I/O-Schnittstellen 1670 und Speichersteuerungen 1680.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 1610, ohne Beschränkung darauf, Kerne 1620(1)-1620(4) und einen L3-Cache 1630. In mindestens einer Ausführungsform kann der Kernkomplex 1610, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 1620 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 1620 so konfiguriert, dass sie Anweisungen eines bestimmten ISA ausführen. In mindestens einer Ausführungsform ist jeder Kern 1620 ein CPU-Kern.
  • In mindestens einer Ausführungsform beinhaltet jeder Kern 1620, ohne Beschränkung darauf, eine Abhol-/Decodier-Einheit 1622, eine Ganzzahlausführungsmaschine 1624, eine Gleitkommaausführungsmaschine 1626 und einen L2-Cache 1628. In mindestens einer Ausführungsform holt die Abhol-/Decodier-Einheit 1622 Anweisungen ab, decodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungs-Engine 1624 und die Gleitkommaausführungsmaschine 1626. In mindestens einer Ausführungsform kann die Abhol-/Decodier-Einheit 1622 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 1624 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 1626 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 1624, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 1626, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Decodier-Einheit 1622 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 1624 als auch die Gleitkommaausführungsmaschine 1626 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 1620(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 1620 repräsentiert, auf den L2-Cache 1628(i) zugreifen, der in dem Kern 1620(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 1610(j) enthaltene Kern 1620, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1610 repräsentiert, mit anderen Kernen 1620 in dem Kernkomplex 1610(j) über den in dem Kernkomplex 1610(j) enthaltenen L3-Cache 1630(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 1610(j) enthaltenen Kerne 1620, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1610 repräsentiert, auf den gesamten in dem Kernkomplex 1610(j) enthaltenen L3-Cache 1630(j) zugreifen. In mindestens einer Ausführungsform kann der L3-Cache 1630, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform ist das Fabric 1660 eine Systemverbindung, die Daten- und Steuerungs-Übertragungen über die Kernkomplexe 1610(1)-1610(N) (wobei N eine ganze Zahl größer als Null ist), I/O-Schnittstellen 1670 und Speichersteuerungen 1680 erleichtert. In mindestens einer Ausführungsform kann die CPU 1600, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 1660 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 1600 sein können. In mindestens einer Ausführungsform sind die I/O-Schnittstellen 1670 repräsentativ für eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCI , PCI-X, PCle, GBE, USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den I/O-Schnittstellen 1670 gekoppelt. Zu den Peripheriegeräten, die mit den I/O-Schnittstellen 1670 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 Speichersteuerung 1680 Datenübertragungen zwischen der CPU 1600 und einem Systemspeicher 1690. In mindestens einer Ausführungsform teilen sich der Kernkomplex 1610 und der Grafikkomplex 1640 den Systemspeicher 1690. In mindestens einer Ausführungsform umfasst die CPU 1600 ein Speichersubsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichersteuerungen 1680 und Speichervorrichtungen beinhaltet, die einer Komponente zugeordnet sein oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform umfasst die CPU 1600 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 1628 und L3-Caches 1630) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 1620 und Kernkomplexe 1610) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • 17 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice 1790, 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 Grafikverarbeitungs-Engines 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-Enkoder/Dekoder), 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 1782 innerhalb eines Systemspeichers 1714 speichert Prozesselemente 1783. In einer Ausführungsform werden die Prozesselemente 1783 im Ansprechen auf GPU-Aufrufe 1781 von Anwendungen 1780, die auf dem Prozessor 1707 ausgeführt werden, gespeichert. Ein Prozesselement 1783 enthält den Prozessstatus für die entsprechende Anwendung 1780. Ein in dem Prozesselement 1783 enthaltener Arbeits- bzw. Workdeskriptor („WD“) 1784 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 1784 ein Zeiger auf eine Auftragsanforderungswarteschlange in dem effektiven Adressraum 1782 der Anwendung.
  • Das Grafikbeschleunigungsmodul 1746 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 1784 an das Grafikbeschleunigungsmodul 1746 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 1746 oder eine individuelle Grafikverarbeitungs-Engine. Weil das Grafikbeschleunigungsmodul 1746 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 1746 zugewiesen wird.
  • Im Betrieb holt eine WD-Abholeinheit 1791 in dem Beschleunigerintegrations-Slice 1790 den nächsten WD 1784 ab, der eine Angabe der Arbeit enthält, die von einer oder mehreren Grafikverarbeitungsmaschinen des Grafikbeschleunigungsmoduls 1746 zu erledigen ist. Daten aus dem WD 1784 können in Registern 1745 gespeichert und von einer Speicherverwaltungseinheit („MMU“) 1739, einer Unterbrechungs- bzw. Interrupt-Verwaltungsschaltung 1747 und/oder einer Kontextverwaltungsschaltung 1748 verwendet werden, wie dargestellt. Eine Ausführungsform der MMU 1739 beinhaltet beispielsweise einen Segment-/Seitenlauf-Schaltkreis für den Zugriff auf Segment-/Seitentabellen 1786 innerhalb des virtuellen Betriebssystemadressraums 1785. Die Interrupt-Verwaltungsschaltung 1747 kann von dem Grafikbeschleunigungsmodul 1746 empfangene Interrupt-Ereignisse („INT“) 1792 verarbeiten. Bei der Durchführung von Grafikoperationen wird eine von einer Grafikverarbeitungsmaschine erzeugte effektive Adresse 1793 von der MMU 1739 in eine reale Adresse übersetzt.
  • In einer Ausführungsform wird für jede Grafikverarbeitungs-Engine und/oder jedes Grafikbeschleunigungsmodul 1746 ein gleicher Satz von Registern 1745 dupliziert und kann von einem Hypervisor oder Betriebssystem initialisiert werden. Jedes dieser duplizierten Register kann in dem Beschleunigerintegrations-Slice 1790 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 Virtuelladresse (VA)-Beschleunigernutzungsaufzeichnungs-Zeiger
    4 Virtuelladresse (VA)-Speichersegmenttabellenzeiger
    5 Autoritätsmaske
    6 Arbeitsdeskriptor
  • In einer Ausführungsform ist jeder WD 1784 spezifisch für ein bestimmtes Grafikbeschleunigungsmodul 1746 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.
  • 18A und 18B 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, Peripherieschnittstellensteuerungen oder Universalprozessorkerne. In mindestens einer Ausführungsform sind die beispielhaften Grafikprozessoren zur Verwendung innerhalb eines SoC vorgesehen.
  • 18A zeigt einen beispielhaften Grafikprozessor 1810 einer integrierten SoC-Schaltung, die gemäß mindestens einer Ausführungsform unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein kann. 18B veranschaulicht einen weiteren beispielhaften Grafikprozessor 1810 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 1810 von 18A ein stromsparender Grafikprozessorkern. In mindestens einer Ausführungsform ist der Grafikprozessor 1840 von 18B ein Grafikprozessorkern mit höherer Leistung. In mindestens einer Ausführungsform kann jeder der Grafikprozessoren 1810, 1840 eine Variante des Grafikprozessors 1310 von 13 sein.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1810 einen Vertex-Prozessor 1805 und einen oder mehrere Fragment-Prozessor(en) 1815A-1815N (z.B. 1815A, 1815B, 1815C, 1815D, bis 1815N-1 und 1815N). In mindestens einer Ausführungsform kann der Grafikprozessor 1810 verschiedene Shader-Programme über eine separate Logik ausführen, so dass der Vertex-Prozessor 1805 für die Ausführung von Operationen für Vertex-Shader-Programme optimiert ist, während ein oder mehrere Fragment-Prozessor(en) 1815A-1815N 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 1805 eine Vertex-Verarbeitungsstufe einer 3D-Grafik-Pipeline aus und erzeugt Primitive und Vertex-Daten. In mindestens einer Ausführungsform verwenden Fragmentprozessor(en) 1815A-1815N die von dem Vertexprozessor 1805 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) 1815A-1815N 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 1810 zusätzlich eine oder mehrere MMU(s) 1820A-1820B, Cache(s) 1825A-1825B und Schaltungsverbindung(en) bzw. Interconnect(s) 1830A-1830B. In mindestens einer Ausführungsform sorgen eine oder mehrere MMU(s) 1820A-1820B für die Zuordnung von virtuellen zu physikalischen Adressen für den Grafikprozessor 1810, einschließlich für den Vertex-Prozessor 1805 und/oder den/die Fragment-Prozessor(en) 1815A-1815N, der/die auf in dem Speicher gespeicherte Vertex- oder Bild/Textur-Daten verweisen kann/können, zusätzlich zu Vertex- oder Bild/TexturDaten, die in einem oder mehreren Cache(s) 1825A-1825B gespeichert sind. In mindestens einer Ausführungsform können eine oder mehrere MMU(s) 1820A-1820B mit anderen MMUs innerhalb eines Systems synchronisiert werden, einschließlich einer oder mehrerer MMUs, die einem oder mehreren Anwendungsprozessor(en) 1305, Bildprozessor(en) 1315 und/oder Videoprozessor(en) 1320 von 13 zugeordnet sind, so dass jeder Prozessor 1305-1320 an einem gemeinsamen oder vereinheitlichten virtuellen Speichersystem teilhaben kann. In mindestens einer Ausführungsform ermöglichen eine oder mehrere Schaltungsverbindung(en) 1830A-1830B dem Grafikprozessor 1810 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 1840 eine oder mehrere MMU(s) 1820A-1820B, Caches 1825A-1825B und Schaltungsverbindungen 1830A-1830B des Grafikprozessors 1810 von 18A. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1840 einen oder mehrere Shader-Kerne 1855A-1855N (z.B. 1855A, 1855B, 1855C, 1855D, 1855E, 1855F bis 1855N-1 und 1855N), 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 Ausführung 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 1840 einen Zwischenkern-Task-Manager bzw. Intercore-Task-Manager 1845, der als ein Thread-Dispatcher bzw. -Versender fungiert, um Ausführungs-Threads an einen oder mehrere Shader-Kerne 1855A-1855N zu verteilen, und eine Kacheleinheit 1858, 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.
  • 19A veranschaulicht einen Grafikkern 1900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Grafikkern 1900 in dem Grafikprozessor 1310 von 13 enthalten sein. In mindestens einer Ausführungsform kann der Grafikkern 1900 ein einheitlicher Shader-Kern 1855A-1855N wie in 18B sein. In mindestens einer Ausführungsform beinhaltet der Grafikkern 1900 einen gemeinsam genutzten Befehlscache 1902, eine Textureinheit 1932 und einen Cache/gemeinsamen Speicher 1920, die den Ausführungsressourcen innerhalb des Grafikkerns 1900 gemeinsam sind. In mindestens einer Ausführungsform kann der Grafikkern 1900 mehrere Slices 1901 A-1901 N oder Partitionen für jeden Kern enthalten, und kann ein Grafikprozessor mehrere Instanzen des Grafikkerns 1900 enthalten. Die Slices 1901A-1901 N können eine Unterstützungslogik enthalten, die einen lokalen Befehlscache 1904A-1904N, einen Thread-Planer bzw. Thread-Scheduler 1906A-1906N, einen Thread-Versender bzw. Thread-Dispatcher 1908A-1908N und einen Satz von Registern 1910A-1910N beinhaltet. In mindestens einer Ausführungsform können die Slices 1901A-1901 N einen Satz zusätzlicher Funktionseinheiten („AFUs“) 1912A-1912N, Gleitkommaeinheiten („FPUs“) 1914A-1914N, ganzzahlige arithmetische Logikeinheiten („ALUs“) 1916-1916N, Adressberechnungseinheiten („ACUs“) 1913A-1913N, doppeltpräzise Gleitkommaeinheiten („DPFPUs“) 1915A-1915N und Matrixverarbeitungseinheiten („MPUs“) 1917A-1917N beinhalten.
  • In mindestens einer Ausführungsform können die FPUs 1914A-1914N Gleitkommaoperationen mit einfacher Genauigkeit (32 Bit) und halber Genauigkeit (16 Bit) durchführen, während die DPFPUs 1915A-1915N Gleitkommaoperationen mit doppelter Genauigkeit (64 Bit) durchführen. In mindestens einer Ausführungsform können die ALUs 1916A-1916N 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 1917A-1917N 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 1917-1917N 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 1912A-1912N zusätzliche logische Operationen durchführen, die nicht von Gleitkomma- oder Ganzzahleinheiten unterstützt werden, einschließlich trigonometrischer Operationen (z.B. Sinus, Cosinus usw.).
  • 19B veranschaulicht eine Universal-Grafikverarbeitungseinheit („GPGPU“) 1930, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die GPGPU 1930 hochparallel und für den Einsatz auf einem Multi-Chip-Modul geeignet. In mindestens einer Ausführungsform kann die GPGPU 1930 so konfiguriert sein, dass hochparallele Rechenoperationen von einem Array von GPUs durchgeführt werden können. In mindestens einer Ausführungsform kann die GPGPU 1930 direkt mit anderen Instanzen der GPGPU 1930 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 1930 eine Host-Schnittstelle 1932, um eine Verbindung mit einem Hostprozessor zu ermöglichen. In mindestens einer Ausführungsform ist die Host-Schnittstelle 1932 eine PCIe-Schnittstelle. In mindestens einer Ausführungsform kann die Host-Schnittstelle 1932 eine herstellerspezifische Kommunikationsschnittstelle oder ein Kommunikations-Fabric sein. In mindestens einer Ausführungsform empfängt die GPGPU 1930 Befehle von einem Hostprozessor und verwendet einen globalen Planer bzw. Scheduler 1934, um Ausführungs-Threads, die mit diesen Befehlen verbunden sind, an einen Satz von Rechenclustern 1936A-1936H zu verteilen. In mindestens einer Ausführungsform teilen sich die Rechencluster 1936A-1936H einen Cachespeicher 1938. In mindestens einer Ausführungsform kann der Cachespeicher 1938 als ein übergeordneter Cache für Cachespeicher innerhalb von Rechenclustern 1936A-1936H dienen.
  • In mindestens einer Ausführungsform umfasst die GPGPU 1930 einen Speicher 1944A-1944B, der über eine Reihe von Speichersteuerungen 1942A-1942B mit den Rechenclustern 1936A-1936H verbunden ist. In mindestens einer Ausführungsform kann der Speicher 1944A-1944B 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 1936A-1936H jeweils einen Satz von Grafikkernen, wie z.B. den Grafikkern 1900 von 19A, 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 1936A-1936H 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 1930 so konfiguriert sein, dass sie als Rechencluster arbeiten. Die Rechencluster 1936A-1936H können beliebige technisch machbare Kommunikationstechniken zur Synchronisation und zum Datenaustausch benutzen. In mindestens einer Ausführungsform kommunizieren mehrere Instanzen der GPGPU 1930 über die Host-Schnittstelle 1932. In mindestens einer Ausführungsform enthält die GPGPU 1930 einen I/O-Hub 1939, der die GPGPU 1930 mit einer GPU-Verbindung 1940 koppelt, die eine direkte Verbindung zu anderen Instanzen der GPGPU 1930 ermöglicht. In mindestens einer Ausführungsform ist die GPU-Verbindung 1940 mit einer dedizierten GPU-zu-GPU-Brücke gekoppelt, die die Kommunikation und Synchronisation die zwischen mehreren Instanzen der GPGPU 1930 ermöglicht. In mindestens einer Ausführungsform koppelt die GPU-Verbindung 1940 mit einem Hochgeschwindigkeits-Interconnect, um Daten an andere GPGPUs 1930 oder Parallelprozessoren zu senden und von diesen zu empfangen. In mindestens einer Ausführungsform befinden sich mehrere Instanzen der GPGPU 1930 in separaten Datenverarbeitungssystemen und kommunizieren über eine Netzwerkvorrichtung, die über die Host-Schnittstelle 1932 zugänglich ist. In mindestens einer Ausführungsform kann die GPU-Verbindung 1940 so konfiguriert sein, dass sie zusätzlich oder alternativ zu der Host-Schnittstelle 1932 eine Verbindung zu einem Hostprozessor ermöglicht. In mindestens einer Ausführungsform kann die GPGPU 1930 so konfiguriert sein, dass sie ein CUDA-Programm ausführt.
  • FIG. 120A veranschaulicht einen Parallelprozessor 2000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform können verschiedene Komponenten des Parallelprozessors 2000 einen oder mehrere integrierte Schaltkreisen, wie z.B. programmierbare Prozessore, anwendungsspezifische integrierte Schaltkreise („ASICs“) oder FPGAs, benutzen.
  • In mindestens einer Ausführungsform enthält der Parallelprozessor 2000 eine Parallelverarbeitungseinheit 2002. In mindestens einer Ausführungsform enthält die Parallelverarbeitungseinheit 2002 eine I/O-Einheit 2004, die die Kommunikation mit anderen Vorrichtungen ermöglicht, einschließlich anderer Instanzen der Parallelverarbeitungseinheit 2002. In mindestens einer Ausführungsform kann die l/O-Einheit 2004 direkt mit anderen Vorrichtungen verbunden sein. In mindestens einer Ausführungsform ist die l/O-Einheit 2004 über eine Hub- oder Switch-Schnittstelle, wie z.B. den Speicher-Hub 2005, mit anderen Vorrichtungen verbunden. In mindestens einer Ausführungsform bilden die Verbindungen zwischen dem Speicher-Hub 2005 und der l/O-Einheit 2004 eine Kommunikationsverbindung. In mindestens einer Ausführungsform ist die l/O-Einheit 2004 mit einer Host-Schnittstelle 2006 und einer Speicherkreuzschiene 2016 verbunden, wobei die Host-Schnittstelle 2006 Befehle zur Durchführung von Verarbeitungsvorgängen und die Speicherkreuzschiene 2016 Befehle zur Durchführung von Speicheroperationen empfängt.
  • In mindestens einer Ausführungsform kann die Host-Schnittstelle 2006 dann, wenn die Host-Schnittstelle einen Befehlspuffer über die l/O-Einheit 2004 empfängt, Arbeitsoperationen zur Ausführung dieser Befehle an ein Frontend 2008 leiten. In mindestens einer Ausführungsform ist das Frontend 2008 mit einem Planer bzw. Scheduler 2010 gekoppelt, der so konfiguriert ist, dass er Befehle oder andere Arbeitselemente an ein Verarbeitungsfeld bzw. Verarbeitungs-Array 2012 verteilt. In mindestens einer Ausführungsform stellt der Scheduler 2010 sicher, dass das Verarbeitungs-Array 2012 richtig konfiguriert ist und sich in einem gültigen Zustand befindet, bevor Aufgaben an das Verarbeitungs-Array 2012 verteilt werden. In mindestens einer Ausführungsform wird der Scheduler 2010 über Firmware-Logik ausgeführt, die auf einem Mikrocontroller ausgeführt wird. In mindestens einer Ausführungsform ist der in einem Mikrocontroller implementierte Scheduler 2010 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 2012 ausgeführt werden. In mindestens einer Ausführungsform kann die Hostsoftware Arbeitslasten für die Planung auf dem Verarbeitungs-Array 2012 über eine von mehreren Grafikverarbeitungs-Doorbells nachweisen. In mindestens einer Ausführungsform können die Arbeitslasten dann automatisch über das Verarbeitungs-Array 2012 durch die Logik des Schedulers 2010 in einem Mikrocontroller mit Scheduler 2010 verteilt werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 bis zu „N“ Cluster umfassen (z.B. Cluster 2014A, Cluster 2014B bis Cluster 2014N). In mindestens einer Ausführungsform kann jeder Cluster 2014A-2014N des Verarbeitungs-Arrays 2012 eine große Anzahl gleichzeitiger Threads ausführen. In mindestens einer Ausführungsform kann der Scheduler 2010 den Clustern 2014A-2014N des Verarbeitungs-Arrays 2012 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 2010 gehandhabt werden, oder kann teilweise durch die Compilerlogik während der Kompilierung der Programmlogik, die für die Ausführung durch das Verarbeitungs-Array 2012 konfiguriert ist, unterstützt werden. In mindestens einer Ausführungsform können verschiedene Cluster 2014A-2014N des Verarbeitungs-Arrays 2012 für die Verarbeitung verschiedener Arten von Programmen oder für die Durchführung verschiedener Arten von Berechnungen zugewiesen werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 so konfiguriert sein, dass es verschiedene Arten von parallelen Verarbeitungsoperationen durchführt. In mindestens einer Ausführungsform ist das Verarbeitungs-Array 2012 so konfiguriert, dass es parallele Universalrechenoperationen durchführt. Zum Beispiel kann in mindestens einer Ausführungsform das Verarbeitungs-Array 2012 Logik zur Ausführung von Verarbeitungs-Tasks 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 2012 so konfiguriert, dass es parallele Grafikverarbeitungsoperationen durchführt. In mindestens einer Ausführungsform kann das Verarbeitungsarray 2012 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 Vertex-Verarbeitungslogik. In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 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 2002 Daten aus dem Systemspeicher über die l/O-Einheit 2004 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 2022) gespeichert und dann in den Systemspeicher zurückgeschrieben werden.
  • In mindestens einer Ausführungsform kann dann, wenn die Parallelverarbeitungseinheit 2002 zur Durchführung der Grafikverarbeitung verwendet wird, der Scheduler 2010 so konfiguriert sein, dass er eine Verarbeitungslast in ungefähr gleich große Aufgaben aufteilt, um eine bessere Verteilung der Grafikverarbeitungsoperationen auf mehrere Cluster 2014A-2014N des Verarbeitungsarrays 2012 zu ermöglichen. In mindestens einer Ausführungsform können Teile des Verarbeitungs-Arrays 2012 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 2014A-2014N erzeugt werden, in Puffern gespeichert werden, damit Zwischendaten zur weiteren Verarbeitung zwischen den Clustern 2014A-2014N übertragen werden können.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2012 Verarbeitungs-Tasks empfangen, die über den Scheduler 2010 auszuführen sind, der Befehle zur Definition von Verarbeitungs-Tasks von dem Frontend 2008 empfängt. In mindestens einer Ausführungsform können die Verarbeitungs-Tasks 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 2010 so konfiguriert sein, dass er den Aufgaben entsprechende Indizes abruft oder Indizes von dem Frontend 2008 empfängt. In mindestens einer Ausführungsform kann das Frontend 2008 so konfiguriert sein, dass es sicherstellt, dass das Verarbeitungs-Array 2012 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 2002 mit dem Parallelprozessorspeicher 2022 gekoppelt sein. In mindestens einer Ausführungsform kann auf den Parallelprozessorspeicher 2022 über eine Speicherkreuzschiene 2016 zugegriffen werden, die Speicheranforderungen von dem Verarbeitungs-Array 2012 sowie von der I/O-Einheit 2004 empfangen kann. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2016 über eine Speicherschnittstelle 2018 auf den Parallelprozessorspeicher 2022 zugreifen. In mindestens einer Ausführungsform kann die Speicherschnittstelle 2018 mehrere Partitionseinheiten (z.B. eine Partitionseinheit 2020A, eine Partitionseinheit 2020B bis eine Partitionseinheit 2020N) beinhalten, die jeweils mit einem Teil (z.B. einer Speichereinheit) des Parallelprozessorspeichers 2022 gekoppelt sein können. In mindestens einer Ausführungsform ist eine Anzahl von Partitionseinheiten 2020A-2020N so konfiguriert, dass sie gleich einer Anzahl von Speichereinheiten ist, so dass eine erste Partitionseinheit 2020A eine entsprechende erste Speichereinheit 2024A hat, eine zweite Partitionseinheit 2020B eine entsprechende Speichereinheit 2024B hat und eine N-te Partitionseinheit 2020N eine entsprechende N-te Speichereinheit 2024N hat. In mindestens einer Ausführungsform kann die Anzahl der Partitionseinheiten 2020A-2020N nicht gleich der Anzahl der Speichereinheiten sein.
  • In mindestens einer Ausführungsform können die Speichereinheiten 2024A-2024N 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 2024A-2024N 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 2024A-2024N hinweg gespeichert werden, so dass die Partitionseinheiten 2020A-2020N Teile jedes Renderingziels parallel schreiben können, um die verfügbare Bandbreite des Parallelprozessorspeichers 2022 effizient zu nutzen. In mindestens einer Ausführungsform kann eine lokale Instanz des Parallelprozessorspeichers 2022 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 2014A-2014N des Verarbeitungs-Arrays 2012 Daten verarbeiten, die in jede der Speichereinheiten 2024A-2024N in dem Parallelprozessorspeicher 2022 geschrieben werden. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2016 so konfiguriert sein, dass sie eine Ausgabe jedes Clusters 2014A-2014N an eine beliebige Partitionseinheit 2020A-2020N oder an einen anderen Cluster 2014A-2014N überträgt, der zusätzliche Verarbeitungsoperationen an einer Ausgabe durchführen kann. In mindestens einer Ausführungsform kann jeder Cluster 2014A-2014N mit der Speicherschnittstelle 2018 über die Speicherkreuzschiene 2016 kommunizieren, um von verschiedenen externen Speichervorrichtungen zu lesen oder in diese zu schreiben. In mindestens einer Ausführungsform hat die Speicherkreuzschiene 2016 eine Verbindung zu der Speicherschnittstelle 2018, um mit der l/O-Einheit 2004 zu kommunizieren, sowie eine Verbindung zu einer lokalen Instanz des Parallelprozessorspeichers 2022, so dass die Verarbeitungseinheiten in den verschiedenen Clustern 2014A-2014N mit dem Systemspeicher oder einem anderen Speicher kommunizieren können, der nicht lokal zur Parallelverarbeitungseinheit 2002 ist. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2016 virtuelle Kanäle verwenden, um Verkehrsstreams zwischen Clustern 2014A-2014N und Partitionseinheiten 2020A-2020N zu trennen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der Parallelverarbeitungseinheit 2002 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 2002 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 2002 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 2002 oder des Parallelprozessors 2000 enthalten, in einer Vielzahl von Konfigurationen und Formfaktoren ausgeführt werden, einschließlich, aber nicht beschränkt auf, Desktop-, Laptop- oder Handheld-Personal Computer, Server, Workstations, Spielkonsolen und/oder eingebettete Systeme.
  • 20B zeigt einen Verarbeitungscluster 2094, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2094 in einer Parallelverarbeitungseinheit enthalten. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2094 einer der Verarbeitungscluster 2014A-2014N von 20. In mindestens einer Ausführungsform kann der Verarbeitungscluster 2094 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 Verarbeitungsmaschinen innerhalb jedes Verarbeitungsclusters 2094 ausgibt.
  • In mindestens einer Ausführungsform kann der Betrieb des Verarbeitungsclusters 2094 über einen Pipeline-Manager 2032 gesteuert werden, der Verarbeitungs-Tasks auf parallele SIMT-Prozessoren verteilt. In mindestens einer Ausführungsform empfängt der Pipeline-Manager 2032 Anweisungen von dem Scheduler 2010 von 20 und verwaltet die Ausführung dieser Anweisungen über einen Grafik-Multiprozessor 2034 und/oder eine Textureinheit 2036. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2034 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 2094 enthalten sein. In mindestens einer Ausführungsform können eine oder mehrere Instanzen des Grafik-Multiprozessors 2034 in dem Verarbeitungscluster 2094 enthalten sein. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2034 Daten verarbeiten und kann eine Datenkreuzschiene 2040 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 2032 die Verteilung der verarbeiteten Daten erleichtern, indem er Ziele für die verarbeiteten Daten angibt, die über die Datenkreuzschiene 2040 zu verteilen sind.
  • In mindestens einer Ausführungsform kann jeder Grafik-Multiprozessor 2034 innerhalb des Verarbeitungsclusters 2094 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 2094 übertragenen Anweisungen einen Thread. In mindestens einer Ausführungsform ist ein Satz von Threads, die über einen Satz von Parallelverarbeitungsmaschinen 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 2034 zugewiesen sein. In mindestens einer Ausführungsform kann eine Thread-Gruppe weniger Threads umfassen als die Anzahl der Verarbeitungs-Engines innerhalb des Grafik-Multiprozessors 2034. 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 2034 enthalten. Wenn eine Thread-Gruppe mehr Threads umfasst als die Anzahl der Verarbeitungs-Engines in dem Grafik-Multiprozessor 2034, 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 2034 ausgeführt werden.
  • In mindestens einer Ausführungsform enthält der Grafik-Multiprozessor 2034 einen internen Cachespeicher, um Lade- und Speicheroperationen durchzuführen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2034 auf einen internen Cache verzichten und einen Cachespeicher (z.B. L1 -Cache 2048) innerhalb des Verarbeitungsclusters 2094 verwenden. In mindestens einer Ausführungsform hat jeder Grafik-Multiprozessor 2034 auch Zugriff auf Level-2 („L2“)-Caches innerhalb von Partitionseinheiten (z.B. den Partitionseinheiten 2020A-2020N von 20A), die von allen Verarbeitungsclustern 2094 gemeinsam genutzt werden und zur Datenübertragung zwischen Threads verwendet werden können. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2034 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 2002 als globaler Speicher verwendet werden. In mindestens einer Ausführungsform umfasst der Verarbeitungscluster 2094 mehrere Instanzen des Grafik-Multiprozessors 2034, die sich gemeinsame Anweisungen und Daten teilen können, die in dem L1-Cache 2048 gespeichert sein können.
  • In mindestens einer Ausführungsform kann jeder Verarbeitungscluster 2094 eine MMU 2045 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 2045 innerhalb der Speicherschnittstelle 2018 von 20 befinden. In mindestens einer Ausführungsform enthält die MMU 2045 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 2045 Adressübersetzungs-Lookaside-Puffer („TLBs“) oder Caches enthalten, die sich in dem Grafik-Multiprozessor 2034 oder in dem L1-Cache 2048 oder in dem Verarbeitungscluster 2094 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 2094 so konfiguriert sein, dass jeder Grafik-Multiprozessor 2034 mit einer Textureinheit 2036 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 2034 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 2034 eine verarbeitete Aufgabe an die Datenkreuzschiene 2040 aus, um die verarbeitete Aufgabe einem anderen Verarbeitungscluster 2094 zur weiteren Verarbeitung bereitzustellen oder um die verarbeitete Aufgabe in einem L2-Cache, einem lokalen Parallelprozessorspeicher oder einem Systemspeicher über die Speicherkreuzschiene 2016 zu speichern. In mindestens einer Ausführungsform ist eine Pre-Raster-Operations-Einheit („preROP“) 2042 so konfiguriert, dass sie Daten von dem Grafik-Multiprozessor 2034 empfängt und Daten an ROP-Einheiten weiterleitet, die sich bei den hierin beschriebenen Partitionseinheiten (z.B. den Partitionseinheiten 2020A-2020N in 20) befinden können. In mindestens einer Ausführungsform kann die PreROP 2042 Optimierungen für die Farbmischung durchführen, Pixelfarbdaten organisieren und Adressübersetzungen vornehmen.
  • 20C veranschaulicht einen Grafik-Multiprozessor 2096, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2096 der Grafik-Multiprozessor 2034 von 20B. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2096 mit dem Pipeline-Manager 2032 des Verarbeitungsclusters 2094 gekoppelt. In mindestens einer Ausführungsform hat der Grafik-Multiprozessor 2096 eine Ausführungs-Pipeline, die unter anderem einen Anweisungscache 2052, eine Anweisungseinheit 2054, eine Adressabbildungseinheit 2056, eine Registerdatei 2058, einen oder mehrere GPGPU-Kerne 2062 und eine oder mehrere LSUs 2066 beinhaltet. Die GPGPU-Kerne 2062 und die LSUs 2066 sind über eine Speicher- und Cache-Verbindung 2068 mit dem Cachespeicher 2072 und dem gemeinsamen Speicher 2070 gekoppelt.
  • In mindestens einer Ausführungsform empfängt der Anweisungscache 2052 einen Stream bzw. Strom von auszuführenden Befehlen von dem Pipeline-Manager 2032. In mindestens einer Ausführungsform werden die Befehle in dem Anweisungscache 2052 zwischengespeichert und von der Anweisungseinheit 2054 zur Ausführung bereitgestellt. In mindestens einer Ausführungsform kann die Anweisungseinheit 2054 Anweisungen als Thread-Gruppen (z.B. Warps) versenden, wobei jeder Thread einer Thread-Gruppe einer anderen Ausführungseinheit innerhalb des GPGPU-Kerns 2062 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 2056 verwendet werden, um Adressen in einem vereinheitlichten Adressraum in eine eindeutige Speicheradresse zu übersetzen, auf die die LSUs 2066 zugreifen können.
  • In mindestens einer Ausführungsform stellt die Registerdatei 2058 einen Satz von Registern für Funktionseinheiten des Grafik-Multiprozessors 2096 bereit. In mindestens einer Ausführungsform stellt die Registerdatei 2058 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten (z.B. GPGPU-Kerne 2062, LSUs 2066) des Grafik-Multiprozessors 2096 verbunden sind. In mindestens einer Ausführungsform ist die Registerdatei 2058 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 2058 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 2058 zwischen verschiedenen Thread-Gruppen aufgeteilt, die von dem Grafik-Multiprozessor 2096 ausgeführt werden.
  • In mindestens einer Ausführungsform können die GPGPU-Kerne 2062 jeweils FPUs und/oder Integer-ALUs enthalten, die zur Ausführung von Anweisungen des Grafik-Multiprozessors 2096 verwendet werden. Die GPGPU-Kerne 2062 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 2062 eine FPU mit einfacher Genauigkeit und eine Integer-ALU, während ein zweiter Teil der GPGPU-Kerne 2062 eine FPU mit doppelter Genauigkeit enthält. In mindestens einer Ausführungsform können die FPUs den IEEE 754-2008-Standard für Gleitkommaarithmetik benutzen oder Gleitkommaarithmetik mit variabler Genauigkeit ermöglichen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2096 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 2062 auch eine Logik mit fester oder spezieller Funktion enthalten.
  • In mindestens einer Ausführungsform enthalten die GPGPU-Kerne 2062 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 2062 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 2062 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 2068 ein Verbindungsnetzwerk, das jede Funktionseinheit des Grafik-Multiprozessors 2096 mit der Registerdatei 2058 und dem gemeinsamen Speicher 2070 verbindet. In mindestens einer Ausführungsform ist die Speicher- und Cache-Verbindung 2068 eine Koppelfeldverbindung, die es der LSU 2066 ermöglicht, Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher 2070 und der Registerdatei 2058 durchzuführen. In mindestens einer Ausführungsform kann die Registerdatei 2058 mit derselben Frequenz arbeiten wie die GPGPU-Kerne 2062, so dass die Datenübertragung zwischen den GPGPU-Kernen 2062 und der Registerdatei 2058 eine sehr geringe Latenz aufweist. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2070 verwendet werden, um die Kommunikation zwischen Threads zu ermöglichen, die auf Funktionseinheiten innerhalb des Grafik-Multiprozessors 2096 ausgeführt werden. In mindestens einer Ausführungsform kann der Cachespeicher 2072 z.B. als Datencache verwendet werden, um Texturdaten zu cachen, die zwischen Funktionseinheiten und der Textureinheit 2036 kommuniziert werden. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2070 auch als programmverwalteter Cache verwendet werden. In mindestens einer Ausführungsform können Threads, die auf den GPGPU-Kernen 2062 ausgeführt werden, zusätzlich zu den automatisch zwischengespeicherten Daten, die in dem Cachespeicher 2072 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, Musteranalyse-operationen 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.
  • 21 zeigt einen Grafikprozessor 2100, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst der Grafikprozessor 2100 eine Ringverbindung 2102, ein Pipeline-Frontend 2104, eine Medien Engine 2137 und Grafikkerne 2180A-2180N. In mindestens einer Ausführungsform verbindet die Ringverbindung 2102 den Grafikprozessor 2100 mit anderen Verarbeitungseinheiten, einschließlich anderer Grafikprozessoren oder eines oder mehrerer Mehrzweckprozessorkerne. In mindestens einer Ausführungsform ist der Grafikprozessor 2100 einer von vielen Prozessoren, die in ein Multikern-Verarbeitungssystem integriert sind.
  • In mindestens einer Ausführungsform empfängt der Grafikprozessor 2100 Stapel von Befehlen über die Ringverbindung 2102. In mindestens einer Ausführungsform werden die eingehenden Befehle von einem Befehlsstreamer 2103 in dem Pipeline-Frontend 2104 interpretiert. In mindestens einer Ausführungsform enthält der Grafikprozessor 2100 eine skalierbare Ausführungslogik zur Durchführung der 3D-Geometrieverarbeitung und der Medienverarbeitung über den/die Grafikkern(e) 2180A-2180N. In mindestens einer Ausführungsform liefert der Befehlsstreamer 2103 für 3D-Geometrieverarbeitungsbefehle Befehle an die Geometrie-Pipeline 2136. In mindestens einer Ausführungsform liefert der Befehlsstreamer 2103 für mindestens einige Medienverarbeitungsbefehle Befehle an ein Video-Frontend 2134, das mit einer Medien-Engine 2137 gekoppelt ist. In mindestens einer Ausführungsform umfasst die Medien-Engine 2137 eine Video Quality Engine („VQE“) 2130 für die Video- und Bildnachbearbeitung und eine Multiformat-Codier-/ Decodier-Engine („MFX“) 2133 für die hardwarebeschleunigte Codierung und Decodierung von Mediendaten. In mindestens einer Ausführungsform erzeugen die Geometrie-Pipeline 2136 und die Medien-Engine 2137 jeweils Ausführungs-Threads für Thread-Ausführungsressourcen, die von mindestens einem Grafikkern 2180A bereitgestellt werden.
  • In mindestens einer Ausführungsform enthält der Grafikprozessor 2100 skalierbare Thread-Ausführungsressourcen mit modularen Grafikkernen 2180A-2180N (manchmal als Kern-Slices bezeichnet), die jeweils mehrere Subkerne 2150A-2150N, 2160A-2160N (manchmal als Kern-Sub-Slices bezeichnet) aufweisen. In mindestens einer Ausführungsform kann der Grafikprozessor 2100 eine beliebige Anzahl von Grafikkernen 2180A bis 2180N aufweisen. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2100 einen Grafikkern 2180A mit mindestens einem ersten Subkern 2150A und einem zweiten Subkern 2160A. In mindestens einer Ausführungsform ist der Grafikprozessor 2100 ein Prozessor mit geringem Stromverbrauch und einem einzigen Subkern (z.B. dem Subkern 2150A). In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2100 mehrere Grafikkerne 2180A-2180N, die jeweils einen Satz erster Subkerne 2150A-2150N und einen Satz zweiter Subkerne 2160A-2160N umfassen. In mindestens einer Ausführungsform enthält jeder Subkern in den ersten Subkernen 2150A-2150N mindestens einen ersten Satz von Ausführungseinheiten („EUs“) 2152A-2152N und Medien-/Textur-Sampler 2154A-2154N. In mindestens einer Ausführungsform enthält jeder Subkern in den zweiten Subkernen 2160A-2160N mindestens einen zweiten Satz von Ausführungseinheiten 2162A-2162N und Samplern 2164A-2164N. In mindestens einer Ausführungsform teilt sich jeder Subkern 2150A-2150N, 2160A-2160N einen Satz von gemeinsam genutzten Ressourcen 2170A-2170N. In mindestens einer Ausführungsform umfassen die gemeinsam genutzten Ressourcen 2170 den gemeinsam genutzten Cachespeicher und die Pixeloperationslogik.
  • 22 veranschaulicht einen Prozessor 2200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Prozessor 2200, ohne Beschränkung darauf, Logikschaltungen zur Ausführung von Befehlen enthalten. In mindestens einer Ausführungsform kann der Prozessor 2200 Befehle ausführen, einschließlich x86-Befehle, ARM-Befehle, spezielle Befehle für ASICs usw. In mindestens einer Ausführungsform kann der Prozessor 2210 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 2210 Anweisungen zur Beschleunigung von CUDA-Programmen ausführen.
  • In mindestens einer Ausführungsform enthält der Prozessor 2200 ein In-Order-Front-End („Front-End“) 2201 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 2201 mehrere Einheiten beinhalten. In mindestens einer Ausführungsform holt ein Anweisungs-Vorabrufer bzw. -Prefetcher 2226 Anweisungen aus dem Speicher und leitet sie an einen Anweisungs-Decodierer 2228 weiter, der seinerseits Anweisungen decodiert oder interpretiert. In mindestens einer Ausführungsform decodiert der Anweisungs-Decodierer 2228 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 2228 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 2230 decodierte Uops in programmgeordnete Sequenzen oder Traces in einer Uop-Warteschlange 2234 zur Ausführung zusammenstellen. In mindestens einer Ausführungsform stellt dann, wenn der Trace-Cache 2230 auf eine komplexe Anweisung stößt, ein Mikrocode-ROM 2232 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 2228 auf den Mikrocode-ROM 2232 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 2228 decodiert werden. In mindestens einer Ausführungsform kann eine Anweisung in dem Mikrocode-ROM 2232 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 2230 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 2232 zu vervollständigen. In mindestens einer Ausführungsform kann das Front-End 2201 der Maschine, nachdem der Mikrocode-ROM 2232 die Sequenzierung von Mikro-Ops für eine Anweisung beendet hat, das Abrufen von Mikro-Ops aus dem Trace-Cache 2230 wieder aufnehmen.
  • In mindestens einer Ausführungsform kann die Out-of-Order-Ausführungs-Engine („Out of Order Engine“) 2203 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 2203 beinhaltet, ohne darauf beschränkt zu sein, einen Allokator/Register-Umbenenner 2240, eine Speicher-Uop-Warteschlange 2242, eine Ganzzahl-/Gleitkomma-Uop-Warteschlange 2244, einen Speicher-Scheduler 2246, einen schnellen Scheduler 2202, einen langsamen/allgemeinen Gleitkomma-Scheduler („langsamer/allgemeiner FP-Scheduler“) 2204 und einen einfachen Gleitkomma-Scheduler („einfacher FP-Scheduler“) 2206. In mindestens einer Ausführungsform werden der schnelle Scheduler 2202, der langsame/allgemeine Gleitkomma-Scheduler 2204 und der einfache Gleitkomma-Scheduler 2206 hierin auch gemeinsam als „Uop-Scheduler 2202, 2204, 2206“ bezeichnet. Der Allocator/Register-Umbenenner 2240 weist Maschinenpuffer und Ressourcen zu, die jede Uop zur Ausführung benötigt. In mindestens einer Ausführungsform benennt der Allocator/Register-Umbenenner 2240 logische Register auf Einträge in einer Registerdatei um. In mindestens einer Ausführungsform weist der Allocator/Register-Umbenenner 2240 auch einen Eintrag für jede Uop in einer von zwei Uop-Warteschlangen zu, der Speicher-Uop-Warteschlange 2242 für Speicheroperationen und der Ganzzahl-/Gleitkomma-Uop-Warteschlange 2244 für Nicht-Speicheroperationen, und zwar vor dem Speicher-Scheduler 2246 und den Uop-Schedulern 2202, 2204, 2206. In mindestens einer Ausführungsform bestimmen die Uop-Scheduler 2202, 2204, 2206, 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 2202 in jeder Hälfte des Haupttaktzyklus terminieren, während der langsame/allgemeine Gleitkomma-Scheduler 2204 und der einfache Gleitkomma-Scheduler 2206 einmal pro Hauptprozessortaktzyklus terminieren können. In mindestens einer Ausführungsform arbitrieren die Uop-Scheduler 2202, 2204, 2206 für Versende- bzw. Dispatch-Ports, um Uops für die Ausführung zu planen.
  • In mindestens einer Ausführungsform beinhaltet der Ausführungsblock 2211, ohne Beschränkung darauf, eine Ganzzahl-Registerdatei/ein Bypass-Netzwerk 2208, eine Gleitkommaregisterdatei/ein Bypass-Netzwerk („FP-Registerdatei/ein Bypass-Netzwerk“) 2210, Adressgenerierungseinheiten („AGUs“) 2212 und 2214, schnelle ALUs bzw. S-ALUSs 2216 und 2218, eine langsame ALU bzw. L-ALU 2220, eine Gleitkomma-ALU („FP“) 2222 und eine Gleitkomma-Bewegungseinheit („FP-Move“) 2224. In mindestens einer Ausführungsform werden die Ganzzahl-Registerdatei/das Bypass-Netzwerk 2208 und die Gleitkomma-Registerdatei/das Bypass-Netzwerk 2210 hierin auch als „Registerdateien 2208, 2210“ bezeichnet. In mindestens einer Ausführungsform werden die AGUs 2212 und 2214, die schnellen ALUs 2216 und 2218, die langsame ALU 2220, die Gleitkomma-ALU 2222 und die Gleitkomma-Bewegungseinheit 2224 hierin auch als „Ausführungseinheiten 2212, 2214, 2216, 2218, 2220, 2222 und 2224“ 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 2208, 2210 zwischen den Uop-Schedulern 2202, 2204, 2206 und den Ausführungseinheiten 2212, 2214, 2216, 2218, 2220, 2222 und 2224 angeordnet sein. In mindestens einer Ausführungsform führt das Ganzzahl-Registerdatei/das Bypass-Netzwerk 2208 Ganzzahloperationen durch. In mindestens einer Ausführungsform führt die Gleitkommaregisterdatei/das Bypass-Netzwerk 2210 Gleitkommaoperationen durch. In mindestens einer Ausführungsform kann jede der Registerdateien 2208, 2210, 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 2208, 2210 Daten miteinander austauschen. In mindestens einer Ausführungsform kann das Ganzzahl-Registerdatei/das Bypass-Netzwerk 2208, 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 2210, 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 2212, 2214, 2216, 2218, 2220, 2222, 2224 Anweisungen ausführen. In mindestens einer Ausführungsform speichern Registerdateien 2208, 2210 Ganzzahl- und Gleitkomma-Daten-Operandenwerte, die Mikroanweisungen ausführen müssen. In mindestens einer Ausführungsform kann der Prozessor 2200, ohne Beschränkung darauf, eine beliebige Anzahl und Kombination von Ausführungseinheiten 2212, 2214, 2216, 2218, 2220, 2222, 2224 enthalten. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2222 und die Gleitkomma-Bewegungseinheit 2224 Gleitkomma-, MMX-, SIMD-, AVX- und SSE- oder andere Operationen ausführen. In mindestens einer Ausführungsform kann die Gleitkomma-ALU 2222, ohne Beschränkung darauf, einen 64-Bit-mal-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 2216, 2218 übergeben werden. In mindestens einer Ausführungsform können die schnellen ALUS 2216, 2218 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 2220, da die langsame ALU 2220, 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 2212, 2214 ausgeführt werden. In mindestens einer Ausführungsform können die schnelle ALU 2216, die schnelle ALU 2218 und die langsame ALU 2220 Ganzzahloperationen an 64-Bit-Datenoperanden durchführen. In mindestens einer Ausführungsform können die schnelle ALU 2216, die schnelle ALU 2218 und die langsame ALU 2220 so benutzt werden, 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 2222 und die Gleitkomma-Bewegungseinheit („FP MOVE“) 2224 so benutzt werden, dass sie einen Bereich von Operanden mit Bits unterschiedlicher Breite unterstützen. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2222 und die Gleitkomma-Bewegungseinheit 2224 mit 128 Bit breiten gepackten Datenoperanden in Verbindung mit SIMD- und Multimedia-Anweisungen arbeiten.
  • In mindestens einer Ausführungsform versenden die Uop-Scheduler 2202, 2204, 2206 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 2200 ausgeführt werden können, kann der Prozessor 2200 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 Schaltkreise innerhalb eines Prozessors unter Verwendung einer beliebigen Anzahl verschiedener Techniken 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.
  • 23 zeigt einen Prozessor 2300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet der Prozessor 2300, ohne Beschränkung darauf, einen oder mehrere Prozessorkerne („Kerne“) 2302A-2302N, eine integrierte Speichersteuerung 2314 und einen integrierten Grafikprozessor 2308. In mindestens einer Ausführungsform kann der Prozessor 2300 zusätzliche Kerne bis hin zu und einschließlich des zusätzlichen Prozessorkerns 2302N enthalten, der durch gestrichelte, linierte Kästen dargestellt ist. In mindestens einer Ausführungsform enthält jeder der Prozessorkerne 2302A-2302N eine oder mehrere interne Cacheeinheiten 2304A-2304N. In mindestens einer Ausführungsform hat jeder Prozessorkern auch Zugriff auf eine oder mehrere gemeinsam genutzte Cacheeinheiten 2306.
  • In mindestens einer Ausführungsform repräsentieren die internen Cacheeinheiten 2304A-2304N und die gemeinsam genutzten Cacheeinheiten 2306 eine Cachespeicherhierarchie innerhalb des Prozessors 2300. In mindestens einer Ausführungsform können die Cachespeichereinheiten 2304A-2304N 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 2306 und 2304A-2304N aufrecht.
  • In mindestens einer Ausführungsform kann der Prozessor 2300 auch einen Satz von einer oder mehreren Bussteuereinheiten 2316 und einen Systemagent-Kern 2310 enthalten. In mindestens einer Ausführungsform verwalten eine oder mehrere Bussteuereinheiten 2316 einen Satz von Peripheriebussen, wie z.B. einen oder mehrere PCI- oder PCI-Express-Busse. In mindestens einer Ausführungsform stellt der Systemagent-Kern 2310 Verwaltungsfunktionen für verschiedene Prozessorkomponenten bereit. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2310 einen oder mehrere integrierte Speichersteuerungen 2314 zur Verwaltung des Zugriffs auf verschiedene externe Speichervorrichtungen (nicht gezeigt).
  • In mindestens einer Ausführungsform beinhalten einer oder mehrere der Prozessorkerne 2302A-2302N Unterstützung für gleichzeitiges Multithreading. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2310 Komponenten zum Koordinieren und Betreiben der Prozessorkerne 2302A-2302N während der Multithreading-Verarbeitung. In mindestens einer Ausführungsform kann der Systemagent-Kern 2310 zusätzlich eine Leistungssteuerungseinheit („PCU“) enthalten, die Logik und Komponenten zur Regelung eines oder mehrerer Leistungszustände der Prozessorkerne 2302A-2302N und des Grafikprozessors 2308 beinhaltet.
  • In mindestens einer Ausführungsform enthält der Prozessor 2300 zusätzlich einen Grafikprozessor 2308 zur Ausführung von Grafikverarbeitungsoperationen. In mindestens einer Ausführungsform ist der Grafikprozessor 2308 mit gemeinsam genutzten Cacheeinheiten 2306 und dem Systemagent-Kern 2310 gekoppelt, einschließlich einer oder mehrerer integrierter Speichersteuerungen 2314. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2310 auch eine Anzeigesteuerung 2311, um die Ausgabe des Grafikprozessors an ein oder mehrere gekoppelte Anzeigen zu steuern. In mindestens einer Ausführungsform kann die Anzeigesteuerung 2311 auch ein separates Modul sein, das über mindestens eine Verbindung bzw. einen Interconnect mit dem Grafikprozessor 2308 gekoppelt ist, oder kann in den Grafikprozessor 2308 integriert sein.
  • In mindestens einer Ausführungsform wird eine ringbasierte Verbindungseinheit 2312 verwendet, um interne Komponenten des Prozessors 2300 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 2308 über eine I/O-Verbindung 2313 mit der Ringverbindung 2312 gekoppelt.
  • In mindestens einer Ausführungsform repräsentiert die I/O-Verbindung 2313 mindestens eine von mehreren Arten von I/O-Verbindungen, einschließlich einer On-Package-I/O-Verbindung, die die Kommunikation zwischen verschiedenen Prozessorkomponenten und einem eingebetteten Hochleistungsspeichermodul 2318, wie z.B. einem eDRAM-Modul, erleichtert. In mindestens einer Ausführungsform verwenden jeder der Prozessorkerne 2302A-2302N und der Grafikprozessor 2308 eingebettete Speichermodule 2318 als gemeinsame LLC.
  • In mindestens einer Ausführungsform sind die Prozessorkerne 2302A-2302N homogene Kerne, die eine gemeinsame Befehlssatzarchitektur ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2302A-2302N heterogen in Bezug auf die ISA, wobei ein oder mehrere Prozessorkerne 2302A-2302N einen gemeinsamen Befehlssatz ausführen, während ein oder mehrere andere Kerne der Prozessorkerne 2302A-2302N eine Teilmenge eines gemeinsamen Befehlssatzes oder einen anderen Befehlssatz ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2302A-2302N 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 2300 auf einem oder mehreren Chips oder als integrierte SoC-Schaltung vorhanden sein.
  • 24 veranschaulicht einen Grafikprozessorkern 2400, gemäß mindestens einer beschriebenen Ausführungsform. In mindestens einer Ausführungsform ist der Grafikprozessorkern 2400 in einem Grafikkern-Array enthalten. In mindestens einer Ausführungsform kann der Grafikprozessorkern 2400, 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 2400 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 2400 einen Festfunktionsblock 2430 enthalten, der mit mehreren Subkernen 2401A-2401F 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 2430 eine Geometrie/Festfunktions-Pipeline 2436, die von allen Subkernen in dem Grafikprozessor 2400, z.B. in Grafikprozessor-Variationen mit geringerer Leistung und/oder geringerem Energieverbrauch, gemeinsam genutzt werden kann. In mindestens einer Ausführungsform beinhaltet die Geometrie/Festfunktions-Pipeline 2436 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 2430 darüber hinaus eine Grafik-SoC-Schnittstelle 2437, einen Grafik-Mikrocontroller 2438 und eine Medienpipeline 2439. Die Grafik-SoC-Schnittstelle 2437 stellt eine Schnittstelle zwischen dem Grafikkern 2400 und anderen Prozessorkernen innerhalb einer integrierten SoC-Schaltung bereit. In mindestens einer Ausführungsform ist der Grafik-Mikrocontroller 2438 ein programmierbarer Subprozessor, der so konfiguriert werden kann, dass er verschiedene Funktionen des Grafikprozessors 2400 verwaltet, einschließlich Thread-Versendung, Planung und Präemption. In mindestens einer Ausführungsform enthält die Medienpipeline 2439 Logik zur Erleichterung der Decodierung, Codierung, Vorverarbeitung und/oder Nachverarbeitung von Multimediadaten, einschließlich Bild- und Videodaten. In mindestens einer Ausführungsform führt die Medienpipeline 2439 Medienoperationen über Anforderungen an die Rechen- oder Abtastlogik innerhalb der Subkerne 2401-2401 F aus.
  • In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2437 dem Grafikkern 2400 die Kommunikation mit Mehrzweck-Anwendungsprozessorkernen (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 2437 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 führt globale(n) Speicheratome(n) aus, die von einem Grafikkern 2400 und CPUs innerhalb eines SoCs gemeinsam genutzt werden können. In mindestens einer Ausführungsform kann die SoC-Schnittstelle 2437 auch Energieverwaltungssteuerungen für den Grafikkern 2400 ausführen und eine Schnittstelle zwischen einer Taktdomäne des Grafikkerns 2400 und anderen Taktdomänen innerhalb eines SoCs ermöglichen. In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2437 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 2439 gesendet werden, wenn Medienoperationen durchzuführen sind, oder an eine Geometrie- und Festfunktions-Pipeline (z.B. die Geometrie- und Festfunktions-Pipeline 2436, die Geometrie- und Festfunktions-Pipeline 2414), wenn Grafikverarbeitungsoperationen durchzuführen sind.
  • In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2438 so konfiguriert sein, dass er verschiedene Planungs- und Verwaltungs-Tasks für den Grafikkern 2400 durchführt. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2438 die Planung von Grafik- und/oder Rechenlasten auf verschiedenen parallelen Grafik-Engines in den Arrays 2402A-2402F, 2404A-2404F der Ausführungseinheiten (EU) in den Subkernen 2401A-2401F durchführen. In mindestens einer Ausführungsform kann Hostsoftware, die auf einem CPU-Kern eines SoC mit Grafikkern 2400 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 Planungsvorgänge 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 2438 auch Stromsparzustände oder Leerlaufzustände für den Grafikkern 2400 erleichtern, indem er dem Grafikkern 2400 eine Fähigkeit bereitstellt, Register innerhalb des Grafikkerns 2400 ü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 2400 mehr oder weniger als die dargestellten Subkerne 2401A-2401F haben, bis hin zu N modularen Subkernen. Für jeden Satz von N Subkernen kann der Grafikkern 2400 in mindestens einer Ausführungsform auch eine gemeinsam genutzte Funktionslogik 2410, einen gemeinsam genutzten Speicher und/oder Cachespeicher 2412, eine Geometrie-/ Festfunktions-Pipeline 2414 sowie eine zusätzliche Festfunktionslogik 2416 zur Beschleunigung verschiedener Grafik- und Rechenverarbeitungsvorgänge beinhalten. In mindestens einer Ausführungsform kann die gemeinsam genutzte Funktionslogik 2410 Logikeinheiten (z.B. Sampler-, Mathematik- und/oder Inter-Thread-Kommunikationslogik) umfassen, die von allen N Subkernen innerhalb des Grafikkerns 2400 gemeinsam genutzt werden können. Der gemeinsam genutzte Speicher und/oder Cachespeicher 2412 kann ein LLC für N Subkerne 2401A-2401 F innerhalb des Grafikkerns 2400 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 2414 anstelle der Geometrie-/Festfunktions-Pipeline 2436 innerhalb des Festfunktionsblocks 2430 enthalten sein und kann gleiche oder ähnliche Logikeinheiten beinhalten.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkern 2400 zusätzliche feste Funktionslogik 2416, die verschiedene feste Funktionsbeschleunigungslogik zur Verwendung durch den Grafikkern 2400 enthalten kann. In mindestens einer Ausführungsform umfasst die zusätzliche Festfunktionslogik 2416 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 2416, 2436, und eine Cull-Pipeline, bei der es sich um eine zusätzliche Geometrie-Pipeline handelt, die in der zusätzlichen Festfunktionslogik 2416 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 2416 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 2416 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 2401A-2401F 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 2401A-2401F mehrere EU-Arrays 2402A-2402F, 2404A-2404F, Thread-Dispatch- und Inter-Thread-Kommunikationslogik („TD/IC“) 2403A-2403F, einen 3D (z.B. Textur-)- Sampler 2405A-2405F, einen Media-Sampler 2406A-2406F, einen Shader-Prozessor 2407A-2407F und gemeinsam genutzten lokalen Speicher („SLM“) 2408A-2408F. Die EU-Arrays 2402A-2402F, 2404A-2404F 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 2403A-2403F 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 2405A-2405F 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 2406A-2406F ähnliche Lesevorgänge auf der Grundlage eines Typs und eines Formats durchführen, die mit den Mediendaten verbunden sind. In mindestens einer Ausführungsform kann jeder Grafik-Subkern 2401A-2401F abwechselnd einen vereinheitlichten 3D- und Medien-Sampler enthalten. In mindestens einer Ausführungsform können Threads, die auf Ausführungseinheiten innerhalb jedes der Subkerne 2401A-2401F ausgeführt werden, den gemeinsamen lokalen Speicher 2408A-2408F 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.
  • 25 veranschaulicht eine Parallelverarbeitungseinheit („PPU“) 2500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die PPU 2500 mit maschinenlesbarem Code konfiguriert, der, wenn er von der PPU 2500 ausgeführt wird, die PPU 2500 veranlasst, einige oder alle der hierin beschriebenen Prozesse und Techniken durchzuführen. In mindestens einer Ausführungsform ist die PPU 2500 ein Multi-Thread-Prozessor auf einer oder mehreren Vorrichtungen mit integrierten Schaltkreisen und benutzt Multithreading als eine latenzverbergende Technik, 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 2500 konfiguriert sind. In mindestens einer Ausführungsform ist die PPU 2500 eine GPU, die so konfiguriert ist, dass sie eine Grafik-Rendering-Pipeline zur Verarbeitung dreidimensionaler („3D“) Grafikdaten ausführt, 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 2500 verwendet, um Berechnungen wie lineare AlgebraOperationen und Machine-Learning-Operationen durchzuführen. 21 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 ausgeführt werden kann.
  • In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2500 so konfiguriert, dass sie High Performance Computing („HPC“)-, Rechenzentrums- und Machine Learning-Anwendungen beschleunigen. In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2500 für die Beschleunigung von CUDA-Programmen konfiguriert. In mindestens einer Ausführungsform beinhaltet die PPU 2500, ohne Beschränkung darauf, eine I/O-Einheit 2506, eine Frontend-Einheit 2510, eine Scheduler-Einheit 2512, eine Arbeitsverteilungseinheit 2514, einen Hub 2516, eine Kreuzschiene bzw. Crossbar („Xbar“) 2520, einen oder mehrere Universalverarbeitungscluster („GPCs“) 2518 und eine oder mehrere Partitionseinheiten („Speicherpartitionseinheiten“) 2522. In mindestens einer Ausführungsform ist die PPU 2500 mit einem Hostprozessor oder anderen PPUs 2500 über eine oder mehrere Hochgeschwindigkeits-GPU-Verbindungen („GPU-Interconnects“) 2508 verbunden. In mindestens einer Ausführungsform ist die PPU 2500 über eine Zwischenverbindung bzw. einen Interconnect 2502 mit einem Hostprozessor oder anderen Peripheriegeräten verbunden. In mindestens einer Ausführungsform ist die PPU 2500 mit einem lokalen Speicher verbunden, der ein oder mehrere Speichervorrichtungen („Speicher“) 2504 umfasst. In mindestens einer Ausführungsform beinhalten die Speichervorrichtungen 2504, 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 2508 auf eine drahtgebundene Mehrspur-Kommunikations-verbindung beziehen, die von Systemen verwendet wird, um zu skalieren und die eine oder mehrere PPUs 2500 in Kombination mit einer oder mehreren CPUs umfassen, die Cache-Kohärenz zwischen PPUs 2500 und CPUs sowie CPU-Mastering unterstützen. In mindestens einer Ausführungsform werden Daten und/oder Befehle über die Hochgeschwindigkeits-GPU-Verbindung 2508 durch den Hub 2516 zu/von anderen Einheiten der PPU 2500, wie z.B. einer oder mehreren Kopiermaschinen, Videocodierern, Video-Decodierern, Energieverwaltungs-einheiten und anderen Komponenten, die in 25 möglicherweise nicht explizit dargestellt sind, übertragen.
  • In mindestens einer Ausführungsform ist die I/O-Einheit 2506 so konfiguriert, dass sie Kommunikationen (z.B. Befehle, Daten) von einem Hostprozessor (in 25 nicht dargestellt) über den Systembus 2502 sendet und empfängt. In mindestens einer Ausführungsform kommuniziert die I/O-Einheit 2506 mit dem Hostprozessor direkt über den Systembus 2502 oder über ein oder mehrere Zwischenvorrichtungen, wie z.B. eine Speicherbrücke. In mindestens einer Ausführungsform kann die I/O-Einheit 2506 über den Systembus 2502 mit einem oder mehreren anderen Prozessoren kommunizieren, z.B. mit einer oder mehreren der PPUs 2500. In mindestens einer Ausführungsform umfasst die I/O-Einheit 2506 eine PCIe-Schnittstelle für die Kommunikation über einen PCIe-Bus. In mindestens einer Ausführungsform umfasst die I/O-Einheit 2506 Schnittstellen für die Kommunikation mit externen Geräten.
  • In mindestens einer Ausführungsform decodiert die I/O-Einheit 2506 über den Systembus 2502 empfangene Pakete. In mindestens einer Ausführungsform repräsentieren mindestens einige Pakete Befehle, die so konfiguriert sind, dass sie die PPU 2500 veranlassen, verschiedene Operationen durchzuführen. In mindestens einer Ausführungsform sendet die I/O-Einheit 2506 decodierte Befehle an verschiedene andere Einheiten der PPU 2500, wie durch Befehle vorgegeben. In mindestens einer Ausführungsform werden Befehle an die Frontend-Einheit 2510 und/oder an den Hub 2516 oder andere Einheiten der PPU 2500, wie z.B. eine oder mehrere Kopiermaschinen, einen Videocodierer, einen Video-Decodierer, eine Energieverwaltungseinheit usw., (in 25 nicht explizit dargestellt) übertragen. In mindestens einer Ausführungsform ist die I/O-Einheit 2506 so konfiguriert, dass sie die Kommunikation zwischen und unter verschiedenen logischen Einheiten der PPU 2500 routet bzw. leitet.
  • In mindestens einer Ausführungsform codiert ein von dem Hostprozessor ausgeführtes Programm einen Befehlsstrom in einem Puffer, der der PPU 2500 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 2500 zugreifen können (z.B. Lesen/Schreiben) - eine Host-Schnittstelleneinheit kann so konfiguriert sein, dass sie auf einen Puffer in einem mit dem Systembus 2502 verbundenen Systemspeicher über Speicheranforderungen zugreift, die über den Systembus 2502 von der I/O-Einheit 2506 ü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 2500, so dass die Frontend-Einheit 2510 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 2500 weiterleitet.
  • In mindestens einer Ausführungsform ist die Frontend-Einheit 2510 mit der Scheduler-Einheit 2512 gekoppelt, die verschiedene GPCs 2518 zur Verarbeitung von Aufgaben konfiguriert, die durch einen oder mehrere Befehlsströme definiert sind. In mindestens einer Ausführungsform ist die Scheduler-Einheit 2512 so konfiguriert, dass sie Zustandsinformationen mit Bezug zu verschiedenen Aufgaben nachverfolgt, die von der Scheduler-Einheit 2512 verwaltet werden, wobei die Zustandsinformationen angeben können, welchem der GPCs 2518 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 2512 die Ausführung einer Vielzahl von Aufgaben auf einem oder mehreren GPCs 2518.
  • In mindestens einer Ausführungsform ist die Scheduler-Einheit 2512 mit der Arbeitsverteilungseinheit 2514 gekoppelt, die so konfiguriert ist, dass sie Aufgaben zur Ausführung auf den GPCs 2518 versendet. In mindestens einer Ausführungsform nachverfolgt die Arbeitsverteilungseinheit 2514 eine Anzahl geplanter Aufgaben, die von der Scheduler-Einheit 2512 empfangen wurden, und verwaltet die Arbeitsverteilungseinheit 2514 einen Pool ausstehender Aufgaben und einen Pool aktiver Aufgaben für jeden GPC 2518. 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 2518 zugewiesen sind; der Pool aktiver Aufgaben kann eine Anzahl von Slots (z.B. 4 Slots) für Aufgaben umfassen, die aktiv von den GPCs 2518 verarbeitet werden, so dass dann, wenn einer der GPCs 2518 die Ausführung einer Aufgabe abschließt, diese Aufgabe aus dem Pool aktiver Aufgaben für den GPC 2518 entfernt wird und eine der anderen Aufgaben aus dem Pool anstehender Aufgaben ausgewählt und zur Ausführung auf dem GPC 2518 eingeplant wird. In mindestens einer Ausführungsform wird dann, wenn eine aktive Aufgabe auf dem GPC 2518 im Leerlauf ist, z.B. während auf die Auflösung einer Datenabhängigkeit gewartet wird, die aktive Aufgabe aus dem GPC 2518 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 2518 eingeplant wird.
  • In mindestens einer Ausführungsform kommuniziert die Arbeitsverteilungseinheit 2514 mit einem oder mehreren GPCs 2518 über die Kreuzschiene bzw. XBar 2520. In mindestens einer Ausführungsform ist die XBar 2520 ein Interconnect- bzw. Verbindungsnetzwerk, das viele Einheiten der PPU 2500 mit anderen Einheiten der PPU 2500 koppelt und so konfiguriert sein kann, dass es die Arbeitsverteilungseinheit 2514 mit einem bestimmten GPC 2518 koppelt. In mindestens einer Ausführungsform können auch eine oder mehrere andere Einheiten der PPU 2500 über den Hub 2516 mit der XBar 2520 verbunden sein.
  • In mindestens einer Ausführungsform werden Aufgaben von der Scheduler-Einheit 2512 verwaltet und von der Arbeitsverteilungseinheit 2514 an einen der GPCs 2518 weitergeleitet. Der GPC 2518 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 2518 verbraucht, über die XBar 2520 an einen anderen GPC 2518 weitergeleitet oder in dem Speicher 2504 gespeichert werden. In mindestens einer Ausführungsform können Ergebnisse in den Speicher 2504 über Partitionseinheiten 2522 geschrieben werden, die eine Speicherschnittstelle zum Lesen und Schreiben von Daten in/aus dem Speicher 2504 umfassen. In mindestens einer Ausführungsform können die Ergebnisse über die Hochgeschwindigkeits-GPU-Verbindung 2508 an eine andere PPU 2504 oder CPU übertragen werden. In mindestens einer Ausführungsform umfasst die PPU 2500, ohne Beschränkung darauf, eine Anzahl U von Partitionseinheiten 2522, die gleich der Anzahl der mit der PPU 2500 verbundenen separaten und unterschiedlichen Speichervorrichtungen 2504 ist.
  • In mindestens einer Ausführungsform führt ein Hostprozessor einen Treiberkern aus, der eine Anwendungsprogrammierschnittstelle („API“) ausführt, die es einer oder mehreren auf dem Hostprozessor ausgeführten Anwendungen ermöglicht, Operationen zur Ausführung auf der PPU 2500 zu planen. In mindestens einer Ausführungsform werden mehrere Rechenanwendungen gleichzeitig von der PPU 2500 ausgeführt und stellt die PPU 2500 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 2500 zu generieren, und gibt der Treiberkern Aufgaben an einen oder mehrere Streams aus, die von der PPU 2500 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.
  • 26 veranschaulicht einen GPC 2600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der GPC 2600 der GPC 2518 von 25. In mindestens einer Ausführungsform beinhaltet jeder GPC 2600, ohne Beschränkung darauf, eine Anzahl von Hardware-Einheiten zur Verarbeitung von Aufgaben, und beinhaltet jeder GPC 2600, ohne Beschränkung darauf, einen Pipeline-Manager 2602, eine Pre-Raster-Operationseinheit („PROP“) 2604, eine Raster-Engine 2608, eine Arbeitsverteilungs-Kreuzschiene („WDX“) 2616, eine MMU 2618, einen oder mehrere Datenverarbeitungscluster („DPCs“) 2606 und jede geeignete Kombination von Teilen.
  • In mindestens einer Ausführungsform wird der Betriebsablauf des GPC 2600 von dem Pipeline-Manager 2602 gesteuert. In mindestens einer Ausführungsform verwaltet der Pipeline-Manager 2602 die Konfiguration eines oder mehrerer DPCs 2606 zur Verarbeitung von Aufgaben, die dem GPC 2600 zugewiesen sind. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 2602 mindestens eine des einen oder der mehreren DPCs 2606, um mindestens einen Teil einer Grafik-Rendering-Pipeline auszuführen. In mindestens einer Ausführungsform ist der DPC 2606 so konfiguriert, dass er ein Vertex-Shader-Programm auf einem programmierbaren Streaming-Multiprozessor („SM“) 2614 ausführt. In mindestens einer Ausführungsform ist der Pipeline-Manager 2602 so konfiguriert, dass er von einer Arbeitsverteilungseinheit empfangene Pakete an entsprechende logische Einheiten innerhalb des GPC 2600 weiterleitet, und in mindestens einer Ausführungsform können einige Pakete an Hardwareeinheiten mit fester Funktion in dem PROP 2604 und/oder in der Raster-Engine 2608 weitergeleitet werden, während andere Pakete an die DPCs 2606 zur Verarbeitung durch eine Primitiv-Engine 2612 oder den SM 2614 weitergeleitet werden können. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 2602 mindestens einen der DPCs 2606, um eine Rechenpipeline auszuführen. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 2602 mindestens einen der DPCs 2606, um mindestens einen Teil eines CUDA-Programms auszuführen.
  • In mindestens einer Ausführungsform ist die PROP-Einheit 2604 so konfiguriert, dass sie von der Raster-Engine 2608 und den DPCs 2606 erzeugte Daten an eine Raster Operations („ROP“)-Einheit in einer Partitionseinheit weiterleitet, wie z.B. die vorstehend in Verbindung mit 25 näher beschriebene Speicherpartitionseinheit 2522. In mindestens einer Ausführungsform ist die PROP-Einheit 2604 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 2608, 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 2608, 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 mit einem durch Vertices definierten geometrischen Primitiv verbunden 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 mit einem Primitiv verbunden 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 2608 Fragmente, die von einer geeigneten Einheit zu verarbeiten sind, z.B. von einem Fragment-Shader in dem DPC 2606.
  • In mindestens einer Ausführungsform umfasst jeder in dem GPC 2600 enthaltene DPC 2606, ohne Beschränkung darauf, einen M-Pipe-Controller („MPC“) 2610, eine Primitiv-Engine 2612, einen oder mehrere SMs 2614 und jede geeignete Kombination davon. In mindestens einer Ausführungsform steuert der MPC 2610 den Betriebsablauf des DPC 2606, indem er von dem Pipeline-Manager 2602 empfangene Pakete an entsprechende Einheiten in dem DPC 2606 weiterleitet. In mindestens einer Ausführungsform werden Pakete, die einem Vertex zugeordnet sind, an die Primitive Engine 2612 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 2614 übertragen werden.
  • In mindestens einer Ausführungsform umfasst der SM 2614, 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 2614 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 benutzt, 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 umfasst der SM 2614 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 2614 wird in Verbindung mit 26 ausführlicher beschrieben.
  • In mindestens einer Ausführungsform stellt die MMU 2618 eine Schnittstelle zwischen dem GPC 2600 und einer Speicherpartitionseinheit (z.B. der Partitionseinheit 2522 in 25) bereit, und stellt die MMU 2618 eine Übersetzung virtueller Adressen in physische Adressen, einen Speicherschutz und eine Arbitrierung von Speicheranforderungen bereit. In mindestens einer Ausführungsform stellt die MMU 2618 einen oder mehrere Übersetzungs-Lookaside-Puffer (TLBs) zur Durchführung der Übersetzung virtueller Adressen in physische Adressen im Speicher bereit.
  • 26 veranschaulicht einen Streaming-Multiprozessor („SM“) 2700, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der SM 2700 der SM 2614 von 26. In mindestens einer Ausführungsform beinhaltet der SM 2700, ohne Beschränkung darauf, einen Anweisungscache 2702; eine oder mehrere Schedulereinheiten 2704; eine Registerdatei 2708; einen oder mehrere Verarbeitungskerne („Cores“) 2710; eine oder mehrere Spezialfunktionseinheiten („SFUs“) 2712; eine oder mehrere LSUs 2714; ein Verbindungsnetzwerk 2716; einen gemeinsamen Speicher/L1-Cache 2718; 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 2700 zugewiesen. In mindestens einer Ausführungsform empfängt die Schedulereinheit 2704 Aufgaben von einer Arbeitsverteilungseinheit und verwaltet die Befehlsplanung für einen oder mehrere Thread-Blöcke, die dem SM 2700 zugewiesen sind. In mindestens einer Ausführungsform plant die Schedulereinheit 2704 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 2704 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 2710, SFUs 2712 und LSUs 2714) 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 bzw. Grid von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist eine Dispatcheinheit 2706 so konfiguriert, dass sie Befehle an eine oder mehrere Funktionseinheiten überträgt, und beinhaltet die Schedulereinheit 2704, ohne Beschränkung darauf, zwei Dispatcheinheiten 2706, 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 2704 eine einzelne Dispatcheinheit 2706 oder zusätzliche Dispatcheinheiten 2706.
  • In mindestens einer Ausführungsform enthält jeder SM 2700, ohne Beschränkung darauf, eine Registerdatei 2708, die einen Satz von Registern für Funktionseinheiten des SM 2700 bereitstellt. In mindestens einer Ausführungsform ist die Registerdatei 2708 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 2708 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 2708 zwischen verschiedenen Warps aufgeteilt, die von dem SM 2700 ausgeführt werden, und stellt die Registerdatei 2708 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten verbunden sind. In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, eine Vielzahl von L Verarbeitungskernen 2710. In mindestens einer Ausführungsform beinhaltet der SM 2700, ohne Beschränkung darauf, eine große Anzahl (z.B. 128 oder mehr) von unterschiedlichen Verarbeitungskernen 2710. In mindestens einer Ausführungsform beinhaltet jeder Verarbeitungskern 2710, ohne Beschränkung darauf, eine voll gepipelte, einfachpräzise, doppeltpräzise und/oder gemischtpräzise Verarbeitungseinheit, die, ohne Beschränkung darauf, eine arithmetische Gleitkomma-Logikeinheit und eine arithmetische Ganzzahl-Logikeinheit umfasst. In mindestens einer Ausführungsform benutzen die Gleitkomma-Arithmetik-Logikeinheiten den Standard IEEE 754-2008 für Gleitkomma-Arithmetik. In mindestens einer Ausführungsform beinhalten die Verarbeitungskerne 2710, 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 2710 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 4×4-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 2700, ohne Beschränkung darauf, M SFUs 2712, die spezielle Funktionen ausführen (z.B. Attributauswertung, reziproke Quadratwurzel und dergleichen). In mindestens einer Ausführungsform beinhalten die SFUs 2712, 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 2712, 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 2700 ausgeführt werden. In mindestens einer Ausführungsform werden die Texturkarten in dem gemeinsamen Speicher/L1-Cache 2718 gespeichert. In mindestens einer Ausführungsform führen Textureinheiten Texturoperationen, wie z.B. Filteroperationen unter Verwendung von Mip-Maps (z.B. Texturkarten mit unterschiedlichen Detailstufen) aus. In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, zwei Textureinheiten.
  • In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, N LSUs 2714, die Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher/L1-Cache 2718 und der Registerdatei 2708 ausführen. In mindestens einer Ausführungsform umfasst jeder SM 2700, ohne Beschränkung darauf, ein Verbindungsnetzwerk 2716, das jede der Funktionseinheiten mit der Registerdatei 2708 und die LSU 2714 mit der Registerdatei 2708 und dem gemeinsamen Speicher/L1-Cache 2718 verbindet. In mindestens einer Ausführungsform ist das Verbindungsnetzwerk 2716 eine Kreuzschiene, die so konfiguriert werden kann, dass sie jede der Funktionseinheiten mit jedem der Register in der Registerdatei 2708 verbindet und die LSUs 2714 mit der Registerdatei 2708 und Speicherplätzen in dem gemeinsamen Speicher/L1-Cache 2718 verbindet.
  • In mindestens einer Ausführungsform ist der gemeinsam genutzte Speicher/L1-Cache 2718 ein Array von On-Chip-Speicher, der die Datenspeicherung und Kommunikation zwischen dem SM 2700 und einer Primitiv-Engine sowie zwischen Threads in dem SM 2700 ermöglicht. In mindestens einer Ausführungsform umfasst der gemeinsam genutzte Speicher/L1-Cache 2718, ohne Beschränkung darauf, 128 KB Speicherkapazität und befindet sich in einem Pfad von dem SM 2700 zu einer Partitionseinheit. In mindestens einer Ausführungsform wird der gemeinsame Speicher/L1-Cache 2718 zum Zwischenspeichern von Lese- und Schreibvorgängen verwendet. In mindestens einer Ausführungsform sind einer oder mehrere von gemeinsamem Speicher/L1-Cache 2718, 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 2718, dass der gemeinsam genutzte Speicher/L1-Cache 2718 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 2700 zur Ausführung eines Programms und zur Durchführung von Berechnungen, der gemeinsame Speicher/L1-Cache 2718 zur Kommunikation zwischen Threads und die LSU 2714 zum Lesen und Schreiben des globalen Speichers über den gemeinsamen Speicher/L1-Cache 2718 und eine Speicherpartitionseinheit verwendet werden. In mindestens einer Ausführungsform schreibt der SM 2700, wenn er für allgemeine parallele Berechnungen konfiguriert ist, Befehle, die die Schedulereinheit 2704 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.
  • Softwarekonstruktionen für Universalcomputing
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte Softwarekonstrukte zur Ausführung mindestens einer Ausführungsform.
  • 28 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 Berechnungs-Tasks zu beschleunigen. In mindestens einer Ausführungsform kann eine Programmierplatt-form 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 2800 einer Programmierplattform eine Ausführungsumgebung für eine Anwendung 2801 bereit. In mindestens einer Ausführungsform kann die Anwendung 2801 jede beliebige Computersoftware umfassen, die auf dem Software-Stack 2800 gestartet werden kann. In mindestens einer Ausführungsform kann die Anwendung 2801 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 2801 und der Software-Stack 2800 auf Hardware 2807. Die Hardware 2807 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 2800 herstellerspezifisch und nur mit Vorrichtungen bestimmter Hersteller kompatibel sein. In mindestens einer Ausführungsform, wie beispielsweise bei OpenCL, kann der Softwarestack 2800 mit Vorrichtungen verschiedener Hersteller verwendet werden. In mindestens einer Ausführungsform umfasst die Hardware 2807 einen Host, der mit einer oder mehreren Vorrichtungen verbunden ist, auf die zugegriffen werden kann, um Berechnungs-Tasks über API (Application Programming Interface)-Aufrufe durchzuführen. Eine Vorrichtung innerhalb der Hardware 2807 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 2807, 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 2800 einer Programmierplattform, ohne Beschränkung darauf, eine Reihe von Bibliotheken 2803, eine Laufzeit 2805 und einen Gerätekerneltreiber 2806. Jede der Bibliotheken 2803 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 2803 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 2803 Funktionen, die für die Ausführung auf einer oder mehreren Vorrichtungsarten optimiert sind. In mindestens einer Ausführungsform können die Bibliotheken 2803 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 2903 entsprechenden APIs 2902 zugeordnet, die eine oder mehrere APIs enthalten können, die Funktionen in den Bibliotheken 2903 offenlegen.
  • In mindestens einer Ausführungsform ist die Anwendung 2801 als Quellcode geschrieben, der in ausführbaren Code kompiliert wird, wie nachstehend in Verbindung mit 31 - 33 näher erläutert wird. In mindestens einer Ausführungsform kann ausführbarer Code der Anwendung 2801 zumindest teilweise auf einer Ausführungsumgebung laufen, die von dem Software-Stack 2800 bereitgestellt wird. In mindestens einer Ausführungsform kann während der Ausführung der Anwendung 2801 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 Laufzeit 2805 aufgerufen werden, um den erforderlichen Code auf das Gerät zu laden und zu starten. In mindestens einer Ausführungsform kann die Laufzeit 2805 jedes technisch machbare Laufzeitsystem umfassen, das die Ausführung der Anwendung S01 unterstützen kann.
  • In mindestens einer Ausführungsform ist die Laufzeit 2805 eine oder mehrere Laufzeitbibliotheken, die mit entsprechenden APIs verbunden sind, die als API(s) 2804 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, Fehlerbehand-lung 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) 2804 auf jede technisch machbare Weise ausgeführt werden. 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 2806 so konfiguriert, dass er Kommunikation mit einem zugrunde liegenden Gerät erleichtert. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 2806 Low-Level-Funktionalitäten bereitstellen, auf die sich APIs, wie z.B. die API(s) 2804, und/oder andere Software stützen. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 2806 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 2806 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 2806 den IR-Code zur Laufzeit kompilieren muss.
  • 29 veranschaulicht eine CUDA-Implementierung des Software-Stacks 2800 von 28, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein CUDA-Software-Stack 2900, auf dem eine Anwendung 2901 gestartet werden kann, CUDA-Bibliotheken 2903, eine CUDA-Laufzeit 2905, einen CUDA-Treiber 2907 und einen Gerätekerneltreiber 2908. In mindestens einer Ausführungsform wird der CUDA-Software-Stack 2900 auf der Hardware 2909 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 2901, die CUDA-Laufzeit 2905 und der Gerätekerneltreiber 2908 ähnliche Funktionalitäten wie die Anwendung 2801, die Laufzeit 2805 bzw. der Gerätekerneltreiber 2806 ausführen, die vorstehend in Verbindung mit 28 beschrieben sind. In mindestens einer Ausführungsform umfasst der CUDA-Treiber 2907 eine Bibliothek (libcuda.so), die eine CUDA-Treiber-API 2906 ausführt. Ähnlich zu einer CUDA-Laufzeit-API 2904, die von einer CUDA-Laufzeitbibliothek (cudart) ausgeführt wird, kann die CUDA-Treiber-API 2906 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 2906 von der CUDA-Laufzeit-API 2904 dadurch, dass die CUDA-Laufzeit-API 2904 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 2904 ist die CUDA-Treiber-API 2906 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 2906 Funktionen zur Kontextverwaltung bereitstellen, die von der CUDA-Laufzeit-API 2904 nicht bereitgestellt werden. In mindestens einer Ausführungsform ist die CUDA-Treiber-API 2906 auch sprachunabhängig und unterstützt z.B. OpenCL zusätzlich zu der CUDA-Laufzeit-API 2904. Ferner können in mindestens einer Ausführungsform die Entwicklungsbibliotheken, einschließlich der CUDA-Laufzeit 2905, als getrennt von den Treiberkomponenten betrachtet werden, einschließlich des Benutzer-Mode-CUDA-Treibers 2907 und des Kernel-Mode-Gerätetreibers 2908 (manchmal auch als „Anzeige“-Treiber bezeichnet).
  • In mindestens einer Ausführungsform können die CUDA-Bibliotheken 2903 mathematische Bibliotheken, Deep-Learning-Bibliotheken, Bibliotheken paralleler Algorithmen und/oder Bibliotheken für Signal-/Bild-/Videoverarbeitung beinhalten, die von parallelen Rechenanwendungen wie der Anwendung 2901 verwendet werden können, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 2903 mathematische Bibliotheken wie beispielsweise eine cuBLAS-Bibliothek, die Basic Linear Algebra Subprograms („BLAS“) zur Durchführung linearer Algebraoperationen umfasst, 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 2903 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.
  • 30 veranschaulicht eine ROCm-Implementierung des Software-Stacks 2800 von 28, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein ROCm-Software-Stack 3000, auf dem eine Anwendung 3001 gestartet werden kann, eine Laufzeitumgebung 3003, eine Systemlaufzeit 3005, einen Thunk 3007, einen ROCm-Kerneltreiber 3008 und einen Gerätekerneltreiber. In mindestens einer Ausführungsform wird der ROCm-Software-Stack 3000 auf der Hardware 3009 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 3001 ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 28 besprochene Anwendung 2801. Darüber hinaus können die Laufzeitumgebung 3003 und das Laufzeitsystem 3005 in mindestens einer Ausführungsform ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 28 beschriebene Laufzeit 2805. In mindestens einer Ausführungsform unterscheiden sich die Laufzeitumgebung 3003 und das Laufzeitsystem 3005 dadurch, dass das Laufzeitsystem 3005 eine sprachunabhängige Laufzeitumgebung ist, die eine ROCr-Systemlaufzeit-API 3004 umfasst und eine Heterogeneous System Architecture („HAS“) Laufzeit-API verwendet. Die H28-Laufzeit-API ist eine schlanke API für den Benutzer-Mode, 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 zum Laufzeitsystem 3005 umfasst die Laufzeitumgebung 3003 in mindestens einer Ausführungsform eine sprachspezifische Laufzeitumgebungs-API 3002, die auf der ROCr-Laufzeitsystem-API 3004 aufliegt. In mindestens einer Ausführungsform kann die Laufzeitsystem-API unter anderem eine Heterogeneous Compute Interface for Portability („HIP“)-Laufzeitsystem-API, eine Heterogeneous Compute Compiler („HCC“)-Laufzeitumgebungs-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 29 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) 3007 eine Schnittstelle, die zur Interaktion mit dem zugrunde liegenden ROCm-Treiber 3008 verwendet werden kann. In mindestens einer Ausführungsform ist der ROCm-Treiber 3008 ein ROCk-Treiber, der eine Kombination aus einem AMDGPU-Treiber und einem HSA-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 2 besprochene Gerätekerneltreiber 2806 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 3000 oberhalb der Laufzeitumgebung 3003 enthalten sein und eine ähnliche Funktionalität wie die CUDA-Bibliotheken 2903, die vorstehend in Verbindung mit 29 besprochen wurden, bereitstellen. In mindestens einer Ausführungsform können verschiedene Bibliotheken mathematische, Deep-Learning- und/oder andere Bibliotheken enthalten, wie z.B. eine hip-BLAS-Bibliothek, die Funktionen ähnlich denen von CUDA cuBLAS umfasst, eine rocFFT-Bibliothek zur Berechnung von FFTs, die CUDA cuFFT ähnlich ist, und andere.
  • 31 veranschaulicht eine OpenCL-Implementierung des Software-Stacks 2800 von 28, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein OpenCL-Software-Stack 3100, auf dem eine Anwendung 3101 gestartet werden kann, ein OpenCL-Framework 3110, eine OpenCL-Laufzeitumgebung 3106 und einen Treiber 3107. In mindestens einer Ausführungsform wird der OpenCL-Software-Stack 3100 auf der Hardware 2909 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 3101, die OpenCL-Laufzeitumgebung 3106, der Gerätekerneltreiber 3107 und die Hardware 3108 ähnliche Funktionen ausführen wie die Anwendung 2801, die Laufzeit 2805, der Gerätekerneltreiber 2806 bzw. die Hardware 2807, die vorstehend in Verbindung mit 28 beschrieben sind. In mindestens einer Ausführungsform enthält die Anwendung 3101 außerdem einen OpenCL-Kernel 3102 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 3103 und Laufzeit-API 3105, bereit. In mindestens einer Ausführungsform verwendet die Laufzeit-API 3105 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 3105 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 3103 Funktionen zur Verfügung, 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 3104 in dem OpenCL-Framewerk 3110 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 3104 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.
  • 32 veranschaulicht Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform 3204 so konfiguriert, dass sie verschiedene Programmiermodelle 3203, Middlewares und/oder Bibliotheken 3202 und Frameworks 3201 unterstützt, auf die sich eine Anwendung 3200 stützen kann. In mindestens einer Ausführungsform kann die Anwendung 3200 eine KI/ML-Anwendung sein, die beispielsweise ein Deep-Learning-Framework wie MXNet, PyTorch oder TensorFlow verwendet, 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 3204 eine der vorstehend in Verbindung mit 29, 30 bzw. 31 beschriebenen CUDA-, ROCm- oder OpenCL-Plattformen sein. In mindestens einer Ausführungsform unterstützt die Programmierplattform 3204 mehrere Programmiermodelle 3203, die Abstraktionen eines zugrunde liegenden Rechensystems sind, die Ausdrücke von Algorithmen und Datenstrukturen erlauben. In mindestens einer Ausführungsform können Programmiermodelle 3203 Merkmale zugrunde liegender Hardware offenlegen, um die Leistung zu verbessern. In mindestens einer Ausführungsform können die Programmiermodelle 3203 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 3202 Abstraktionen von Programmiermodellen 3204 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 3204 verfügbaren Dienste hinausgehen. In mindestens einer Ausführungsform können die Bibliotheken und/oder Middlewares 3202 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 3202 in mindestens einer Ausführungsform NCCL- und ROCm Communication Collectives Library („RCCL“)-Bibliotheken, die Kommunikationsroutinen für GPUs bereitstellen, eine MIOpen-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 3201 von Bibliotheken und/oder Middlewares 3202 ab. In mindestens einer Ausführungsform ist jedes der Anwendungsframeworks 3201 ein Softwareframework, das für eine 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 Frameworks wie Caffe, Caffe2, TensorFlow, Keras, PyTorch oder MxNet Deep Learning Frameworks verwenden.
  • 33 veranschaulicht die Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 28 - 31, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform empfängt ein Compiler 3301 Quellcode 3300, der sowohl Host-Code als auch Geräte-Code enthält. In mindestens einer Ausführungsform ist der Compiler 3301 so konfiguriert, dass er den Quellcode 3300 in einen ausführbaren Host-Code 3302 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 3303 zur Ausführung auf einem Gerät umwandelt. In mindestens einer Ausführungsform kann der Quellcode 3300 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 3300 Code in einer beliebigen, von dem Compiler 3301 unterstützten Programmiersprache enthalten, wie z.B. C++, C, Fortran usw. In mindestens einer Ausführungsform kann der Quellcode 3300 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 3300 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 3301 so konfiguriert, dass er den Quellcode 3300 in einen ausführbaren Host-Code 3302 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 3303 zur Ausführung auf einem Gerät kompiliert. In mindestens einer Ausführungsform führt der Compiler 3301 Operationen durch, darunter ein Parsen des Quellcodes 3300 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 3300 eine Single-Source-Datei enthält, kann der Compiler 3301 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 3303 bzw. den ausführbaren Host-Code 3302 kompilieren und den ausführbaren Geräte-Code 3303 und den ausführbaren Host-Code 3302 in einer einzigen Datei miteinander verknüpfen, wie nachstehend unter Bezugnahme auf 34 ausführlicher erläutert.
  • In mindestens einer Ausführungsform können der ausführbare Host-Code 3302 und der ausführbare Geräte-Code 3303 in jedem geeigneten Format vorliegen, z.B. als Binärcode und/oder IR-Code. Im Fall von CUDA kann der ausführbare Host-Code 3302 in mindestens einer Ausführungsform nativen Objektcode beinhalten und kann der ausführbare Geräte-Code 3303 Code in PTX-Zwischendarstellung beinhalten. Im Fall von ROCm können sowohl der ausführbare Host-Code 3302 als auch der ausführbare Geräte-Code 3303 in mindestens einer Ausführungsform einen Ziel-Binärcode enthalten.
  • 34 ist eine detailliertere Darstellung der Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 28 - 31, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist ein Compiler 3401 so konfiguriert, dass er Quellcode 3400 empfängt, Quellcode 3400 kompiliert und eine ausführbare Datei 3408 ausgibt. In mindestens einer Ausführungsform ist der Quellcode 3400 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 3401 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 3401 ein Compiler-Frontend 3402, einen Host-Compiler 3405, einen Geräte-Compiler 3406 und einen Linker 3409. In mindestens einer Ausführungsform ist das Compiler-Frontend 3402 so konfiguriert, dass es den Geräte-Code 3404 von dem Host-Code 3403 in dem Quellcode 3400 trennt. Geräte-Code 3404 wird von dem Gerätecompiler 3406 in ausführbaren Geräte-Code 3408 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 3403 von dem Host-Compiler 3405 in ausführbaren Host-Code 3407 kompiliert. In mindestens einer Ausführungsform kann für NVCC der Host-Compiler 3405, ohne darauf beschränkt zu sein, ein universeller C/C++-Compiler sein, der nativen Objektcode ausgibt, während der Geräte-Compiler 3406, 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 3405 als auch der Geräte-Compiler 3406 LLVM-basierte Compiler sein, die Ziel-Binärcode ausgeben, sind aber nicht darauf beschränkt.
  • Nach der Kompilierung des Quellcodes 3400 in einen ausführbaren Host-Code 3407 und einen ausführbaren Geräte-Code 3408 verknüpft der Linker 3409 in mindestens einer Ausführungsform den ausführbaren Host- und Geräte-Code 3407 und 3408 in einer ausführbaren Datei 3410. 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.
  • 35 veranschaulicht ein Übersetzen von Quellcode vor der Kompilierung des Quellcodes, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird Quellcode 3500 durch ein Übersetzungswerkzeug 3501 geleitet, das den Quellcode 3500 in übersetzten Quellcode 3502 übersetzt. In mindestens einer Ausführungsform wird ein Compiler 3503 verwendet, um den übersetzten Quellcode 3502 in einen ausführbaren Host-Code 3504 und einen ausführbaren Geräte-Code 3505 zu kompilieren, in einem Prozess, der der Kompilierung des Quellcodes 3300 durch den Compiler 3301 in einen ausführbaren Host-Code 3302 und einen ausführbaren Geräte-Code 3303 ähnelt, wie vorstehend in Verbindung mit 33 beschrieben wurde.
  • In mindestens einer Ausführungsform wird eine von dem Übersetzungswerkzeug 3501 durchgeführte Übersetzung verwendet, um den Quellcode 3500 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 3501 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 3500 ein Parsen des Quellcodes 3500 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 36A und 37 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 3501 durchgeführt werden, manchmal unvollständig sein, so dass zusätzlicher, manueller Aufwand erforderlich ist, um den Quellcode 3500 vollständig zu portieren.
  • Konfigurieren von GPUs für Universalberechnungen
  • 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.
  • 36A veranschaulicht ein System 3600, das so konfiguriert ist, dass es CUDA-Quellcode 3610 unter Verwendung verschiedener Arten von Verarbeitungseinheiten kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das System 3600, ohne Beschränkung darauf, CUDA-Quellcode 3610, einen CUDA-Compiler 3650, ausführbaren Host-Code 3670(1), ausführbaren Host-Code 3670(2), ausführbaren CUDA-Geräte-Code 3684, eine CPU 3690, eine CUDA-fähige GPU 3694, eine GPU 3692, ein CUDA-zu-HIP-Übersetzungswerkzeug 3620, HIP-Quellcode 3630, einen HIP-Compilertreiber 3640, einen HCC 3660 und ausführbaren HCC-Geräte-Code 3682.
  • In mindestens einer Ausführungsform ist der CUDA-Quellcode 3610 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 3690, eine GPU 3692 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 3690.
  • In mindestens einer Ausführungsform enthält der CUDA-Quellcode 3610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Hostfunktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform können globale Funktionen 3612, Gerätefunktionen 3614, Hostfunktionen 3616 und Host/Geräte-Funktionen 3618 in dem CUDA-Quellcode 3610 gemischt sein. In mindestens einer Ausführungsform ist jede der globalen Funktionen 3612 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 3612 als Einstiegspunkte zu einem Gerät dienen. In mindestens einer Ausführungsform ist jede der globalen Funktionen 3612 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 3612 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 3614 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 3616 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 3616 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 3610 auch, ohne Beschränkung darauf, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die über eine CUDA-Laufzeit-API 3602 definiert sind. In mindestens einer Ausführungsform kann die CUDA-Laufzeit-API 3602, 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 3610 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 3602, 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 3602 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 3650 den eingegebenen CUDA-Code (z.B. den CUDA-Quellcode 3610), um den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 zu erzeugen. In mindestens einer Ausführungsform ist der CUDA-Compiler 3650 ein NVCC. In mindestens einer Ausführungsform ist der ausführbare Host-Code 3670(1) eine kompilierte Version des Host-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CPU 3690 ausführbar ist. In mindestens einer Ausführungsform kann die CPU 3690 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 3684 eine kompilierte Version des Geräte-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CUDA-fähigen GPU 3694 ausführbar ist. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684, ohne Beschränkung darauf, Binärcode. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, 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 3694) kompiliert wird. In mindestens einer Ausführungsform kann der CUDA-fähige Grafikprozessor 3694 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 3694 von der NVIDIA Corporation in Santa Clara, CA, entwickelt.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 3620 so konfiguriert, dass es den CUDA-Quellcode 3610 in einen funktionell ähnlichen HIP-Quellcode 3630 übersetzt. In mindestens einer Ausführungsform ist der HIP-Quellcode 3630 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 3612, 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 3612 nur von einem Host aus aufrufbar sein.
  • In mindestens einer Ausführungsform enthält der HIP-Quellcode 3630, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform kann der HIP-Quellcode 3630 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die in einer HIP-Laufzeit-API 3632 angegeben sind. In mindestens einer Ausführungsform enthält die HIP-Laufzeit-API 3632, ohne Beschränkung darauf, funktionell ähnliche Versionen einer Teilmenge von Funktionen, die in der CUDA-Laufzeit-API 3602 enthalten sind. In mindestens einer Ausführungsform kann der HIP-Quellcode 3630 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 3632, 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 3620 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 3620 eine beliebige Anzahl von Aufrufen zu Funktionen, die in der CUDA-Laufzeit-API 3602 angegeben sind, in eine beliebige Anzahl von Aufrufen zu Funktionen, die in der HIP-Laufzeit-API 3632 angegeben sind, um.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 3620 ein als hipify-perl bekanntes Werkzeug, das einen textbasierten Übersetzungsprozess ausführt. In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 3620 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 3620 durchgeführt werden, erfordern.
  • In mindestens einer Ausführungsform ist der HIP-Compilertreiber 3640 ein Frontend, das ein Zielgerät 3646 bestimmt und dann einen mit dem Zielgerät 3646 kompatiblen Compiler konfiguriert, um den HIP-Quellcode 3630 zu kompilieren. In mindestens einer Ausführungsform ist das Zielgerät 3646 ein Prozessor, der für die parallele Befehlsverarbeitung optimiert ist. In mindestens einer Ausführungsform kann der HIP-Compilertreiber 3640 das Zielgerät 3646 auf jede technisch machbare Weise bestimmen.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 3646 mit CUDA kompatibel ist (z.B. die CUDA-fähige GPU 3694), der HIP-Compilertreiber 3640 einen HIP/NVCC-Kompilierungsbefehl 3642. In mindestens einer Ausführungsform und wie in Verbindung mit 36B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 3642 den CUDA-Compiler 3650 zum Kompilieren des HIP-Quellcodes 3630 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 3642 erzeugt der CUDA-Compiler 3650 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 3646 nicht mit CUDA kompatibel ist, der HIP-Compilertreiber 3640 einen HIP/HCC-Kompilierungsbefehl 3644. In mindestens einer Ausführungsform und wie in Verbindung mit 36C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 3644 den HCC 3660 zum Kompilieren von HIP-Quellcode 3630 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 3644 erzeugt der HCC 3660 ausführbaren Host-Code 3670(2) und ausführbaren HCC-Geräte-Code 3682. In mindestens einer Ausführungsform ist der ausführbare HCC-Geräte-Code 3682 eine kompilierte Version des in dem HIP-Quellcode 3630 enthaltenen Geräte-Codes, der auf der GPU 3692 ausführbar ist. In mindestens einer Ausführungsform kann die GPU 3692 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 3692 von der AMD Corporation in Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform ist GPU, 3692 eine nicht CUDA-fähige GPU 3692.
  • Nur zu Erläuterungszwecken sind in 36A drei verschiedene Abläufe dargestellt, die in mindestens einer Ausführungsform ausgeführt werden können, um den CUDA-Quellcode 3610 für die Ausführung auf der CPU 3690 und verschiedenen Geräten zu kompilieren. In mindestens einer Ausführungsform kompiliert ein direkter CUDA-Ablauf den CUDA-Quellcode 3610 für die Ausführung auf der CPU 3690 und der CUDA-fähigen GPU 3694, ohne den CUDA-Quellcode 3610 in den HIP-Quellcode 3630 zu übersetzen. In mindestens einer Ausführungsform übersetzt ein indirekter CUDA-Ablauf den CUDA-Quellcode 3610 in den HIP-Quellcode 3630 und kompiliert dann den HIP-Quellcode 3630 zur Ausführung auf der CPU 3690 und der CUDA-fähigen GPU 3694. In mindestens einer Ausführungsform übersetzt ein CUDA/HCC-Ablauf den CUDA-Quellcode 3610 in HIP-Quellcode 3630 und kompiliert dann den HIP-Quellcode 3630 für die Ausführung auf der CPU 3690 und der GPU 3692.
  • Ein direkter CUDA-Ablauf, der in mindestens einer Ausführungsform ausgeführt werden 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 3650 den CUDA-Quellcode 3610 und einen CUDA-Kompilierbefehl 3648, der den CUDA-Compiler 3650 für die Kompilierung des CUDA-Quellcodes 3610 konfiguriert. In mindestens einer Ausführungsform ist der CUDA-Quellcode 3610, 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 3648 generiert der CUDA-Compiler 3650 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 (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 3670(1) und der ausführbare CUDA-Geräte-Code 3684 auf der CPU 3690 bzw. der CUDA-fähigen GPU 3694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, 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 ausgeführt werden 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 3620 den CUDA-Quellcode 3610. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung B2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform und wie in der mit B3 bezeichneten Blase dargestellt, empfängt der HIP-Compilertreiber 3640 den HIP-Quellcode 3630 und bestimmt, dass das Zielgerät 3646 CUDA-fähig ist.
  • In mindestens einer Ausführungsform und wie mit der mit B4 bezeichneten Blase dargestellt, erzeugt der HIP-Compilertreiber 3640 den HIP/NVCC-Kompilierbefehl 3642 und überträgt sowohl den HIP/NVCC-Kompilierbefehl 3642 als auch den HIP-Quellcode 3630 an den CUDA-Compiler 3650. In mindestens einer Ausführungsform und wie in Verbindung mit 36B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 3642 den CUDA-Compiler 3650 zum Kompilieren des HIP-Quellcodes 3630 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 3642 erzeugt der CUDA-Compiler 3650 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 (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 3670(1) und der ausführbare CUDA-Geräte-Code 3684 auf der CPU 3690 bzw. der CUDA-fähigen GPU 3694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, 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 ausgeführt werden 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 3620 den CUDA-Quellcode 3610. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung C2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform und wie mit der Blase C3 dargestellt, empfängt der HIP-Compilertreiber 3640 den HIP-Quellcode 3630 und bestimmt, dass das Zielgerät 3646 nicht CUDA-fähig ist.
  • In mindestens einer Ausführungsform erzeugt der HIP-Compilertreiber 3640 den HIP/HCC-Kompilierbefehl 3644 und überträgt sowohl den HIP/HCC-Kompilierbefehl 3644 als auch den HIP-Quellcode 3630 an den HCC 3660 (dargestellt durch die mit C4 bezeichnete Blase). In mindestens einer Ausführungsform und wie in Verbindung mit 36C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 3644 den HCC 3660, um den HIP-Quellcode 3630 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 3644 erzeugt der HCC 3660 einen ausführbaren Host-Code 3670(2) und einen ausführbaren HCC-Geräte-Code 3682 (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 3670(2) und der ausführbare HCC-Geräte-Code 3682 auf der CPU 3690 bzw. der GPU 3692 ausgeführt werden.
  • In mindestens einer Ausführungsform kann, nachdem der CUDA-Quellcode 3610 in HIP-Quellcode 3630 übersetzt wurde, der HIP-Compilertreiber 3640 anschließend verwendet werden, um ausführbaren Code entweder für die CUDA-fähige GPU 3694 oder die GPU 3692 zu erzeugen, ohne CUDA-HIP-Übersetzungswerkzeug 3620 erneut auszuführen. In mindestens einer Ausführungsform übersetzt das CUDA-zu-HIP-Übersetzungswerkzeug 3620 den CUDA-Quellcode 3610 in HIP-Quellcode 3630, der dann im Speicher abgelegt wird. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 dann den HCC 3660, um den ausführbaren Host-Code 3670(2) und den ausführbaren HCC-Geräte-Code 3682 basierend auf dem HIP-Quellcode 3630 zu erzeugen. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 anschließend den CUDA-Compiler 3650, um auf der Grundlage des gespeicherten HIP-Quellcodes 3630 den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 zu erzeugen.
  • 36B veranschaulicht ein System 3604, das so konfiguriert ist, dass es den CUDA-Quellcode 3610 von 36A unter Verwendung der CPU 3690 und der CUDA-fähigen GPU 3694 gemäß mindestens einer Ausführungsform kompiliert und ausführt. In mindestens einer Ausführungsform umfasst das System 3604, ohne Beschränkung darauf, den CUDA-Quellcode 3610, das CUDA-HIP-Übersetzungswerkzeug 3620, den HIP-Quellcode 3630, den HIP-Compilertreiber 3640, den CUDA-Compiler 3650, den ausführbaren Host-Code 3670(1), den ausführbaren CUDA-Geräte-Code 3684, die CPU 3690 und die CUDA-fähige GPU 3694.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 36A beschrieben, enthält der CUDA-Quellcode 3610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 3610 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 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 3620 jeden Kernel-Aufruf in dem CUDA-Quellcode 3610 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem CUDA-Quellcode 3610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt HIP-Compilertreiber 3640, dass das Zielgerät 3646 CUDA-fähig ist, und erzeugt den HIP/NVCC-Kompilierungsbefehl 3642. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 dann den CUDA-Compiler 3650 über den HIP/NVCC-Kompilierbefehl 3642, um den HIP-Quellcode 3630 zu kompilieren. In mindestens einer Ausführungsform stellt der HIP-Compilertreiber 3640 Zugriff auf einen HIP-zu-CUDA-Übersetzungsheader 3652 als Teil der Konfiguration des CUDA-Compilers 3650 bereit. In mindestens einer Ausführungsform übersetzt der HIP-zu-CUDA-Übersetzungsheader 3652 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 3650 den HIP-zu-CUDA-Übersetzungsheader 3652 in Verbindung mit einer CUDA-Laufzeitbibliothek 3654, die der CUDA-Laufzeit-API 3602 entspricht, um den ausführbaren Host-Code 3670(1) und den ausführbaren CUDA-Geräte-Code 3684 zu erzeugen. In mindestens einer Ausführungsform können der ausführbare Host-Code 3670(1) und der ausführbare CUDA-Geräte-Code 3684 dann auf der CPU 3690 bzw. der CUDA-fähigen GPU 3694 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 3684 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 3684, ohne Beschränkung darauf, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • 36C zeigt ein System 3606, das so konfiguriert ist, dass es den CUDA-Quellcode 3610 von 36A unter Verwendung einer CPU 3690 und einer nicht-CUDA-fähigen GPU 3692 kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das System 3606, ohne Beschränkung darauf, den CUDA-Quellcode 3610, das CUDA-zu-HIP-Übersetzungswerkzeug 3620, den HIP-Quellcode 3630, den HIP-Compilertreiber 3640, den HCC 3660, den ausführbaren Host-Code 3670(2), den ausführbaren HCC-Geräte-Code 3682, die CPU 3690 und die GPU 3692.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 36A beschrieben, enthält der CUDA-Quellcode 3610, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3612, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 3614, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3616 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 3618. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 3610 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 3620 den CUDA-Quellcode 3610 in den HIP-Quellcode 3630. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 3620 jeden Kernel-Aufruf in dem CUDA-Quellcode 3610 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 3610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt der HIP-Compilertreiber 3640 anschließend, dass das Zielgerät 3646 nicht CUDA-fähig ist, und erzeugt den HIP/HCC-Kompilierbefehl 3644. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3640 dann den HCC 3660, um den HIP/HCC-Kompilierbefehl 3644 auszuführen, um den HIP-Quellcode 3630 zu kompilieren. In mindestens einer Ausführungsform konfiguriert der HIP/HCC-Kompilierbefehl 3644 den HCC 3660 so, dass er, ohne Beschränkung darauf, eine HIP/HCC-Laufzeitbibliothek 3658 und einen HCC-Header 3656 verwendet, um ausführbaren Host-Code 3670(2) und ausführbaren HCC-Geräte-Code 3682 zu erzeugen. In mindestens einer Ausführungsform entspricht die HIP/HCC-Laufzeitbibliothek 3658 der HIP-Laufzeit-API 3632. In mindestens einer Ausführungsform enthält der HCC-Header 3656, 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 3670(2) und der ausführbare HCC-Geräte-Code 3682 auf der CPU 3690 bzw. der GPU 3692 ausgeführt werden.
  • 37 veranschaulicht einen beispielhaften Kernel, der von dem CUDA-zu-HIP-Übersetzungswerkzeug 3620 von 36C übersetzt wurde, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform unterteilt der CUDA-Quellcode 3610 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 3610 Thread-Blöcke, die einem bestimmten Kernel zugeordnet sind, in ein eindimensionales, zweidimensionales oder dreidimensionales Gitter bzw. Grid 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 bzw. Grid, 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 bzw. Grids, das einen Kernel für einen bestimmten Kernelaufruf ausführt, und zugehörige Streams unter Verwendung einer CUDA-Kernel-Startsyntax 3710 spezifiziert. In mindestens einer Ausführungsform wird die CUDA-Kernel-Start-Syntax 3710 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 Kernelparametern („KernelArguments“) eingefügt wird. In mindestens einer Ausführungsform umfasst die CUDA-Kernel-Startsyntax 3710, 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 bzw. Grids. 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 bzw. Grid 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 3710 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 3710 ist „SharedMemorySize“ standardmäßig auf null gesetzt. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 3710 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 3610, 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 3710 wird der Kernel MatAdd unter Verwendung eines Gitters bzw. Grids 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 bzw. Grid mit genügend Blöcken erstellt, um einen Thread pro Matrixelement zu haben, und führt jeder Thread in einem solchen Gitter bzw. Grid den Kernel MatAdd aus, um eine paarweise Addition durchzuführen.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 3620 während des Übersetzens von CUDA-Quellcode 3610 in HIP-Quellcode 3630 jeden Kernelaufruf in dem CUDA-Quellcode 3610 von der CUDA-Kernel-Start-Syntax 3710 in eine HIP-Kernel-Start-Syntax 3720 und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 3610 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe. In mindestens einer Ausführungsform ist die HIP-Kernel-Start-Syntax 3720 als „hipLaunch-KernelGGL(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 3720 die gleiche Bedeutung wie in der CUDA-Kernel-Start-Syntax 3710 (hierin zuvor beschrieben). In mindestens einer Ausführungsform sind die Argumente SharedMemorySize und Stream in der HIP-Kernel-Startsyntax 3720 erforderlich und in der CUDA-Kernel-Startsyntax 3710 optional.
  • In mindestens einer Ausführungsform ist ein Teil des in 37 dargestellten HIP-Quellcodes 3630 identisch mit einem Teil des in 37 dargestellten CUDA-Quellcodes 3610, 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 3630 mit demselben Deklarationsbezeichner „_global_“ definiert, mit dem der Kernel MatAdd in dem CUDA-Quellcode 3610 definiert ist. In mindestens einer Ausführungsform lautet ein Kernelaufruf in dem HIP-Quellcode 3630 „hipLaunchKernelGGL(MatAdd, numBlocks, threadsPerBlock, 0, 0, A, B, C);“, während ein entsprechender Kernelaufruf in dem CUDA-Quellcode 3610 „MatAdd«<numBlocks, threadsPerBlock»(A, B, C);“ lautet.
  • 38 veranschaulicht die nicht-CUDA-fähige GPU 3692 von 36C in größerem Detail, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird die GPU 3692 von der AMD Corporation in Santa Clara entwickelt. In mindestens einer Ausführungsform kann die GPU 3692 so konfiguriert sein, dass sie Rechenoperationen hochparallel durchführt. In mindestens einer Ausführungsform ist die GPU 3692 so konfiguriert, dass sie Grafikpipelineoperationen wie Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen ausführt, die mit dem Rendern eines Frames auf einer Anzeige verbunden sind. In mindestens einer Ausführungsform ist die GPU 3692 so konfiguriert, dass sie Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist die GPU 3692 so konfiguriert, dass sie sowohl grafikbezogene als auch grafikfremde Operationen ausführt. In mindestens einer Ausführungsform kann die GPU 3692 so konfiguriert sein, dass sie Geräte-Code ausführt, der in dem HIP-Quellcode 3630 enthalten ist.
  • In mindestens einer Ausführungsform umfasst die GPU 3692, ohne Beschränkung darauf, eine beliebige Anzahl von programmierbaren Verarbeitungseinheiten 3820, einen Befehlsprozessor 3810, einen L2-Cache 3822, Speichersteuerungen 3870, DMA-Engines 3880(1), Systemspeichersteuerungen 3882, DMA-Engines 3880(2) und GPU-Controller 3884. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 3820, ohne Beschränkung darauf, einen Arbeitslast-Manager 3830 und eine beliebige Anzahl von Recheneinheiten 3840. In mindestens einer Ausführungsform liest der Befehlsprozessor 3810 Befehle aus einer oder mehreren Befehlswarteschlangen (nicht dargestellt) und verteilt die Befehle an Arbeitslast-Manager 3830. In mindestens einer Ausführungsform verteilt der zugehörige Arbeitslast-Manager 3830 für jede programmierbare Verarbeitungseinheit 3820 Arbeit an in der programmierbaren Verarbeitungseinheit 3820 enthaltene Recheneinheiten 3840. In mindestens einer Ausführungsform kann jede Recheneinheit 3840 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 3840 ausgeführt. In mindestens einer Ausführungsform ist eine Arbeitsgruppe ein Thread-Block.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 3840, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 3850 und einen gemeinsamen Speicher 3860. In mindestens einer Ausführungsform umfasst jede SIMD-Einheit 3850 eine SIMD-Architektur und ist zur parallelen Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform beinhaltet jede SIMD-Einheit 3850, ohne Beschränkung darauf, eine Vektor-ALU 3852 und eine Vektorregisterdatei 3854. In mindestens einer Ausführungsform führt jede SIMD-Einheit 3850 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 3860 kommunizieren.
  • In mindestens einer Ausführungsform werden programmierbare Verarbeitungseinheiten 3820 als „Shader-Engines“ bezeichnet. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 3820, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware zusätzlich zu Recheneinheiten 3840. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 3820, 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 Arbeitslast-Manager 3830 und eine beliebige Anzahl von Recheneinheiten 3840.
  • In mindestens einer Ausführungsform teilen sich die Recheneinheiten 3840 einen L2-Cache 3822. In mindestens einer Ausführungsform ist der L2-Cache 3822 partitioniert. In mindestens einer Ausführungsform ist ein GPU-Speicher 3890 für alle Recheneinheiten 3840 in der GPU 3692 zugänglich. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 3870 und Systemspeichersteuerungen 3882 die Datenübertragung zwischen der GPU 3692 und einem Host, und ermöglichen die DMA-Engines 3880(1) asynchrone Speicherübertragungen zwischen der GPU 3692 und einem solchen Host. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 3870 und GPU-Controller 3884 Datenübertragungen zwischen der GPU 3692 und anderen GPUs 3692, und ermöglichen DMA-Engines 3880(2) asynchrone Speicherübertragungen zwischen der GPU 3692 und anderen GPUs 3692.
  • In mindestens einer Ausführungsform beinhaltet die GPU 3692, 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 3692 sein können, hinweg erleichtern. In mindestens einer Ausführungsform beinhaltet die GPU 3692, ohne Beschränkung darauf, eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCIe), die mit einer beliebigen Anzahl und Art von Peripheriegeräten gekoppelt sind. In mindestens einer Ausführungsform kann die GPU 3692, 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 umfasst die GPU 3692 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und eine beliebige Art von Speichersteuerungen (z.B. Speichersteuerung 3870 und Systemspeichersteuerung 3882) und Speichervorrichtungen (z.B. gemeinsam genutzte Speicher 3860) umfasst, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform umfasst die GPU 3692 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z. B. L2-Cache 3822) umfasst, die jeweils für eine beliebige Anzahl von Komponenten (z.B. SIMD-Einheiten 3850, Recheneinheiten 3840 und programmierbare Verarbeitungseinheiten 3820) reserviert oder von diesen gemeinsam genutzt werden können.
  • 39 veranschaulicht, wie Threads eines beispielhaften CUDA-Grids 3920 gemäß mindestens einer Ausführungsform auf verschiedene Recheneinheiten 3840 von 38 abgebildet werden. In mindestens einer Ausführungsform und nur zu Erläuterungszwecken hat das Raster 3920 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 3920 daher, ohne Beschränkung darauf, (BX * BY) Thread-Blöcke 3930 und umfasst jeder Thread-Block 3930, ohne Beschränkung darauf, (TX * TY) Threads 3940. Die Threads 3940 sind in 39 als verschnörkelte Pfeile dargestellt.
  • In mindestens einer Ausführungsform wird das Raster 3920 auf die programmierbare Verarbeitungseinheit 3820(1) abgebildet, die, ohne Beschränkung darauf, die Recheneinheiten 3840(1)-3840(C) umfasst. In mindestens einer Ausführungsform und wie gezeigt werden (BJ * BY) Thread-Blöcke 3930 auf die Recheneinheit 3840(1) abgebildet, und werden die restlichen Thread-Blöcke 3930 auf die Recheneinheit 3840(2) abgebildet. In mindestens einer Ausführungsform kann jeder Thread-Block 3930, ohne Beschränkung darauf, eine beliebige Anzahl von Warps enthalten, und ist jeder Warp einer anderen SIMD-Einheit 3850 von 38 zugeordnet.
  • In mindestens einer Ausführungsform können Warps in einem gegebenen Thread-Block 3930 zusammen synchronisieren und über gemeinsam genutzten Speicher 3860 in der zugeordneten Recheneinheit 3840 kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 3930(BJ,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 3860(1) kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 3930(BJ+1,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 3860(2) kommunizieren.
  • 40 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 4000 als Eingabe für ein DPC++-Kompatibilitätstool 4002 bereitgestellt, um menschenlesbares DPC++ 4004 zu erzeugen. In mindestens einer Ausführungsform enthält der für den Menschen lesbare DPC++ 4004 Inline-Kommentare, die vom DPC++-Kompatibilitätstool 4002 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 4006 abzuschließen und dadurch den DPC++-Quellcode 4008 zu erzeugen.
  • In mindestens einer Ausführungsform ist oder enthält der CUDA-Quellcode 4000 eine Sammlung von menschenlesbarem Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Quellcode 4000 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 Einschrä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 sequentielle Anweisungsverarbeitung optimiert ist, wie beispielsweise eine CPU. Der in Verbindung mit 40 beschriebene CUDA-Quellcode 4000 kann mit den an anderer Stelle in diesem Dokument beschriebenen Quellcodes übereinstimmen.
  • In mindestens einer Ausführungsform bezieht sich das DPC++-Kompatibilitätswerkzeug 4002 auf ein ausführbares Werkzeug, ein Programm, eine Anwendung oder eine andere geeignete Art von Werkzeug, das zur Erleichterung der Migration von CUDA-Quellcode 4000 zu DPC++-Quellcode 4008 verwendet wird. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 4002 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 4002 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++ 4004 bezeichnet wird. In mindestens einer Ausführungsform enthält das menschenlesbare DPC++ 4004 Kommentare, die vom DPC++-Kompatibilitätswerkzeug 4002 erzeugt werden, um anzuzeigen, wo ein Benutzereingriff erforderlich sein kann. In mindestens einer Ausführungsform ist ein Benutzereingriff erforderlich, wenn der CUDA-Quellcode 4000 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 4000 (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 4002; das Abschließen der Migration und das Überprüfen der Korrektheit, wodurch DPC++-Quellcode 4008 erzeugt wird; und das Kompilieren von DPC++-Quellcode 4008 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 4002 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 4002 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 4002 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 4002 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 4002 menschenlesbaren DPC++ 4004, bei dem es sich um DPC++-Code handeln kann, der in der vom DPC++-Kompatibilitätstool 4002 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 4002 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 4002 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 4002 direkt DPC++-Quellcode 4008, der von einem DPC++-Compiler kompiliert wird, ohne dass ein menschliches Eingreifen erforderlich ist oder genutzt wird, um den vom DPC++-Kompatibilitätswerkzeug 4002 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 4002 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++ {
            wenn (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 4002 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 4002 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 4002 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 VectorAdd-Kernel() 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 4002 geändert zu werden. In mindestens einer Ausführungsform modifiziert das DPC++-Kompatibilitätswerkzeug 4002 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++ 4004 (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)] = ite_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++ 4004 auf die vom DPC++-Kompatibilitätswerkzeug 4002 erzeugte Ausgabe und kann auf die eine oder andere Weise optimiert werden. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätstool 4002 erzeugte, für den Menschen lesbare DPC++ 4004 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 43002 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 4002 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 4002 ü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 4002 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 4002; 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 Einschrä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.
  • Zumindest eine Ausführungsform der Erfindung kann im Hinblick auf die nachstehenden Sätze beschrieben werden:
    1. 1. Prozessor umfassend:
      • eine oder mehrere Schaltungen, um zu veranlassen, dass mindestens zwei verschiedene Typen von Verarbeitungskernen eine Inferencing-Operation mittels mindestens eines neuronalen Netzes ausführen.
    2. 2. Prozessor nach Satz 1, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern, umfassen.
    3. 3. Prozessor nach Satz 2, wobei es sich bei dem mindestens einen PPU-Kern um Grafikverarbeitungseinheits-Kerne, GPU-Kerne, handelt.
    4. 4. Prozessor nach einem der Sätze 1-3, wobei mindestens ein Softwareprogramm Anweisungen umfasst, um zu bewirken, dass die mindestens zwei verschiedenen Typen von Verarbeitungskernen die Inferencing-Operation ausführen, wobei das mindestens eine Softwareprogramm einen ersten Satz von Anweisungen, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Satz von Anweisungen, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    5. 5. Prozessor nach einem der Sätze 1-4, wobei die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen ist, wobei die Parallelverarbeitungsbibliothek Anweisungen umfasst, um einen ersten Abschnitt der Inferencing-Operation auf einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen und einen zweiten Abschnitt der Inferencing-Operation auf einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen.
    6. 6. Prozessor nach einem der Sätze 1-5, wobei die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen ist, um zumindest das mindestens eine neuronale Netz anzugeben, wobei die Parallelverarbeitungsbibliothek eine gemeinsame Zeigeradressierung für die mindestens zwei verschiedenen Typen von Verarbeitungskernen bereitstellt, um die Inferencing-Operation auszuführen.
    7. 7. Prozessor umfassend:
      • mindestens eine Schaltung, um einen Graphencode zu verwenden, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    8. 8. Prozessor nach Satz 7, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern umfassen.
    9. 9. Prozessor nach Satz 7 oder 8, wobei der Graphencode einen von einer Parallelverarbeitungsbibliothek erzeugten Ausführungsgraphen angibt.
    10. 10. Prozessor nach einem der Sätze 7-9, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation auszuführen.
    11. 11. Prozessor nach einem der Sätze 7-10, wobei das Softwareprogramm einen Satz von Anweisungen umfasst und der Graphencode eine erste Teilmenge des Satzes von Anweisungen und eine zweite Teilmenge des Satzes von Anweisungen umfasst, wobei die erste Teilmenge von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist und die zweite Teilmenge von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist.
    12. 12. Prozessor nach einem der Sätze 7-11, wobei eine Parallelverarbeitungsbibliothek den Graphencode als Ergebnis mindestens eines Funktionsaufrufs an eine von der Parallelverarbeitungsbibliothek bereitgestellte Schnittstelle erzeugt, und wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um mindestens einen Software-Kernel für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um mindestens einen Software-Kernel für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    13. 13. Prozessor nach einem der Sätze 7-12, wobei der Graphencode mindestens einen ersten Software-Kernel, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Kernel, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    14. 14. Maschinenlesbares Medium, auf dem mindestens eine Anweisung gespeichert ist, die, wenn sie von mindestens einem Prozessor ausgeführt wird, den mindestens einen Prozessor veranlasst, zumindest:
      • mindestens zwei verschiedene Typen von Verarbeitungskernen zu veranlassen, eine Inferencing-Operation mittels mindestens eines neuronalen Netzes auszuführen.
    15. 15. Maschinenlesbares Medium nach Satz 14, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern, und mindestens einen Deep-Learning-Beschleuniger, DLA, umfassen.
    16. 16. Maschinenlesbares Medium nach Satz 15, wobei es sich bei dem mindestens einen PPU-Kern um Grafikverarbeitungseinheits-Kerne, GPU-Kerne handelt.
    17. 17. Maschinenlesbares Medium nach einem der Sätze 14-16, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgestaltet sind, um einen Ausführungsgraphen auszuführen, wobei der Ausführungsgraph einen ersten Kernel, um einen ersten Teil der Inferencing-Operation auszuführen, und einen zweiten Kernel, um einen zweiten Teil der Inferencing-Operation auszuführen, umfasst.
    18. 18. Maschinenlesbares Medium nach einem der Sätze 14-17-, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, ein Softwareprogramm auszuführen, das Anweisungen umfasst, um die mindestens zwei verschiedenen Typen von Verarbeitungskernen zu veranlassen, die Inferencing-Operation auszuführen, wobei das Softwareprogramm einen ersten Satz von Anweisungen, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Satz von Anweisungen, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    19. 19. Maschinenlesbares Medium nach einem der Sätze 14-18, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, das mindestens eine neuronale Netz als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek zu empfangen, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um zu bewirken, dass ein erster Teil der Inferencing-Operation von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird, und einen zweiten Satz von Anweisungen, um zu bewirken, dass ein zweiter Teil der Inferencing-Operation von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird, umfasst.
    20. 20. Maschinenlesbares Medium nach einem der Sätze 14-19, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, die mindestens zwei verschiedenen Typen von Verarbeitungskernen veranlassen, die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen.
    21. 21. Maschinenlesbares Medium nach einem der Sätze 14-20, wobei mindestens ein Funktionsaufruf an eine Anwendungsprogrammierschnittstelle, API, die von der Parallelverarbeitungsbibliothek bereitgestellt wird, ausgestaltet ist, um das mindestens eine neuronale Netz anzugeben.
    22. 22. Maschinenlesbares Medium, auf dem mindestens eine Anweisung gespeichert ist, die, wenn sie von mindestens einem Prozessor ausgeführt wird, den mindestens einen Prozessor veranlasst, zumindest:
      • einen Graphencode zu verwenden, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    23. 23. Maschinenlesbares Medium nach Satz 22, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens eine Grafikverarbeitungseinheit-Kern, GPU-Kern, umfassen.
    24. 24. Maschinenlesbares Medium nach Satz 22 oder 23, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation mittels mindestens eines neuronalen Netzes auszuführen.
    25. 25. Maschinenlesbares Medium nach einem der Sätze 22-24, wobei der Graphencode einen Ausführungsgraphen angibt, der von einer Parallelverarbeitungsbibliothek als Ergebnis mindestens eines Funktionsaufrufs an die Parallelverarbeitungsbibliothek erzeugt wird, was das Softwareprogramm angibt, das von den mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist.
    26. 26. Maschinenlesbares Medium nach einem der Sätze 22-25, wobei das Softwareprogramm einen Satz von Rechenoperationen angibt, die von den mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, und wobei der Graphencode einen ersten Kernel, um eine erste Teilmenge der Rechenoperationen unter Verwendung eines ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen, und einen zweiten Kernel, um eine zweite Teilmenge der Rechenoperationen unter Verwendung eines zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen, umfasst.
    27. 27. Maschinenlesbares Medium nach einem der Sätze 22-26, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, den Graphencode als Ergebnis mindestens eines Funktionsaufrufs an eine Anwendungsprogrammierschnittstelle, API, zu erzeugen, die von einer Parallelverarbeitungsbibliothek bereitgestellt wird, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um einen ersten Abschnitt des Graphencodes für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um einen zweiten Abschnitt des Graphencodes für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    28. 28. Maschinenlesbares Medium nach einem der Sätze 22-27, wobei der Graphencode einen ersten Satz von Softwareanweisungen umfasst, die von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, und einen zweiten Satz von Softwareanweisungen, die von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, umfasst.
    29. 29. Verfahren umfassend:
      • Verwenden von Graphencode, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    30. 30. Verfahren nach Satz 29, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Grafikverarbeitungseinheits-Kern, GPU-Kern, und einen Deep-Learning-Beschleuniger, DLA, umfassen.
    31. 31. Verfahren nach Satz 29 oder 30, wobei das Softwareprogramm einen Satz von Operationen umfasst und der Graphencode einen Ausführungsgraphen angibt, der einen ersten Kernel, der eine erste Teilmenge eines Satzes von Operationen umfasst, die von einem ersten der mindestens zwei verschiedenen Typen von Prozessorkernen auszuführen sind, und einen zweiten Kernel, der eine zweite Teilmenge des Satzes von Operationen umfasst, die von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, umfasst.
    32. 32. Verfahren nach einem der Sätze 29-31, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation unter Verwendung der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen.
    33. 33. Verfahren nach einem der Sätze 29-32, wobei der Graphencode von einer Parallelverarbeitungsbibliothek als Ergebnis mindestens eines Funktionsaufrufs an eine Anwendungsprogrammierschnittstelle, API, die von der Parallelverarbeitungsbibliothek bereitgestellt wird, erzeugt wird.
    34. 34. Verfahren nach einem der Sätze 29-33, wobei der Graphencode von einer Parallelverarbeitungsbibliothek erzeugt wird, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um einen ersten Abschnitt des Graphencodes für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um einen zweiten Abschnitt des Graphencodes für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    35. 35. Verfahren nach einem der Sätze 29-34, wobei der Graphencode einen ersten Abschnitt des Softwareprogramms, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Abschnitt des Softwareprogramms, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, angibt.
    36. 36. Verfahren nach einem der Sätze 29-35, wobei eine Parallelverarbeitungsbibliothek eine gemeinsame Zeigeradressierung für die mindestens zwei verschiedenen Typen von Verarbeitungskernen bereitstellt, um mindestens eine durch das Softwareprogramm angegebene Rechenoperation auszuführen.
  • 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 Frame 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, zeigt der Begriff „Mehrzahl“ einen Zustand an, in dem er plural ist (z.B. „eine Mehrzahl von Elementen“ zeigt 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) ausgeführt werden, 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 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 auszuführen, 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 ausführt, 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 Einschrä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 einschrä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 „Methode“ werden hierin insofern synonym verwendet, als ein System eine oder mehrere Methoden umfassen kann und Methoden als System betrachtet werden können.
  • Bei mindestens einer Ausführungsform handelt es sich bei einer arithmetischen Logikeinheit um einen Satz kombinatorischer Logikschaltungen, die eine oder mehrere Eingaben verarbeiten, um ein Ergebnis zu erzeugen. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit von einem Prozessor verwendet, um mathematische Operationen wie Addition, Subtraktion oder Multiplikation auszuführen. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit verwendet, um logische Operationen wie logisches UND/ODER oder XOR auszuführen. Bei mindestens einer Ausführungsform ist eine arithmetische Logikeinheit zustandslos und besteht aus physikalischen Schaltkomponenten wie Halbleitertransistoren, die zur Ausbildung logischer Gatter angeordnet sind. Bei mindestens einer Ausführungsform kann eine arithmetische Logikeinheit intern als zustandsabhängige logische Schaltung mit einem zugehörigen Taktgeber arbeiten. Bei mindestens einer Ausführungsform kann eine arithmetische Logikeinheit als asynchrone logische Schaltung aufgebaut sein, deren interner Zustand nicht in einem zugehörigen Registersatz gehalten wird. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit 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.
  • Bei mindestens einer Ausführungsform übergibt der Prozessor als Ergebnis der Verarbeitung eines vom Prozessor abgerufenen Befehls einen oder mehrere Eingaben oder Operanden an eine arithmetische Logikeinheit, wodurch die arithmetische Logikeinheit veranlasst wird, ein Ergebnis zu erzeugen, das zumindest teilweise auf einem Befehlscode basiert, der den Eingängen der arithmetischen Logikeinheit bereitgestellt wird. Bei mindestens einer Ausführungsform basieren die vom Prozessor an die ALU gelieferten Befehlscodes zumindest teilweise auf dem vom Prozessor ausgeführten Befehl. Bei mindestens einer Ausführungsform verarbeitet die kombinatorische Logik in der ALU die Eingaben und erzeugt eine Ausgabe, die auf einen Bus innerhalb des Prozessors gelegt wird. Bei mindestens einer Ausführungsform wählt der Prozessor ein Zielregister, einen Speicherplatz, eine Ausgabeeinrichtung oder einen Ausgabespeicherplatz auf dem Ausgangsbus aus, so dass die Taktung 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 Ausführungsformen 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 Ausführungsformen 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 beispielhafte Ausführungsformen der beschriebenen Techniken darlegt, können auch andere Architekturen verwendet werden, um die beschriebene Funktionalität auszuführen, 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.
  • [0380] 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 Ausführung der Ansprüche offenbart.
  • ZITATE ENTHALTEN IN DER BESCHREIBUNG
  • Diese Liste der vom Anmelder aufgeführten Dokumente wurde automatisiert erzeugt und ist ausschließlich zur besseren Information des Lesers aufgenommen. Die Liste ist nicht Bestandteil der deutschen Patent- bzw. Gebrauchsmusteranmeldung. Das DPMA übernimmt keinerlei Haftung für etwaige Fehler oder Auslassungen.
  • Zitierte Patentliteratur
    • US 17/468128 [0001]
    • US 17468128 [0333]

    Claims (36)

    1. Prozessor umfassend: eine oder mehrere Schaltungen, um zu veranlassen, dass mindestens zwei verschiedene Typen von Verarbeitungskernen eine Inferencing-Operation mittels mindestens eines neuronalen Netzes ausführen.
    2. Prozessor nach Anspruch 1, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern, umfassen.
    3. Prozessor nach Anspruch 2, wobei es sich bei dem mindestens einen PPU-Kern um Grafikverarbeitungseinheits-Kerne, GPU-Kerne, handelt.
    4. Prozessor nach Anspruch 1, wobei mindestens ein Softwareprogramm Anweisungen umfasst, um zu bewirken, dass die mindestens zwei verschiedenen Typen von Verarbeitungskernen die Inferencing-Operation ausführen, wobei das mindestens eine Softwareprogramm einen ersten Satz von Anweisungen, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Satz von Anweisungen, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    5. Prozessor nach Anspruch 1, wobei die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen ist, wobei die Parallelverarbeitungsbibliothek Anweisungen umfasst, um einen ersten Abschnitt der Inferencing-Operation auf einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen und einen zweiten Abschnitt der Inferencing-Operation auf einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen.
    6. Prozessor nach Anspruch 1, wobei die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen ist, um zumindest das mindestens eine neuronale Netz anzugeben, wobei die Parallelverarbeitungsbibliothek eine gemeinsame Zeigeradressierung für die mindestens zwei verschiedenen Typen von Verarbeitungskernen bereitstellt, um die Inferencing-Operation auszuführen.
    7. Prozessor umfassend: mindestens eine Schaltung, um einen Graphencode zu verwenden, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    8. Prozessor nach Anspruch 7, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern umfassen.
    9. Prozessor nach Anspruch 7, wobei der Graphencode einen von einer Parallelverarbeitungsbibliothek erzeugten Ausführungsgraphen angibt.
    10. Prozessor nach Anspruch 7, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation auszuführen.
    11. Prozessor nach Anspruch 7, wobei das Softwareprogramm einen Satz von Anweisungen umfasst und der Graphencode eine erste Teilmenge des Satzes von Anweisungen und eine zweite Teilmenge des Satzes von Anweisungen umfasst, wobei die erste Teilmenge von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist und die zweite Teilmenge von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist.
    12. Prozessor nach Anspruch 7, wobei eine Parallelverarbeitungsbibliothek den Graphencode als Ergebnis mindestens eines Funktionsaufrufs an eine von der Parallelverarbeitungsbibliothek bereitgestellte Schnittstelle erzeugt, und wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um mindestens einen Software-Kernel für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um mindestens einen Software-Kernel für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    13. Prozessor nach Anspruch 7, wobei der Graphencode mindestens einen ersten Software-Kernel, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Kernel, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    14. Maschinenlesbares Medium, auf dem mindestens eine Anweisung gespeichert ist, die, wenn sie von mindestens einem Prozessor ausgeführt wird, den mindestens einen Prozessor veranlasst, zumindest: mindestens zwei verschiedene Typen von Verarbeitungskernen zu veranlassen, eine Inferencing-Operation mittels mindestens eines neuronalen Netzes auszuführen.
    15. Maschinenlesbares Medium nach Anspruch 14, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Parallelverarbeitungseinheits-Kern, PPU-Kern, und mindestens einen Deep-Learning-Beschleuniger, DLA, umfassen.
    16. Maschinenlesbares Medium nach Anspruch 15, wobei es sich bei dem mindestens einen PPU-Kern um Grafikverarbeitungseinheits-Kerne, GPU-Kerne handelt.
    17. Maschinenlesbares Medium nach Anspruch 14, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgestaltet sind, um einen Ausführungsgraphen auszuführen, wobei der Ausführungsgraph einen ersten Kernel, um einen ersten Teil der Inferencing-Operation auszuführen, und einen zweiten Kernel, um einen zweiten Teil der Inferencing-Operation auszuführen, umfasst.
    18. Maschinenlesbares Medium nach Anspruch 14, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, ein Softwareprogramm auszuführen, das Anweisungen umfasst, um die mindestens zwei verschiedenen Typen von Verarbeitungskernen zu veranlassen, die Inferencing-Operation auszuführen, wobei das Softwareprogramm einen ersten Satz von Anweisungen, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Satz von Anweisungen, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, umfasst.
    19. Maschinenlesbares Medium nach Anspruch 14, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, das mindestens eine neuronale Netz als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek zu empfangen, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um zu bewirken, dass ein erster Teil der Inferencing-Operation von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird, und einen zweiten Satz von Anweisungen, um zu bewirken, dass ein zweiter Teil der Inferencing-Operation von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird, umfasst.
    20. Maschinenlesbares Medium nach Anspruch 14, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, die mindestens zwei verschiedenen Typen von Verarbeitungskernen veranlassen, die Inferencing-Operation als Ergebnis mindestens eines Funktionsaufrufs an eine Parallelverarbeitungsbibliothek auszuführen.
    21. Maschinenlesbares Medium nach Anspruch 20, wobei mindestens ein Funktionsaufruf an eine Anwendungsprogrammierschnittstelle, API, die von der Parallelverarbeitungsbibliothek bereitgestellt wird, ausgestaltet ist, um das mindestens eine neuronale Netz anzugeben.
    22. Maschinenlesbares Medium, auf dem mindestens eine Anweisung gespeichert ist, die, wenn sie von mindestens einem Prozessor ausgeführt wird, den mindestens einen Prozessor veranlasst, zumindest: einen Graphencode zu verwenden, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    23. Maschinenlesbares Medium nach Anspruch 22, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Deep-Learning-Beschleuniger, DLA, und mindestens eine Grafikverarbeitungseinheit-Kern, GPU-Kern, umfassen.
    24. Maschinenlesbares Medium nach Anspruch 22, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation mittels mindestens eines neuronalen Netzes auszuführen.
    25. Maschinenlesbares Medium nach Anspruch 22, wobei der Graphencode einen Ausführungsgraphen angibt, der von einer Parallelverarbeitungsbibliothek als Ergebnis mindestens eines Funktionsaufrufs an die Parallelverarbeitungsbibliothek erzeugt wird, was das Softwareprogramm angibt, das von den mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist.
    26. Maschinenlesbares Medium nach Anspruch 22, wobei das Softwareprogramm einen Satz von Rechenoperationen angibt, die von den mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, und wobei der Graphencode einen ersten Kernel, um eine erste Teilmenge der Rechenoperationen unter Verwendung eines ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen, und einen zweiten Kernel, um eine zweite Teilmenge der Rechenoperationen unter Verwendung eines zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen, umfasst.
    27. Maschinenlesbares Medium nach Anspruch 22, das darüber hinaus Anweisungen umfasst, die, wenn sie von dem mindestens einen Prozessor ausgeführt werden, den mindestens einen Prozessor veranlassen, den Graphencode als Ergebnis mindestens eines Funktionsaufrufs an eine Anwendungsprogrammierschnittstelle, API, zu erzeugen, die von einer Parallelverarbeitungsbibliothek bereitgestellt wird, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um einen ersten Abschnitt des Graphencodes für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um einen zweiten Abschnitt des Graphencodes für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    28. Maschinenlesbares Medium nach Anspruch 22, wobei der Graphencode einen ersten Satz von Softwareanweisungen umfasst, die von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, und einen zweiten Satz von Softwareanweisungen, die von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, umfasst.
    29. Verfahren umfassend: Verwenden von Graphencode, um zu bewirken, dass ein Softwareprogramm von mindestens zwei verschiedenen Typen von Verarbeitungskernen ausgeführt wird.
    30. Verfahren nach Anspruch 29, wobei die mindestens zwei verschiedenen Typen von Verarbeitungskernen mindestens einen Grafikverarbeitungseinheits-Kern, GPU-Kern, und einen Deep-Learning-Beschleuniger, DLA, umfassen.
    31. Verfahren nach Anspruch 29, wobei das Softwareprogramm einen Satz von Operationen umfasst und der Graphencode einen Ausführungsgraphen angibt, der einen ersten Kernel, der eine erste Teilmenge eines Satzes von Operationen umfasst, die von einem ersten der mindestens zwei verschiedenen Typen von Prozessorkernen auszuführen sind, und einen zweiten Kernel, der eine zweite Teilmenge des Satzes von Operationen umfasst, die von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen sind, umfasst.
    32. Verfahren nach Anspruch 29, wobei der Graphencode ausgestaltet ist, um das Softwareprogramm zu veranlassen, mindestens eine Inferencing-Operation unter Verwendung der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen.
    33. Verfahren nach Anspruch 29, wobei der Graphencode von einer Parallelverarbeitungsbibliothek als Ergebnis mindestens eines Funktionsaufrufs an eine Anwendungsprogrammierschnittstelle, API, die von der Parallelverarbeitungsbibliothek bereitgestellt wird, erzeugt wird.
    34. Verfahren nach Anspruch 29, wobei der Graphencode von einer Parallelverarbeitungsbibliothek erzeugt wird, wobei die Parallelverarbeitungsbibliothek einen ersten Satz von Anweisungen, um einen ersten Abschnitt des Graphencodes für einen ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, und einen zweiten Satz von Anweisungen, um einen zweiten Abschnitt des Graphencodes für einen zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen zu erzeugen, umfasst.
    35. Verfahren nach Anspruch 29, wobei der Graphencode einen ersten Abschnitt des Softwareprogramms, der von einem ersten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, und einen zweiten Abschnitt des Softwareprogramms, der von einem zweiten der mindestens zwei verschiedenen Typen von Verarbeitungskernen auszuführen ist, angibt.
    36. Verfahren nach Anspruch 29, wobei eine Parallelverarbeitungsbibliothek eine gemeinsame Zeigeradressierung für die mindestens zwei verschiedenen Typen von Verarbeitungskernen bereitstellt, um mindestens eine durch das Softwareprogramm angegebene Rechenoperation auszuführen.
    DE112022003222.7T 2021-09-07 2022-09-06 Multi-architektur-ausführungsgraphen Pending DE112022003222T5 (de)

    Applications Claiming Priority (3)

    Application Number Priority Date Filing Date Title
    US17/468,128 US20230083345A1 (en) 2021-09-07 2021-09-07 Multi-architecture execution graphs
    US17/468,128 2021-09-07
    PCT/US2022/075994 WO2023039380A1 (en) 2021-09-07 2022-09-06 Multi-architecture execution graphs

    Publications (1)

    Publication Number Publication Date
    DE112022003222T5 true DE112022003222T5 (de) 2024-05-02

    Family

    ID=83903118

    Family Applications (1)

    Application Number Title Priority Date Filing Date
    DE112022003222.7T Pending DE112022003222T5 (de) 2021-09-07 2022-09-06 Multi-architektur-ausführungsgraphen

    Country Status (4)

    Country Link
    US (1) US20230083345A1 (de)
    CN (1) CN117136354A (de)
    DE (1) DE112022003222T5 (de)
    WO (1) WO2023039380A1 (de)

    Families Citing this family (1)

    * Cited by examiner, † Cited by third party
    Publication number Priority date Publication date Assignee Title
    KR20230041444A (ko) * 2021-09-17 2023-03-24 삼성전자주식회사 뉴럴 네트워크를 위한 컴파일 방법 및 장치

    Family Cites Families (2)

    * Cited by examiner, † Cited by third party
    Publication number Priority date Publication date Assignee Title
    US20200364088A1 (en) * 2019-05-16 2020-11-19 Nvidia Corporation Resource sharing by two or more heterogeneous processing cores
    US20210133990A1 (en) * 2019-11-05 2021-05-06 Nvidia Corporation Image aligning neural network

    Also Published As

    Publication number Publication date
    WO2023039380A1 (en) 2023-03-16
    CN117136354A (zh) 2023-11-28
    WO2023039380A9 (en) 2023-08-03
    US20230083345A1 (en) 2023-03-16

    Similar Documents

    Publication Publication Date Title
    DE112021005433T5 (de) Verfahren zur leistungsbalancierung mehrerer chips
    DE102022131530A1 (de) Verfahren zum modifizieren von graphencode
    DE112022002953T5 (de) Parallele verarbeitung von thread-gruppen
    DE102022131708A1 (de) Anwendungsprogrammierschnittstelle zum begrenzen von speicher
    DE112023000300T5 (de) Anwendungsprogrammierschnittstelle für selektives laden
    DE112022003546T5 (de) Anwendungsprogrammierschnittstelle, die einen graph-code veranlasst, einen semaphor zu aktualisieren
    DE102023101893A1 (de) Graphenbasierter speicher
    DE112023000246T5 (de) Anwendungsprogrammier-schnittstelle zum entkoppeln einer virtuellen adresse
    DE112022003222T5 (de) Multi-architektur-ausführungsgraphen
    DE102022132017A1 (de) Anwendungsprogrammierschnittstellen für interoperabilität
    DE102022132013A1 (de) Anwendungsprogrammierschnittstellen für interoperabilität
    DE102022132008A1 (de) Asynchrone speicherdeallokation
    DE102022124362A1 (de) Benutzerkonfigurierbare speicherzuweisung
    DE112022001917T5 (de) Synchronisieren einer graphausführung
    DE102022114663A1 (de) Synchronisatonsbarriere
    DE112022000425T5 (de) Gleichzeitiges einführen von code
    DE112023000260T5 (de) Verfahren zum verwenden von kontextbezogenen informationen
    DE112023000204T5 (de) Anwendungsprogrammierschnittstelle zur Angabe der Ausführung von Graph-Knoten
    DE112022003323T5 (de) Anwendungsprogrammierschnittstelle für scan-operationen
    DE112022003558T5 (de) Anwendungsprogrammierschnittstelle, die einen graph-code veranlasst, auf einen semaphor zu warten
    DE102023130421A1 (de) Modifikation von graphen
    DE102024103398A1 (de) Anwendungsprogrammierschnittstelle zum lesen von informationen über abhängigkeit von speicheroperationen aus einer datenstruktur
    DE112022003347T5 (de) Codegenerierung basierend auf prozessornutzung
    DE102024103400A1 (de) Anwendungsprogrammierschnittstelle zum speichern von speicherabhängigkeitsinformationen
    DE112023000296T5 (de) Anwendungsprogrammierschnittstelle zum identifizieren eines speicherplatzes von programmabschnitten

    Legal Events

    Date Code Title Description
    R012 Request for examination validly filed