DE102023114219A1 - Programmcode-Versionen - Google Patents

Programmcode-Versionen Download PDF

Info

Publication number
DE102023114219A1
DE102023114219A1 DE102023114219.4A DE102023114219A DE102023114219A1 DE 102023114219 A1 DE102023114219 A1 DE 102023114219A1 DE 102023114219 A DE102023114219 A DE 102023114219A DE 102023114219 A1 DE102023114219 A1 DE 102023114219A1
Authority
DE
Germany
Prior art keywords
memory
versions
processor
program code
graphics
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
DE102023114219.4A
Other languages
English (en)
Inventor
Michael Joseph Wolfe
Güray Özen
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 DE102023114219A1 publication Critical patent/DE102023114219A1/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Memory System Of A Hierarchy Structure (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Vorrichtungen, Systeme und Techniken zur Durchführung von Versionen von Programmcode. In mindestens einer Ausführungsform werden eine oder mehrere Versionen einer Vielzahl von Versionen von Softwarecode durchgeführt. In mindestens einer Ausführungsform werden eine oder mehrere Versionen einer Vielzahl von Versionen von Softwarecode durchgeführt, basierend zumindest teilweise darauf, ob die Versionen von Programmcode auf überlappende Speicherbereiche zugreifen.

Description

  • GEBIET
  • Mindestens eine Ausführungsform bezieht sich auf Verarbeitungsressourcen, die zum Ausführen eines oder mehrerer CUDA-Programme verwendet werden. Zum Beispiel bezieht sich mindestens eine Ausführungsform auf Prozessoren oder Computersysteme, die zum Auswählen einer Codeversion für die Ausführung auf einem Grafikprozessor verwendet werden, wobei die hierin beschriebenen Techniken zum Einsatz kommen.
  • HINTERGRUND
  • Die Durchführung von Rechenoperationen kann erhebliche Speicher-, Zeit- und Computerressourcen in Anspruch nehmen. Die Menge an Speicher, Zeit und Rechenressourcen kann durch optimierten Code verbessert werden, aber ein Bestimmen, ob optimierter Code sicher verwendet werden kann, kann eine erhebliche Menge an zusätzlichen Ressourcen erfordern, um beispielsweise zu bestimmen, ob überlappende Speicherplätze im optimierten Code verwendet werden. In einigen Fällen ist es schwierig oder unmöglich zu bestimmen, ob optimierter Code zum Zeitpunkt der Kompilierung ohne Probleme (z. B. Speicherkonflikte) ausgeführt werden kann. Die Ausführung von nicht optimiertem Code kann einen unnötigen Ressourcenverbrauch verursachen, während die Ausführung von optimiertem Code, der möglicherweise Konflikte mit anderem Code aufweist, zu Fehlern oder anderen Problemen führen kann.
  • KURZE BESCHREIBUNG DER ZEICHNUNGEN
    • 1 veranschaulicht ein beispielhaftes Computersystem, in dem eine Codeversion ausgewählt wird, gemäß mindestens einer Ausführungsform;
    • 2 veranschaulicht eine beispielhafte Speicherabbildung, gemäß mindestens einer Ausführungsform;
    • 3 veranschaulicht eine beispielhafte Speicherabbildung mit nicht überlappendem Speicher, gemäß mindestens einer Ausführungsform;
    • 4 veranschaulicht eine beispielhafte Speicherabbildung mit möglicherweise überlappendem Speicher, gemäß mindestens einer Ausführungsform;
    • 5 veranschaulicht ein beispielhaftes Computersystem, in dem Codeversionen erzeugt werden, gemäß mindestens einer Ausführungsform;
    • 6 veranschaulicht ein beispielhaftes Verfahren zum Auswählen einer Codeversion, gemäß mindestens einer Ausführungsform;
    • 7 veranschaulicht ein beispielhaftes Codefragment, gemäß mindestens einer Ausführungsform;
    • 8 veranschaulicht ein beispielhaftes Codefragment mit Prozessor-Direktiven, gemäß mindestens einer Ausführungsform;
    • 9 veranschaulicht beispielhafte Laufzeitrichtlinien, gemäß mindestens einer Ausführungsform;
    • 10 veranschaulicht ein beispielhaftes Verfahren zum Hinzufügen von Speichertabelleneinträgen, gemäß mindestens einer Ausführungsform;
    • 11 veranschaulicht ein beispielhaftes Verfahren zum Entfernen von Speichertabelleneinträgen, gemäß mindestens einer Ausführungsform;
    • 12 veranschaulicht beispielhafte Softwareversionen mit Laufzeitrichtlinien, gemäß mindestens einer Ausführungsform;
    • 13 veranschaulicht ein beispielhaftes Rechenzentrum, gemäß mindestens einer Ausführungsform;
    • 14 veranschaulicht ein Verarbeitungssystem, gemäß mindestens einer Ausführungsform;
    • 15 veranschaulicht ein Computersystem, gemäß mindestens einer Ausführungsform;
    • 16 veranschaulicht ein System, gemäß mindestens einer Ausführungsform;
    • 17 veranschaulicht eine beispielhafte integrierte Schaltung, gemäß mindestens einer Ausführungsform;
    • 18 veranschaulicht ein Computersystem, gemäß mindestens einer Ausführungsform;
    • 19 veranschaulicht eine APU, gemäß mindestens einer Ausführungsform;
    • 20 veranschaulicht eine CPU, gemäß mindestens einer Ausführungsform;
    • 21 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice, gemäß mindestens einer Ausführungsform;
    • 22A und 22B veranschaulichen beispielhafte Grafikprozessoren, gemäß mindestens einer Ausführungsform;
    • 23A veranschaulicht einen Grafikkern, gemäß mindestens einer Ausführungsform;
    • 23B veranschaulicht eine GPGPU, gemäß mindestens einer Ausführungsform;
    • 24A veranschaulicht einen Parallelprozessor, gemäß mindestens einer Ausführungsform;
    • 24B veranschaulicht einen Verarbeitungscluster, gemäß mindestens einer Ausführungsform;
    • 24C veranschaulicht einen Grafik-Multiprozessor, gemäß mindestens einer Ausführungsform;
    • 25 veranschaulicht einen Grafikprozessor, gemäß mindestens einer Ausführungsform;
    • 26 veranschaulicht einen Prozessor, gemäß mindestens einer Ausführungsform;
    • 27 veranschaulicht einen Prozessor, gemäß mindestens einer Ausführungsform;
    • 28 veranschaulicht einen Grafikprozessorkern, gemäß mindestens einer Ausführungsform;
    • 29 veranschaulicht eine PPU, gemäß mindestens einer Ausführungsform;
    • 30 veranschaulicht einen GPC, gemäß mindestens einer Ausführungsform;
    • 31 veranschaulicht einen Streaming-Multiprozessor, gemäß mindestens einer Ausführungsform;
    • 32 veranschaulicht einen Software-Stack einer Programmierplattform, gemäß mindestens einer Ausführungsform;
    • 33 veranschaulicht eine CUDA-Implementierung eines Software-Stacks aus 31, gemäß mindestens einer Ausführungsform;
    • 34 veranschaulicht eine ROCm-Implementierung eines Software-Stacks aus 31, gemäß mindestens einer Ausführungsform;
    • 35 veranschaulicht eine OpenCL-Implementierung eines Software-Stacks aus 31, gemäß mindestens einer Ausführungsform;
    • 36 veranschaulicht Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform;
    • 37 veranschaulicht die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 32-34, gemäß mindestens einer Ausführungsform;
    • 38 veranschaulicht ausführlicher die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 32-35, gemäß mindestens einer Ausführungsform;
    • 39 veranschaulicht die Übersetzung von Quellcode vor der Kompilierung des Quellcodes, gemäß mindestens einer Ausführungsform;
    • 40A veranschaulicht ein System, das dazu konfiguriert ist, CUDA-Quellcode unter Verwendung verschiedener Arten von Verarbeitungseinheiten zu kompilieren und auszuführen, gemäß mindestens einer Ausführungsform;
    • 40B veranschaulicht ein System, das dazu konfiguriert ist, den CUDA-Quellcode von 40A unter Verwendung einer CPU und eines CUDA-fähigen Grafikprozessors zu kompilieren und auszuführen, gemäß mindestens einer Ausführungsform;
    • 40C veranschaulicht ein System, das dazu konfiguriert ist, den CUDA-Quellcode von 40A unter Verwendung einer CPU und einer nicht CUDA-fähigen GPU zu kompilieren und auszuführen, gemäß mindestens einer Ausführungsform;
    • 41 veranschaulicht einen beispielhaften Kernel, der durch ein CUDA-zu-HIP-Übersetzungswerkzeug von 40C übersetzt wurde, gemäß mindestens einer Ausführungsform;
    • 42 veranschaulicht näher eine nicht-CUDA-fähige GPU von 40C, gemäß mindestens einer Ausführungsform;
    • 43 veranschaulicht, wie Threads eines beispielhaften CUDA-Grids auf verschiedene Recheneinheiten von 42 gemappt werden, gemäß mindestens einer Ausführungsform; und
    • 44 veranschaulicht, wie bestehender CUDA-Code zu Data Parallel C++-Code zu migrieren ist, gemäß mindestens einer Ausführungsform.
  • DETAILLIERTE BESCHREIBUNG
  • 1 veranschaulicht ein beispielhaftes Computersystem 100, in dem gemäß mindestens einer Ausführungsform eine Codeversion ausgewählt wird. In mindestens einer Ausführungsform führt ein Prozessor 102 Anweisungen zur Implementierung eines Compilers 108 aus oder führt diese anderweitig aus. In mindestens einer Ausführungsform ist der Prozessor 102 ein Prozessor, wie er hierin zumindest in Verbindung mit 13-44 beschrieben ist. In mindestens einer Ausführungsform ist der Prozessor 102 beispielsweise eine CPU oder eine GPU oder eine GPGPU oder eine PPU oder ein Beschleuniger oder eine andere Art von Prozessor, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform, die in 1 nicht dargestellt ist, ist der Prozessor 102 einer aus einer Vielzahl von Prozessoren, die Elemente des beispielhaften Computersystems 100 sind.
  • In mindestens einer Ausführungsform ist ein Compiler 108 ein Compiler, wie er hierin zumindest in Verbindung mit 13-44 beschrieben ist. In mindestens einer Ausführungsform empfängt der Compiler 108 Quellcode 104. In mindestens einer Ausführungsform kompiliert der Compiler 108 den Quellcode 104 zu plattformunabhängigem Code, wie z. B. plattformunabhängigem PTX (Parallel Thread Execution)-Code, wie hierin beschrieben. In mindestens einer Ausführungsform kompiliert ein zweiter Compiler (in 1 nicht dargestellt) plattformunabhängigen Code in Maschinencode, wie hierin beschrieben. In mindestens einer Ausführungsform kompiliert der Compiler 108 den Quellcode 104 direkt in Maschinencode, wie hierin beschrieben.
  • In mindestens einer Ausführungsform ist der Quellcode 104 ein Quellcode, wie er hierin zumindest im Zusammenhang mit 13-44 beschrieben ist. In mindestens einer Ausführungsform empfängt der Compiler 108 Direktiven 106. In mindestens einer Ausführungsform sind die Direktiven 106 Compiler-Direktiven. In mindestens einer Ausführungsform sind die Direktiven 106 Präprozessor-Direktiven. In mindestens einer Ausführungsform stellen die Direktiven 106 einem Compiler wie dem Compiler 108 zusätzliche Direktiven zur Verfügung, damit dieser beispielsweise optimierten Code erzeugen kann. In mindestens einer Ausführungsform ist der erzeugte optimierte Code ein Code mit einer oder mehreren Optimierungen zur Verbesserung von Effizienz, Geschwindigkeit, Speichernutzung und/oder anderen derartigen Verbesserungen. In mindestens einer Ausführungsform ist der erzeugte optimierte Code für die Ausführung auf einer oder mehreren Prozessorarchitekturen, wie sie hierin beschrieben sind, optimiert.
  • In mindestens einer Ausführungsform verwendet der Compiler 108 den Quellcode 104, um eine Speichertabelle 110 zu erzeugen, wobei er Systeme und Verfahren wie die hierin beschriebenen verwendet. In mindestens einer Ausführungsform verwendet der Compiler 108 den Quellcode 104 und die Direktiven 106, um die Speichertabelle 110 zu erzeugen, wobei er Systeme und Verfahren verwendet, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform verwendet der Compiler 108 beispielsweise den Quellcode 104 und die Direktiven 106, um die Speichertabelle 110 mit Hilfe von Systemen und Verfahren, wie sie hierin beschrieben sind, zu erzeugen.
  • In mindestens einer Ausführungsform verwendet der Compiler 108 den Quellcode 104, um Software-Kernel 112 (z. B. Kernel für Grafikverarbeitungseinheiten (GPU) wie die hierin beschriebenen) zu erzeugen, wobei er Systeme und Verfahren wie die hierin beschriebenen verwendet. In mindestens einer Ausführungsform verwendet der Compiler 108 den Quellcode 104 und die Direktiven 106, um die Software-Kernel 112 zu erzeugen, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform verwendet der Compiler 108 beispielsweise den Quellcode 104 und die Direktiven 106, um die Software-Kernel 112 unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen zu erzeugen. In mindestens einer Ausführungsform verwendet der Compiler 108 Direktiven und/oder den Quellcode 104, um eine Vielzahl von Software-Kerneln zu erzeugen, die optimiert werden können, um die Geschwindigkeit zu erhöhen oder die Speichersicherheit zu erhöhen oder die Speichergröße zu verringern, oder die optimiert werden können, um eine oder mehrere andere derartige Optimierungsarten zu verbessern.
  • In mindestens einer Ausführungsform wird, wenn der Compiler 108 Direktiven und/oder Quellcode 104 verwendet, um die Speichertabelle 110 zu erzeugen, eine Speichertabelle 120 erzeugt. In mindestens einer Ausführungsform wird die Speichertabelle 120 in einem mit dem Prozessor 102 assoziierten Speicher gespeichert. In mindestens einer Ausführungsform, die in 1 nicht dargestellt ist, wird die Speichertabelle 120 in einem mit einem Grafikprozessor 116 assoziierten Speicher gespeichert. In mindestens einer Ausführungsform werden die Software-Kernel 122 erzeugt, wenn der Compiler 108 Direktiven und/oder Quellcode 104 verwendet, um die Software-Kernel 112 zu erzeugen. In mindestens einer Ausführungsform ist der Grafikprozessor 116 ein Grafikprozessor, wie er hierin zumindest in Verbindung mit den beschrieben ist. In mindestens einer Ausführungsform ist der Grafikprozessor 116 beispielsweise eine CPU oder eine GPU oder eine GPGPU oder eine PPU oder ein Beschleuniger oder ein anderer Prozessor, wie er hierin beschrieben ist. In mindestens einer Ausführungsform, die in 1 nicht dargestellt ist, ist der Grafikprozessor 116 einer aus einer Vielzahl von Grafikprozessoren, die Elemente des beispielhaften Computersystems 100 sind.
  • In mindestens einer Ausführungsform führt der Prozessor 102 einen oder mehrere Anweisungen aus, um einen Kernel 124 aus den Software-Kerneln 122 auszuwählen, basierend zumindest teilweise auf der Speichertabelle 120, unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform führt der Prozessor 102 einen oder mehrere Anweisungen aus, um den Kernel 124 aus den Software-Kerneln 122 auszuwählen, basierend zumindest teilweise auf der Speichertabelle 120, während einer Laufzeit 118, unter Verwendung einer Laufzeitumgebung und/oder unter Verwendung einer oder mehrerer Laufzeit-Anwendungsprogrammierschnittstellen (APIs), wie sie hierin beschrieben sind.
  • In mindestens einer Ausführungsform führt der Grafikprozessor 116 einen ausgewählten Kernel 126 aus, um mindestens einen Teil der im Quellcode 104 beschriebenen Funktionen auszuführen. In mindestens einer Ausführungsform wird der Grafikprozessorspeicher 114, der ein dem Grafikprozessor 116 zugeordneter Speicher ist, durch einen oder mehrere Einträge in der Speichertabelle 120 referenziert, wie hierin zumindest in Verbindung mit 2 beschrieben. In mindestens einer Ausführungsform führt der Grafikprozessor 116 Anweisungen aus, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform führt der Grafikprozessor 116 Anweisungen aus, um aus mehreren Versionen eines Teils eines auszuführenden Programms auszuwählen, basierend zumindest teilweise auf einer oder mehreren Speicherstellen, auf die durch eine oder mehrere der mehreren Versionen zuzugreifen ist, oder führt diese Anweisungen anderweitig aus.
  • 2 veranschaulicht eine beispielhafte Speicherzuordnung oder Speicherabbildung 200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform hat ein Grafikprozessorspeicher 202 einen oder mehrere Speicherbereiche. In mindestens einer Ausführungsform ist der Grafikprozessorspeicher der Speicher eines Grafikprozessors, wie z. B. des Grafikprozessors 116, der hierin zumindest in Verbindung mit 1 beschrieben ist. In mindestens einer Ausführungsform hat der Grafikprozessorspeicher 202 beispielsweise einen Speicherbereich 204, einen Speicherbereich 206, einen Speicherbereich 208, einen Speicherbereich 210 und einen Speicherbereich 212.
  • In mindestens einer Ausführungsform sind Speicherbereiche wie beispielsweise der Speicherbereich 204, der Speicherbereich 206, der Speicherbereich 208, der Speicherbereich 210 und der Speicherbereich 212 nicht überlappende Speicherbereiche, so dass, wenn der Grafikprozessorspeicher 202 beispielsweise acht Gigabyte (GB) groß ist, der Speicherbereich 204 ein erstes Gigabyte, der Speicherbereich 206 ein zweites Gigabyte, der Speicherbereich 208 ein drittes Gigabyte usw. ist. In mindestens einer Ausführungsform überlappen sich Speicherbereiche wie beispielsweise der Speicherbereich 204, der Speicherbereich 206, der Speicherbereich 208, der Speicherbereich 210 und der Speicherbereich 212 teilweise, so dass mindestens ein Teil des Grafikprozessorspeichers 202 innerhalb einer Vielzahl von Speicherbereichen liegt. In mindestens einer Ausführungsform überspannen Speicherbereiche wie der Speicherbereich 204, der Speicherbereich 206, der Speicherbereich 208, der Speicherbereich 210 und der Speicherbereich 212 den Grafikprozessorspeicher 202, so dass sich jeder Teil des Grafikprozessorspeichers 202 in genau einem Speicherbereich befindet. In mindestens einer Ausführungsform sind Speicherbereiche wie der Speicherbereich 204, der Speicherbereich 206, der Speicherbereich 208, der Speicherbereich 210 und der Speicherbereich 212 so aufgefüllt, dass es Teile des Grafikprozessorspeichers 202 gibt, die sich nicht in einem Speicherbereich befinden.
  • In mindestens einer Ausführungsform speichert eine Speichertabelle 224 eine oder mehrere Bereichskennungen, die zur Identifizierung von Speicherbereichen in dem Grafikprozessorspeicher 202 verwendet werden können. In mindestens einer Ausführungsform ist die Speichertabelle 224 eine Speichertabelle wie beispielsweise die Speichertabelle 120, die hierin zumindest in Verbindung mit 1 beschrieben ist. In mindestens einer Ausführungsform speichert die Speichertabelle 224 eine oder mehrere Bereichkennungen, wie die Bereichkennung 214, die Bereichkennung 216, die Bereichkennung 218, die Bereichkennung 220 und die Bereichkennung 222, die Speicherbereichen in dem Grafikprozessorspeicher 202 identifizieren. In mindestens einer Ausführungsform wird beispielsweise die Bereichkennung 214 zur Identifizierung der Speicherbereich 204, die Bereichkennung 216 zur Identifizierung der Speicherbereich 206, die Bereichkennung 218 zur Identifizierung der Speicherbereich 208, die Bereichkennung 2220 zur Identifizierung der Speicherbereich 210 und die Bereichkennung 222 zur Identifizierung der Speicherbereich 212 verwendet.
  • In mindestens einer Ausführungsform wird die Speichertabelle 224 in einer Datenstruktur wie z. B. einer Liste, einer verknüpften Liste, einem Array, einem Baum oder einer anderen Art von Datenstruktur gespeichert. In mindestens einer Ausführungsform wird die Speichertabelle 224 in einer selbstabgleichenden Datenstruktur wie einem Rot-Schwarz-Baum gespeichert. In mindestens einer Ausführungsform wird eine Datenstruktur zum Speichern der Speichertabelle 224 verwendet, um eine schnellere Suche in der Speichertabelle 224 zu ermöglichen. In mindestens einer Ausführungsform, zum Beispiel, wenn die Speichertabelle 224 unter Verwendung einer selbstabgleichenden Datenstruktur wie einem Rot-Schwarz-Baum gespeichert wird, kann die Speichertabelle 224 in O(log(N)) Zeit durchsucht werden, wobei N eine Anzahl von Einträgen in der Speichertabelle 224 ist. In mindestens einer Ausführungsform können, wenn die Speichertabelle 224 unter Verwendung einer selbstabgleichenden Datenstruktur wie beispielsweise einem Rot-Schwarz-Baum gespeichert wird, alle Host-Zeiger in der Speichertabelle 224 in O(M * log(N)) Zeit durchsucht werden, wobei N eine Anzahl von Einträgen in der Speichertabelle 224 und M eine Anzahl von Host-Zeigern ist. In mindestens einer Ausführungsform kann die Speichertabelle 224 zusätzliche Daten enthalten, wie z. B. Angaben darüber, welche Speicherbereiche zum Speichern von Daten verwendet werden, zusätzliche Daten und/oder Metadaten über Speicherbereiche, Referenzzählungen (oder aktuelle Zählungen) von Daten in Speicherbereichen und/oder andere derartige Informationen, wie sie hierin beschrieben sind.
  • 3 veranschaulicht eine beispielhafte Speicherabbildung 300 mit nicht überlappendem Speicher, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform gibt eine Speicheradresse 308 eine Speicherposition 310 in einem Speicherbereich 304 des Grafikprozessorspeichers 302 an. In mindestens einer Ausführungsform ist der Speicherbereich 304 ein Speicherbereich, wie z.B. der Speicherbereich 204, der Speicherbereich 206, der Speicherbereich 208, der Speicherbereich 210 und/oder der Speicherbereich 212, der hierin zumindest in Verbindung mit 2 beschrieben ist. In mindestens einer Ausführungsform ist der Grafikprozessorspeicher 302 ein Grafikprozessorspeicher wie beispielsweise der Grafikprozessorspeicher 202, wie hierin zumindest in Verbindung mit 2 beschrieben. In mindestens einer Ausführungsform gibt die Speicheradresse 308 eine Startposition des Speichers 310 an. In mindestens einer Ausführungsform gibt die Speicheradresse 308 eine Ausdehnung des Speichers 310 an. In mindestens einer Ausführungsform kann die Speicheradresse 308 beispielsweise angeben, dass der Speicher 310 an einer Stelle innerhalb des Speicherbereichs 304 beginnt und eine angegebene Anzahl von Bytes umfasst. In mindestens einer Ausführungsform kann eine Speichertabelle wie beispielsweise die hierin zumindest in Verbindung mit 1 beschriebene Speichertabelle 120 Daten enthalten, die anzeigen, dass die Speicheradresse 308 den Speicher in dem Speicherbereich 304 angibt. In mindestens einer Ausführungsform ist die Speicheradresse 308 eine Host-Adresse und wird beispielsweise in einem Speicher gespeichert, der mit einem Prozessor wie dem Prozessor 102 assoziiert ist, wie hierin zumindest in Verbindung mit 1 beschrieben.
  • In mindestens einer Ausführungsform gibt eine Speicheradresse 312 einen Speicherplatz 314 in einem Speicherbereich 306 des Grafikprozessorspeichers 302 an. In mindestens einer Ausführungsform ist ein Speicherbereich wie beispielsweise der Speicherbereich 306 eine Gruppe von Speicherplätzen in dem Grafikprozessorspeicher 302. In mindestens einer Ausführungsform ist ein Speicherbereich wie beispielsweise der Speicherbereich 306 ein Satz von Speicherplätzen innerhalb des Grafikprozessorspeichers 302 mit einem entsprechenden Satz von aufeinanderfolgenden Speicheradressen. In mindestens einer Ausführungsform ist ein Speicherbereich wie beispielsweise der Speicherbereich 306 ein Satz von Speicherplätzen innerhalb des Grafikprozessorspeichers 302 mit einem entsprechenden Satz von aufeinanderfolgenden virtuellen Speicheradressen. In mindestens einer Ausführungsform ist ein Speicherbereich, wie beispielsweise der Speicherbereich 306, ein Satz von physischen oder virtuellen Speicherplätzen. In mindestens einer Ausführungsform ist ein Speicherbereich wie beispielsweise der Speicherbereich 306 ein Satz von nicht zusammenhängenden (oder nicht aufeinanderfolgenden) physischen oder virtuellen Speicherplätzen. In mindestens einer Ausführungsform ist der Speicherbereich 306 ein Speicherbereich wie beispielsweise der Speicherbereich 204, der Speicherbereich 206, der Speicherbereich 208, der Speicherbereich 210 und/oder der Speicherbereich 212, der hierin zumindest in Verbindung mit 2 beschrieben ist. In mindestens einer Ausführungsform, wie in 3 dargestellt, ist der Speicher 310 in einem anderen Speicherbereich (z.B. Speicherbereich 304) enthalten als ein Speicherbereich, der den Speicher 314 enthält (z.B. Speicherbereich 306), und dementsprechend überschneiden oder überlappen sich der Speicher 310 und der Speicher 314 nicht, wie hierin beschrieben.
  • In mindestens einer Ausführungsform, die in 3 nicht dargestellt ist, können der Speicher 310 und/oder der Speicher 314 in einer Vielzahl von Speicherbereichen enthalten sein. In mindestens einer Ausführungsform, wenn beispielsweise der Speicherbereich 304 ein GB des Grafikprozessorspeichers 302 umfasst und die Speicheradresse 308 mehr als ein GB Speicher angibt, kann der Speicher 310 mehrere Speicherbereiche in dem Grafikprozessorspeicher 302 abdecken.
  • 4 veranschaulicht eine beispielhafte Speicherabbildung 400 mit möglicherweise überlappendem Speicher, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform gibt eine Speicheradresse 408 eine Position des Speichers 410 in einem Speicherbereich 404 des Grafikprozessorspeichers 402 an. In mindestens einer Ausführungsform ist die Speicheradresse 408 eine Speicheradresse wie z. B. die Speicheradresse 308, ist der Speicherbereich 404 ein Speicherbereich wie z. B. der Speicherbereich 304, und ist der Grafikprozessorspeicher 402 ein Grafikprozessorspeicher wie z. B. der Grafikprozessorspeicher 302, wie hierin zumindest in Verbindung mit 3 beschrieben. In mindestens einer Ausführungsform gibt eine Speicheradresse 412 eine Position des Speichers 414 in einem Speicherbereich 406 des Grafikprozessorspeichers 402 an. In mindestens einer Ausführungsform ist die Speicheradresse 412 eine Speicheradresse wie z. B. die Speicheradresse 312 und ist der Speicherbereich 406 ein Speicherbereich wie z. B. der Speicherbereich 306, wie hierin zumindest in Verbindung mit 3 beschrieben.
  • In mindestens einer Ausführungsform gibt eine Speicheradresse 416 eine Position des Speichers 418 in einem Speicherbereich 404 des Grafikprozessorspeichers 402 an. In mindestens einer Ausführungsform, wie in 4 dargestellt, ist der Speicher 410 in einem anderen Speicherbereich (z. B. Speicherbereich 404) enthalten als ein Speicherbereich, der den Speicher 414 enthält (z. B. Speicherbereich 406), und dementsprechend überschneiden oder überlappen sich der Speicher 410 und der Speicher 414 nicht, wie hierin beschrieben. In mindestens einer Ausführungsform, wie in 4 dargestellt, ist der Speicher 410 in einem Speicherbereich (z.B. Speicherbereich 404) enthalten, der ein Speicherbereich ist, der den Speicher 418 enthält, und dementsprechend können sich der Speicher 410 und der Speicher 418 überlappen, wie hierin beschrieben. In mindestens einer Ausführungsform überlappen sich der Speicher 410 und der Speicher 418 nicht, wenn beispielsweise der Speicher 410 ein erstes Megabyte (MB) des Speicherbereichs 404 und der Speicher 418 ein zweites (oder späteres) MB des Speicherbereichs 404 ist, aber da sich der Speicher 410 und der Speicher 418 beide in dem Speicherbereich 404 befinden, können sich die Speicher 410 und 418 überlappen. In mindestens einer Ausführungsform überlappen sich der Speicher 410 und der Speicher 418 nicht, wenn beispielsweise der Speicher 410 die ersten zehn MB des Speicherbereichs 404 ist und der Speicher 418 einen Speicher enthält, der innerhalb der ersten zehn MB des Speicherbereichs 404 liegt, aber ein Prozess, der die Speicheradresse 408 verwendet, nur einen Teil der Speicheradresse 408 nutzt, der sich nicht mit dem Speicher 418 überlappt, und dementsprechend können sich der Speicher 410 und der Speicher 418 überlappen, da sich der Speicher 410 und der Speicher 418 beide in dem Speicherbereich 404 befinden.
  • 5 veranschaulicht ein beispielhaftes Computersystem 500, in dem Codeversionen gemäß mindestens einer Ausführungsform erzeugt werden. In mindestens einer Ausführungsform erzeugt ein auf dem Prozessor 502 ausgeführter Compiler 508 einen oder mehrere Software-Kernel unter Verwendung von Quellcode 504 und Direktiven 506, wie hierin beschrieben. In mindestens einer Ausführungsform ist der Compiler 508 ein Compiler, wie z. B. der Compiler 108, ist der Prozessor 502 ein Prozessor, wie z. B. der Prozessor 102, ist der Quellcode 504 ein Quellcode, wie z. B. der Quellcode 104, und sind die Direktiven 506 Direktiven, wie z. B. die Direktiven 106, die alle hierin zumindest in Verbindung mit 1 beschrieben sind.
  • In mindestens einer Ausführungsform, wie in 5 dargestellt, erzeugt der Compiler 508 mindestens einen ersten Software-Kernel 510, bei dem es sich um einen optimierten Kernel handelt, bei dem es keine Speicherüberschneidungen oder Speicherüberlappungen gibt (hierin auch als „kein Speicher-Aliasing“ bezeichnet). In mindestens einer Ausführungsform, wie in 5 dargestellt, erzeugt der Compiler 508 mindestens einen zweiten Software-Kernel 512, der ein weniger optimierter Kernel ist (z. B. ein Kernel mit weniger Optimierungen als der erste Software-Kernel 510), bei dem es zu einer möglichen Speicherüberlappung kommt (hierin auch als mögliche Speicherüberlappung bezeichnet). In mindestens einer Ausführungsform erzeugt der Prozessor 502 eine Vielzahl von Versionen von Programmcode (z. B. des Quellcodes 504), von denen der erste Software-Kernel 510 eine erste Version und der zweite Software-Kernel 512 eine zweite Version ist. In mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, führt ein Grafikprozessor wie beispielsweise der Grafikprozessor 116 (wie hierin zumindest in Verbindung mit 1 beschrieben) Anweisungen aus oder führt sie anderweitig aus, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode (z. B. erster Software-Kernel 510 und/oder zweiter Software-Kernel 512) auszuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, wie hierin beschrieben. In mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, führt ein Grafikprozessor, wie z. B. der Grafikprozessor 116 (wie hierin zumindest in Verbindung mit 1 beschrieben), Anweisungen aus oder führt sie anderweitig aus, um aus mehreren Versionen eines Teils eines auszuführenden Programms (z. B. des ersten Software-Kernels 510 und/oder des zweiten Software-Kernels 512) auszuwählen, und zwar zumindest teilweise auf der Grundlage einer oder mehrerer Speicherstellen, auf die von einer oder mehreren der mehreren Versionen zuzugreifen ist, wie hierin beschrieben.
  • 6 veranschaulicht einen beispielhaften Prozess 600 zum Auswählen einer Codeversion, in Übereinstimmung mit mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Prozessor, wie z. B. der Prozessor 102, der hierin zumindest in Verbindung mit 1 beschrieben ist, einen oder mehrere Schritte des beispielhaften Prozesses 600 zur Laufzeit durch, wie hierin beschrieben. In mindestens einer Ausführungsform führt ein Grafikprozessor, wie z. B. der Grafikprozessor 116, der hierin zumindest in Verbindung mit 1 beschrieben ist, einen oder mehrere Schritte des beispielhaften Prozesses 600 zur Laufzeit durch, wie hierin beschrieben. In mindestens einer Ausführungsform führen ein oder mehrere Prozessoren, wie sie hierin zumindest im Zusammenhang mit 1-44 beschrieben sind, einen oder mehrere Schritte des beispielhaften Prozesses 600 durch.
  • In mindestens einer Ausführungsform wird in einem Schritt 602 des beispielhaften Prozesses 600 eine erste Adresse empfangen. In mindestens einer Ausführungsform kann in Schritt 602 eine erste Adresse einen Speicherplatz und/oder auch einen oder mehrere Speicherplatzparameter enthalten, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform wird der beispielhafte Prozess 600 nach Schritt 602 mit einem Schritt 604 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 604 des beispielhaften Prozesses 600 eine Gerätespeicheradresse (z. B. eine Speicheradresse auf einem Gerät) empfangen. In mindestens einer Ausführungsform kann sich in Schritt 604 eine Gerätespeicheradresse auf einen Speicher beziehen, der innerhalb eines Speicherbereichs, wie er hierin beschrieben ist, zugewiesen ist. In mindestens einer Ausführungsform, die in 6 nicht dargestellt ist, kann eine Kennung eines Speicherbereichs, in dem sich der Gerätespeicher befindet, mit Hilfe von Systemen und Verfahren, wie den hierin beschriebenen, bestimmt werden. In mindestens einer Ausführungsform wird der beispielhafte Prozess 600 nach Schritt 604 mit einem Schritt 606 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 606 des beispielhaften Prozesses 600 eine in Schritt 602 empfangene Adresse mit einer in Schritt 604 empfangenen Gerätespeicheradresse verknüpft. In mindestens einer Ausführungsform wird eine in Schritt 602 empfangene Adresse einer Gerätespeicheradresse zugeordnet, wobei Systeme und Verfahren verwendet werden, wie sie hierin zumindest in Verbindung mit den und beschrieben sind. In mindestens einer Ausführungsform wird der beispielhafte Prozess 600 nach Schritt 606 mit einem Schritt 608 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 608 des beispielhaften Prozesses 600 ein Speicherbereich des in Schritt 604 empfangenen Gerätespeichers identifiziert. In mindestens einer Ausführungsform kann beispielsweise, wenn sich der im Schritt 604 empfangene Gerätespeicher in einem Speicherbereich befindet, wie z. B. dem Speicherbereich 204, dem Speicherbereich 206, dem Speicherbereich 208, dem Speicherbereich 210 und/oder dem Speicherbereich 212 (wie hierin mindestens in Verbindung mit 2 beschrieben), eine Bereichkennung, wie z. B. die Bereichkennung 214, die Bereichkennung 216, die Bereichkennung 218, die Bereichkennung 220 und/oder die Bereichkennung 222 (ebenfalls wie hierin mindestens in Verbindung mit 2 beschrieben) verwendet werden, um einen Speicherbereich des in Schritt 604 empfangenen Gerätespeichers zu identifizieren. In mindestens einer Ausführungsform wird der beispielhafte Prozess 600 nach Schritt 608 mit einem Schritt 610 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 610 des beispielhaften Prozesses 600 bestimmt, ob sich ein in Schritt 608 identifizierter Speicherbereich mit einem oder mehreren anderen zuvor identifizierten Speicherbereichen überschneidet oder überlappt (oder Aliase aufweist). In mindestens einer Ausführungsform kann beispielsweise in einer ersten Iteration des beispielhaften Prozesses 600 ein erster Speicherbereich und in einer zweiten Iteration des beispielhaften Prozesses 600 ein zweiter Speicherbereich identifiziert werden, und wenn ein erster Speicherbereich und ein zweiter Speicherbereich identisch sind, kann in Schritt 610 bestimmt werden, dass ein in Schritt 608 identifizierter Speicherbereich sich mit einem oder mehreren anderen zuvor identifizierten Speicherbereichen überschneidet oder überlappt (oder Aliase aufweist). In mindestens einer Ausführungsform kann beispielsweise ein erster Speicherbereich bei einer ersten Iteration des beispielhaften Prozesses 600 und ein zweiter Speicherbereich bei einer zweiten Iteration des beispielhaften Prozesses 600 identifiziert werden, und wenn ein erster Speicherbereich und ein zweiter Speicherbereich zumindest teilweise identisch sind, kann in Schritt 610 bestimmt werden, dass ein in Schritt 608 identifizierter Speicherbereich sich mit einem oder mehreren anderen zuvor identifizierten Speicherbereichen überschneidet oder überlappt (oder Aliase aufweist). In mindestens einer Ausführungsform wird in Schritt 610, falls bestimmt wird, dass ein in Schritt 608 identifizierter Speicherbereich sich mit einem oder mehreren anderen zuvor identifizierten Speicherbereichen überschneidet oder überlappt (oder Aliase aufweist) („JA“-Zweig), der beispielhafte Prozess 600 in einem Schritt 616 fortgesetzt. In mindestens einer Ausführungsform wird der beispielhafte Prozess 600 in Schritt 610 mit einem Schritt 612 fortgesetzt, falls bestimmt wird, dass ein in Schritt 608 identifizierter Speicherbereich sich nicht mit einem oder mehreren anderen zuvor identifizierten Speicherbereichen überschneidet oder überlappt (oder ein Alias ist) („NEIN“-Zweig).
  • In mindestens einer Ausführungsform wird in Schritt 612 des beispielhaften Prozesses 600 bestimmt, ob es eine nächste zu verarbeitende Adresse gibt. In mindestens einer Ausführungsform wird in Schritt 612, falls bestimmt wird, dass es eine nächste zu verarbeitende Adresse gibt („JA“-Zweig), der beispielhafte Prozess 600 in Schritt 602 fortgesetzt, um eine nächste Adresse zu verarbeiten. In mindestens einer Ausführungsform wird in Schritt 610, falls bestimmt wird, dass es keine nächste zu verarbeitende Adresse gibt („NEIN“-Zweig), der beispielhafte Prozess 600 in Schritt 614 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 614 des beispielhaften Prozesses 600 bestimmt (z. B. in Schritt 610 bei jeder Iteration des beispielhaften Prozesses 600), dass es keine Überlappung (oder Aliasing) von Speicherbereichen gibt und dementsprechend ein erster (oder optimierter) Kernel verwendet werden kann (z. B. der erste Software-Kernel 510, wie hierin zumindest in Verbindung mit 5 beschrieben). In mindestens einer Ausführungsform wird in Schritt 614 die Auswahl eines ersten Kernels mit Hilfe von Systemen und Verfahren, wie sie hierin beschrieben sind, durchgeführt. In mindestens einer Ausführungsform wird der beispielhafte Prozess 600 nach Schritt 614 beendet. In mindestens einer Ausführungsform, die in 6 nicht dargestellt ist, wird der beispielhafte Prozess 600 nach Schritt 614 in Schritt 602 fortgesetzt, um eine nächste Adresse zu verarbeiten.
  • In mindestens einer Ausführungsform wird in Schritt 616 des beispielhaften Prozesses 600 bestimmt (z. B. in Schritt 610 bei mindestens einer Iteration des beispielhaften Prozesses 600), dass die Möglichkeit einer Überlappung (oder eines Aliasing) von Speicherbereichen besteht und dementsprechend ein zweiter (oder weniger optimierter) Kernel verwendet werden kann (z. B. der zweite Software-Kernel 512, wie hierin zumindest in Verbindung mit 5 beschrieben). In mindestens einer Ausführungsform wird in Schritt 614 die Auswahl eines zweiten Kernels mit Hilfe von Systemen und Verfahren, wie sie hierin beschrieben sind, durchgeführt. In mindestens einer Ausführungsform wird der beispielhafte Prozess 600 nach Schritt 616 beendet. In mindestens einer Ausführungsform, die in 6 nicht dargestellt ist, wird der beispielhafte Prozess 600 nach Schritt 616 in Schritt 602 fortgesetzt, um eine nächste Adresse zu verarbeiten.
  • In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 600 in einer anderen Reihenfolge durchgeführt als in 6 dargestellt. In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 600 parallel ausgeführt. In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 600 von einer Vielzahl von Threads durchgeführt, die auf einem oder mehreren Prozessoren ausgeführt werden, wie sie hierin zumindest in Verbindung mit 1-44 beschrieben sind.
  • 7 veranschaulicht ein beispielhaftes Codefragment 700 in Übereinstimmung mit mindestens einer Ausführungsform. In mindestens einer Ausführungsform verwendet ein Quellcode 710 Eingaben 702 zur Durchführung von Berechnungen. In mindestens einer Ausführungsform umfassen die Eingaben 702, wie hierin beschrieben, ein Feld oder Array „a“ 704, ein Feld oder Array „b“ 706 und ein Feld oder Array „c“ 708. In mindestens einer Ausführungsform enthält der Quellcode 710 eine Schleife, die bei jeder Iteration der Schleife ein Produkt aus einem Element des Arrays „b“ 706 und einem Element des Arrays „c“ 708 zu einem Element des Arrays „a“ 704 addiert.
  • In mindestens einer Ausführungsform, wie in 7 dargestellt, wird bei einer ersten Iteration 712 des Quellcodes 710 (z. B. Schleifenindex 0) ein Produkt aus einem ersten Element des Arrays „b“ 706 und einem ersten Element des Arrays „c“ 708 zu einem ersten Element des Arrays „a“ 704 addiert. In mindestens einer Ausführungsform, wie in 7 dargestellt, wird bei einer zweiten Iteration 714 des Quellcodes 710 (z. B. Schleifenindex 1) ein Produkt aus einem zweiten Element des Arrays „b“ 706 und einem zweiten Element des Arrays „c“ 708 zu einem zweiten Element des Arrays „a“ 704 addiert. In mindestens einer Ausführungsform, wie in 7 dargestellt, wird bei einer dritten Iteration 716 des Quellcodes 710 (z. B. Schleifenindex 2) ein Produkt aus einem dritten Element des Arrays „b“ 706 und einem dritten Element des Arrays „c“ 708 zu einem dritten Element des Arrays „a“ 704 addiert. In mindestens einer Ausführungsform, wie in 7 dargestellt, wird bei einer vierten Iteration 718 des Quellcodes 710 (z. B. Schleifenindex 3) ein Produkt aus einem vierten Element des Arrays „b“ 706 und einem vierten Element des Arrays „c“ 708 zu einem vierten Element des Arrays „a“ 704 addiert.
  • In mindestens einer Ausführungsform, wie in 7 dargestellt, werden die Arrays „b“ 706 und „c“ 708 durch die Ausführung des Quellcodes 710 nicht verändert und zeigen Ausgaben 720 des Quellcodes 710, dass das Ausgabearray „b“ 724 identisch mit dem Array „b“ der Eingaben 702 und das Ausgabearray „c“ 726 identisch mit dem Array „c“ 708 der Eingaben 702 ist. In mindestens einer Ausführungsform, wie in 7 dargestellt, wird das Array „a“ durch die Ausführung des Quellcodes 710 verändert und unterscheidet sich das Ausgabearray „a“ 722 von dem Array „a“ 704 der Eingaben 702.
  • In mindestens einer Ausführungsform, die in 7 nicht dargestellt ist, kann ein Software-Kernel aus dem Quellcode 710 erzeugt werden. In mindestens einer Ausführungsform kann ein aus dem Quellcode 710 erzeugter Software-Kernel ein optimierter Software-Kernel sein, der die erste Iteration 712, die zweite Iteration 714, die dritte Iteration 716 und die vierte Iteration 718 unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, parallel ausführen kann (z. B. als ein Kernel zwei 1208, hierin zumindest in Verbindung mit 12 beschrieben). In mindestens einer Ausführungsform kann ein aus dem Quellcode 710 erzeugter Software-Kernel ein weniger optimierter Software-Kernel sein, der die erste Iteration 712, die zweite Iteration 714, die dritte Iteration 716 und die vierte Iteration 718 nacheinander unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind, ausführen kann (z. B. als ein Kernel eins 1202, hierin zumindest in Verbindung mit 12 beschrieben). In mindestens einer Ausführungsform kann, falls bestimmt wird, dass ein Speicherbereich, in dem das Array „a“ 704 gespeichert ist, sich nicht mit einem anderen Speicherbereich überschneidet oder überlappt (oder ein Alias ist), unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen, ein Software-Kernel ausgeführt werden, der die erste Iteration 712, die zweite Iteration 714, die dritte Iteration 716 und die vierte Iteration 718 parallel ausführt oder anderweitig durchführt. In mindestens einer Ausführungsform kann, falls bestimmt wird, dass ein Speicherbereich, in dem das Array „a“ 704 gespeichert ist, sich mit einem anderen Speicherbereich überschneidet oder überlappt (oder ein Alias ist), unter Verwendung von Systemen und Verfahren wie den hierin beschriebenen ein Software-Kernel ausgeführt werden, der die erste Iteration 712, die zweite Iteration 714, die dritte Iteration 716 und die vierte Iteration 718 nacheinander ausführt oder anderweitig durchführt.
  • In mindestens einer Ausführungsform, wie in 7 dargestellt ist, kann ein Software-Kernel, der die erste Iteration 712, die zweite Iteration 714, die dritte Iteration 716 und die vierte Iteration 718 parallel ausführt oder anderweitig durchführt, wenn sich ein Speicherbereich, in dem sich das Array „b“ 706 befindet, mit einem anderen Speicherbereich überschneidet oder überlappt (oder Aliase aufweist) und/oder wenn sich ein Speicherbereich, in dem sich das Array „c“ 708 befindet, mit einem anderen Speicherbereich überschneidet (oder Aliase aufweist), ausgeführt werden, da das Array „b“ 706 und das Array „c“ 708 durch den Quellcode 710 nicht geändert werden.
  • 8 veranschaulicht ein beispielhaftes Codefragment 800 mit Prozessor-Direktiven, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform enthält das beispielhafte Codefragment 800 mit Prozessor-Direktiven ein erstes Codefragment 810, das ein Codefragment wie beispielsweise der Quellcode 710 ist, der hierin zumindest in Verbindung mit 7 beschrieben ist, mit zusätzlichen Prozessor-Direktiven (z. B. „#pragma parallel loop copy(a[0:4]) copyin(b[0:4],c[0:4])“). In mindestens einer Ausführungsform umfassen Eingaben 802 ein Array „a“ 804, ein Array „b“ 806 und ein Array „c“ 808, die mit den Eingaben 702 identisch sind, wie hierin zumindest in Verbindung mit 7 beschrieben. In mindestens einer Ausführungsform umfassen Ausgaben 812 ein Array „a“ 814, ein Array „b“ 816 und ein Array „c“ 818, die mit den Ausgaben 720 identisch sind, wie hierin zumindest in Verbindung mit 7 beschrieben.
  • In mindestens einer Ausführungsform, wie in 8 dargestellt, geben die Prozessor-Direktiven (die hierin auch als Compiler-Direktiven oder Direktiven bezeichnet werden) in dem ersten Codefragment 810 an, wie der mit den Eingaben und Ausgaben verbundene Speicher in den und aus dem Speicher eines Grafikprozessors, wie hierin beschrieben, zu kopieren ist. In mindestens einer Ausführungsform soll „copy(a[0:4])“ anzeigen, dass das Array „a“ vor der Ausführung eines Software-Kernels in den Speicher des Grafikprozessors kopiert und nach der Ausführung eines Software-Kernels aus dem Speicher des Grafikprozessors kopiert werden soll. In mindestens einer Ausführungsform soll „copyin(b[0:4],c[0:4])“ anzeigen, dass Array „b“ und Array „c“ vor der Ausführung eines Software-Kernels in den Speicher des Grafikprozessors kopiert werden sollen, aber nach der Ausführung eines Software-Kerns nicht aus dem Speicher des Grafikprozessors kopiert werden sollen (z. B. weil Array „b“ und Array „c“ durch die Ausführung eines Software-Kernels, wie hierin beschrieben, nicht verändert werden.
  • In mindestens einer Ausführungsform ist ein zweites Codefragment 820 ebenfalls ein Codefragment wie der Quellcode 710, der hierin zumindest in Verbindung mit 7 beschrieben ist, mit verschiedenen zusätzlichen Prozessor-Direktiven (z. B. „#pragma acc kernels loop“). In mindestens einer Ausführungsform gibt das zweite Codefragment 820 nicht an, welche Arrays Eingabewerte und welche Ausgabewerte sind. In mindestens einer Ausführungsform wird das zweite Codefragment 820 von einem Compiler, wie er hierin beschrieben ist, vorverarbeitet, um zu bestimmen, welche Werte Eingabewerte und welche Ausgabewerte sind. In mindestens einer Ausführungsform ist ein „LVALUE“ ein Wert auf der linken Seite eines Gleichheitszeichens (z. B. in der Anweisung „x = y + z“ ist x ein LVALUE). In mindestens einer Ausführungsform ist ein „RVALUE“ ein Wert auf der rechten Seite eines Gleichheitszeichens (z. B. in der Anweisung „x = y + z“ sind y und z RVALUEs). In mindestens einer Ausführungsform sind das Array „b“ 806 und das Array „c“ 808 beide RVALUEs, da sie im zweiten Codefragment 820 rechts von einem Gleichheitszeichen stehen (z. B. in der Anweisung „a[i] += b[i]*c[i]“ in dem zweiten Codefragment 820). In mindestens einer Ausführungsform ist das Array „a“ 804 sowohl ein LVALUE (weil es links von einem Gleichheitszeichen erscheint) als auch ein RVALUE (weil es rechts von einem Gleichheitszeichen erscheint). Es ist zu beachten, dass eine Quellcodeanweisung wie beispielsweise „a[i] += b[i]*c[i]“ eine Syntax der Sprache C oder C++ ist, bei der „+=“ anzeigt, dass RVALUEs zu LVALUEs addiert werden, so dass „a[i] += b[i]*c[i]“ „a[i] = a[i] + (b[i]*c[i])“ bedeutet. In mindestens einer Ausführungsform kann das zweite Codefragment 820 und/oder das erste Codefragment 810 eine andere Syntax von Prozessor-Direktiven beinhalten als die hierin beschriebene.
  • 9 veranschaulicht beispielhafte Laufzeitrichtlinien oder Laufzeit-Direktiven 900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird ein Codefragment 902, das ein Codefragment wie beispielsweise das Codefragment 820 ist, das hierin zumindest in Verbindung mit 8 beschrieben ist, verwendet, um eine Laufzeit-Direktive 904, eine Laufzeit-Direktive 906 und eine Laufzeit-Direktive 908 zu erzeugen. In mindestens einer Ausführungsform gibt die eine Laufzeit-Direktive 904 an, dass drei Arrays (Arrays „a“, „b“ und „c“) von einem Prozessor in einen Grafikprozessor, wie er hierin beschrieben ist, kopiert werden sollen und eine Adresse (z. B. „dev-a“, „dev-b“ und „dev-c“) zurückgegeben werden soll. In mindestens einer Ausführungsform gibt die Laufzeit-Direktive 906 an, dass ein Kernel mit Argumenten gestartet werden soll, die mindestens die Adressen „dev-a“, „dev-b“ und „dev-c“ enthalten. In mindestens einer Ausführungsform zeigt die Laufzeit-Direktiver 908 an, dass ein Array (Array „a“) von einem Grafikprozessor zurückkopiert werden soll und dass zwei Arrays (Array „b“ und „c“) gelöscht werden können, da sie von einem mit der Laufzeit-Direktive 906 gestarteten Kernel nicht verändert wurden. In mindestens einer Ausführungsform können auch andere Eingabe- und Ausgabetypen verwendet werden, darunter Skalarwerte, mehrdimensionale Arrays, Listen, Bäume, Strukturen und Klassen, ohne darauf beschränkt zu sein.
  • 10 veranschaulicht einen beispielhaften Prozess 1000 zum Hinzufügen von Speichertabelleneinträgen, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Prozessor, wie beispielsweise der Prozessor 102, der hierin zumindest in Verbindung mit 1 beschrieben ist, einen oder mehrere Schritte des beispielhaften Prozesses 1000 aus. In mindestens einer Ausführungsform führt ein Grafikprozessor wie beispielsweise der Grafikprozessor 116, der hierin zumindest in Verbindung mit 1 beschrieben ist, einen oder mehrere Schritte des beispielhaften Prozesses 1000 aus. In mindestens einer Ausführungsform führen ein oder mehrere Prozessoren, wie sie hierin zumindest im Zusammenhang mit 1-44 beschrieben sind, einen oder mehrere Schritte des beispielhaften Prozesses 1000 aus.
  • In mindestens einer Ausführungsform wird in einem Schritt 1002 des beispielhaften Prozesses 1000 ein dataon-Befehl, wie er hierin beschrieben ist, empfangen. In mindestens einer Ausführungsform ist in Schritt 1002 ein dataon-Befehl ein Befehl zur Verwendung von Daten auf einem Grafikprozessor, wie er hierin beschrieben ist. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1000 nach Schritt 1002 mit einem Schritt 1004 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1004 des beispielhaften Prozesses 1000 bestimmt, ob Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, auf einem Gerät (z. B. einem Grafikprozessor wie den hierin beschriebenen) vorhanden sind. In mindestens einer Ausführungsform wird in Schritt 1004 eine Speichertabelle, wie sie hierin beschrieben ist, verwendet, um zu bestimmen, ob Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, auf einem Gerät vorhanden sind. In mindestens einer Ausführungsform wird eine aktuelle Tabelle verwendet, um zu bestimmen, ob Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, auf einem Gerät vorhanden sind. In mindestens einer Ausführungsform wird eine Host-Adresse, wie sie hierin beschrieben ist, verwendet, um zu bestimmen, ob Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, auf einem Gerät vorhanden sind. In mindestens einer Ausführungsform wird eine Datenlänge, wie sie hierin beschrieben ist, verwendet, um zu bestimmen, ob Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, auf einem Gerät vorhanden sind. In mindestens einer Ausführungsform, wenn eine Speichertabelle, wie die hierin beschriebenen, verwendet wird, um zu bestimmen, ob Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, auf einem Gerät vorhanden sind, gibt eine Suche eine oder mehrere der folgenden Informationen zurück: einen Referenzzählwert der auf einem Gerät vorhandenen Daten, einen aktuellen Zählwert der auf einem Gerät vorhandenen Daten, einen booleschen Indikator dafür, ob Daten auf einem Gerät vorhanden sind, und/oder eine Geräteadresse der auf einem Gerät vorhandenen Daten. In mindestens einer Ausführungsform wird in Schritt 1004, falls bestimmt wird, dass Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, auf einem Gerät vorhanden sind („JA“-Zweig), der beispielhafte Prozess 1000 in Schritt 1014 fortgesetzt. In mindestens einer Ausführungsform wird in Schritt 1004, falls bestimmt wird, dass Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, nicht auf einem Gerät vorhanden sind („NEIN“-Zweig), der beispielhafte Prozess 1000 in Schritt 1006 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1006 des beispielhaften Prozesses 1000, falls bestimmt wird, dass Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, nicht auf einem Gerät vorhanden sind (z. B. in Schritt 1004), ein Tabelleneintrag erstellt, z. B. in einer Speichertabelle oder einer aktuellen Tabelle unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1000 nach Schritt 1006 mit einem Schritt 1008 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1008 des beispielhaften Prozesses 1000 Speicher zugewiesen, um Daten zu speichern, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind. In mindestens einer Ausführungsform wird in Schritt 1008 einem Gerät wie einem Grafikprozessor, wie hierin beschrieben, Speicher zugewiesen. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1000 nach Schritt 1008 mit einem Schritt 1010 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1010 des beispielhaften Prozesses 1000 bestimmt, ob ein in Schritt 1002 empfangener dataon-Befehl eine copyin-Anweisung enthält, wie hierin beschrieben. In mindestens einer Ausführungsform wird in Schritt 1010, falls bestimmt wird, dass ein in Schritt 1002 empfangener dataon-Befehl eine copyin-Anweisung enthält („JA“-Zweig), der beispielhafte Prozess 1000 in Schritt 1012 fortgesetzt. In mindestens einer Ausführungsform wird in Schritt 1010, falls bestimmt wird, dass ein in Schritt 1002 empfangener dataon-Befehl keine copyin-Anweisung enthält („NEIN“-Zweig), der beispielhafte Prozess 1000 in einem Schritt 1014 fortgesetzt.
  • In mindestens einer Ausführungsform werden in Schritt 1012 des beispielhaften Prozesses 1000, wenn ein in Schritt 1002 empfangener dataon-Befehl eine copyin-Anweisung enthält (z. B. wie in Schritt 1010 bestimmt), Daten von einem Host zu einem Gerät kopiert, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform werden in Schritt 1012 Daten von einem Prozessor, wie z. B. dem Prozessor 102, zu einem Grafikprozessor, wie z. B. dem Grafikprozessor 116, kopiert, wie hierin zumindest in Verbindung mit 1 beschrieben. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1000 nach Schritt 1012 in einem Schritt 1014 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1014 des beispielhaften Prozesses 1000 ein Zählwert bzw. eine Anzahl von Daten auf einem Gerät erhöht bzw. inkrementiert. In mindestens einer Ausführungsform kann in Schritt 1014, falls sich zuvor Daten auf einem Gerät befanden (z. B. Zweig „JA“ in Schritt 1004), der Zählwert bzw. die Anzahl der Daten auf einem Gerät von „n“ (vorherige Anzahl) auf „n+1“ (erhöhte Anzahl) inkrementiert werden. In mindestens einer Ausführungsform kann in Schritt 1014, wenn sich zuvor keine Daten auf einem Gerät befanden (z. B. „NEIN“-Zweig in Schritt 1004), der Zählwert bzw. die Anzahl der Daten auf einem Gerät von „0“ (vorherige Anzahl) auf „1" (erhöhte Anzahl) inkrementiert werden. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1000 nach Schritt 1014 mit einem Schritt 1016 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1016 des beispielhaften Prozesses 1000 eine Geräteadresse von Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, zurückgegeben. In mindestens einer Ausführungsform wird in Schritt 1016 des beispielhaften Prozesses 1000 ein Zählwert (z. B. ein inkrementierter Zählwert) von Daten, die mit einem in Schritt 1002 empfangenen dataon-Befehl assoziiert sind, zurückgegeben. In mindestens einer Ausführungsform wird in Schritt 1016 ein Gerät und/oder ein Zählwert an einen aufrufenden Prozess zurückgegeben, wie z. B. einen Prozess, der Quellcode kompiliert, um einen oder mehrere Software-Kernel zu erzeugen, wie hierin beschrieben. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1000 nach Schritt 1016 beendet. In mindestens einer Ausführungsform, die in 10 nicht dargestellt ist, wird der beispielhafte Prozess 1000 nach Schritt 1016 mit Schritt 1002 fortgesetzt, um einen nächsten dataon-Befehl zu empfangen. In mindestens einer Ausführungsform, die in 10 nicht dargestellt ist, kann nach dem Schritt 1016 ein beispielhafter Prozess 1100 ausgeführt werden, der mit einem Schritt 1102 beginnt. In mindestens einer Ausführungsform können der beispielhafte Prozess 1000 und der beispielhafte Prozess 1100 gleichzeitig ausgeführt werden.
  • In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 1000 in einer anderen Reihenfolge durchgeführt, als in 10 dargestellt ist. In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 1000 parallel ausgeführt. In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 1000 von einer Vielzahl von Threads ausgeführt, die auf einem oder mehreren Prozessoren ausgeführt werden, wie sie hierin zumindest im Zusammenhang mit 1-44 beschrieben sind.
  • 11 veranschaulicht einen beispielhaften Prozess 1100 zum Entfernen von Speichertabelleneinträgen, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform führt ein Prozessor, wie z. B. der Prozessor 102, der hierin zumindest in Verbindung mit 1 beschrieben ist, einen oder mehrere Schritte des beispielhaften Prozesses 1100 aus. In mindestens einer Ausführungsform führt ein Grafikprozessor wie beispielsweise der Grafikprozessor 116, der hierin zumindest in Verbindung mit 1 beschrieben ist, einen oder mehrere Schritte des beispielhaften Prozesses 1100 aus. In mindestens einer Ausführungsform führen ein oder mehrere Prozessoren, wie sie hierin zumindest im Zusammenhang mit 1-44 beschrieben sind, einen oder mehrere Schritte des beispielhaften Prozesses 1100 durch.
  • In mindestens einer Ausführungsform wird in einem Schritt 1102 des beispielhaften Prozesses 1100 ein dataoff-Befehl, wie er hierin beschrieben ist, empfangen. In mindestens einer Ausführungsform ist in Schritt 1102 ein dataoff-Befehl ein Befehl, die Verwendung von Daten auf einem Grafikprozessor, wie den hierin beschriebenen, zu beenden. In mindestens einer Ausführungsform hat ein dataoff-Befehl einen entsprechenden dataon-Befehl, wie hierin zumindest in Verbindung mit 10 (z. B. in Schritt 1002) beschrieben. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 nach Schritt 1102 mit einem Schritt 1104 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1104 des beispielhaften Prozesses 1100 ein Zählwert von Daten auf einem Gerät verringert bzw. dekrementiert. In mindestens einer Ausführungsform ist ein Zählwert von Daten ein Referenzzählwert, wie hierin beschrieben. In mindestens einer Ausführungsform ist ein Zählwert von Daten ein aktueller Zählwert, wie hierin beschrieben. In mindestens einer Ausführungsform ist ein Zählwert von Daten ein boolescher Wert, wie hierin beschrieben. In mindestens einer Ausführungsform kann in Schritt 1104, falls sich Daten zuvor auf einem Gerät befinden, ein Zählwert von Daten auf einem Gerät von „n+1“ (ein vorheriger Zählwert) auf „n“ (ein verringerter Zählwert) dekrementiert werden. In mindestens einer Ausführungsform, die in 11 nicht dargestellt ist, kann in Schritt 1104 ein Fehler auftreten, falls sich zuvor keine Daten auf einem Gerät befanden und ein dataoff-Befehl wird. In mindestens einer Ausführungsform, die in 11 nicht dargestellt ist, kann in Schritt 1104 ein dataoff-Befehl ignoriert werden, falls sich die Daten zuvor nicht auf einem Gerät befanden. In mindestens einer Ausführungsform kann in Schritt 1104, falls ein Zählwert von Daten „1“ ist (ein vorheriger Zählwert), dieser auf „0“ dekrementiert werden (ein dekrementierter Zählwert). In mindestens einer Ausführungsform kann in Schritt 1104, falls ein Datenzählwert „0“ ist, wenn ein dataoff-Befehl empfangen wird, ein Fehler auftreten und/oder ein dataoff-Befehl ignoriert werden. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 nach Schritt 1104 mit einem Schritt 1106 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1106 des beispielhaften Prozesses 1100 bestimmt, ob ein Zählwert Null erreicht hat. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 in einem Schritt 1108 fortgesetzt, falls in Schritt 1106 bestimmt wird, dass ein Zählwert Null erreicht hat („JA“-Zweig). In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 in Schritt 1106 mit einem Schritt 1116 fortgesetzt, falls bestimmt wird, dass ein Zählwert nicht Null erreicht hat („NEIN“-Zweig).
  • In mindestens einer Ausführungsform wird in Schritt 1108 des beispielhaften Prozesses 1100 bestimmt, ob ein in Schritt 1102 empfangener dataoff-Befehl eine copyout-Direktive enthält, wie hierin beschrieben. In mindestens einer Ausführungsform wird in Schritt 1108, falls bestimmt wird, dass ein in Schritt 1102 empfangener dataoff-Befehl eine copyout-Anweisung enthält („JA“-Zweig), der beispielhafte Prozess 1100 in einem Schritt 1110 fortgesetzt. In mindestens einer Ausführungsform wird in Schritt 1108, falls bestimmt wird, dass ein in Schritt 1102 empfangener dataoff-Befehl keine copyout-Anweisung enthält („NEIN“-Zweig), der beispielhafte Prozess 1100 in einem Schritt 1112 fortgesetzt.
  • In mindestens einer Ausführungsform werden in Schritt 1110 des beispielhaften Prozesses 1100, falls ein in Schritt 1102 empfangener dataoff-Befehl eine copyout-Anweisung enthält (z. B. wie in Schritt 1108 bestimmt), Daten von einem Gerät zu einem Host kopiert, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden. In mindestens einer Ausführungsform werden in Schritt 1110 Daten von einem Grafikprozessor, wie z. B. dem Grafikprozessor 116, auf einen Prozessor, wie z. B. den Prozessor 102, kopiert, beides wie hierin zumindest in Verbindung mit 1 beschrieben. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 nach Schritt 1110 mit Schritt 1112 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1112 des beispielhaften Prozesses 1100 Speicher, der zum Speichern von Daten verwendet wird, die mit einem dataon-Befehl assoziiert sind (z. B. empfangen in Schritt 1002 des beispielhaften Prozesses 1000), freigegeben bzw. dealloziert. In mindestens einer Ausführungsform wird in Schritt 1112 Speicher von einem Gerät wie einem Grafikprozessor, wie hierin beschrieben, freigegeben bzw. dealloziert. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 nach Schritt 1112 mit einem Schritt 1114 fortgesetzt.
  • In mindestens einer Ausführungsform wird in Schritt 1114 des beispielhaften Prozesses 1100 ein Tabelleneintrag gelöscht. In mindestens einer Ausführungsform wird in Schritt 1114 ein in Schritt 1006 des beispielhaften Prozesses 1000 erstellter Tabelleneintrag gelöscht. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 nach Schritt 1114 mit Schritt 1116 fortgesetzt.
  • In mindestens einer Ausführungsform kehrt der beispielhafte Prozess 1100 in Schritt 1116 zurück. In mindestens einer Ausführungsform, die in 11 nicht dargestellt ist, gibt der beispielhafte Prozess 1100 in Schritt 1116 einen Statusindikator an einen aufrufenden Prozess zurück, wie hierin beschrieben. In mindestens einer in 11 nicht dargestellten Ausführungsform können vor Schritt 1116 Daten herauskopiert werden (z. B. wie in Verbindung mit Schritt 1110 beschrieben), bevor der beispielhafte Prozess 1100 zurückkehrt. In mindestens einer Ausführungsform wird der beispielhafte Prozess 1100 nach Schritt 1116 beendet. In mindestens einer Ausführungsform, die in 11 nicht dargestellt ist, wird der beispielhafte Prozess 1100 nach Schritt 1116 mit Schritt 1102 fortgesetzt, um einen weiteren dataoff-Befehl zu empfangen. In mindestens einer Ausführungsform, die in 11 nicht dargestellt ist, kann nach Schritt 1116 der beispielhafte Prozess 1000 ausgeführt werden, beginnend mit Schritt 1002. In mindestens einer Ausführungsform können der beispielhafte Prozess 1000 und der beispielhafte Prozess 1100 gleichzeitig ausgeführt werden.
  • In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 1100 in einer anderen Reihenfolge durchgeführt, als in 11 dargestellt ist. In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 1100 parallel ausgeführt. In mindestens einer Ausführungsform werden die Schritte des beispielhaften Prozesses 1100 von einer Vielzahl von Threads durchgeführt, die auf einem oder mehreren Prozessoren ausgeführt werden, wie sie hierin zumindest im Zusammenhang mit 1-44 beschrieben sind.
  • 12 veranschaulicht beispielhafte Softwareversionen 1200 mit Laufzeit-Direktiven, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der erste Kernel 1202 ein weniger optimierter Kernel, der vier Schleifenanweisungen 1206 unter Verwendung eines einzelnen Threads 1204 sequenziell ausführt oder anderweitig durchführt. In mindestens einer Ausführungsform ist der Thread 1204 ein Thread, wie er hierin zumindest in Verbindung mit 13-44 beschrieben ist. In mindestens einer Ausführungsform ist der zweite Kernel 1208 ein optimierter Kernel, der jede der vier Schleifenanweisungen parallel ausführt oder anderweitig durchführt. In mindestens einer Ausführungsform, wie in 12 dargestellt, führt Kernel zwei 1208 eine erste Schleifenanweisung 1212 unter Verwendung eines ersten Threads 1210 aus oder führt sie anderweitig aus, führt eine zweite Schleifenanweisung 1216 unter Verwendung eines zweiten Threads 1214 aus oder führt sie anderweitig aus, führt eine dritte Schleifenanweisung 1220 unter Verwendung eines dritten Threads 1218 aus oder führt sie anderweitig aus, und führt eine vierte Schleifenanweisung 1224 unter Verwendung eines vierten Threads 1222 aus oder führt sie anderweitig aus. In mindestens einer Ausführungsform können einer oder mehrere der Threads 1210, 1214, 1218 oder 1222 wiederverwendet werden, um eine oder mehrere der ersten Schleifenanweisung 1212, der zweiten Schleifenanweisung 1216, der dritten Schleifenanweisung 1220 oder der vierten Schleifenanweisung 1224 auszuführen, wobei Systeme und Verfahren wie die hierin beschriebenen verwendet werden.
  • In mindestens einer Ausführungsform ist eine Laufzeit-Direktive 1226 eine Laufzeit-Direktive wie beispielsweise die Laufzeit-Direktive 904, wie sie hierin zumindest in Verbindung mit 9 beschrieben ist. In mindestens einer Ausführungsform enthält die Laufzeit-Direktive 1226 ein Argument „test-for-aliasing“, das verwendet wird, um zu bestimmen, ob sich beispielsweise Daten in dem Array „a“ mit anderen in einem Software-Kernel verwendeten Daten überschneiden oder überlappen (oder Aliase bilden). In mindestens einer Ausführungsform testet ein „test-for-aliasing“ Überschneidungen bzw. Überlappungen oder Aliasing unter Verwendung von Systemen und Verfahren, wie sie hierin beschrieben sind (z. B. unter Verwendung einer Speichertabelle oder einer aktuellen Tabelle).
  • In mindestens einer Ausführungsform ist eine Laufzeit-Direktive 1228 eine Laufzeit-Direktive wie die Laufzeit-Direktive 906, wie hierin zumindest in Verbindung mit 9 beschrieben. In mindestens einer Ausführungsform umfasst die Laufzeit-Direktive 1228 zwei Software-Kernel („Kernell“ und „Kernel2“) und ein „Aliasing-Ergebnis“, das verwendet wird, um zu bestimmen, ob Kernel1 oder Kernel2 auszuführen ist, wie hierin beschrieben. In mindestens einer Ausführungsform, die in 12 nicht dargestellt ist, enthält die Laufzeit-Direktive 1228 eine Vielzahl von Software-Kerneln (oder eine Vielzahl von Versionen), und kann das „Aliasing-Ergebnis“ verwendet werden, um zu bestimmen, welche Version einer Vielzahl von Versionen auszuführen ist, basierend zumindest teilweise darauf, welche Software-Kernel auf überlappende (oder verknüpfte) Speicherplätze zugreifen, wie hierin beschrieben.
  • In der folgenden Beschreibung werden zahlreiche spezifische Details aufgeführt, um ein gründlicheres Verständnis mindestens einer Ausführungsform zu ermöglichen. Für den Fachmann versteht sich jedoch, dass die erfindungsgemäßen Konzepte auch ohne eines oder mehrere dieser spezifischen Details in die Praxis umgesetzt werden können.
  • Rechenzentrum
  • 13 veranschaulicht ein beispielhaftes Rechenzentrum 1300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Rechenzentrum 1300, ohne darauf beschränkt zu sein, eine Rechenzentrum-Infrastrukturschicht 1310, eine Frameworkschicht 1320, eine Softwareschicht 1330 und eine Anwendungsschicht 1340.
  • In mindestens einer Ausführungsform, wie in 13 gezeigt, kann die Rechenzentrum-Infrastrukturschicht 1310 einen Ressourcenorchestrator 1312, gruppierte Rechenressourcen 1314 und Knoten-Rechenressourcen („Knoten-C.R.s“) 1316(1)-1316(N) beinhalten, wobei „N“ eine beliebige ganze, positive Zahl darstellt. In mindestens einer Ausführungsform können die Knoten-C.R.s 1316(1)-1316(N), ohne darauf beschränkt zu sein, eine beliebige Anzahl von Zentralverarbeitungseinheiten („CPUs“) oder anderen Prozessoren (einschließlich Beschleunigern, feldprogrammierbaren Gate-Arrays („FPGAs“), Datenverarbeitungseinheiten („DPUs“) in Netzwerkgeräten, 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 1316(1)-1316(N) ein Server mit einer oder mehreren der vorstehend erwähnten Rechenressourcen sein.
  • In mindestens einer Ausführungsform können die gruppierten Rechenressourcen 1314 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 1314 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 1312 einen oder mehrere Knoten-CRs 1316(1)-1316(N) und/oder gruppierte Rechenressourcen 1314 konfigurieren oder anderweitig steuern. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 1312 eine Software-Design-Infrastruktur („SDI")-Verwaltungseinheit für das Rechenzentrum 1300 beinhalten. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 1312 Hardware, Software oder eine Kombination davon umfassen.
  • In mindestens einer Ausführungsform, wie in 13 gezeigt, beinhaltet die Frameworkschicht 1320, ohne Beschränkung darauf, einen Job-Scheduler 1332, einen Konfigurationsmanager 1334, einen Ressourcenverwalter 1336 und ein verteiltes Dateisystem 1338. In mindestens einer Ausführungsform kann die Frameworkschicht 1320 ein Framework zur Unterstützung der Software 1352 der Softwareschicht 1330 und/oder einer oder mehrerer Anwendung(en) 1342 der Anwendungsschicht 1340 beinhalten. In mindestens einer Ausführungsform können die Software 1352 oder die Anwendung(en) 1342 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 1320 eine Art von freiem und quelloffenem Software-Webanwendungs-Framework wie Apache SparkTM (nachstehend „Spark“) sein, das ein verteiltes Dateisystem 1338 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 1332 einen Spark-Treiber enthalten, um die Planung von Arbeitslasten zu erleichtern, die von verschiedenen Schichten des Rechenzentrums 1300 unterstützt werden. In mindestens einer Ausführungsform kann der Konfigurationsmanager 1334 in der Lage sein, verschiedene Schichten zu konfigurieren, wie beispielsweise die Softwareschicht 1330 und die Frameworkschicht 1320, einschließlich Spark und das verteilte Dateisystem 1338 zur Unterstützung der Verarbeitung großer Datenmengen. In mindestens einer Ausführungsform kann der Ressourcenverwalter 1336 in der Lage sein, geclusterte oder gruppierte Rechenressourcen zu verwalten, die zur Unterstützung des verteilten Dateisystems 1338 und des Job-Schedulers 1332 gemappt oder zugeordnet sind. In mindestens einer Ausführungsform können geclusterte oder gruppierte Rechenressourcen die gruppierten Rechenressourcen 1314 auf der Rechenzentrums-Infrastrukturschicht 1310 umfassen. In mindestens einer Ausführungsform kann sich der Ressourcenverwalter 936 mit dem Ressourcenorchestrator 1312 koordinieren, um diese gemappten oder zugeordneten Rechenressourcen zu verwalten.
  • In mindestens einer Ausführungsform kann die in der Softwareschicht 1330 enthaltene Software 1352 Software enthalten, die von mindestens Teilen der Knoten-C.R.s 1316(1)-1316(N), den gruppierten Rechenressourcen 1314 und/oder dem verteilten Dateisystem 1338 der Frameworkschicht 1320 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 1340 enthaltene(n) Anwendung(en) 1342 eine oder mehrere Arten von Anwendungen beinhalten, die von mindestens Teilen der Knoten-C.R.s 1316(1)-1316(N), den gruppierten Rechenressourcen 1314 und/oder dem verteilten Dateisystem 1338 der Frameschicht 1320 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 1334, der Ressourcenverwalter 1336 und der Ressourcenorchestrator 1312 eine beliebige Anzahl und Art von selbstmodifizierenden Aktionen implementieren, die auf einer beliebigen Menge und Art von Daten basieren, die auf jede technisch mögliche Weise erfasst werden. In mindestens einer Ausführungsform können selbstmodifizierende Aktionen einen Rechenzentrumsbetreiber des Rechenzentrums 1300 davon entlasten, möglicherweise schlechte Konfigurationsentscheidungen zu treffen und möglicherweise nicht ausgelastete und/oder schlecht leistende Teile eines Rechenzentrums zu vermeiden.
  • In mindestens einer Ausführungsform wird mindestens eine in 13 gezeigte oder in Bezug dazu beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens eine der gruppierten Rechenressourcen 1314 und die Knoten-C.R. 1316(1-N) verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens eine der gruppierten Rechenressourcen 1314 und die Knoten-C.R. 1316(1-N) verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • Computergestützte Systeme
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte computergestützte Systeme, die zur Implementierung mindestens einer Ausführungsform verwendet werden können.
  • 14 veranschaulicht ein Verarbeitungssystem 1400, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Verarbeitungssystem 1400 einen oder mehrere Prozessoren 1402 und einen oder mehrere Grafikprozessoren 1408, und kann ein Einzelprozessor-Desktop-System, ein Multiprozessor-Workstation-System oder ein Serversystem mit einer großen Anzahl von Prozessoren 1402 oder Prozessorkernen 1407 sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 1400 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 1400 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 1400 ein Mobiltelefon, ein Smartphone, ein Tablet-Computergerät oder ein mobiles Internetgerät. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1400 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 1400 ein Fernseh- oder Set-Top-Box-Gerät mit einem oder mehreren Prozessoren 1402 und einer grafischen Oberfläche, die von einem oder mehreren Grafikprozessoren 1408 erzeugt wird.
  • In mindestens einer Ausführungsform enthalten ein oder mehrere Prozessoren 1402 jeweils einen oder mehrere Prozessorkerne 1407 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 1407 so konfiguriert, dass er einen bestimmten Befehlssatz 1409 verarbeitet. In mindestens einer Ausführungsform kann der Befehlssatz 1409 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 1407 jeweils einen anderen Befehlssatz 1409 verarbeiten, der Anweisungen enthalten kann, um die Emulation anderer Befehlssätze zu erleichtern. In mindestens einer Ausführungsform kann der Prozessorkern 1407 auch andere Verarbeitungsvorrichtungen enthalten, wie z.B. einen digitalen Signalprozessor („DSP“).
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 1402 einen Cachespeicher („Cache“) 1404. In mindestens einer Ausführungsform kann der Prozessor 1402 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform wird der Cachespeicher von verschiedenen Komponenten des Prozessors 1402 gemeinsam genutzt. In mindestens einer Ausführungsform verwendet der Prozessor 1402 auch einen externen Cache (z.B. einen Level 3 („L3")-Cache oder Last Level Cache („LLC“)) (nicht dargestellt), der von den Prozessorkernen 1407 unter Verwendung bekannter Cache-Kohärenztechniken gemeinsam genutzt werden kann. In mindestens einer Ausführungsform ist zusätzlich eine Registerdatei 1406 in dem Prozessor 1402 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 1406 Universalregister oder andere Register enthalten.
  • In mindestens einer Ausführungsform ist/sind ein oder mehrere Prozessor(en) 1402 mit einem oder mehreren Schnittstellenbus(en) 1410 gekoppelt, um Kommunikationssignale wie Adress- , Daten- oder Steuersignale zwischen dem Prozessor 1402 und anderen Komponenten in dem Verarbeitungssystem 1400 zu übertragen. In mindestens einer Ausführungsform kann der Schnittstellenbus 1410 ein Prozessorbus sein, wie z.B. eine Version eines Direct Media Interface („DMI“)-Busses. In mindestens einer Ausführungsform ist der Schnittstellenbus 1410 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) 1402 einen integrierten Speichercontroller 1416 und einen Plattformcontroller-Hub 1430. In mindestens einer Ausführungsform erleichtert der Speichercontroller 1416 die Kommunikation zwischen einem Speichervorrichtung und anderen Komponenten des Verarbeitungssystems 1400, während der Plattformcontroller-Hub („PCH“) 1430 Verbindungen zu Eingabe/Ausgabe-Geräten („E/A“) über einen lokalen E/A-Bus bereitstellt.
  • In mindestens einer Ausführungsform kann die Speichervorrichtung 1420 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 1420 als Systemspeicher für das Verarbeitungssystem 1400 arbeiten, um Daten 1422 und Anweisungen 1421 zur Verwendung zu speichern, wenn ein oder mehrere Prozessoren 1402 eine Anwendung oder einen Prozess ausführen. In mindestens einer Ausführungsform koppelt der Speichercontroller 1416 auch mit einem optionalen externen Grafikprozessor 1412, der mit einem oder mehreren Grafikprozessoren 1408 in den Prozessoren 1402 kommunizieren kann, um Grafik- und Medienoperationen durchzuführen. In mindestens einer Ausführungsform kann eine Anzeigevorrichtung 1411 mit dem/den Prozessor(en) 1402 verbunden sein. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 1411 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 1411 eine kopfmontierte Anzeige („HMD“), wie beispielsweise eine stereoskopische Anzeigevorrichtung zur Verwendung in Anwendungen der virtuellen Realität („VR“) oder der erweiterten Realität („AR“), beinhalten.
  • In mindestens einer Ausführungsform ermöglicht der Plattformcontroller-Hub 1430 die Verbindung von Peripheriegeräten mit der Speichervorrichtung 1420 und dem Prozessor 1402 über einen Hochgeschwindigkeits-E/A-Bus. In mindestens einer Ausführungsform beinhalten die E/A-Peripheriegeräte, ohne darauf beschränkt zu sein, einen Audiocontroller 1446, einen Netzwerkcontroller 1434, eine Firmware-Schnittstelle 1428, einen drahtlosen Transceiver 1426, Berührungssensoren 1425 und eine Datenspeichervorrichtung 1424 (z.B. ein Festplattenlaufwerk, einen Flash-Speicher usw.). In mindestens einer Ausführungsform kann die Datenspeichervorrichtung 1424 ü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 1425 Touchscreen-Sensoren, Drucksensoren oder Fingerabdrucksensoren beinhalten. In mindestens einer Ausführungsform kann der drahtlose Transceiver 1426 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 1428 eine Kommunikation mit System-Firmware und kann z.B. eine einheitliche erweiterbare Firmware-Schnittstelle („UEFI“) sein. In mindestens einer Ausführungsform kann der Netzwerkcontroller 1434 eine Netzwerkverbindung zu einem kabelgebundenen Netzwerk ermöglichen. In mindestens einer Ausführungsform koppelt ein Hochleistungs-Netzwerkcontroller (nicht dargestellt) mit dem Schnittstellenbus 1410. In mindestens einer Ausführungsform ist der Audiocontroller 1446 ein Mehrkanal-High-Definition-Audiocontroller. In mindestens einer Ausführungsform enthält das Verarbeitungssystem 1400 einen optionalen Legacy-E/A-Controller 1440 zur Kopplung von Legacy-Geräten (z.B. Personal System 2 („PS/2“)) mit dem Verarbeitungssystem 1400. In mindestens einer Ausführungsform kann der Plattformcontroller-Hub 1430 auch mit einem oder mehreren Universal Serial Bus („USB“)-Controllern 1442 verbinden, die Eingabevorrichtungen, wie z.B. Tastatur- und Mauskombinationen 1443, eine Kamera 1444 oder andere USB-Eingabevorrichtungen verbinden.
  • In mindestens einer Ausführungsform kann eine Instanz des Speichercontrollers 1416 und des Plattformcontroller-Hubs 1430 in einen diskreten externen Grafikprozessor, wie beispielsweise den externen Grafikprozessor 1412, integriert sein. In mindestens einer Ausführungsform können der Plattformcontroller-Hub 1430 und/oder der Speichercontroller 1416 extern zu einem oder mehreren Prozessor(en) 1402 sein. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1400 beispielsweise einen externen Speichercontroller 1416 und einen Plattformcontroller-Hub 1430 enthalten, der als ein Speichercontroller-Hub und Peripheriecontroller-Hub innerhalb eines System-Chipsatzes konfiguriert sein kann, der mit dem/den Prozessor(en) 1402 in Verbindung steht.
  • In mindestens einer Ausführungsform wird mindestens eine in 14 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren 1402 oder der externe Grafikprozessor 1412 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren 1402 oder der externe Grafikprozessor 1412 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 15 veranschaulicht ein Computersystem 1500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann das Computersystem 1500 ein System mit miteinander verbundenen Vorrichtungen und Komponenten, ein SOC oder eine Kombination davon sein. In mindestens einer Ausführungsform ist das Computersystem 1500 mit einem Prozessor 1502 ausgebildet, der Ausführungseinheiten zum Ausführen einer Anweisung enthalten kann. In mindestens einer Ausführungsform kann das Computersystem 1500, ohne Beschränkung darauf, eine Komponente, wie beispielsweise den Prozessor 1502, 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 1500 Prozessoren beinhalten, wie z.B. die PENTIUM®-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 1500 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 1500 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 1500, ohne Beschränkung darauf, einen Prozessor 1502 enthalten, der, ohne Beschränkung darauf, eine oder mehrere Ausführungseinheiten 1508 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 1500 ein Einzelprozessor-Desktop- oder ein Serversystem. In mindestens einer Ausführungsform kann das Computersystem 1500 ein Multiprozessorsystem sein. In mindestens einer Ausführungsform kann der Prozessor 1502, ohne Beschränkung darauf, einen CISC-Mikroprozessor, einen RISC-Mikroprozessor, einen VLIW-Mikroprozessor, einen Prozessor, der eine Kombination von Befehlssätzen implementiert, oder eine beliebige andere Prozessoreinheit, wie z.B. einen digitalen Signalprozessor, beinhalten. In mindestens einer Ausführungsform kann der Prozessor 1502 mit einem Prozessorbus 1510 gekoppelt sein, der Datensignale zwischen dem Prozessor 1502 und anderen Komponenten in dem Computersystem 1500 übertragen kann.
  • In mindestens einer Ausführungsform kann der Prozessor 1502, ohne Beschränkung darauf, einen internen Level 1 („L1“)-Cachespeicher („Cache“) 1504 enthalten. In mindestens einer Ausführungsform kann der Prozessor 1502 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform kann sich der Cachespeicher außerhalb des Prozessors 1502 befinden. In mindestens einer Ausführungsform kann der Prozessor 1502 auch eine Kombination aus sowohl internen als auch externen Caches enthalten. In mindestens einer Ausführungsform kann eine Registerdatei 1506 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 1508, einschließlich, ohne Beschränkung darauf, von Logik zur Durchführung von Ganzzahl- und Gleitkommaoperationen, ebenfalls in dem Prozessor 1502. Der Prozessor 1502 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 1508 Logik zur Verarbeitung eines gepackten Befehlssatzes 1509 enthalten. In mindestens einer Ausführungsform können durch Aufnahme des gepackten Befehlssatzes 1509 in einen Befehlssatz eines Universalprozessors 1502 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 1502 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 1508 auch in Mikrocontrollern, eingebetteten Prozessoren, Grafikvorrichtungen, DSPs und anderen Arten von Logikschaltungen verwendet werden. In mindestens einer Ausführungsform kann das Computersystem 1500, ohne Beschränkung darauf, einen Speicher 1520 enthalten. In mindestens einer Ausführungsform kann der Speicher 1520 als eine DRAM-Vorrichtung, eine SRAM-Vorrichtung, eine Flash-Speicher-Vorrichtung oder eine andere Speichervorrichtung implementiert sein. Der Speicher 1520 kann Anweisung(en) 1519 und/oder Daten 1521 speichern, die durch Datensignale repräsentiert werden, die von dem Prozessor 1502 ausgeführt werden können.
  • In mindestens einer Ausführungsform kann ein Systemlogikchip mit dem Prozessorbus 1510 und dem Speicher 1520 gekoppelt sein. In mindestens einer Ausführungsform kann der Systemlogikchip, ohne Beschränkung darauf, einen Speichercontroller-Hub („MCH“) 1516 enthalten, und kann der Prozessor 1502 mit dem MCH 1516 über den Prozessorbus 1510 kommunizieren. In mindestens einer Ausführungsform kann der MCH 1516 einen Speicherpfad 1518 mit hoher Bandbreite zu dem Speicher 1520 zur Befehls- und Datenspeicherung und zur Speicherung von Grafikbefehlen, Daten und Texturen bereitstellen. In mindestens einer Ausführungsform kann der MCH 1516 Datensignale zwischen dem Prozessor 1502, dem Speicher 1520 und anderen Komponenten in dem Computersystem 1500 leiten und Datensignale zwischen dem Prozessorbus 1510, dem Speicher 1520 und einer System-E/A 1522 überbrücken. In mindestens einer Ausführungsform kann der Systemlogikchip einen Grafik-Port zur Kopplung mit einem Grafikcontroller bereitstellen. In mindestens einer Ausführungsform kann der MCH 1516 über einen Speicherpfad 1518 mit hoher Bandbreite mit dem Speicher 1520 gekoppelt sein, und kann die Grafik-/ Videokarte 1512 über eine Accelerated Graphics Port („AGP“)-Verbindung bzw. Zwischenverbindung bzw. Interconnect 1514 mit dem MCH 1516 gekoppelt sein.
  • In mindestens einer Ausführungsform kann das Computersystem 1500 einen System-E/A-Bus 1522 verwenden, der ein proprietärer Hub-Schnittstellenbus ist, um den MCH 1516 mit dem E/A-Controller-Hub („ICH“) 1530 zu koppeln. In mindestens einer Ausführungsform kann der ICH 1530 direkte Verbindungen zu einigen E/A-Geräten über einen lokalen E/A-Bus bereitstellen. In mindestens einer Ausführungsform kann der lokale E/A-Bus, ohne Beschränkung darauf, einen Hochgeschwindigkeits-E/A-Bus zur Verbindung von Peripheriegeräten mit dem Speicher 1520, einem Chipsatz und dem Prozessor 1502 umfassen. Beispiele können, ohne Beschränkung darauf, einen Audiocontroller 1529, einen Firmware-Hub („Flash-BIOS“) 1528, einen drahtlosen Transceiver 1526, einen Datenspeicher 1524, einen Legacy-E/A-Controller 1523, der eine Benutzereingabeschnittstelle 1525 und eine Tastaturschnittstelle enthält, einen seriellen Erweiterungs-Port 1527, wie z.B. ein USB, und einen Netzwerkcontroller 1534 beinhalten. Der Datenspeicher 1524 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 15 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 15 ein beispielhaftes SoC veranschaulichen. In mindestens einer Ausführungsform können in 15 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 1500 unter Verwendung von Compute-Express-Link („CXL“)-Interconnects miteinander verbunden.
  • In mindestens einer Ausführungsform wird mindestens eine in 15 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Prozessor 1502 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Prozessor 1502 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 16 veranschaulicht ein System 1600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist das System 1600 eine elektronische Vorrichtung, die einen Prozessor 1610 verwendet. In mindestens einer Ausführungsform kann das System 1600 zum Beispiel, und ohne Beschränkung darauf, ein Notebook, ein Tower-Server, ein Rack-Server, ein Blade-Server, 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 1600, ohne Beschränkung darauf, einen Prozessor 1610 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 1610 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 16 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 16 ein beispielhaftes SoC darstellen. In mindestens einer Ausführungsform können die in 16 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 16 unter Verwendung von CXL-Interconnects miteinander verbunden.
  • In mindestens einer Ausführungsform kann 16 eine Anzeige 1624, einen Touchscreen 1625, ein Touchpad 1630, eine Near Field Communications („NFC“)-Einheit 1645, einen Sensor-Hub 1640, einen Wärmesensor 1646, einen Express-Chipsatz („EC“) 1635, ein Trusted Platform Module („TPM“) 1638, BIOS/Firmware/Flash-Speicher („BIOS, FW Flash“) 1622, einen DSP 1660, eine Solid State Disk („SSD“) oder eine Festplatte („HDD“) 1620, eine Wireless Local Area Network („WLAN“)-Einheit 1650, eine Bluetooth-Einheit 1652, eine Wireless Wide Area Network („WWAN“)-Einheit 1656, ein Global Positioning System („GPS“) 1655, eine Kamera („USB 3.0-Kamera“) 1654, wie z.B. eine USB 3.0-Kamera, oder eine Low Power Double Data Rate („LPDDR“)-Speichereinheit („LPDDR3“) 1615, die z.B. in dem LPDDR3-Standard implementiert ist, beinhalten. Jede dieser Komponenten kann in jeder geeigneten Weise implementiert sein.
  • In mindestens einer Ausführungsform können andere Komponenten über die vorstehend beschriebenen Komponenten kommunikativ mit dem Prozessor 1610 verbunden sein. In mindestens einer Ausführungsform können ein Beschleunigungsmesser 1641, ein Umgebungslichtsensor („ALS“) 1642, ein Kompass 1643 und ein Gyroskop 1644 kommunikativ mit dem Sensor-Hub 1640 gekoppelt sein. In mindestens einer Ausführungsform können ein Wärmesensor 1639, ein Lüfter 1637, eine Tastatur 1646 und ein Touchpad 1630 kommunikativ mit dem EC 1635 gekoppelt sein. In mindestens einer Ausführungsform können ein Lautsprecher 1663, ein Kopfhörer 1664 und ein Mikrofon („mic“) 1665 kommunikativ mit einer Audioeinheit („audio codec and class d amp“) 1664 gekoppelt sein, die ihrerseits kommunikativ mit dem DSP 1660 gekoppelt sein kann. In mindestens einer Ausführungsform kann die Audioeinheit 1664 beispielsweise, und ohne Beschränkung darauf, einen Audio-Kodierer/-Dekodierer („codec“) und einen Verstärker der Klasse D beinhalten. In mindestens einer Ausführungsform kann eine SIM-Karte („SIM“) 1657 kommunikativ mit der WWAN-Einheit 1656 gekoppelt sein. In mindestens einer Ausführungsform können Komponenten wie beispielsweise die WLAN-Einheit 1650 und die Bluetooth-Einheit 1652 sowie die WWAN-Einheit 1656 in einem Next Generation Form Factor („NGFF“) implementiert sein.
  • In mindestens einer Ausführungsform wird mindestens eine in 16 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Prozessor 1610 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Prozessor 1610 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 17 veranschaulicht eine beispielhafte integrierte Schaltung 1700, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die beispielhafte integrierte Schaltung 1700 ein SoC, das unter Verwendung eines oder mehrerer IP-Cores hergestellt sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 1700 einen oder mehrere Anwendungsprozessor(en) 1705 (z.B. CPUs, DPUs), mindestens einen Grafikprozessor 1710 und kann zusätzlich einen Bildprozessor 1715 und/oder einen Videoprozessor 1720 enthalten, von denen jeder ein modularer IP-Kern sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 1700 eine Peripherie- oder Bus-Logik einschließlich eines USB-Controllers 1725, eines UART-Controllers 1730, eines SPI/SDIO-Controllers 1735 und eines I2S/I2C-Controllers 1740. In mindestens einer Ausführungsform kann die integrierte Schaltung 1700 eine Anzeigevorrichtung 1745 enthalten, die mit einem oder mehreren eines High-Definition Multimedia Interface („HDMI“)-Controllers 1750 und einer Mobile Industry Processor Interface („MIPI“)-Anzeigeschnittstelle 1755 verbunden ist. In mindestens einer Ausführungsform kann der Speicher durch ein Flash-Speicher-Subsystem 1760 mit Flash-Speicher und einem Flash-Speichercontroller bereitgestellt sein. In mindestens einer Ausführungsform kann eine Speicherschnittstelle über einen Speichercontroller 1765 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 1770.
  • In mindestens einer Ausführungsform wird mindestens eine in 17 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Anwendungsprozessor 17 05, ein Grafikprozessor 17 10, ein Bildprozessor 17 15 oder ein Videoprozessor 17 20 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Anwendungsprozessor 17 05, ein Grafikprozessor 17 10, ein Bildprozessor 17 15 oder ein Videoprozessor 17 20 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 18 veranschaulicht ein Computer- bzw. Rechensystem 1800, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das Rechensystem 1800 ein Verarbeitungssubsystem 1801 mit einem oder mehreren Prozessor(en) 1802 und einem Systemspeicher 1804, der über einen Zwischenverbindungspfad bzw. Verbindungspfad kommuniziert, der einen Speicher-Hub 1805 enthalten kann. In mindestens einer Ausführungsform kann der Speicher-Hub 1805 eine separate Komponente innerhalb einer Chipsatzkomponente sein oder in einen oder mehrere Prozessor(en) 1802 integriert sein. In mindestens einer Ausführungsform ist der Speicher-Hub 1805 mit einem E/A-Subsystem 1811 über eine Kommunikationsverbindung 1806 gekoppelt. In mindestens einer Ausführungsform beinhaltet das E/A-Subsystem 1811 einen E/A-Hub 1807, der es dem Rechensystem 1800 ermöglichen kann, Eingaben von einer oder mehreren Eingabevorrichtung(en) 1808 zu empfangen. In mindestens einer Ausführungsform kann der E/A-Hub 1807 einen Anzeigecontroller, der in einem oder mehreren Prozessor(en) 1802 enthalten sein kann, in die Lage versetzen, Ausgaben an eine oder mehrere Anzeigevorrichtung(en) 1810A zu liefern. In mindestens einer Ausführungsform kann/können ein oder mehrere Anzeigevorrichtung(en) 1810A, die mit dem E/A-Hub 1807 gekoppelt sind, eine lokale, interne oder eingebettete Anzeigevorrichtung beinhalten.
  • In mindestens einer Ausführungsform beinhaltet das Verarbeitungssubsystem 1801 einen oder mehrere Parallelprozessor(en) 1812, der/die über einen Bus oder eine andere Kommunikationsverbindung 1813 mit dem Speicher-Hub 1805 verbunden ist/sind. In mindestens einer Ausführungsform kann die Kommunikationsverbindung 1813 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) 1812 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) 1812 ein Grafikverarbeitungs-Subsystem, das Pixel an eine oder mehrere Anzeigevorrichtung(en) 1810A ausgeben kann, die über den E/A-Hub 1807 gekoppelt sind. In mindestens einer Ausführungsform können ein oder mehrere Parallelprozessor(en) 1812 auch einen Anzeigecontroller und eine Anzeigeschnittstelle (nicht dargestellt) enthalten, um eine direkte Verbindung zu einer oder mehreren Anzeigevorrichtung(en) 1810B zu ermöglichen.
  • In mindestens einer Ausführungsform kann eine Systemspeichereinheit 1814 mit dem E/A-Hub 1807 verbunden sein, um einen Speichermechanismus für das Rechensystem 1800 bereitzustellen. In mindestens einer Ausführungsform kann ein E/A-Switch 1816 verwendet werden, um einen Schnittstellenmechanismus bereitzustellen, der Verbindungen zwischen dem E/A-Hub 1807 und anderen Komponenten ermöglicht, wie z.B. einem Netzwerkadapter 1818 und/oder einem drahtlosen Netzwerkadapter 1819, der in eine Plattform integriert sein kann, und verschiedenen anderen Vorrichtungen, die über ein oder mehrere Add-in-Vorrichtungen 1820 hinzugefügt werden können. In mindestens einer Ausführungsform kann der Netzwerkadapter 1818 ein Ethernet-Adapter oder ein anderer kabelgebundener Netzwerkadapter sein. In mindestens einer Ausführungsform kann der drahtlose Netzwerkadapter 1719 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 1800 weitere, nicht explizit dargestellte Komponenten enthalten, darunter USB- oder andere Portverbindungen, optische Speicherlaufwerke, Videoaufnahmevorrichtungen und dergleichen, die ebenfalls mit dem E/A-Hub 1807 verbunden sein können. In mindestens einer Ausführungsform können Kommunikationspfade, die verschiedene Komponenten in 18 miteinander verbinden, unter Verwendung beliebiger geeigneter Protokolle implementiert sein, 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) 1812 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) 1812 Schaltkreise, die für allgemeine Verarbeitung optimiert sind. In mindestens einer Ausführungsform können Komponenten des Rechensystems 1800 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) 1812, der Speicher-Hub 1805, der/die Prozessor(en) 1802 und der E/A-Hub 1807 in eine integrierte SoC-Schaltung integriert sein. In mindestens einer Ausführungsform können Komponenten des Rechensystems 1800 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 1800 in ein Multi-Chip-Modul („MCM“) integriert sein, das mit anderen Multi-Chip-Modulen zu einem modularen Rechensystem zusammengeschaltet sein kann. In mindestens einer Ausführungsform sind das E/A-Subsystem 1811 und die Anzeigevorrichtungen 1810B nicht in dem Rechensystem 1800 enthalten.
  • In mindestens einer Ausführungsform wird mindestens eine in 18 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren 1802 oder Parallelprozessoren 1812 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren 1802 oder Parallelprozessoren 1812 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • Verarbeitungssysteme
  • Die folgenden Figuren stellen, ohne Beschränkung darauf, beispielhafte Verarbeitungssysteme dar, die zur Implementierung mindestens einer Ausführungsform verwendet werden können.
  • 19 veranschaulicht eine beschleunigte Verarbeitungseinheit („APU“; accelerated processing unit) 1900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die APU 1900 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die APU 1900 so konfiguriert sein, dass sie ein Anwendungsprogramm, wie z.B. ein CUDA-Programm, ausführt. In mindestens einer Ausführungsform umfasst die APU 1900, ohne Beschränkung darauf, einen Kernkomplex 1910, einen Grafikkomplex 1940, eine Struktur bzw. ein Fabric 1960, E/A-Schnittstellen 1970, Speichercontroller 1980, einen Anzeigecontroller 1992 und eine Multimedia-Engine 1994. In mindestens einer Ausführungsform kann die APU 1900, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 1910, eine beliebige Anzahl von Grafikkomplexen 1950, eine beliebige Anzahl von Anzeigecontrollern 1992 und eine beliebige Anzahl von Multimedia-Engines 1994 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 1910 eine CPU, ist der Grafikkomplex 1940 eine GPU und ist die APU 1900 eine Verarbeitungseinheit, die, ohne Beschränkung darauf, 1910 und 1940 auf einem einzigen Chip integriert. In mindestens einer Ausführungsform können einige Aufgaben dem Kernkomplex 1910 und andere Aufgaben dem Grafikkomplex 1940 zugewiesen werden. In mindestens einer Ausführungsform ist der Kernkomplex 1910 so konfiguriert, dass er eine Hauptsteuerungssoftware ausführt, die der APU 1900 zugeordnet ist, wie z.B. ein Betriebssystem. In mindestens einer Ausführungsform ist der Kernkomplex 1910 der Hauptprozessor der APU 1900, der Operationen bzw. Betriebsabläufe der anderen Prozessoren steuert und koordiniert. In mindestens einer Ausführungsform gibt der Kernkomplex 1910 Befehle aus, die den Betrieb des Grafikkomplexes 1940 steuern. In mindestens einer Ausführungsform kann der Kernkomplex 1910 so konfiguriert sein, dass er von dem CUDA-Quellcode abgeleiteten ausführbaren Host-Code ausführt, und kann der Grafikkomplex 1940 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 1910, ohne Beschränkung darauf, Kerne 1920(1)-1920(4) und einen L3-Cache 1930. In mindestens einer Ausführungsform kann der Kernkomplex 1910, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 1920 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 1920 so konfiguriert, dass sie Anweisungen einer bestimmten Befehlssatzarchitektur („ISA“) ausführen. In mindestens einer Ausführungsform ist jeder Kern 1920 ein CPU-Kern.
  • In mindestens einer Ausführungsform enthält jeder Kern 1920, ohne Beschränkung darauf, eine Abhol-/Dekodier-Einheit 1922, eine Ganzzahlausführungsmaschine 1924, eine Gleitkommaausführungsmaschine 1926 und einen L2-Cache 1928. In mindestens einer Ausführungsform holt die Abhol-/Dekodier-Einheit 1922 Anweisungen ab, dekodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungsmaschine 1924 und die Gleitkommaausführungsmaschine 1926. In mindestens einer Ausführungsform kann die Abhol-/Dekodier-Einheit 1922 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 1924 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 1926 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 1924, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 1926, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Dekodier-Einheit 1922 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 1924 als auch die Gleitkommaausführungsmaschine 1926 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 1920(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 1920 repräsentiert, auf den L2-Cache 1928(i) zugreifen, der in dem Kern 1920(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 1910(j) enthaltene Kern 1920, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1910 repräsentiert, mit anderen in dem Kernkomplex 1910(j) enthaltenen Kernen 1920 über den in dem Kernkomplex 1910(j) enthaltenen L3-Cache 1930(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 1910(j) enthaltenen Kerne 1920, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 1910 repräsentiert, auf den gesamten L3-Cache 1930(j) zugreifen, der in dem Kernkomplex 1910(j) enthalten ist. In mindestens einer Ausführungsform kann der L3-Cache 1930, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform kann der Grafikkomplex 1940 so konfiguriert sein, dass er Rechenoperationen hochparallel ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 1940 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 1940 so konfiguriert, dass er Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist der Grafikkomplex 1940 so konfiguriert, dass er sowohl grafikbezogene als auch grafikfremde Operationen ausführt.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1940, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 1950 und einen L2-Cache 1942. In mindestens einer Ausführungsform teilen sich die Recheneinheiten 1950 den L2-Cache 1942. In mindestens einer Ausführungsform ist der L2-Cache 1942 partitioniert. In mindestens einer Aus- führungsform umfasst der Grafikkomplex 1940, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 1950 und eine beliebige Anzahl (einschließlich Null) und Art von Caches. In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1940, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 1950, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 1952 und einen gemeinsamen Speicher 1954. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 1952 eine SIMD-Architektur und ist für die parallele Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform kann jede Recheneinheit 1950 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 1950 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 1952 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 1954 kommunizieren.
  • In mindestens einer Ausführungsform ist die Struktur 1960 eine Systemverbindung bzw. ein System-Interconnect, die bzw. der Daten- und Steuerungs-Übertragungen zwischen dem Kernkomplex 1910, dem Grafikkomplex 1940, den E/A-Schnittstellen 1970, den Speichercontrollern 1980, dem Anzeigecontroller 1992 und der Multimedia-Engine 1994 ermöglicht. In mindestens einer Ausführungsform kann die APU 1900, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 1960 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 1900 sein können. In mindestens einer Ausführungsform sind die E/A-Schnittstellen 1970 repräsentativ für eine beliebige Anzahl und Art von E/A-Schnittstellen (z.B. PCI, PCI-Extended („PCI-X“), PCIe, Gigabit-Ethernet („GBE“), USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den E/A-Schnittstellen 1970 gekoppelt. Die Peripheriegeräte, die mit den E/A-Schnittstellen 1970 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 der Anzeigecontroller AMD92 Bilder auf einer oder mehreren Anzeigevorrichtungen an, z.B. auf einer Flüssigkristallanzeige („LCD“). In mindestens einer Ausführungsform umfasst die Multimedia-Engine 1994, 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 Speichercontroller 1980 die Datenübertragung zwischen der APU 1900 und einem einheitlichen Systemspeicher 1990. In mindestens einer Ausführungsform teilen sich der Kernkomplex 1910 und der Grafikkomplex 1940 den vereinheitlichten Systemspeicher 1990.
  • In mindestens einer Ausführungsform implementiert die APU 1900 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichercontrollern 1980 und Speichervorrichtungen (z.B. den gemeinsam genutzten Speicher 1954) enthält, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die APU 1900 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 1928, L3-Cache 1930 und L2-Cache 1942) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 1920, Kernkomplex 1910, SIMD-Einheiten 1952, Recheneinheiten 1950 und Grafikkomplex 1940) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 19 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 1910 oder des Grafikkomplexes 1940 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 1910 oder des Grafikkomplexes 1940 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 20 zeigt eine CPU 2000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die CPU 2000 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die CPU 2000 so konfiguriert sein, dass sie ein Anwendungsprogramm ausführt. In mindestens einer Ausführungsform ist die CPU 2000 so konfiguriert, dass sie eine Hauptsteuerungssoftware, wie z.B. ein Betriebssystem, ausführt. In mindestens einer Ausführungsform gibt die CPU 2000 Befehle aus, die den Betrieb einer externen GPU (nicht dargestellt) steuern. In mindestens einer Ausführungsform kann die CPU 2000 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 2000, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 2010, ein Fabric 2060, E/A-Schnittstellen 2070 und Speichercontroller 2080.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 2010, ohne Beschränkung darauf, Kerne 2020(1)-2020(4) und einen L3-Cache 2030. In mindestens einer Ausführungsform kann der Kernkomplex 2010, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 2020 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 2020 so konfiguriert, dass sie Anweisungen eines bestimmten ISA ausführen. In mindestens einer Ausführungsform ist jeder Kern 2020 ein CPU-Kern.
  • In mindestens einer Ausführungsform beinhaltet jeder Kern 2020, ohne Beschränkung darauf, eine Abhol-/Dekodier-Einheit 2022, eine Ganzzahlausführungsmaschine 2024, eine Gleitkommaausführungsmaschine 2026 und einen L2-Cache 2028. In mindestens einer Ausführungsform holt die Abhol-/Dekodier-Einheit 2022 Anweisungen ab, dekodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungs-Engine 2024 und die Gleitkommaausführungsmaschine 2026. In mindestens einer Ausführungsform kann die Abhol-/Dekodier-Einheit 2022 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 2024 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 2026 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 2024, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 2026, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Dekodier-Einheit 2022 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 2024 als auch die Gleitkommaausführungsmaschine 2026 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 2020(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 2020 repräsentiert, auf den L2-Cache 2028(i) zugreifen, der in dem Kern 2020(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 2010(j) enthaltene Kern 2020, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2010 repräsentiert, mit anderen Kernen 2020 in dem Kernkomplex 2010(j) über den in dem Kernkomplex 2010(j) enthaltenen L3-Cache 2030(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 2010(j) enthaltenen Kerne 2020, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2010 repräsentiert, auf den gesamten in dem Kernkomplex 2010(j) enthaltenen L3-Cache 2030(j) zugreifen. In mindestens einer Ausführungsform kann der L3-Cache 2030, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform ist das Fabric 2060 eine Systemverbindung, die Daten- und Steuerungs-Übertragungen über die Kernkomplexe 2010(1)-2010(N) (wobei N eine ganze Zahl größer als Null ist), E/A-Schnittstellen 2070 und Speichercontroller 2080 erleichtert. In mindestens einer Ausführungsform kann die CPU 2000, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 2060 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 2000 sein können. In mindestens einer Ausführungsform sind die E/A-Schnittstellen 2070 repräsentativ für eine beliebige Anzahl und Art von E/A-Schnittstellen (z.B. PCI, PCI-X, PCIe, GBE, USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den E/A-Schnittstellen 2070 gekoppelt. Zu den Peripheriegeräten, die mit den E/A-Schnittstellen 2070 gekoppelt sind, gehören unter anderem Bildschirme, Tastaturen, Mäuse, Drucker, Scanner, Joysticks oder andere Arten von Spielsteuerungen, Medienaufzeichnungsvorrichtungen, externe Speichervorrichtungen, Netzwerkschnittstellenkarten usw.
  • In mindestens einer Ausführungsform erleichtern die Speichercontroller 2080 Datenübertragungen zwischen der CPU 2000 und einem Systemspeicher 2090. In mindestens einer Ausführungsform teilen sich der Kernkomplex 2010 und der Grafikkomplex 2040 den Systemspeicher 2090. In mindestens einer Ausführungsform implementiert die CPU 2000 ein Speichersubsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichercontrollern 2080 und Speichervorrichtungen beinhaltet, die einer Komponente zugeordnet sein oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die CPU 2000 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 2028 und L3-Caches 2030) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 2020 und Kernkomplexe 2010) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 20 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2010(1)- 2010(n) verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2010(1)- 2010(n) verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 21 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice 2190, gemäß mindestens einer Ausführungsform. Wie hierin verwendet, umfasst ein „Slice“ einen bestimmten Teil von Verarbeitungsressourcen einer Beschleunigerintegrationsschaltung. In mindestens einer Ausführungsform stellt die Beschleunigerintegrationsschaltung Cache-Verwaltung, Speicherzugriff, Kontextverwaltung und Interruptverwaltungsdienste für mehrere Grafikverarbeitungsmodule in einem Grafikbeschleunigungsmodul bereit. Die Grafikverarbeitungs-Engines können jeweils eine separate GPU umfassen. Alternativ können die Grafikverarbeitungs-Engines verschiedene Arten von Grafikverarbeitungs-Engines innerhalb einer GPU umfassen, wie z.B. Grafikausführungseinheiten, Medienverarbeitungs-Engines (z.B. Video-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 2182 innerhalb eines Systemspeichers 2114 speichert Prozesselemente 2183. In einer Ausführungsform werden die Prozesselemente 2183 im Ansprechen auf GPU-Aufrufe 2181 von Anwendungen 2180, die auf dem Prozessor 2107 ausgeführt werden, gespeichert. Ein Prozesselement 2183 enthält den Prozessstatus für die entsprechende Anwendung 2180. Ein in dem Prozesselement 2183 enthaltener Arbeits- bzw. Workdeskriptor („WD“) 2184 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 2184 ein Zeiger auf eine Auftragsanforderungswarteschlange in dem effektiven Adressraum 2182 der Anwendung.
  • Das Grafikbeschleunigungsmodul 2146 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 2184 an das Grafikbeschleunigungsmodul 2146 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 2146 oder eine individuelle Grafikverarbeitungs-Engine. Weil das Grafikbeschleunigungsmodul 2146 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 2146 zugewiesen wird.
  • Im Betrieb holt eine WD-Abholeinheit 2191 in dem Beschleunigerintegrations-Slice 2190 den nächsten WD 2184 ab, der eine Angabe der Arbeit enthält, die von einer oder mehreren Grafikverarbeitungsmaschinen des Grafikbeschleunigungsmoduls 2146 zu erledigen ist. Daten aus dem WD 2184 können in Registern 2145 gespeichert und von einer Speicherverwaltungseinheit („MMU“) 2139, einer Unterbrechungs- bzw. Interrupt-Verwaltungsschaltung 2147 und/oder einer Kontextverwaltungsschaltung 2148 verwendet werden, wie dargestellt. Eine Ausführungsform der MMU 2139 beinhaltet beispielsweise einen Segment-/Seitenlauf-Schaltkreis für den Zugriff auf Segment-/Seitentabellen 2186 innerhalb des virtuellen Betriebssystemadressraums 2185. Die Interrupt-Verwaltungsschaltung 2147 kann von dem Grafikbeschleunigungsmodul 2146 empfangene Interrupt-Ereignisse („INT“) 2192 verarbeiten. Bei der Durchführung von Grafikoperationen wird eine von einer Grafikverarbeitungsmaschine erzeugte effektive Adresse 2193 von der MMU 2139 in eine reale Adresse übersetzt.
  • In einer Ausführungsform wird für jede Grafikverarbeitungs-Engine und/oder jedes Grafikbeschleunigungsmodul 2146 ein gleicher Satz von Registern 2145 dupliziert und kann von einem Hypervisor oder Betriebssystem initialisiert werden. Jedes dieser duplizierten Register kann in dem Beschleunigerintegrations-Slice 2190 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 2184 spezifisch für ein bestimmtes Grafikbeschleunigungsmodul 2146 und/oder eine bestimmte Grafikverarbeitungs-Engine. Er enthält alle Informationen, die von einer Grafikverarbeitungs-Engine benötigt werden, um Arbeit zu verrichten, oder er kann ein Zeiger auf einen Speicherplatz sein, an dem eine Anwendung eine Befehlswarteschlange von abzuschließender Arbeit eingerichtet hat.
  • In mindestens einer Ausführungsform wird mindestens eine in 21 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Prozessor 2107 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Prozessor 2107 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 22A und 22B veranschaulichen beispielhafte Grafikprozessoren, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann jeder der beispielhaften Grafikprozessoren unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein. Zusätzlich zu dem, was dargestellt ist, können andere Logik und Schaltungen in mindestens einer Ausführungsform enthalten sein, einschließlich zusätzlicher Grafikprozessoren/-kerne, Peripherieschnittstellencontroller oder Universalprozessorkerne. In mindestens einer Ausführungsform sind die beispielhaften Grafikprozessoren zur Verwendung innerhalb eines SoC vorgesehen.
  • 22A veranschaulicht einen beispielhaften Grafikprozessor 2210 eines integrierten SoC-Schaltkreises, der unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein kann, gemäß mindestens einer Ausführungsform. 22B veranschaulicht einen weiteren beispielhaften Grafikprozessor 2240 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 2210 von 22A ein stromsparender Grafikprozessorkern. In mindestens einer Ausführungsform ist der Grafikprozessor 2240 von 22B ein Grafikprozessorkern mit höherer Leistung. In mindestens einer Ausführungsform kann jeder der Grafikprozessoren 2210, 2240 eine Variante des Grafikprozessors 1710 von 17 sein.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2210 einen Vertex-Prozessor 2205 und einen oder mehrere Fragment-Prozessor(en) 2215A-2215N (z.B. 2215A, 2215B, 2215C, 2215D, bis 2215N-1 und 2215N). In mindestens einer Ausführungsform kann der Grafikprozessor 2210 verschiedene Shader-Programme über eine separate Logik ausführen, so dass der Vertex-Prozessor 2205 für die Ausführung von Operationen für Vertex-Shader-Programme optimiert ist, während ein oder mehrere Fragment-Prozessor(en) 2215A-2215N 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 2205 eine Vertex-Verarbeitungsstufe einer 3D-Grafik-Pipeline aus und erzeugt Primitive und Vertex-Daten. In mindestens einer Ausführungsform verwenden Fragmentprozessor(en) 2215A-2215N die von dem Vertexprozessor 2205 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) 2215A-2215N 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 2210 zusätzlich eine oder mehrere MMU(s) 2220A-2220B, Cache(s) 2225A-2225B und Schaltungsverbindung(en) bzw. Interconnect(s) 2230A-2230B. In mindestens einer Ausführungsform sorgen eine oder mehrere MMU(s) 2220A-2220B für die Zuordnung von virtuellen zu physikalischen Adressen für den Grafikprozessor 2210, einschließlich für den Vertex-Prozessor 2205 und/oder den/die Fragment-Prozessor(en) 2215A-2215N, der/die auf in dem Speicher gespeicherte Vertex- oder Bild/Textur-Daten verweisen kann/können, zusätzlich zu Vertex- oder Bild/Textur-Daten, die in einem oder mehreren Cache(s) 2225A-2225B gespeichert sind. In mindestens einer Ausführungsform können eine oder mehrere MMU(s) 2220A-2220B mit anderen MMUs innerhalb eines Systems synchronisiert werden, einschließlich einer oder mehrerer MMUs, die einem oder mehreren Anwendungsprozessor(en) 1705, Bildprozessor(en) 1715 und/oder Videoprozessor(en) 1720 von 17 zugeordnet sind, so dass jeder Prozessor 1705-1720 an einem gemeinsamen oder vereinheitlichten virtuellen Speichersystem teilhaben kann. In mindestens einer Ausführungsform ermöglichen eine oder mehrere Schaltungsverbindung(en) 2230A-2130B dem Grafikprozessor 2210 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 2240 eine oder mehrere MMU(s) 2220A-2220B, Caches 2225A-2225B und Schaltungsverbindungen 2230A-2230B des Grafikprozessors 2210 von 22A. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2240 einen oder mehrere Shader-Kerne 2255A-2255N (z.B. 2255A, 2255B, 2255C, 2255D, 2255E, 2255F bis 2255N-1 und 2255N), die eine einheitliche Shader-Kern-Architektur bereitstellen, in der ein einziger Kern oder Art oder Kern alle Arten von programmierbarem Shader-Code ausführen kann, einschließlich Shader-Programmcode zur Implementierung von Vertex-Shadern, Fragment-Shadern und/oder Rechen-Shadern. In mindestens einer Ausführungsform kann eine Anzahl von Shader-Kernen variieren. In mindestens einer Ausführungsform enthält der Grafikprozessor 2240 einen Zwischenkern-Aufgabenverwalter bzw. Intercore-Taskmanager 2245, der als ein Thread-Dispatcher bzw. - Versender fungiert, um Ausführungs-Threads an einen oder mehrere Shader-Kerne 2255A-2255N zu verteilen, und eine Kacheleinheit 2258, um Kacheloperationen für kachelbasiertes Rendering zu beschleunigen, bei denen Renderingoperationen für eine Szene in den Bildraum unterteilt werden, um beispielsweise lokale räumliche Kohärenz innerhalb einer Szene auszunutzen oder die Verwendung interner Caches zu optimieren.
  • In mindestens einer Ausführungsform wird mindestens eine in 22A und 22B gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens einer von Grafikprozessor 2210 oder Grafikprozessor 2240 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Grafikprozessor 2210 oder der Grafikprozessor 2240 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 23A veranschaulicht einen Grafikkern 2300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Grafikkern 2300 in dem Grafikprozessor 1710 von 17 enthalten sein. In mindestens einer Ausführungsform kann der Grafikkern 2300 ein einheitlicher Shader-Kern 2255A-2255N wie in 22B sein. In mindestens einer Ausführungsform beinhaltet der Grafikkern 2300 einen gemeinsam genutzten Befehlscache 2302, eine Textureinheit 2332 und einen Cache/gemeinsamen Speicher 2320, die den Ausführungsressourcen innerhalb des Grafikkerns 2300 gemeinsam sind. In mindestens einer Ausführungsform kann der Grafikkern 2300 mehrere Slices 2301A-2301N oder Partitionen für jeden Kern enthalten, und kann ein Grafikprozessor mehrere Instanzen des Grafikkerns 2300 enthalten. Die Slices 2301A-2301N können eine Unterstützungslogik enthalten, die einen lokalen Befehlscache 2304A-2304N, einen Thread-Planer bzw. Thread-Scheduler 2306A-2306N, einen Thread-Versender bzw. Thread-Dispatcher 2308A-2308N und einen Satz von Registern 2310A-2310N beinhaltet. In mindestens einer Ausführungsform können die Slices 2301A-2301N einen Satz zusätzlicher Funktionseinheiten („AFUs“) 2312A-2312N, Gleitkommaeinheiten („FPUs“) 2314A-2314N, ganzzahlige Arithmetik-Logik-Einheiten („ALUs“) 2316-2316N, Adressberechnungseinheiten („ACUs“) 2313A-2313N, doppeltpräzise Gleitkommaeinheiten („DPFPUs“) 2315A-2315N und Matrixverarbeitungseinheiten („MPUs“) 2317A-2317N beinhalten.
  • In mindestens einer Ausführungsform können die FPUs 2314A-2314N Gleitkommaoperationen mit einfacher Genauigkeit (32 Bit) und halber Genauigkeit (16 Bit) durchführen, während die DPFPUs 2315A-2315N Gleitkommaoperationen mit doppelter Genauigkeit (64 Bit) durchführen. In mindestens einer Ausführungsform können die ALUs 2316A-2316N 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 2317A-2317N 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 2317-2317N 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 2312A-2312N zusätzliche logische Operationen durchführen, die nicht von Gleitkomma- oder Ganzzahleinheiten unterstützt werden, einschließlich trigonometrischer Operationen (z.B. Sinus, Cosinus usw.).
  • In mindestens einer Ausführungsform wird mindestens eine in 23A gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Grafikkern 2300 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Grafikkern 2300 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 23B veranschaulicht eine Universal-Grafikverarbeitungseinheit („GPGPU“) 2330, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die GPGPU 2330 hochparallel und für den Einsatz auf einem Multi-Chip-Modul geeignet. In mindestens einer Ausführungsform kann die GPGPU 2330 so konfiguriert sein, dass hochparallele Rechenoperationen von einem Array von GPUs durchgeführt werden können. In mindestens einer Ausführungsform kann die GPGPU 2330 direkt mit anderen Instanzen der GPGPU 2330 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 2330 eine Host-Schnittstelle 2332, um eine Verbindung mit einem Hostprozessor zu ermöglichen. In mindestens einer Ausführungsform ist die Host-Schnittstelle 2332 eine PCIe-Schnittstelle. In mindestens einer Ausführungsform kann die Host-Schnittstelle 2332 eine herstellerspezifische Kommunikationsschnittstelle oder ein Kommunikations-Fabric sein. In mindestens einer Ausführungsform empfängt die GPGPU 2330 Befehle von einem Hostprozessor und verwendet einen globalen Planer bzw. Scheduler 2334, um Ausführungs-Threads, die mit diesen Befehlen verbunden sind, an einen Satz von Rechenclustern 2336A-2336H zu verteilen. In mindestens einer Ausführungsform teilen sich die Rechencluster 2336A-2336H einen Cachespeicher 2338. In mindestens einer Ausführungsform kann der Cachespeicher 2338 als ein übergeordneter Cache für Cachespeicher innerhalb von Rechenclustern 2336A-2336H dienen.
  • In mindestens einer Ausführungsform umfasst die GPGPU 2330 einen Speicher 2344A-2344B, der über eine Reihe von Speichercontrollern 2342A-2342B mit den Rechenclustern 2336A-2336H verbunden ist. In mindestens einer Ausführungsform kann der Speicher 2344A-2344B 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 2336A-2336H jeweils einen Satz von Grafikkernen, wie z.B. den Grafikkern 2300 von 23A, 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 2336A-2336H 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 2330 so konfiguriert sein, dass sie als Rechencluster arbeiten. Die Rechencluster 2336A-2336H können beliebige technisch machbare Kommunikationstechniken zur Synchronisation und zum Datenaustausch implementieren. In mindestens einer Ausführungsform kommunizieren mehrere Instanzen der GPGPU 2330 über die Host-Schnittstelle 2332. In mindestens einer Ausführungsform enthält die GPGPU 2330 einen E/A-Hub 2339, der die GPGPU 2330 mit einer GPU-Verbindung 2340 koppelt, die eine direkte Verbindung zu anderen Instanzen der GPGPU 2330 ermöglicht. In mindestens einer Ausführungsform ist die GPU-Verbindung 2340 mit einer dedizierten GPU-zu-GPU-Brücke gekoppelt, die die Kommunikation und Synchronisation die zwischen mehreren Instanzen der GPGPU 2330 ermöglicht. In mindestens einer Ausführungsform koppelt die GPU-Verbindung 2340 mit einem Hochgeschwindigkeits-Interconnect, um Daten an andere GPGPUs 2330 oder Parallelprozessoren zu senden und von diesen zu empfangen. In mindestens einer Ausführungsform befinden sich mehrere Instanzen der GPGPU 2330 in separaten Datenverarbeitungssystemen und kommunizieren über eine Netzwerkvorrichtung, die über die Host-Schnittstelle 2332 zugänglich ist. In mindestens einer Ausführungsform kann die GPU-Verbindung 2340 so konfiguriert sein, dass sie zusätzlich oder alternativ zu der Host-Schnittstelle 2332 eine Verbindung zu einem Hostprozessor ermöglicht. In mindestens einer Ausführungsform kann die GPGPU 2330 so konfiguriert sein, dass sie ein CUDA-Programm ausführt.
  • In mindestens einer Ausführungsform wird mindestens eine in 23B gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird die GPGPU 2330 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird die GPGPU 2330 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 24A veranschaulicht einen Parallelprozessor 2400, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform können verschiedene Komponenten des Parallelprozessors 2400 mit einem oder mehreren integrierten Schaltkreisen, wie z.B. programmierbaren Prozessoren, anwendungsspezifischen integrierten Schaltkreisen („ASICs“) oder FPGAs, implementiert sein.
  • In mindestens einer Ausführungsform enthält der Parallelprozessor 2400 eine Parallelverarbeitungseinheit 2402. In mindestens einer Ausführungsform enthält die Parallelverarbeitungseinheit 2402 eine E/A-Einheit 2404, die die Kommunikation mit anderen Vorrichtungen ermöglicht, einschließlich anderer Instanzen der Parallelverarbeitungseinheit 2402. In mindestens einer Ausführungsform kann die E/A-Einheit 2404 direkt mit anderen Vorrichtungen verbunden sein. In mindestens einer Ausführungsform ist die E/A-Einheit 2404 über eine Hub- oder Switch-Schnittstelle, wie z.B. den Speicher-Hub 2405, mit anderen Vorrichtungen verbunden. In mindestens einer Ausführungsform bilden die Verbindungen zwischen dem Speicher-Hub 2405 und der E/A-Einheit 2404 eine Kommunikationsverbindung. In mindestens einer Ausführungsform ist die E/A-Einheit 2404 mit einer Host-Schnittstelle 2406 und einer Speicherkreuzschiene 2416 verbunden, wobei die Host-Schnittstelle 2406 Befehle zur Durchführung von Verarbeitungsvorgängen und die Speicherkreuzschiene 2416 Befehle zur Durchführung von Speicheroperationen empfängt.
  • In mindestens einer Ausführungsform kann die Host-Schnittstelle 2406 dann, wenn die Host-Schnittstelle einen Befehlspuffer über die E/A-Einheit 2404 empfängt, Arbeitsoperationen zur Ausführung dieser Befehle an ein Frontend 2408 leiten. In mindestens einer Ausführungsform ist das Frontend 2408 mit einem Planer bzw. Scheduler 2410 gekoppelt, der so konfiguriert ist, dass er Befehle oder andere Arbeitselemente an ein Verarbeitungsfeld bzw. Verarbeitungs-Array 2412 verteilt. In mindestens einer Ausführungsform stellt der Scheduler 2410 sicher, dass das Verarbeitungs-Array 2412 richtig konfiguriert ist und sich in einem gültigen Zustand befindet, bevor Aufgaben an das Verarbeitungs-Array 2412 verteilt werden. In mindestens einer Ausführungsform ist der Scheduler 2410 über Firmware-Logik implementiert, die auf einem Mikrocontroller ausgeführt wird. In mindestens einer Ausführungsform ist der in einem Mikrocontroller implementierte Scheduler 2410 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 2412 ausgeführt werden. In mindestens einer Ausführungsform kann die Hostsoftware Arbeitslasten für die Planung auf dem Verarbeitungs-Array 2412 über eine von mehreren Grafikverarbeitungs-Doorbells nachweisen. In mindestens einer Ausführungsform können die Arbeitslasten dann automatisch über das Verarbeitungs-Array 2412 durch die Logik des Schedulers 2410 in einem Mikrocontroller mit Scheduler 2410 verteilt werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2412 bis zu „N“ Cluster umfassen (z.B. Cluster 2414A, Cluster 2414B bis Cluster 2414N). In mindestens einer Ausführungsform kann jeder Cluster 2414A-2414N des Verarbeitungs-Arrays 2412 eine große Anzahl gleichzeitiger Threads ausführen. In mindestens einer Ausführungsform kann der Scheduler 2410 den Clustern 2414A-2414N des Verarbeitungs-Arrays 2412 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 2410 gehandhabt werden, oder kann teilweise durch die Compilerlogik während der Kompilierung der Programmlogik, die für die Ausführung durch das Verarbeitungs-Array 2412 konfiguriert ist, unterstützt werden. In mindestens einer Ausführungsform können verschiedene Cluster 2414A-2414N des Verarbeitungs-Arrays 2412 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 2412 so konfiguriert sein, dass es verschiedene Arten von parallelen Verarbeitungsoperationen durchführt. In mindestens einer Ausführungsform ist das Verarbeitungs-Array 2412 so konfiguriert, dass es parallele Universalrechenoperationen durchführt. Zum Beispiel kann in mindestens einer Ausführungsform das Verarbeitungs-Array 2412 Logik zur Ausführung von Verarbeitungsaufgaben enthalten, einschließlich der Filterung von Video- und/oder Audiodaten, der Durchführung von Modellierungsoperationen, einschließlich physikalischer Operationen, und der Durchführung von Datentransformationen.
  • In mindestens einer Ausführungsform ist das Verarbeitungs-Array 2412 so konfiguriert, dass es parallele Grafikverarbeitungsoperationen durchführt. In mindestens einer Ausführungsform kann das Verarbeitungsarray 2412 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 2412 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 2402 Daten aus dem Systemspeicher über die E/A-Einheit 2404 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 2422) gespeichert und dann in den Systemspeicher zurückgeschrieben werden.
  • In mindestens einer Ausführungsform kann dann, wenn die Parallelverarbeitungseinheit 2402 zur Durchführung der Grafikverarbeitung verwendet wird, der Scheduler 2410 so konfiguriert sein, dass er eine Verarbeitungslast in ungefähr gleich große Aufgaben aufteilt, um eine bessere Verteilung der Grafikverarbeitungsoperationen auf mehrere Cluster 2414A-2414N des Verarbeitungsarrays 2412 zu ermöglichen. In mindestens einer Ausführungsform können Teile des Verarbeitungs-Arrays 2412 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 2414A-2414N erzeugt werden, in Puffern gespeichert werden, damit Zwischendaten zur weiteren Verarbeitung zwischen den Clustern 2414A-2414N übertragen werden können.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2412 Verarbeitungsaufgaben empfangen, die über den Scheduler 2410 auszuführen sind, der Befehle zur Definition von Verarbeitungsaufgaben von dem Frontend 2408 empfängt. In mindestens einer Ausführungsform können die Verarbeitungsaufgaben Indizes der zu verarbeitenden Daten enthalten, z.B. Oberflächen-(Patch-)Daten, Primitivdaten, Vertexdaten und/oder Pixeldaten, sowie Zustandsparameter und Befehle, die definieren, wie die Daten zu verarbeiten sind (z.B. welches Programm auszuführen ist). In mindestens einer Ausführungsform kann der Scheduler 2410 so konfiguriert sein, dass er den Aufgaben entsprechende Indizes abruft oder Indizes von dem Frontend 2408 empfängt. In mindestens einer Ausführungsform kann das Frontend 2408 so konfiguriert sein, dass es sicherstellt, dass das Verarbeitungs-Array 2412 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 2402 mit dem Parallelprozessorspeicher 2422 gekoppelt sein. In mindestens einer Ausführungsform kann auf den Parallelprozessorspeicher 2422 über eine Speicherkreuzschiene 2416 zugegriffen werden, die Speicheranforderungen von dem Verarbeitungs-Array 2412 sowie von der E/A-Einheit 2404 empfangen kann. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2416 über eine Speicherschnittstelle 2418 auf den Parallelprozessorspeicher 2422 zugreifen. In mindestens einer Ausführungsform kann die Speicherschnittstelle 2418 mehrere Partitionseinheiten (z.B. eine Partitionseinheit 2420A, eine Partitionseinheit 2420B bis eine Partitionseinheit 2420N) beinhalten, die jeweils mit einem Teil (z.B. einer Speichereinheit) des Parallelprozessorspeichers 2422 gekoppelt sein können. In mindestens einer Ausführungsform ist eine Anzahl von Partitionseinheiten 2420A-2420N so konfiguriert, dass sie gleich einer Anzahl von Speichereinheiten ist, so dass eine erste Partitionseinheit 2420A eine entsprechende erste Speichereinheit 2424A hat, eine zweite Partitionseinheit 2420B eine entsprechende Speichereinheit 2424B hat und eine N-te Partitionseinheit 2420N eine entsprechende N-te Speichereinheit 2424N hat. In mindestens einer Ausführungsform kann die Anzahl der Partitionseinheiten 2420A-2420N nicht gleich der Anzahl der Speichereinheiten sein.
  • In mindestens einer Ausführungsform können die Speichereinheiten 2424A-2424N 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 2424A-2424N 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 2424A-2424N hinweg gespeichert werden, so dass die Partitionseinheiten 2420A-2420N Teile jedes Renderingziels parallel schreiben können, um die verfügbare Bandbreite des Parallelprozessorspeichers 2422 effizient zu nutzen. In mindestens einer Ausführungsform kann eine lokale Instanz des Parallelprozessorspeichers 2422 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 2414A-2414N des Verarbeitungs-Arrays 2412 Daten verarbeiten, die in jede der Speichereinheiten 2424A-2424N in dem Parallelprozessorspeicher 2422 geschrieben werden. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2416 so konfiguriert sein, dass sie eine Ausgabe jedes Clusters 2414A-2414N an eine beliebige Partitionseinheit 2420A-2420N oder an einen anderen Cluster 2414A-2414N überträgt, der zusätzliche Verarbeitungsoperationen an einer Ausgabe durchführen kann. In mindestens einer Ausführungsform kann jeder Cluster 2414A-2414N mit der Speicherschnittstelle 2418 über die Speicherkreuzschiene 2416 kommunizieren, um von verschiedenen externen Speichervorrichtungen zu lesen oder in diese zu schreiben. In mindestens einer Ausführungsform hat die Speicherkreuzschiene 2416 eine Verbindung zu der Speicherschnittstelle 2418, um mit der E/A-Einheit 2404 zu kommunizieren, sowie eine Verbindung zu einer lokalen Instanz des Parallelprozessorspeichers 2422, so dass die Verarbeitungseinheiten in den verschiedenen Clustern 2414A-2414N mit dem Systemspeicher oder einem anderen Speicher kommunizieren können, der nicht lokal zur Parallelverarbeitungseinheit 2402 ist. In mindestens einer Ausführungsform kann die Speicherkreuzschiene 2416 virtuelle Kanäle verwenden, um Verkehrsstreams zwischen Clustern 2414A-2414N und Partitionseinheiten 2420A-2420N zu trennen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der Parallelverarbeitungseinheit 2402 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 2402 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 2402 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 2402 oder des Parallelprozessors 2400 enthalten, in einer Vielzahl von Konfigurationen und Formfaktoren implementiert sein, einschließlich, aber nicht beschränkt auf, Desktop-, Laptop- oder Handheld-Personal Computer, Server, Workstations, Spielkonsolen und/oder eingebettete Systeme.
  • In mindestens einer Ausführungsform wird mindestens eine in 24A gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Parallelprozessor 2400 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Parallelprozessor 2400 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 24B zeigt einen Verarbeitungscluster 2494, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2494 in einer Parallelverarbeitungseinheit enthalten. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2494 einer der Verarbeitungscluster 2414A-2414N von 24. In mindestens einer Ausführungsform kann der Verarbeitungscluster 2494 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 2494 ausgibt.
  • In mindestens einer Ausführungsform kann der Betrieb des Verarbeitungsclusters 2494 über einen Pipeline-Manager 2432 gesteuert werden, der Verarbeitungsaufgaben auf parallele SIMT-Prozessoren verteilt. In mindestens einer Ausführungsform empfängt der Pipeline-Manager 2432 Anweisungen von dem Scheduler 2410 von 24 und verwaltet die Ausführung dieser Anweisungen über einen Grafik-Multiprozessor 2434 und/oder eine Textureinheit 2436. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2434 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 2494 enthalten sein. In mindestens einer Ausführungsform können eine oder mehrere Instanzen des Grafik-Multiprozessors 2434 in dem Verarbeitungscluster 2494 enthalten sein. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2434 Daten verarbeiten und kann eine Datenkreuzschiene 2440 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 2432 die Verteilung der verarbeiteten Daten erleichtern, indem er Ziele für die verarbeiteten Daten angibt, die über die Datenkreuzschiene 2440 zu verteilen sind.
  • In mindestens einer Ausführungsform kann jeder Grafik-Multiprozessor 2434 innerhalb des Verarbeitungsclusters 2494 einen identischen Satz an funktioneller Ausführungslogik (z.B. Arithmetik-Logik-Einheiten, 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 2494 ü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 2434 zugewiesen sein. In mindestens einer Ausführungsform kann eine Thread-Gruppe weniger Threads umfassen als die Anzahl der Verarbeitungs-Engines innerhalb des Grafik-Multiprozessors 2434. 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 2434 enthalten. Wenn eine Thread-Gruppe mehr Threads umfasst als die Anzahl der Verarbeitungs-Engines in dem Grafik-Multiprozessor 2434, 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 2434 ausgeführt werden.
  • In mindestens einer Ausführungsform enthält der Grafik-Multiprozessor 2434 einen internen Cachespeicher, um Lade- und Speicheroperationen durchzuführen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2434 auf einen internen Cache verzichten und einen Cachespeicher (z.B. L1-Cache 2448) innerhalb des Verarbeitungsclusters 2494 verwenden. In mindestens einer Ausführungsform hat jeder Grafik-Multiprozessor 2434 auch Zugriff auf Level-2 („L2“)-Caches innerhalb von Partitionseinheiten (z.B. den Partitionseinheiten 2420A-2420N von 24A), die von allen Verarbeitungsclustern 2494 gemeinsam genutzt werden und zur Datenübertragung zwischen Threads verwendet werden können. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2434 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 2402 als globaler Speicher verwendet werden. In mindestens einer Ausführungsform umfasst der Verarbeitungscluster 2494 mehrere Instanzen des Grafik-Multiprozessors 2434, die sich gemeinsame Anweisungen und Daten teilen können, die in dem L1-Cache 2448 gespeichert sein können.
  • In mindestens einer Ausführungsform kann jeder Verarbeitungscluster 2494 eine MMU 2445 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 2445 innerhalb der Speicherschnittstelle 2418 von 24 befinden. In mindestens einer Ausführungsform enthält die MMU 2445 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 2445 Adressübersetzungs-Lookaside-Puffer („TLBs“) oder Caches enthalten, die sich in dem Grafik-Multiprozessor 2434 oder in dem L1-Cache 2448 oder in dem Verarbeitungscluster 2494 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 2494 so konfiguriert sein, dass jeder Grafik-Multiprozessor 2434 mit einer Textureinheit 2436 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 2434 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 2434 eine verarbeitete Aufgabe an die Datenkreuzschiene 2440 aus, um die verarbeitete Aufgabe einem anderen Verarbeitungscluster 2494 zur weiteren Verarbeitung bereitzustellen oder um die verarbeitete Aufgabe in einem L2-Cache, einem lokalen Parallelprozessorspeicher oder einem Systemspeicher über die Speicherkreuzschiene 2416 zu speichern. In mindestens einer Ausführungsform ist eine Pre-Raster-Operations-Einheit („preROP“) 2442 so konfiguriert, dass sie Daten von dem Grafik-Multiprozessor 2434 empfängt und Daten an ROP-Einheiten weiterleitet, die sich bei den hierin beschriebenen Partitionseinheiten (z.B. den Partitionseinheiten 2420A-2420N in 24) befinden können. In mindestens einer Ausführungsform kann die PreROP 2442 Optimierungen für die Farbmischung durchführen, Pixelfarbdaten organisieren und Adressübersetzungen vornehmen.
  • In mindestens einer Ausführungsform wird mindestens eine in 24B gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Grafikmultiprozessor 2434 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Grafikmultiprozessor 2434 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 24C veranschaulicht einen Grafik-Multiprozessor 2496, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2496 der Grafik-Multiprozessor 2434 von 24B. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2496 mit dem Pipeline-Manager 2432 des Verarbeitungsclusters 2494 gekoppelt. In mindestens einer Ausführungsform hat der Grafik-Multiprozessor 2496 eine Ausführungs-Pipeline, die unter anderem einen Anweisungscache 2452, eine Anweisungseinheit 2454, eine Adressabbildungseinheit 2456, eine Registerdatei 2458, einen oder mehrere GPGPU-Kerne 2462 und eine oder mehrere LSUs 2466 beinhaltet. Die GPGPU-Kerne 2462 und die LSUs 2466 sind über eine Speicher- und Cache-Verbindung 2468 mit dem Cachespeicher 2472 und dem gemeinsamen Speicher 2470 gekoppelt.
  • In mindestens einer Ausführungsform empfängt der Anweisungscache 2452 einen Stream bzw. Strom von auszuführenden Befehlen von dem Pipeline-Manager 2432. In mindestens einer Ausführungsform werden die Befehle in dem Anweisungscache 2452 zwischengespeichert und von der Anweisungseinheit 2454 zur Ausführung bereitgestellt. In mindestens einer Ausführungsform kann die Anweisungseinheit 2454 Anweisungen als Thread-Gruppen (z.B. Warps) versenden, wobei jeder Thread einer Thread-Gruppe einer anderen Ausführungseinheit innerhalb des GPGPU-Kerns 2462 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 2456 verwendet werden, um Adressen in einem vereinheitlichten Adressraum in eine eindeutige Speicheradresse zu übersetzen, auf die die LSUs 2466 zugreifen können.
  • In mindestens einer Ausführungsform stellt die Registerdatei 2458 einen Satz von Registern für Funktionseinheiten des Grafik-Multiprozessors 2496 bereit. In mindestens einer Ausführungsform stellt die Registerdatei 2458 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten (z.B. GPGPU-Kerne 2462, LSUs 2466) des Grafik-Multiprozessors 2496 verbunden sind. In mindestens einer Ausführungsform ist die Registerdatei 2458 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 2458 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 2458 zwischen verschiedenen Thread-Gruppen aufgeteilt, die von dem Grafik-Multiprozessor 2496 ausgeführt werden.
  • In mindestens einer Ausführungsform können die GPGPU-Kerne 2462 jeweils FPUs und/oder Integer-ALUs enthalten, die zur Ausführung von Anweisungen des Grafik-Multiprozessors 2496 verwendet werden. Die GPGPU-Kerne 2462 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 2462 eine FPU mit einfacher Genauigkeit und eine Integer-ALU, während ein zweiter Teil der GPGPU-Kerne 2462 eine FPU mit doppelter Genauigkeit enthält. In mindestens einer Ausführungsform können die FPUs den IEEE 754-2008-Standard für Gleitkommaarithmetik implementieren oder Gleitkommaarithmetik mit variabler Genauigkeit ermöglichen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2496 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 2462 auch eine Logik mit fester oder spezieller Funktion enthalten.
  • In mindestens einer Ausführungsform enthalten die GPGPU-Kerne 2462 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 2462 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 2462 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 2468 ein Verbindungsnetzwerk, das jede Funktionseinheit des Grafik-Multiprozessors 2496 mit der Registerdatei 2458 und dem gemeinsamen Speicher 2470 verbindet. In mindestens einer Ausführungsform ist die Speicher- und Cache-Verbindung 2468 eine Kreuzschienenverbindung, die es der LSU 2466 ermöglicht, Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher 2470 und der Registerdatei 2458 durchzuführen. In mindestens einer Ausführungsform kann die Registerdatei 2458 mit derselben Frequenz arbeiten wie die GPGPU-Kerne 2462, so dass die Datenübertragung zwischen den GPGPU-Kernen 2462 und der Registerdatei 2458 eine sehr geringe Latenz aufweist. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2470 verwendet werden, um die Kommunikation zwischen Threads zu ermöglichen, die auf Funktionseinheiten innerhalb des Grafik-Multiprozessors 2496 ausgeführt werden. In mindestens einer Ausführungsform kann der Cachespeicher 2472 z.B. als Datencache verwendet werden, um Texturdaten zu cachen, die zwischen Funktionseinheiten und der Textureinheit 2436 kommuniziert werden. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2470 auch als programmverwalteter Cache verwendet werden. In mindestens einer Ausführungsform können Threads, die auf den GPGPU-Kernen 2462 ausgeführt werden, zusätzlich zu den automatisch zwischengespeicherten Daten, die in dem Cachespeicher 2472 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.
  • In mindestens einer Ausführungsform wird mindestens eine in 24C gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Grafikmultiprozessor 2496 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Grafikmultiprozessor 2496 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 25 zeigt einen Grafikprozessor 2500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst der Grafikprozessor 2500 eine Ringverbindung 2502, ein Pipeline-Frontend 2504, eine Media Engine 2537 und Grafikkerne 2580A-2580N. In mindestens einer Ausführungsform verbindet die Ringverbindung 2502 den Grafikprozessor 2500 mit anderen Verarbeitungseinheiten, einschließlich anderer Grafikprozessoren oder eines oder mehrerer Mehrzweckprozessorkerne. In mindestens einer Ausführungsform ist der Grafikprozessor 2500 einer von vielen Prozessoren, die in ein Multikern-Verarbeitungssystem integriert sind.
  • In mindestens einer Ausführungsform empfängt der Grafikprozessor 2500 Stapel von Befehlen über die Ringverbindung 2502. In mindestens einer Ausführungsform werden die eingehenden Befehle von einem Befehlsstreamer 2503 in dem Pipeline-Frontend 2504 interpretiert. In mindestens einer Ausführungsform enthält der Grafikprozessor 2500 eine skalierbare Ausführungslogik zur Durchführung der 3D-Geometrieverarbeitung und der Medienverarbeitung über den/die Grafikkern(e) 2580A-2580N. In mindestens einer Ausführungsform liefert der Befehlsstreamer 2503 für 3D-Geometrieverarbeitungsbefehle Befehle an die Geometrie-Pipeline 2536. In mindestens einer Ausführungsform liefert der Befehlsstreamer 2503 für mindestens einige Medienverarbeitungsbefehle Befehle an ein Video-Frontend 2534, das mit einer Medien-Engine 2537 gekoppelt ist. In mindestens einer Ausführungsform umfasst die Medien-Engine 2537 eine Video Quality Engine („VQE“) 2530 für die Video- und Bildnachbearbeitung und eine Multiformat-Kodier-/ Dekodier-Engine („MFX“) 2533 für die hardwarebeschleunigte Kodierung und Dekodierung von Mediendaten. In mindestens einer Ausführungsform erzeugen die Geometrie-Pipeline 2536 und die Medien-Engine 2537 jeweils Ausführungs-Threads für Thread-Ausführungsressourcen, die von mindestens einem Grafikkern 2580A bereitgestellt werden.
  • In mindestens einer Ausführungsform enthält der Grafikprozessor 2500 skalierbare Thread-Ausführungsressourcen mit modularen Grafikkernen 2580A-2580N (manchmal als Kern-Slices bezeichnet), die jeweils mehrere Subkerne 2550A-550N, 2560A-2560N (manchmal als Kern-Sub-Slices bezeichnet) aufweisen. In mindestens einer Ausführungsform kann der Grafikprozessor 2500 eine beliebige Anzahl von Grafikkernen 2580A bis 2580N aufweisen. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2500 einen Grafikkern 2580A mit mindestens einem ersten Subkern 2550A und einem zweiten Subkern 2560A. In mindestens einer Ausführungsform ist der Grafikprozessor 2500 ein Prozessor mit geringem Stromverbrauch und einem einzigen Subkern (z.B. dem Subkern 2550A). In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2500 mehrere Grafikkerne 2580A-2580N, die jeweils einen Satz erster Subkerne 2550A-2550N und einen Satz zweiter Subkerne 2560A-2560N umfassen. In mindestens einer Ausführungsform enthält jeder Subkern in den ersten Subkernen 2550A-2550N mindestens einen ersten Satz von Ausführungseinheiten („EUs“) 2552A-2552N und Medien-/Textur-Sampler 2554A-2554N. In mindestens einer Ausführungsform enthält jeder Subkern in den zweiten Subkernen 2560A-2560N mindestens einen zweiten Satz von Ausführungseinheiten 2562A-2562N und Samplern 2564A-2564N. In mindestens einer Ausführungsform teilt sich jeder Subkern 2550A-2550N, 2560A-2560N einen Satz von gemeinsam genutzten Ressourcen 2570A-2570N. In mindestens einer Ausführungsform umfassen die gemeinsam genutzten Ressourcen 2570 den gemeinsam genutzten Cachespeicher und die Pixeloperationslogik.
  • In mindestens einer Ausführungsform wird mindestens eine in 25 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Grafikprozessor 2500 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Grafikprozessor 2500 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 26 veranschaulicht einen Prozessor 2600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Prozessor 2600, ohne Beschränkung darauf, Logikschaltungen zur Ausführung von Befehlen enthalten. In mindestens einer Ausführungsform kann der Prozessor 2600 Befehle ausführen, einschließlich x86-Befehle, ARM-Befehle, spezielle Befehle für ASICs usw. In mindestens einer Ausführungsform kann der Prozessor 2610 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 2610 Anweisungen zur Beschleunigung von CUDA-Programmen ausführen.
  • In mindestens einer Ausführungsform enthält der Prozessor 2600 ein In-Order-Front-End („Front-End“) 2601 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 2601 mehrere Einheiten beinhalten. In mindestens einer Ausführungsform holt ein Anweisungs-Vorabrufer bzw. -Prefetcher 2626 Anweisungen aus dem Speicher und leitet sie an einen Anweisungs-Dekodierer 2628 weiter, der seinerseits Anweisungen dekodiert oder interpretiert. In mindestens einer Ausführungsform dekodiert der Anweisungs-Dekodierer 2628 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-Dekodierer 2628 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 2630 dekodierte Uops in programmgeordnete Sequenzen oder Traces in einer Uop-Warteschlange 2634 zur Ausführung zusammenstellen. In mindestens einer Ausführungsform stellt dann, wenn der Trace-Cache 2630 auf eine komplexe Anweisung stößt, ein Mikrocode-ROM 2632 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-Dekodierer 2628 auf den Mikrocode-ROM 2632 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-Dekodierer 2628 dekodiert werden. In mindestens einer Ausführungsform kann eine Anweisung in dem Mikrocode-ROM 2632 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 2630 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 2632 zu vervollständigen. In mindestens einer Ausführungsform kann das Front-End 2601 der Maschine, nachdem der Mikrocode-ROM 2632 die Sequenzierung von Mikro-Ops für eine Anweisung beendet hat, das Abrufen von Mikro-Ops aus dem Trace-Cache 2630 wieder aufnehmen.
  • In mindestens einer Ausführungsform kann die Out-of-Order-Ausführungs-Engine („Out of Order Engine“) 2603 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 2603 beinhaltet, ohne darauf beschränkt zu sein, einen Allokator/Register-Umbenenner 2640, eine Speicher-Uop-Warteschlange 2642, eine Ganzzahl-/Gleitkomma-Uop-Warteschlange 2644, einen Speicher-Scheduler 2646, einen schnellen Scheduler 2602, einen langsamen/allgemeinen Gleitkomma-Scheduler („langsamer/allgemeiner FP-Scheduler“) 2604 und einen einfachen Gleitkomma-Scheduler („einfacher FP-Scheduler“) 2606. In mindestens einer Ausführungsform werden der schnelle Scheduler 2602, der langsame/allgemeine Gleitkomma-Scheduler 2604 und der einfache Gleitkomma-Scheduler 2606 hierin auch gemeinsam als „Uop-Scheduler 2602, 2604, 2606“ bezeichnet. Der Allocator/Register-Umbenenner 2640 weist Maschinenpuffer und Ressourcen zu, die jede Uop zur Ausführung benötigt. In mindestens einer Ausführungsform benennt der Allocator/Register-Umbenenner 2640 logische Register auf Einträge in einer Registerdatei um. In mindestens einer Ausführungsform weist der Allocator/Register-Umbenenner 2640 auch einen Eintrag für jede Uop in einer von zwei Uop-Warteschlangen zu, der Speicher-Uop-Warteschlange 2642 für Speicheroperationen und der Ganzzahl-/Gleitkomma-Uop-Warteschlange 2644 für Nicht-Speicheroperationen, und zwar vor dem Speicher-Scheduler 2646 und den Uop-Schedulern 2602, 2604, 2606. In mindestens einer Ausführungsform bestimmen die Uop-Scheduler 2602, 2604, 2606, 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 2602 in jeder Hälfte des Haupttaktzyklus terminieren, während der langsame/allgemeine Gleitkomma-Scheduler 2604 und der einfache Gleitkomma-Scheduler 2606 einmal pro Hauptprozessortaktzyklus terminieren können. In mindestens einer Ausführungsform arbitrieren die Uop-Scheduler 2602, 2604, 2606 für Versende- bzw. Dispatch-Ports, um Uops für die Ausführung zu planen.
  • In mindestens einer Ausführungsform beinhaltet der Ausführungsblock 2611, ohne Beschränkung darauf, eine Ganzzahl-Registerdatei/ein Bypass-Netzwerk 2608, eine Gleitkommaregisterdatei/ein Bypass-Netzwerk („FP-Registerdatei/ein Bypass-Netzwerk“) 2610, Adressgenerierungseinheiten („AGUs“) 2612 und 2614, schnelle ALUs bzw. S-ALUSs 2616 und 2618, eine langsame ALU bzw. L-ALU 2620, eine Gleitkomma-ALU („FP“) 2622 und eine Gleitkomma-Bewegungseinheit („FP-Move“) 2624. In mindestens einer Ausführungsform werden die Ganzzahl-Registerdatei/das Bypass-Netzwerk 2608 und die Gleitkomma-Registerdatei/das Bypass-Netzwerk 2610 hierin auch als „Registerdateien 2608, 2610“ bezeichnet. In mindestens einer Ausführungsform werden die AGUs 2612 und 2614, die schnellen ALUs 2616 und 2618, die langsame ALU 2620, die Gleitkomma-ALU 2622 und die Gleitkomma-Bewegungseinheit 2624 hierin auch als „Ausführungseinheiten 2612, 2614, 2616, 2618, 2620, 2622 und 2624“ 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 2608, 2610 zwischen den Uop-Schedulern 2602, 2604, 2606 und den Ausführungseinheiten 2612, 2614, 2616, 2618, 2620, 2622 und 2624 angeordnet sein. In mindestens einer Ausführungsform führt das Ganzzahl-Registerdatei/das Bypass-Netzwerk 2608 Ganzzahloperationen durch. In mindestens einer Ausführungsform führt die Gleitkommaregisterdatei/das Bypass-Netzwerk 2610 Gleitkommaoperationen durch. In mindestens einer Ausführungsform kann jede der Registerdateien 2608, 2610, 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 2608, 2610 Daten miteinander austauschen. In mindestens einer Ausführungsform kann das Ganzzahl-Registerdatei/das Bypass-Netzwerk 2608, 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 2610, 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 2612, 2614, 2616, 2618, 2620, 2622, 2624 Anweisungen ausführen. In mindestens einer Ausführungsform speichern Registerdateien 2608, 2610 Ganzzahl- und Gleitkomma-Daten-Operandenwerte, die Mikroanweisungen ausführen müssen. In mindestens einer Ausführungsform kann der Prozessor 2600, ohne Beschränkung darauf, eine beliebige Anzahl und Kombination von Ausführungseinheiten 2612, 2614, 2616, 2618, 2620, 2622, 2624 enthalten. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2622 und die Gleitkomma-Bewegungseinheit 2624 Gleitkomma-, MMX-, SIMD-, AVX- und SSE- oder andere Operationen ausführen. In mindestens einer Ausführungsform kann die Gleitkomma-ALU 2622, 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 2616, 2618 übergeben werden. In mindestens einer Ausführungsform können die schnellen ALUS 2616, 2618 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 2620, da die langsame ALU 2620, 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 2612, 2614 ausgeführt werden. In mindestens einer Ausführungsform können die schnelle ALU 2616, die schnelle ALU 2618 und die langsame ALU 2620 Ganzzahloperationen an 64-Bit-Datenoperanden durchführen. In mindestens einer Ausführungsform können die schnelle ALU 2616, die schnelle ALU 2618 und die langsame ALU 2620 so implementiert sein, dass sie eine Vielzahl von Datenbitgrößen unterstützen, einschließlich sechzehn, zweiunddreißig, 158, 286, usw. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2622 und die Gleitkomma-Bewegungseinheit („FP MOVE“) 2624 so implementiert sein, dass sie einen Bereich von Operanden mit Bits unterschiedlicher Breite unterstützen. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2622 und die Gleitkomma-Bewegungseinheit 2624 mit 128 Bit breiten gepackten Datenoperanden in Verbindung mit SIMD- und Multimedia-Anweisungen arbeiten.
  • In mindestens einer Ausführungsform versenden die Uop-Scheduler 2602, 2604, 2606 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 2600 ausgeführt werden können, kann der Prozessor 2600 auch Logik zur Behandlung von Speicherfehlern enthalten. In mindestens einer Ausführungsform kann es dann, wenn eine Datenlast in einem Datencache fehlschlägt, abhängige Operationen in der Pipeline geben, die einen Scheduler mit vorübergehend falschen Daten verlassen haben. In mindestens einer Ausführungsform verfolgt ein Wiedergabemechanismus Anweisungen, die falsche Daten verwenden, und führt sie erneut aus. In mindestens einer Ausführungsform müssen abhängige Operationen möglicherweise erneut abgespielt werden, während unabhängige Operationen zu Ende geführt werden können. In mindestens einer Ausführungsform können Scheduler und Wiedergabemechanismen von mindestens einer Ausführungsform eines Prozessors auch so ausgelegt sein, dass sie Befehlssequenzen für Textstring-Vergleichsoperationen abfangen.
  • In mindestens einer Ausführungsform kann sich der Begriff „Register“ auf prozessorinterne Speicherplätze beziehen, die als Teil von Anweisungen verwendet werden können, um Operanden zu identifizieren. In mindestens einer Ausführungsform kann es sich bei den Registern um solche handeln, die von außerhalb eines Prozessors (aus der Sicht eines Programmierers) nutzbar sein können. In mindestens einer Ausführungsform brauchen die Register nicht auf einen bestimmten Schaltungstyp beschränkt zu sein. Vielmehr kann ein Register in mindestens einer Ausführungsform Daten speichern, Daten bereitstellen und die hierin beschriebenen Funktionen ausführen. In mindestens einer Ausführungsform können die hierin beschriebenen Register durch Schaltkreise innerhalb eines Prozessors unter Verwendung einer beliebigen Anzahl verschiedener Techniken implementiert sein, wie z.B. dedizierte physische Register, dynamisch zugewiesene physische Register unter Verwendung von Registerumbenennung, Kombinationen aus dedizierten und dynamisch zugewiesenen physischen Registern usw. In mindestens einer Ausführungsform speichern Ganzzahlregister 32-Bit-Ganzzahl-Daten. Eine Registerdatei von mindestens einer Ausführungsform enthält auch acht Multimedia-SIMD-Register für gepackte Daten.
  • In mindestens einer Ausführungsform wird mindestens eine in 26 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Prozessor 2600 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Prozessor 2600 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 27 zeigt einen Prozessor 2700, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet der Prozessor 2700, ohne Beschränkung darauf, einen oder mehrere Prozessorkerne („Kerne“) 2702A-2702N, einen integrierten Speichercontroller 2714 und einen integrierten Grafikprozessor 2708. In mindestens einer Ausführungsform kann der Prozessor 2700 zusätzliche Kerne bis hin zu und einschließlich des zusätzlichen Prozessorkerns 2702N enthalten, der durch gestrichelte, linierte Kästen dargestellt ist. In mindestens einer Ausführungsform enthält jeder der Prozessorkerne 2702A-2702N eine oder mehrere interne Cacheeinheiten 2704A-2704N. In mindestens einer Ausführungsform hat jeder Prozessorkern auch Zugriff auf eine oder mehrere gemeinsam genutzte Cacheeinheiten 2706.
  • In mindestens einer Ausführungsform repräsentieren die internen Cacheeinheiten 2704A-2704N und die gemeinsam genutzten Cacheeinheiten 2706 eine Cachespeicherhierarchie innerhalb des Prozessors 2700. In mindestens einer Ausführungsform können die Cachespeichereinheiten 2704A-2704N 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 2706 und 2704A-2704N aufrecht.
  • In mindestens einer Ausführungsform kann der Prozessor 2700 auch einen Satz von einer oder mehreren Buscontrollereinheiten 2716 und einen Systemagent-Kern 2710 enthalten. In mindestens einer Ausführungsform verwalten eine oder mehrere Buscontrollereinheiten 2716 einen Satz von Peripheriebussen, wie z.B. einen oder mehrere PCI- oder PCI-Express-Busse. In mindestens einer Ausführungsform stellt der Systemagent-Kern 2710 Verwaltungsfunktionen für verschiedene Prozessorkomponenten bereit. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2710 einen oder mehrere integrierte Speichercontroller 2714 zur Verwaltung des Zugriffs auf verschiedene externe Speichervorrichtungen (nicht gezeigt).
  • In mindestens einer Ausführungsform beinhalten einer oder mehrere der Prozessorkerne 2702A-2702N Unterstützung für gleichzeitiges Multithreading. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2710 Komponenten zum Koordinieren und Betreiben der Prozessorkerne 2702A-2702N während der Multithreading-Verarbeitung. In mindestens einer Ausführungsform kann der Systemagent-Kern 2710 zusätzlich eine Leistungssteuerungseinheit („PCU“) enthalten, die Logik und Komponenten zur Regelung eines oder mehrerer Leistungszustände der Prozessorkerne 2702A-2702N und des Grafikprozessors 2708 beinhaltet.
  • In mindestens einer Ausführungsform enthält der Prozessor 2700 zusätzlich einen Grafikprozessor 2708 zur Ausführung von Grafikverarbeitungsoperationen. In mindestens einer Ausführungsform ist der Grafikprozessor 2708 mit gemeinsam genutzten Cacheeinheiten 2706 und dem Systemagent-Kern 2710 gekoppelt, einschließlich eines oder mehrerer integrierter Speichercontroller 2714. In mindestens einer Ausführungsform enthält der Systemagent-Kern 2710 auch einen Anzeigecontroller 2711, um die Ausgabe des Grafikprozessors an ein oder mehrere gekoppelte Anzeigen zu steuern. In mindestens einer Ausführungsform kann der Anzeigecontroller 2711 auch ein separates Modul sein, das über mindestens eine Verbindung bzw. einen Interconnect mit dem Grafikprozessor 2708 gekoppelt ist, oder kann in den Grafikprozessor 2708 integriert sein.
  • In mindestens einer Ausführungsform wird eine ringbasierte Verbindungseinheit 2712 verwendet, um interne Komponenten des Prozessors 2700 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 2708 über eine E/A-Verbindung 2713 mit der Ringverbindung 2712 gekoppelt.
  • In mindestens einer Ausführungsform repräsentiert die E/A-Verbindung 2713 mindestens eine von mehreren Arten von E/A-Verbindungen, einschließlich einer On-Package-E/A-Verbindung, die die Kommunikation zwischen verschiedenen Prozessorkomponenten und einem eingebetteten Hochleistungsspeichermodul 2718, wie z.B. einem eDRAM-Modul, erleichtert. In mindestens einer Ausführungsform verwenden jeder der Prozessorkerne 2702A-2702N und der Grafikprozessor 2708 eingebettete Speichermodule 2718 als gemeinsame LLC.
  • In mindestens einer Ausführungsform sind die Prozessorkerne 2702A-2702N homogene Kerne, die eine gemeinsame Befehlssatzarchitektur ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2702A-2702N heterogen in Bezug auf die ISA, wobei ein oder mehrere Prozessorkerne 2702A-2702N einen gemeinsamen Befehlssatz ausführen, während ein oder mehrere andere Kerne der Prozessorkerne 2702A-2702N eine Teilmenge eines gemeinsamen Befehlssatzes oder einen anderen Befehlssatz ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2702A-2702N 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 2700 auf einem oder mehreren Chips oder als integrierte SoC-Schaltung implementiert sein.
  • In mindestens einer Ausführungsform wird mindestens eine in 27 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren 2700 oder der Grafikprozessor 2708 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens einer der Prozessoren 2700 oder der Grafikprozessor 2708 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 28 veranschaulicht einen Grafikprozessorkern 2800, gemäß mindestens einer beschriebenen Ausführungsform. In mindestens einer Ausführungsform ist der Grafikprozessorkern 2800 in einem Grafikkern-Array enthalten. In mindestens einer Ausführungsform kann der Grafikprozessorkern 2800, 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 2800 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 2800 einen Festfunktionsblock 2830 enthalten, der mit mehreren Subkernen 2801A-2801F 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 2830 eine Geometrie/Festfunktions-Pipeline 2836, die von allen Subkernen in dem Grafikprozessor 2800, z.B. in Grafikprozessor-Implementierungen mit geringerer Leistung und/oder geringerem Energieverbrauch, gemeinsam genutzt werden kann. In mindestens einer Ausführungsform beinhaltet die Geometrie/Festfunktions-Pipeline 2836 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 2830 darüber hinaus eine Grafik-SoC-Schnittstelle 2837, einen Grafik-Mikrocontroller 2838 und eine Medienpipeline 2839. Die Grafik-SoC-Schnittstelle 2837 stellt eine Schnittstelle zwischen dem Grafikkern 2800 und anderen Prozessorkernen innerhalb einer integrierten SoC-Schaltung bereit. In mindestens einer Ausführungsform ist der Grafik-Mikrocontroller 2838 ein programmierbarer Subprozessor, der so konfiguriert werden kann, dass er verschiedene Funktionen des Grafikprozessors 2800 verwaltet, einschließlich Thread-Versendung, Planung und Präemption. In mindestens einer Ausführungsform enthält die Medienpipeline 2839 Logik zur Erleichterung der Dekodierung, Kodierung, Vorverarbeitung und/oder Nachverarbeitung von Multimediadaten, einschließlich Bild- und Videodaten. In mindestens einer Ausführungsform implementiert die Medienpipeline 2839 Medienoperationen über Anforderungen an die Rechen- oder Abtastlogik innerhalb der Subkerne 2801-2801F.
  • In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2837 dem Grafikkern 2800 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 2837 auch Kommunikation mit Vorrichtungen mit fester Funktion innerhalb eines SoCs ermöglichen, wie z.B. Kamera-Bildgebungs-Pipelines, und ermöglicht sie die Verwendung von und/oder implementiert globale(n) Speicheratome(n), die von einem Grafikkern 2800 und CPUs innerhalb eines SoCs gemeinsam genutzt werden können. In mindestens einer Ausführungsform kann die SoC-Schnittstelle 2837 auch Energieverwaltungssteuerungen für den Grafikkern 2800 implementieren und eine Schnittstelle zwischen einer Taktdomäne des Grafikkerns 2800 und anderen Taktdomänen innerhalb eines SoCs ermöglichen. In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2837 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 2839 gesendet werden, wenn Medienoperationen durchzuführen sind, oder an eine Geometrie- und Festfunktions-Pipeline (z.B. die Geometrie- und Festfunktions-Pipeline 2836, die Geometrie- und Festfunktions-Pipeline 2814), wenn Grafikverarbeitungsoperationen durchzuführen sind.
  • In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2838 so konfiguriert sein, dass er verschiedene Planungs- und Verwaltungsaufgaben für den Grafikkern 2800 durchführt. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2838 die Planung von Grafik- und/oder Rechenlasten auf verschiedenen parallelen Grafik-Engines in den Arrays 2802A-2802F, 2804A-2804F der Ausführungseinheiten (EU) in den Subkernen 2801A-2801F durchführen. In mindestens einer Ausführungsform kann Hostsoftware, die auf einem CPU-Kern eines SoC mit Grafikkern 2800 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 2838 auch Stromsparzustände oder Leerlaufzustände für den Grafikkern 2800 erleichtern, indem er dem Grafikkern 2800 eine Fähigkeit bereitstellt, Register innerhalb des Grafikkerns 2800 ü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 2800 mehr oder weniger als die dargestellten Subkerne 2801A-2801F haben, bis hin zu N modularen Subkernen. Für jeden Satz von N Subkernen kann der Grafikkern 2800 in mindestens einer Ausführungsform auch eine gemeinsam genutzte Funktionslogik 2810, einen gemeinsam genutzten Speicher und/oder Cachespeicher 2812, eine Geometrie-/ Festfunktions-Pipeline 2814 sowie eine zusätzliche Festfunktionslogik 2816 zur Beschleunigung verschiedener Grafik- und Rechenverarbeitungsvorgänge beinhalten. In mindestens einer Ausführungsform kann die gemeinsam genutzte Funktionslogik 2810 Logikeinheiten (z.B. Sampler-, Mathematik- und/oder Inter-Thread-Kommunikationslogik) umfassen, die von allen N Subkernen innerhalb des Grafikkerns 2800 gemeinsam genutzt werden können. Der gemeinsam genutzte Speicher und/oder Cachespeicher 2812 kann ein LLC für N Subkerne 2801A-2801F innerhalb des Grafikkerns 2800 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 2814 anstelle der Geometrie-/Festfunktions-Pipeline 2836 innerhalb des Festfunktionsblocks 2830 enthalten sein und kann gleiche oder ähnliche Logikeinheiten beinhalten.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkern 2800 zusätzliche feste Funktionslogik 2816, die verschiedene feste Funktionsbeschleunigungslogik zur Verwendung durch den Grafikkern 2800 enthalten kann. In mindestens einer Ausführungsform umfasst die zusätzliche Festfunktionslogik 2816 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 2816, 2836, und eine Cull-Pipeline, bei der es sich um eine zusätzliche Geometrie-Pipeline handelt, die in der zusätzlichen Festfunktionslogik 2816 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 2816 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 2816 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 2801A-2801F 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 2801A-2801F mehrere EU-Arrays 2802A-2802F, 2804A-2804F, Thread-Dispatch- und Inter-Thread-Kommunikationslogik („TD/IC“) 2803A-2803F, einen 3D (z.B. Textur-)- Sampler 2805A-2805F, einen Media-Sampler 2806A-2806F, einen Shader-Prozessor 2807A-2807F und gemeinsam genutzten lokalen Speicher („SLM“) 2808A-2808F. Die EU-Arrays 2802A-2802F, 2804A-2804F 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 2803A-2803F 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 2805A-2805F 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 2806A-2806F ä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 2801A-2801F abwechselnd einen vereinheitlichten 3D- und Medien-Sampler enthalten. In mindestens einer Ausführungsform können Threads, die auf Ausführungseinheiten innerhalb jedes der Subkerne 2801A-2801F ausgeführt werden, den gemeinsamen lokalen Speicher 2808A-2808F innerhalb jedes Subkerns nutzen, damit Threads, die innerhalb einer Thread-Gruppe ausgeführt werden, unter Verwendung eines gemeinsamen Pools von On-Chip-Speicher ausgeführt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 28 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Grafikprozessorkern 2800 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Grafikprozessorkern 2800 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 29 veranschaulicht eine Parallelverarbeitungseinheit („PPU“) 2900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die PPU 2900 mit maschinenlesbarem Code konfiguriert, der, wenn er von der PPU 2900 ausgeführt wird, die PPU 2900 veranlasst, einige oder alle der hierin beschriebenen Prozesse und Techniken durchzuführen. In mindestens einer Ausführungsform ist die PPU 2900 ein Multi-Thread-Prozessor, der auf einer oder mehreren Vorrichtungen mit integrierten Schaltkreisen implementiert ist und der Multithreading als eine latenzverbergende Technik nutzt, um computerlesbare Anweisungen (auch als maschinenlesbare Anweisungen oder einfach Anweisungen bezeichnet) auf mehreren Threads parallel zu verarbeiten. In mindestens einer Ausführungsform bezieht sich ein Thread auf einen Ausführungs-Thread und ist eine Instanziierung eines Satzes von Anweisungen, die zur Ausführung durch die PPU 2900 konfiguriert sind. In mindestens einer Ausführungsform ist die PPU 2900 eine GPU, die so konfiguriert ist, dass sie eine Grafik-Rendering-Pipeline zur Verarbeitung dreidimensionaler („3D“) Grafikdaten implementiert, um zweidimensionale („2D“) Bilddaten zur Anzeige auf einer Anzeigevorrichtung, wie z.B. einer LCD-Vorrichtung, zu erzeugen. In mindestens einer Ausführungsform wird die PPU 2900 verwendet, um Berechnungen wie lineare Algebra-Operationen und Machine-Learning-Operationen durchzuführen. 29 veranschaulicht einen beispielhaften Parallelprozessor nur zu darstellenden Zwecken und ist als nicht ein beschränkendes Beispiel für eine Prozessorarchitektur zu verstehen, die in mindestens einer Ausführungsform implementiert sein kann.
  • In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2900 so konfiguriert, dass sie High Performance Computing („HPC“)-, Rechenzentrums- und Machine Learning-Anwendungen beschleunigen. In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2900 für die Beschleunigung von CUDA-Programmen konfiguriert. In mindestens einer Ausführungsform beinhaltet die PPU 2900, ohne Beschränkung darauf, eine E/A-Einheit 2906, eine Frontend-Einheit 2910, eine Scheduler-Einheit 2912, eine Arbeitsverteilungseinheit 2914, einen Hub 2916, eine Kreuzschiene bzw. Crossbar („Xbar“) 2920, einen oder mehrere Universalverarbeitungscluster („GPCs“) 2918 und eine oder mehrere Partitionseinheiten („Speicherpartitionseinheiten“) 2922. In mindestens einer Ausführungsform ist die PPU 2900 mit einem Hostprozessor oder anderen PPUs 2900 über eine oder mehrere Hochgeschwindigkeits-GPU-Verbindungen („GPU-Interconnects“) 2908 verbunden. In mindestens einer Ausführungsform ist die PPU 2900 über eine Zwischenverbindung bzw. einen Interconnect 2902 mit einem Hostprozessor oder anderen Peripheriegeräten verbunden. In mindestens einer Ausführungsform ist die PPU 2900 mit einem lokalen Speicher verbunden, der ein oder mehrere Speichervorrichtungen („Speicher“) 2904 umfasst. In mindestens einer Ausführungsform beinhalten die Speichervorrichtungen 2904, 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 2908 auf eine drahtgebundene Mehrspur-Kommunikations-verbindung beziehen, die von Systemen verwendet wird, um zu skalieren und die eine oder mehrere PPUs 2900 in Kombination mit einer oder mehreren CPUs umfassen, die Cache-Kohärenz zwischen PPUs 2900 und CPUs sowie CPU-Mastering unterstützen. In mindestens einer Ausführungsform werden Daten und/oder Befehle über die Hochgeschwindigkeits-GPU-Verbindung 2908 durch den Hub 2916 zu/von anderen Einheiten der PPU 2900, wie z.B. einer oder mehreren Kopiermaschinen, Videokodierern, Video-Dekodierern, Energieverwaltungs-einheiten und anderen Komponenten, die in 29 möglicherweise nicht explizit dargestellt sind, übertragen.
  • In mindestens einer Ausführungsform ist die E/A-Einheit 2906 so konfiguriert, dass sie Kommunikationen (z.B. Befehle, Daten) von einem Hostprozessor (in 29 nicht dargestellt) über den Systembus 2902 sendet und empfängt. In mindestens einer Ausführungsform kommuniziert die E/A-Einheit 2906 mit dem Hostprozessor direkt über den Systembus 2902 oder über ein oder mehrere Zwischenvorrichtungen, wie z.B. eine Speicherbrücke. In mindestens einer Ausführungsform kann die E/A-Einheit 2906 über den Systembus 2902 mit einem oder mehreren anderen Prozessoren kommunizieren, z.B. mit einer oder mehreren der PPUs 2900. In mindestens einer Ausführungsform implementiert die E/A-Einheit 2906 eine PCIe-Schnittstelle für die Kommunikation über einen PCIe-Bus. In mindestens einer Ausführungsform implementiert die E/A-Einheit 2906 Schnittstellen für die Kommunikation mit externen Geräten.
  • In mindestens einer Ausführungsform dekodiert die E/A-Einheit 2906 über den Systembus 2902 empfangene Pakete. In mindestens einer Ausführungsform repräsentieren mindestens einige Pakete Befehle, die so konfiguriert sind, dass sie die PPU 2900 veranlassen, verschiedene Operationen durchzuführen. In mindestens einer Ausführungsform sendet die E/A-Einheit 2906 dekodierte Befehle an verschiedene andere Einheiten der PPU 2900, wie durch Befehle vorgegeben. In mindestens einer Ausführungsform werden Befehle an die Frontend-Einheit 2910 und/oder an den Hub 2916 oder andere Einheiten der PPU 2900, wie z.B. eine oder mehrere Kopiermaschinen, einen Videokodierer, einen Video-Dekodierer, eine Energieverwaltungseinheit usw., (in 29 nicht explizit dargestellt) übertragen. In mindestens einer Ausführungsform ist die E/A-Einheit 2906 so konfiguriert, dass sie die Kommunikation zwischen und unter verschiedenen logischen Einheiten der PPU 2900 routet bzw. leitet.
  • In mindestens einer Ausführungsform kodiert ein von dem Hostprozessor ausgeführtes Programm einen Befehlsstrom in einem Puffer, der der PPU 2900 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 2900 zugreifen können (z.B. Lesen/Schreiben) - eine Host-Schnittstelleneinheit kann so konfiguriert sein, dass sie auf einen Puffer in einem mit dem Systembus 2902 verbundenen Systemspeicher über Speicheranforderungen zugreift, die über den Systembus 2902 von der E/A-Einheit 2906 ü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 2900, so dass die Frontend-Einheit 2910 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 2900 weiterleitet.
  • In mindestens einer Ausführungsform ist die Frontend-Einheit 2910 mit der Scheduler-Einheit 2912 gekoppelt, die verschiedene GPCs 2918 zur Verarbeitung von Aufgaben konfiguriert, die durch einen oder mehrere Befehlsströme definiert sind. In mindestens einer Ausführungsform ist die Scheduler-Einheit 2912 so konfiguriert, dass sie Zustandsinformationen mit Bezug zu verschiedenen Aufgaben nachverfolgt, die von der Scheduler-Einheit 2912 verwaltet werden, wobei die Zustandsinformationen angeben können, welchem der GPCs 2918 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 2912 die Ausführung einer Vielzahl von Aufgaben auf einem oder mehreren GPCs 2918.
  • In mindestens einer Ausführungsform ist die Scheduler-Einheit 2912 mit der Arbeitsverteilungseinheit 2914 gekoppelt, die so konfiguriert ist, dass sie Aufgaben zur Ausführung auf den GPCs 2918 versendet. In mindestens einer Ausführungsform nachverfolgt die Arbeitsverteilungseinheit 2914 eine Anzahl geplanter Aufgaben, die von der Scheduler-Einheit 2912 empfangen wurden, und verwaltet die Arbeitsverteilungseinheit 2914 einen Pool ausstehender Aufgaben und einen Pool aktiver Aufgaben für jeden GPC 2918. 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 2918 zugewiesen sind; der Pool aktiver Aufgaben kann eine Anzahl von Slots (z.B. 4 Slots) für Aufgaben umfassen, die aktiv von den GPCs 2918 verarbeitet werden, so dass dann, wenn einer der GPCs 2918 die Ausführung einer Aufgabe abschließt, diese Aufgabe aus dem Pool aktiver Aufgaben für den GPC 2918 entfernt wird und eine der anderen Aufgaben aus dem Pool anstehender Aufgaben ausgewählt und zur Ausführung auf dem GPC 2918 eingeplant wird. In mindestens einer Ausführungsform wird dann, wenn eine aktive Aufgabe auf dem GPC 2918 im Leerlauf ist, z.B. während auf die Auflösung einer Datenabhängigkeit gewartet wird, die aktive Aufgabe aus dem GPC 2918 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 2918 eingeplant wird.
  • In mindestens einer Ausführungsform kommuniziert die Arbeitsverteilungs-einheit 2914 mit einem oder mehreren GPCs 2918 über die Kreuzschiene bzw. XBar 2920. In mindestens einer Ausführungsform ist die XBar 2920 ein Interconnect- bzw. Verbindungsnetzwerk, das viele Einheiten der PPU 2900 mit anderen Einheiten der PPU 2900 koppelt und so konfiguriert sein kann, dass es die Arbeitsverteilungseinheit 2914 mit einem bestimmten GPC 2918 koppelt. In mindestens einer Ausführungsform können auch eine oder mehrere andere Einheiten der PPU 2900 über den Hub 2916 mit der XBar 2920 verbunden sein.
  • In mindestens einer Ausführungsform werden Aufgaben von der Scheduler-Einheit 2912 verwaltet und von der Arbeitsverteilungseinheit 2914 an einen der GPCs 2918 weitergeleitet. Der GPC 2918 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 2918 verbraucht, über die XBar 2920 an einen anderen GPC 2918 weitergeleitet oder in dem Speicher 2904 gespeichert werden. In mindestens einer Ausführungsform können Ergebnisse in den Speicher 2904 über Partitionseinheiten 2922 geschrieben werden, die eine Speicherschnittstelle zum Lesen und Schreiben von Daten in/aus dem Speicher 2904 implementieren. In mindestens einer Ausführungsform können die Ergebnisse über die Hochgeschwindigkeits-GPU-Verbindung 2908 an eine andere PPU 2904 oder CPU übertragen werden. In mindestens einer Ausführungsform umfasst die PPU 2900, ohne Beschränkung darauf, eine Anzahl U von Partitionseinheiten 2922, die gleich der Anzahl der mit der PPU 2900 verbundenen separaten und unterschiedlichen Speichervorrichtungen 2904 ist.
  • In mindestens einer Ausführungsform führt ein Hostprozessor einen Treiberkern aus, der eine Anwendungsprogrammierschnittstelle („API“) implementiert, die es einer oder mehreren auf dem Hostprozessor ausgeführten Anwendungen ermöglicht, Operationen zur Ausführung auf der PPU 2900 zu planen. In mindestens einer Ausführungsform werden mehrere Rechenanwendungen gleichzeitig von der PPU 2900 ausgeführt und stellt die PPU 2900 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 2900 zu generieren, und gibt der Treiberkern Aufgaben an einen oder mehrere Streams aus, die von der PPU 2900 verarbeitet werden. In mindestens einer Ausführungsform umfasst jede Aufgabe eine oder mehrere Gruppen von zusammenhängenden Threads, die als Warp bezeichnet werden können. In mindestens einer Ausführungsform umfasst ein Warp eine Vielzahl von zusammenhängenden Threads (z.B. 32 Threads), die parallel ausgeführt werden können. In mindestens einer Ausführungsform können sich kooperierende Threads auf eine Vielzahl von Threads beziehen, die Anweisungen zur Durchführung einer Aufgabe enthalten und die Daten über einen gemeinsamen Speicher austauschen.
  • In mindestens einer Ausführungsform wird mindestens eine in 29 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 2900 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 2900 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 30 veranschaulicht einen GPC 3000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der GPC 3000 der GPC 2918 von 29. In mindestens einer Ausführungsform beinhaltet jeder GPC 3000, ohne Beschränkung darauf, eine Anzahl von Hardware-Einheiten zur Verarbeitung von Aufgaben, und beinhaltet jeder GPC 3000, ohne Beschränkung darauf, einen Pipeline-Manager 3002, eine Pre-Raster-Operationseinheit („PROP“) 3004, eine Raster-Engine 3008, eine Arbeitsverteilungs-Kreuzschiene („WDX“) 3016, eine MMU 3018, einen oder mehrere Datenverarbeitungscluster („DPCs“) 3006 und jede geeignete Kombination von Teilen.
  • In mindestens einer Ausführungsform wird der Betriebsablauf des GPC 3000 von dem Pipeline-Manager 3002 gesteuert. In mindestens einer Ausführungsform verwaltet der Pipeline-Manager 3002 die Konfiguration eines oder mehrerer DPCs 3006 zur Verarbeitung von Aufgaben, die dem GPC 3000 zugewiesen sind. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3002 mindestens eine des einen oder der mehreren DPCs 3006, um mindestens einen Teil einer Grafik-Rendering-Pipeline zu implementieren. In mindestens einer Ausführungsform ist der DPC 3006 so konfiguriert, dass er ein Vertex-Shader-Programm auf einem programmierbaren Streaming-Multiprozessor („SM“) 3014 ausführt. In mindestens einer Ausführungsform ist der Pipeline-Manager 3002 so konfiguriert, dass er von einer Arbeitsverteilungseinheit empfangene Pakete an entsprechende logische Einheiten innerhalb des GPC 3000 weiterleitet, und in mindestens einer Ausführungsform können einige Pakete an Hardwareeinheiten mit fester Funktion in dem PROP 3004 und/oder in der Raster-Engine 3008 weitergeleitet werden, während andere Pakete an die DPCs 3006 zur Verarbeitung durch eine Primitiv-Engine 3012 oder den SM 3014 weitergeleitet werden können. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3002 mindestens einen der DPCs 3006, um eine Rechenpipeline zu implementieren. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3002 mindestens einen der DPCs 3006, um mindestens einen Teil eines CUDA-Programms auszuführen.
  • In mindestens einer Ausführungsform ist die PROP-Einheit 3004 so konfiguriert, dass sie von der Raster-Engine 3008 und den DPCs 3006 erzeugte Daten an eine Raster Operations („ROP“)-Einheit in einer Partitionseinheit weiterleitet, wie z.B. die vorstehend in Verbindung mit 29 näher beschriebene Speicherpartitionseinheit 3022. In mindestens einer Ausführungsform ist die PROP-Einheit 3004 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 3008, 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 3008, 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 3008 Fragmente, die von einer geeigneten Einheit zu verarbeiten sind, z.B. von einem in dem DPC 3006 implementierten Fragment-Shader.
  • In mindestens einer Ausführungsform umfasst jeder in dem GPC 3000 enthaltene DPC 3006, ohne Beschränkung darauf, einen M-Pipe-Controller („MPC“) 3010, eine Primitiv-Engine 3012, einen oder mehrere SMs 3014 und jede geeignete Kombination davon. In mindestens einer Ausführungsform steuert der MPC 3010 den Betriebsablauf des DPC 3006, indem er von dem Pipeline-Manager 3002 empfangene Pakete an entsprechende Einheiten in dem DPC 3006 weiterleitet. In mindestens einer Ausführungsform werden Pakete, die einem Vertex zugeordnet sind, an die Primitive Engine 3012 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 3014 übertragen werden.
  • In mindestens einer Ausführungsform umfasst der SM 3014, 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 3014 mit mehreren Threads ausgestattet und so konfiguriert, dass er mehrere Threads (z.B. 32 Threads) aus einer bestimmten Gruppe von Threads gleichzeitig ausführt und eine SIMD-Architektur implementiert, bei der jeder Thread in einer Gruppe von Threads (z.B. ein Warp) so konfiguriert ist, dass er einen anderen Satz von Daten auf der Grundlage desselben Satzes von Anweisungen verarbeitet. In mindestens einer Ausführungsform führen alle Threads in einer Gruppe von Threads dieselben Anweisungen aus. In mindestens einer Ausführungsform implementiert der SM 3014 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 3014 wird in Verbindung mit 31 ausführlicher beschrieben.
  • In mindestens einer Ausführungsform stellt die MMU 3018 eine Schnittstelle zwischen dem GPC 3000 und einer Speicherpartitionseinheit (z.B. der Partitionseinheit 2922 in 29) bereit, und stellt die MMU 3018 eine Übersetzung virtueller Adressen in physische Adressen, einen Speicherschutz und eine Arbitrierung von Speicheranforderungen bereit. In mindestens einer Ausführungsform stellt die MMU 3018 einen oder mehrere Übersetzungs-Lookaside-Puffer (TLBs) zur Durchführung der Übersetzung virtueller Adressen in physische Adressen im Speicher bereit.
  • In mindestens einer Ausführungsform wird mindestens eine in 30 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3000 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3000 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 31 veranschaulicht einen Streaming-Multiprozessor („SM“) 3100, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der SM 3100 der SM 3014 von 30. In mindestens einer Ausführungsform beinhaltet der SM 3100, ohne Beschränkung darauf, einen Anweisungscache 3102; eine oder mehrere Schedulereinheiten 3104; eine Registerdatei 3108; einen oder mehrere Verarbeitungskerne („Cores“) 3110; eine oder mehrere Spezialfunktionseinheiten („SFUs“) 3112; eine oder mehrere LSUs 3114; ein Verbindungsnetzwerk 3116; einen gemeinsamen Speicher/L 1-Cache 3118; 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 3100 zugewiesen. In mindestens einer Ausführungsform empfängt die Schedulereinheit 3104 Aufgaben von einer Arbeitsverteilungseinheit und verwaltet die Befehlsplanung für einen oder mehrere Thread-Blöcke, die dem SM 3100 zugewiesen sind. In mindestens einer Ausführungsform plant die Schedulereinheit 3104 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 3104 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 3110, SFUs 3112 und LSUs 3114) während jedes Taktzyklus verteilt.
  • In mindestens einer Ausführungsform kann sich „kooperative Gruppen“ auf ein Programmiermodell zum Organisieren von Gruppen kommunizierender Threads beziehen, das es Entwicklern ermöglicht, Granularität auszudrücken, mit der Threads kommunizieren, und so reichhaltigere, effizientere parallele Dekompositionen zu ermöglichen. In mindestens einer Ausführungsform unterstützen kooperative Start-APIs eine Synchronisierung zwischen Thread-Blöcken zur Ausführung paralleler Algorithmen. In mindestens einer Ausführungsform bieten APIs herkömmlicher Programmiermodelle ein einziges, einfaches Konstrukt zur Synchronisierung kooperierender Threads: eine Sperre über alle Threads eines Thread-Blocks (z.B. die Funktion syncthreads( )). In mindestens einer Ausführungsform können Programmierer jedoch Gruppen von Threads mit einer kleineren Granularität als der des Thread-Blocks definieren und innerhalb definierter Gruppen synchronisieren, um höhere Leistung, Designflexibilität und Software-Wiederverwendung in Form von gemeinsamen gruppenweiten Funktionsschnittstellen zu ermöglichen. In mindestens einer Ausführungsform ermöglichen es kooperative Gruppen Programmierern, Gruppen von Threads explizit auf Subblock- und Multiblock-Granularität zu definieren und kollektive Operationen wie beispielsweise Synchronisation auf Threads in einer kooperativen Gruppe durchzuführen. In mindestens einer Ausführungsform ist eine Subblock-Granularität so klein wie ein einzelner Thread. In mindestens einer Ausführungsform unterstützt ein Programmiermodell eine saubere Komposition über Softwaregrenzen hinweg, so dass Bibliotheken und Utility-Funktionen innerhalb ihres lokalen Kontexts sicher synchronisieren können, ohne Annahmen über Konvergenz treffen zu müssen. In mindestens einer Ausführungsform ermöglichen kooperative Gruppenprimitive neue Muster kooperativer Parallelität, einschließlich, ohne Beschränkung darauf, Produzenten-Verbraucher-Parallelität, opportunistischer Parallelität und globaler Synchronisierung über ein gesamtes Gitter von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist eine Dispatcheinheit 3106 so konfiguriert, dass sie Befehle an eine oder mehrere Funktionseinheiten überträgt, und beinhaltet die Schedulereinheit 3104, ohne Beschränkung darauf, zwei Dispatcheinheiten 3106, 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 3104 eine einzelne Dispatcheinheit 3106 oder zusätzliche Dispatcheinheiten 3106.
  • In mindestens einer Ausführungsform enthält jeder SM 3100, ohne Beschränkung darauf, eine Registerdatei 3108, die einen Satz von Registern für Funktionseinheiten des SM 3100 bereitstellt. In mindestens einer Ausführungsform ist die Registerdatei 3108 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 3108 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 3108 zwischen verschiedenen Warps aufgeteilt, die von dem SM 3100 ausgeführt werden, und stellt die Registerdatei 3108 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten verbunden sind. In mindestens einer Ausführungsform umfasst jeder SM 3100, ohne Beschränkung darauf, eine Vielzahl von L Verarbeitungskernen 3110. In mindestens einer Ausführungsform beinhaltet der SM 3100, ohne Beschränkung darauf, eine große Anzahl (z.B. 128 oder mehr) von unterschiedlichen Verarbeitungskernen 3110. In mindestens einer Ausführungsform beinhaltet jeder Verarbeitungskern 3110, 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 implementieren die Gleitkomma-Arithmetik-Logikeinheiten den Standard IEEE 754-2008 für Gleitkomma-Arithmetik. In mindestens einer Ausführungsform beinhalten die Verarbeitungskerne 3110, 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 3110 enthalten. In mindestens einer Ausführungsform sind Tensorkerne so konfiguriert, dass sie eine Deep-Learning-Matrixarithmetik durchführen, wie z.B. Faltungsoperationen für das Training und die Inferenzierung neuronaler Netze. In mindestens einer Ausführungsform arbeitet jeder Tensorkern auf einer 4x4-Matrix und führt eine Matrixmultiplikations- und Akkumulationsoperation D = A X B + C durch, wobei A, B, C und D 4x4-Matrizen sind.
  • In mindestens einer Ausführungsform sind die Matrixmultiplikationseingänge A und B 16-Bit-Gleitkommamatrizen und sind die Akkumulationsmatrizen C und D 16-Bit-Gleitkomma- oder 32-Bit-Gleitkommamatrizen. In mindestens einer Ausführungsform arbeiten die Tensorkerne auf 16-Bit-Gleitkomma-Eingangsdaten mit 32-Bit-Gleitkomma-Akkumulation. In mindestens einer Ausführungsform verwendet die 16-Bit-Gleitkommamultiplikation 64 Operationen und ergibt ein Produkt mit voller Genauigkeit, das dann unter Verwendung einer 32-Bit-Gleitkomma-Addition mit anderen Zwischenprodukten für eine 4x4x4-Matrixmultiplikation akkumuliert wird. In mindestens einer Ausführungsform werden Tensorkerne verwendet, um viel größere zweidimensionale oder höherdimensionale Matrixoperationen durchzuführen, die aus diesen kleineren Elementen aufgebaut sind. In mindestens einer Ausführungsform stellt eine API, wie z.B. eine CUDA-C++ API, spezialisierte Operationen zum Laden, Multiplizieren und Akkumulieren von Matrizen und zum Speichern von Matrizen bereit, um Tensorkerne aus einem CUDA-C++ Programm heraus effizient zu nutzen. In mindestens einer Ausführungsform geht, auf der CUDA-Ebene, eine Schnittstelle auf Warp-Ebene von Matrizen der Größe 16x16 aus, die sich über alle 32 Threads eines Warps erstrecken.
  • In mindestens einer Ausführungsform umfasst jeder SM 3100, ohne Beschränkung darauf, M SFUs 3112, die spezielle Funktionen ausführen (z.B. Attributauswertung, reziproke Quadratwurzel und dergleichen). In mindestens einer Ausführungsform beinhalten die SFUs 3112, 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 3112, 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 3100 ausgeführt werden. In mindestens einer Ausführungsform werden die Texturkarten in dem gemeinsamen Speicher/L1-Cache 3118 gespeichert. In mindestens einer Ausführungsform implementieren Textureinheiten Texturoperationen, wie z.B. Filteroperationen unter Verwendung von Mip-Maps (z.B. Texturkarten mit unterschiedlichen Detailstufen). In mindestens einer Ausführungsform umfasst jeder SM 3100, ohne Beschränkung darauf, zwei Textureinheiten.
  • In mindestens einer Ausführungsform umfasst jeder SM 3100, ohne Beschränkung darauf, N LSUs 3114, die Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher/L1-Cache 3118 und der Registerdatei 3108 implementieren. In mindestens einer Ausführungsform umfasst jeder SM 3100, ohne Beschränkung darauf, ein Verbindungsnetzwerk 3116, das jede der Funktionseinheiten mit der Registerdatei 3108 und die LSU 3114 mit der Registerdatei 3108 und dem gemeinsamen Speicher/L1-Cache 3118 verbindet. In mindestens einer Ausführungsform ist das Verbindungsnetzwerk 3116 eine Kreuzschiene, die so konfiguriert werden kann, dass sie jede der Funktionseinheiten mit jedem der Register in der Registerdatei 3108 verbindet und die LSUs 3114 mit der Registerdatei 3108 und Speicherplätzen in dem gemeinsamen Speicher/L1-Cache 3118 verbindet.
  • In mindestens einer Ausführungsform ist der gemeinsam genutzte Speicher/L1-Cache 3118 ein Array von On-Chip-Speicher, der die Datenspeicherung und Kommunikation zwischen dem SM 3100 und einer Primitiv-Engine sowie zwischen Threads in dem SM 3100 ermöglicht. In mindestens einer Ausführungsform umfasst der gemeinsam genutzte Speicher/L1-Cache 3118, ohne Beschränkung darauf, 128 KB Speicherkapazität und befindet sich in einem Pfad von dem SM 3100 zu einer Partitionseinheit. In mindestens einer Ausführungsform wird der gemeinsame Speicher/L1-Cache 3118 zum Zwischenspeichern von Lese- und Schreibvorgängen verwendet. In mindestens einer Ausführungsform sind einer oder mehrere von gemeinsamem Speicher/L1-Cache 3118, 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 3118, dass der gemeinsam genutzte Speicher/L1-Cache 3118 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 3100 zur Ausführung eines Programms und zur Durchführung von Berechnungen, der gemeinsame Speicher/L1-Cache 3118 zur Kommunikation zwischen Threads und die LSU 3114 zum Lesen und Schreiben des globalen Speichers über den gemeinsamen Speicher/L1-Cache 3118 und eine Speicherpartitionseinheit verwendet werden. In mindestens einer Ausführungsform schreibt der SM 3100, wenn er für allgemeine parallele Berechnungen konfiguriert ist, Befehle, die die Schedulereinheit 3104 verwenden kann, um neue Arbeit auf DPCs zu starten.
  • In mindestens einer Ausführungsform ist die PPU in einem Desktop-Computer, einem Laptop-Computer, einem Tablet-Computer, Servern, Supercomputern, einem Smartphone (z.B. einem drahtlosen Handheld-Gerät), einem PDA, einer Digitalkamera, einem Fahrzeug, einer kopfmontierten Anzeige, einem elektronischen Handheld-Gerät usw. enthalten oder mit diesen gekoppelt. In mindestens einer Ausführungsform ist die PPU auf einem einzigen Halbleitersubstrat verkörpert. In mindestens einer Ausführungsform ist die PPU in einem SoC zusammen mit einer oder mehreren anderen Vorrichtungen wie zusätzlichen PPUs, Speicher, einer RISC-CPU, einer MMU, einem Digital-Analog-Wandler („DAC“) und dergleichen enthalten.
  • In mindestens einer Ausführungsform kann die PPU auf einer Grafikkarte enthalten sein, die ein oder mehrere Speichervorrichtungen enthält. In mindestens einer Ausführungsform kann eine Grafikkarte so konfiguriert sein, dass sie mit einem PCIe-Steckplatz auf einer Hauptplatine eines Desktop-Computers verbunden werden kann. In mindestens einer Ausführungsform kann die PPU eine integrierte GPU („iGPU“) sein, die im Chipsatz der Hauptplatine enthalten ist.
  • In mindestens einer Ausführungsform wird mindestens eine in 31 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3100 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3100 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • Softwarekonstruktionen für Universalcomputing
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte Softwarekonstrukte zur Implementierung mindestens einer Ausführungsform.
  • 32 veranschaulicht einen Software-Stack einer Programmierplattform, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform eine Plattform zur Nutzung von Hardware auf einem Rechen- bzw. Computersystem, um Berechnungsaufgaben zu beschleunigen. In mindestens einer Ausführungsform kann eine Programmierplattform für Softwareentwickler über Bibliotheken, Compilerdirektiven und/oder Erweiterungen von Programmiersprachen zugänglich sein. In mindestens einer Ausführungsform kann eine Programmierplattform CUDA, Radeon Open Compute Platform („ROCm“), OpenCL (OpenCL™ wird von der Khronos-Gruppe entwickelt), SYCL oder Intel One API sein, ist aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform stellt ein Software-Stack 3200 einer Programmierplattform eine Ausführungsumgebung für eine Anwendung 3201 bereit. In mindestens einer Ausführungsform kann die Anwendung 3201 jede beliebige Computersoftware umfassen, die auf dem Software-Stack 3200 gestartet werden kann. In mindestens einer Ausführungsform kann die Anwendung 3201 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 3201 und der Software-Stack 3200 auf Hardware 3207. Die Hardware 3207 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 3200 herstellerspezifisch und nur mit Vorrichtungen bestimmter Hersteller kompatibel sein. In mindestens einer Ausführungsform, wie beispielsweise bei OpenCL, kann der Softwarestack 3200 mit Vorrichtungen verschiedener Hersteller verwendet werden. In mindestens einer Ausführungsform umfasst die Hardware 3207 einen Host, der mit einer oder mehreren Vorrichtungen verbunden ist, auf die zugegriffen werden kann, um Berechnungsaufgaben über API (Application Programming Interface)-Aufrufe durchzuführen. Eine Vorrichtung innerhalb der Hardware 3207 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 3207, 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 3200 einer Programmierplattform, ohne Beschränkung darauf, eine Reihe von Bibliotheken 3203, eine Laufzeit 3205 und einen Gerätekerneltreiber 3206. Jede der Bibliotheken 3203 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 3203 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 3203 Funktionen, die für die Ausführung auf einer oder mehreren Vorrichtungsarten optimiert sind. In mindestens einer Ausführungsform können die Bibliotheken 3203 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 3203 entsprechenden APIs 3202 zugeordnet, die eine oder mehrere APIs enthalten können, die in den Bibliotheken 3203 implementierte Funktionen offenlegen.
  • In mindestens einer Ausführungsform ist die Anwendung 3201 als Quellcode geschrieben, der in ausführbaren Code kompiliert wird, wie nachstehend in Verbindung mit 36 - 38 näher erläutert wird. In mindestens einer Ausführungsform kann ausführbarer Code der Anwendung 3201 zumindest teilweise auf einer Ausführungsumgebung laufen, die von dem Software-Stack 3200 bereitgestellt wird. In mindestens einer Ausführungsform kann während der Ausführung der Anwendung 3201 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 3205 aufgerufen werden, um den erforderlichen Code auf das Gerät zu laden und zu starten. In mindestens einer Ausführungsform kann die Laufzeit 3205 jedes technisch machbare Laufzeitsystem umfassen, das die Ausführung der Anwendung S01 unterstützen kann.
  • In mindestens einer Ausführungsform ist die Laufzeit 3205 als eine oder mehrere Laufzeitbibliotheken implementiert, die mit entsprechenden APIs verbunden sind, die als API(s) 3204 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) 3204 auf jede technisch machbare Weise implementiert sein. In mindestens einer Ausführungsform kann eine (oder eine beliebige Anzahl von) API(s) einen Low-Level-Satz von Funktionen für eine feinkörnige Steuerung eines Geräts bereitstellen, während eine andere (oder eine beliebige Anzahl von) API(s) einen Higher-Level-Satz solcher Funktionen bereitstellen kann. In mindestens einer Ausführungsform kann eine High-Level-Laufzeit-API auf einer Low-Level-API aufgebaut sein. In mindestens einer Ausführungsform können eine oder mehrere Laufzeit-APIs sprachspezifische APIs sein, die auf eine sprachunabhängige Laufzeit-API aufgesetzt sind.
  • In mindestens einer Ausführungsform ist der Gerätekerneltreiber 3206 so konfiguriert, dass er Kommunikation mit einem zugrunde liegenden Gerät erleichtert. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 3206 Low-Level-Funktionalitäten bereitstellen, auf die sich APIs, wie z.B. die API(s) 3204, und/oder andere Software stützen. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 3206 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 3206 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 3206 den IR-Code zur Laufzeit kompilieren muss.
  • In mindestens einer Ausführungsform wird mindestens eine in 32 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Software-Stacks 3200 einer Programmierplattform verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des Software-Stacks 3200 einer Programmierplattform verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 33 veranschaulicht eine CUDA-Implementierung des Software-Stacks 3100 von 32, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein CUDA-Software-Stack 3300, auf dem eine Anwendung 3301 gestartet werden kann, CUDA-Bibliotheken 3303, eine CUDA-Laufzeit 3305, einen CUDA-Treiber 3307 und einen Gerätekerneltreiber 3308. In mindestens einer Ausführungsform wird der CUDA-Software-Stack 3300 auf der Hardware 3309 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 3301, die CUDA-Laufzeit 3305 und der Gerätekerneltreiber 3308 ähnliche Funktionalitäten wie die Anwendung 3201, die Laufzeit 3205 bzw. der Gerätekerneltreiber 3206 ausführen, die vorstehend in Verbindung mit 32 beschrieben sind. In mindestens einer Ausführungsform umfasst der CUDA-Treiber 3307 eine Bibliothek (libcuda.so), die eine CUDA-Treiber-API 3306 implementiert. Ähnlich zu einer CUDA-Laufzeit-API 3304, die von einer CUDA-Laufzeitbibliothek (cudart) implementiert wird, kann die CUDA-Treiber-API 3306 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 3306 von der CUDA-Laufzeit-API 3304 dadurch, dass die CUDA-Laufzeit-API 3304 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 3304 ist die CUDA-Treiber-API 3306 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 3306 Funktionen zur Kontextverwaltung bereitstellen, die von der CUDA-Laufzeit-API 3304 nicht bereitgestellt werden. In mindestens einer Ausführungsform ist die CUDA-Treiber-API 3306 auch sprachunabhängig und unterstützt z.B. OpenCL zusätzlich zu der CUDA-Laufzeit-API 3304. Ferner können in mindestens einer Ausführungsform die Entwicklungsbibliotheken, einschließlich der CUDA-Laufzeit 3305, als getrennt von den Treiberkomponenten betrachtet werden, einschließlich des Benutzermodus-CUDA-Treibers 3307 und des Kernelmodus-Gerätetreibers 3308 (manchmal auch als „Anzeige“-Treiber bezeichnet).
  • In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3303 mathematische Bibliotheken, Deep-Learning-Bibliotheken, Bibliotheken paralleler Algorithmen und/oder Bibliotheken für Signal-Bild-/Videoverarbeitung beinhalten, die von parallelen Rechenanwendungen wie der Anwendung 3301 verwendet werden können, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3303 mathematische Bibliotheken wie beispielsweise eine cuBLAS-Bibliothek, die eine Implementierung von Basic Linear Algebra Subprograms („BLAS“) zur Durchführung linearer Algebraoperationen ist, eine cuFFT-Bibliothek zur Berechnung schneller Fourier-Transformationen („FFTs“) und eine cuRAND-Bibliothek zum Erzeugen von Zufallszahlen usw. beinhalten. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3303 unter anderem Deep-Learning-Bibliotheken wie eine cuDNN-Bibliothek mit Primitiven für tiefe neuronale Netze und eine TensorRT-Plattform für hochleistungsfähige Deep-Learning-Inferenz umfassen.
  • In mindestens einer Ausführungsform wird mindestens eine in 33 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des CUDA Software-Stacks 3300 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3300 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 34 veranschaulicht eine ROCm-Implementierung des Software-Stacks 3200 von 32, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein ROCm-Software-Stack 3400, auf dem eine Anwendung 3401 gestartet werden kann, eine Sprachlaufzeit 3403, eine Systemlaufzeit 3405, einen Thunk 3407, einen ROCm-Kerneltreiber 3408 und einen Gerätekerneltreiber. In mindestens einer Ausführungsform wird der ROCm-Software-Stack 3400 auf der Hardware 3409 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 3401 ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 32 besprochene Anwendung 3201. Darüber hinaus können die Sprachlaufzeit 3403 und die Systemlaufzeit 3405 in mindestens einer Ausführungsform ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 32 beschriebene Laufzeit 3205. In mindestens einer Ausführungsform unterscheiden sich die Sprachlaufzeit 3403 und die Systemlaufzeit 3405 dadurch, dass die Systemlaufzeit 3405 eine sprachunabhängige Laufzeit ist, die eine ROCr-Systemlaufzeit-API 3404 implementiert und eine Heterogeneous System Architecture („HAS“) Laufzeit-API verwendet. Die H28-Laufzeit-API ist eine schlanke API für den Benutzermodus, die Schnittstellen für den Zugriff auf und die Interaktion mit einer AMD-GPU bereitstellt, einschließlich Funktionen für die Speicherverwaltung, die Ausführungssteuerung über architektonisches Dispatch von Kerneln, die Fehlerbehandlung, System- und Agenteninformationen sowie die Laufzeitinitialisierung und das Herunterfahren, unter anderem, in mindestens einer Ausführungsform. Im Gegensatz zur Systemlaufzeit 3405 ist die Sprachlaufzeit 3403 in mindestens einer Ausführungsform eine Implementierung einer sprachspezifischen Laufzeit-API 3402, die auf der ROCr-Systemlaufzeit-API 3404 aufliegt. In mindestens einer Ausführungsform kann die Sprach-Laufzeit-API unter anderem eine Heterogeneous Compute Interface for Portability („HIP“)-Sprach-Laufzeit-API, eine Heterogeneous Compute Compiler („HCC“)-Sprach-Laufzeit-API oder eine OpenCL-API umfassen, ist aber nicht darauf beschränkt. HIP-Sprache ist insbesondere eine Erweiterung der C++-Programmiersprache mit funktionell ähnlichen Versionen der CUDA-Mechanismen, und in mindestens einer Ausführungsform umfasst eine HIP-Sprach-Laufzeit-API Funktionen, die denen der vorstehend in Verbindung mit 33 besprochenen CUDA-Laufzeit-API 3304 ä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) 3407 eine Schnittstelle, die zur Interaktion mit dem zugrunde liegenden ROCm-Treiber 3408 verwendet werden kann. In mindestens einer Ausführungsform ist der ROCm-Treiber 3408 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 32 besprochene Gerätekerneltreiber 3206 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 3400 oberhalb der Sprachlaufzeit 3403 enthalten sein und eine ähnliche Funktionalität wie die CUDA-Bibliotheken 3303, die vorstehend in Verbindung mit 33 besprochen wurden, bereitstellen. In mindestens einer Ausführungsform können verschiedene Bibliotheken mathematische, Deep-Learning- und/oder andere Bibliotheken enthalten, wie z.B. eine hipBLAS-Bibliothek, die Funktionen ähnlich denen von CUDA cuBLAS implementiert, eine rocFFT-Bibliothek zur Berechnung von FFTs, die CUDA cuFFT ähnlich ist, und andere.
  • In mindestens einer Ausführungsform wird mindestens eine in 34 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks 3400 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks 3400 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 35 veranschaulicht eine OpenCL-Implementierung des Software-Stacks 3200 von 32, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein OpenCL-Software-Stack 3500, auf dem eine Anwendung 3501 gestartet werden kann, ein OpenCL-Framework 3510, eine OpenCL-Laufzeit 3506 und einen Treiber 3507. In mindestens einer Ausführungsform wird der OpenCL-Software-Stack 3500 auf der Hardware 3309 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 3501, die OpenCL-Laufzeit 3506, der Gerätekerneltreiber 3507 und die Hardware 3508 ähnliche Funktionen ausführen wie die Anwendung 3201, die Laufzeit 3205, der Gerätekerneltreiber 3206 bzw. die Hardware 3207, die vorstehend in Verbindung mit 32 beschrieben sind. In mindestens einer Ausführungsform enthält die Anwendung 3501 außerdem einen OpenCL-Kernel 3502 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 3503 und Laufzeit-API 3505, bereit. In mindestens einer Ausführungsform verwendet die Laufzeit-API 3505 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 3505 verwenden kann, um Befehlswarteschlangen, Programmobjekte und Kernelobjekte, gemeinsam genutzte Speicherobj ekte usw. für dieses Gerät zu verwalten. In mindestens einer Ausführungsform stellt die Plattform-API 3503 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 3504 in dem OpenCL-Framewerk 3510 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 3504 kompiliert werden, der stellvertretend für eine beliebige Anzahl von Compilern steht, die zum Kompilieren von Quellcode und/oder IR-Code, wie Standard Portable Intermediate Representation („SPIR-V“) Code, in Binärcode verwendet werden können. Alternativ können in mindestens einer Ausführungsform OpenCL-Anwendungen offline kompiliert werden, bevor solche Anwendungen ausgeführt werden.
  • In mindestens einer Ausführungsform wird mindestens eine in 35 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 3500 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 3500 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 36 veranschaulicht Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform 3604 so konfiguriert, dass sie verschiedene Programmiermodelle 3603, Middlewares und/oder Bibliotheken 3602 und Frameworks 3601 unterstützt, auf die sich eine Anwendung 3600 stützen kann. In mindestens einer Ausführungsform kann die Anwendung 3600 eine KI/ML,-Anwendung sein, die unter Verwendung beispielsweise eines Deep-Learning-Frameworks wie MXNet, PyTorch oder TensorFlow implementiert ist, das sich auf Bibliotheken wie cuDNN, NVIDIA Collective Communications Library („NCCL“) und/oder NVIDA Developer Data Loading Library („DALI“) CUDA-Bibliotheken stützen kann, um beschleunigte Berechnungen auf zugrunde liegender Hardware bereitzustellen.
  • In mindestens einer Ausführungsform kann die Programmierplattform 3504 eine der vorstehend in Verbindung mit 33, 34 bzw. 35 beschriebenen CUDA-, ROCm- oder OpenCL-Plattformen sein. In mindestens einer Ausführungsform unterstützt die Programmierplattform 3604 mehrere Programmiermodelle 3603, die Abstraktionen eines zugrunde liegenden Rechensystems sind, die Ausdrücke von Algorithmen und Datenstrukturen erlauben. In mindestens einer Ausführungsform können Programmiermodelle 3603 Merkmale zugrunde liegender Hardware offenlegen, um die Leistung zu verbessern. In mindestens einer Ausführungsform können die Programmiermodelle 3603 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 3602 Implementierungen von Abstraktionen von Programmiermodellen 3604 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 3604 verfügbaren Dienste hinausgehen. In mindestens einer Ausführungsform können die Bibliotheken und/oder Middlewares 3602 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 3602 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 3601 von Bibliotheken und/oder Middlewares 3602 ab. In mindestens einer Ausführungsform ist jedes der Anwendungsframeworks 3601 ein Softwareframework, das zur Implementierung einer Standardstruktur von Anwendungssoftware verwendet wird. Um auf das vorstehend besprochene KI/ML-Beispiel zurückzukommen, kann eine KI/ML-Anwendung in mindestens einer Ausführungsform unter Verwendung von eines Frameworks wie Caffe, Caffe2, TensorFlow, Keras, PyTorch oder MxNet Deep Learning Frameworks implementiert sein.
  • In mindestens einer Ausführungsform wird mindestens eine in 36 gezeigte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird die Anwendung 3600 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird die Anwendung 3600 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 37 veranschaulicht die Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 32 - 35, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform empfängt ein Compiler 3701 Quellcode 3700, der sowohl Host-Code als auch Geräte-Code enthält. In mindestens einer Ausführungsform ist der Compiler 3701 so konfiguriert, dass er den Quellcode 3700 in einen ausführbaren Host-Code 3702 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 3703 zur Ausführung auf einem Gerät umwandelt. In mindestens einer Ausführungsform kann der Quellcode 3700 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 3700 Code in einer beliebigen, von dem Compiler 3701 unterstützten Programmiersprache enthalten, wie z.B. C++, C, Fortran usw. In mindestens einer Ausführungsform kann der Quellcode 3700 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 3700 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 3701 so konfiguriert, dass er den Quellcode 3700 in einen ausführbaren Host-Code 3702 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 3703 zur Ausführung auf einem Gerät kompiliert. In mindestens einer Ausführungsform führt der Compiler 3701 Operationen durch, darunter ein Parsen des Quellcodes 3700 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 3700 eine Single-Source-Datei enthält, kann der Compiler 3701 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 3703 bzw. den ausführbaren Host-Code 3702 kompilieren und den ausführbaren Geräte-Code 3703 und den ausführbaren Host-Code 3702 in einer einzigen Datei miteinander verknüpfen, wie nachstehend unter Bezugnahme auf 38 ausführlicher erläutert.
  • In mindestens einer Ausführungsform können der ausführbare Host-Code 3702 und der ausführbare Geräte-Code 3703 in jedem geeigneten Format vorliegen, z.B. als Binärcode und/oder IR-Code. Im Fall von CUDA kann der ausführbare Host-Code 3702 in mindestens einer Ausführungsform nativen Objektcode beinhalten und kann der ausführbare Geräte-Code 3703 Code in PTX-Zwischendarstellung beinhalten. Im Fall von ROCm können sowohl der ausführbare Host-Code 3702 als auch der ausführbare Geräte-Code 3703 in mindestens einer Ausführungsform einen Ziel-Binärcode enthalten.
  • In mindestens einer Ausführungsform wird mindestens eine in 37 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein im Quellcode 3700 spezifizierter ausführbarer Hostcode 3702 oder ausführbarer Gerätecode 3703 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 3700 angegebenen ausführbaren Host-Codes 3702 oder ausführbaren Geräte-Codes 3703 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 38 ist eine detailliertere Darstellung der Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 32 - 35, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist ein Compiler 3801 so konfiguriert, dass er Quellcode 3800 empfängt, Quellcode 3800 kompiliert und eine ausführbare Datei 3808 ausgibt. In mindestens einer Ausführungsform ist der Quellcode 3800 eine Single-Source-Datei, wie z.B. eine .cu-Datei, eine .hip.cpp-Datei oder eine Datei in einem anderen Format, die sowohl Hostals auch Geräte-Code enthält. In mindestens einer Ausführungsform kann der Compiler 3801 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 3801 ein Compiler-Frontend 3802, einen Host-Compiler 3805, einen Geräte-Compiler 3806 und einen Linker 3809. In mindestens einer Ausführungsform ist das Compiler-Frontend 3802 so konfiguriert, dass es den Geräte-Code 3804 von dem Host-Code 3803 in dem Quellcode 3800 trennt. Geräte-Code 3804 wird von dem Gerätecompiler 3806 in ausführbaren Geräte-Code 3808 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 3803 von dem Host-Compiler 3805 in ausführbaren Host-Code 3807 kompiliert. In mindestens einer Ausführungsform kann für NVCC der Host-Compiler 3805, ohne darauf beschränkt zu sein, ein universeller C/C++-Compiler sein, der nativen Objektcode ausgibt, während der Geräte-Compiler 3806, 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 3805 als auch der Geräte-Compiler 3806 LLVM-basierte Compiler sein, die Ziel-Binärcode ausgeben, sind aber nicht darauf beschränkt.
  • Nach der Kompilierung des Quellcodes 3800 in einen ausführbaren Host-Code 3807 und einen ausführbaren Geräte-Code 3808 verknüpft der Linker 3809 in mindestens einer Ausführungsform den ausführbaren Host- und Geräte-Code 3807 und 3808 in einer ausführbaren Datei 3810. In mindestens einer Ausführungsform können nativer Objektcode für einen Host und PTX- oder Binärcode für ein Gerät in einer Executable and Linkable Format („ELF“)-Datei miteinander verknüpft werden, die ein Containerformat zum Speichern von Objektcode ist.
  • In mindestens einer Ausführungsform wird mindestens eine in 38 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird die unter Verwendung des Quellcodes 3800 implementierte ausführbare Datei 3810 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird die unter Verwendung des Quellcodes 3800 implementierte ausführbare Datei 3810 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 39 veranschaulicht ein Übersetzen von Quellcode vor der Kompilierung des Quellcodes, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird Quellcode 3900 durch ein Übersetzungswerkzeug 3901 geleitet, das den Quellcode 3900 in übersetzten Quellcode 3902 übersetzt. In mindestens einer Ausführungsform wird ein Compiler 3903 verwendet, um den übersetzten Quellcode 3902 in einen ausführbaren Host-Code 3904 und einen ausführbaren Geräte-Code 3905 zu kompilieren, in einem Prozess, der der Kompilierung des Quellcodes 3700 durch den Compiler 3701 in einen ausführbaren Host-Code 3702 und einen ausführbaren Geräte-Code 3703 ähnelt, wie vorstehend in Verbindung mit 37 beschrieben wurde.
  • In mindestens einer Ausführungsform wird eine von dem Übersetzungswerkzeug 3901 durchgeführte Übersetzung verwendet, um den Quellcode 3900 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 3901 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 3900 ein Parsen des Quellcodes 3900 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 40A - 41 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 3901 durchgeführt werden, manchmal unvollständig sein, so dass zusätzlicher, manueller Aufwand erforderlich ist, um den Quellcode 3900 vollständig zu portieren.
  • In mindestens einer Ausführungsform wird mindestens eine in 39 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 3900 spezifizierten ausführbaren Host-Codes 3904 oder ausführbaren Geräte-Codes 3905 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens einer der im Quellcode 3900 angegebenen ausführbaren Host-Codes 3904 oder ausführbaren Geräte-Codes 3905 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 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.
  • 40A veranschaulicht ein System 40A00, das so konfiguriert ist, dass es CUDA-Quellcode 4010 unter Verwendung verschiedener Arten von Verarbeitungseinheiten kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das System 40A00, ohne Beschränkung darauf, CUDA-Quellcode 4010, einen CUDA-Compiler 4050, ausführbaren Host-Code 4070(1), ausführbaren Host-Code 4070(2), ausführbaren CUDA-Geräte-Code 4084, eine CPU 4090, eine CUDA-fähige GPU 4094, eine GPU 4092, ein CUDA-zu-HIP-Übersetzungswerkzeug 4020, HIP-Quellcode 4030, einen HIP-Compilertreiber 4040, einen HCC 4060 und ausführbaren HCC-Geräte-Code 4082.
  • In mindestens einer Ausführungsform ist der CUDA-Quellcode 4010 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 4090, eine GPU 4092 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 4090.
  • In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4010, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4012, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4014, eine beliebige Anzahl (einschließlich Null) von Hostfunktionen 4016 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4018. In mindestens einer Ausführungsform können globale Funktionen 4012, Gerätefunktionen 4014, Hostfunktionen 4016 und Host/Geräte-Funktionen 4018 in dem CUDA-Quellcode 4010 gemischt sein. In mindestens einer Ausführungsform ist jede der globalen Funktionen 4012 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 4012 als Einstiegspunkte zu einem Gerät dienen. In mindestens einer Ausführungsform ist jede der globalen Funktionen 4012 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 4012 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 4014 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 4016 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 4016 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 4010 auch, ohne Beschränkung darauf, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die über eine CUDA-Laufzeit-API 4002 definiert sind. In mindestens einer Ausführungsform kann die CUDA-Laufzeit-API 4002, 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 4010 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 4002, 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 4002 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 4050 den eingegebenen CUDA-Code (z.B. den CUDA-Quellcode 4010), um den ausführbaren Host-Code 4070(1) und den ausführbaren CUDA-Geräte-Code 4084 zu erzeugen. In mindestens einer Ausführungsform ist der CUDA-Compiler 4050 ein NVCC. In mindestens einer Ausführungsform ist der ausführbare Host-Code 4070(1) eine kompilierte Version des Host-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CPU 4090 ausführbar ist. In mindestens einer Ausführungsform kann die CPU 4090 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 4084 eine kompilierte Version des Geräte-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CUDA-fähigen GPU 4094 ausführbar ist. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4084, ohne Beschränkung darauf, Binärcode. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4084, 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 4094) kompiliert wird. In mindestens einer Ausführungsform kann der CUDA-fähige Grafikprozessor 4094 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 4094 von der NVIDIA Corporation in Santa Clara, CA, entwickelt.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4020 so konfiguriert, dass es den CUDA-Quellcode 4010 in einen funktionell ähnlichen HIP-Quellcode 4030 übersetzt. In mindestens einer Ausführungsform ist der HIP-Quellcode 4030 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 4012, 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 4012 nur von einem Host aus aufrufbar sein.
  • In mindestens einer Ausführungsform enthält der HIP-Quellcode 4030, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4012, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4014, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4016 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4018. In mindestens einer Ausführungsform kann der HIP-Quellcode 4030 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die in einer HIP-Laufzeit-API 4032 angegeben sind. In mindestens einer Ausführungsform enthält die HIP-Laufzeit-API 4032, ohne Beschränkung darauf, funktionell ähnliche Versionen einer Teilmenge von Funktionen, die in der CUDA-Laufzeit-API 4002 enthalten sind. In mindestens einer Ausführungsform kann der HIP-Quellcode 4030 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 4032, 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 4020 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 4020 eine beliebige Anzahl von Aufrufen zu Funktionen, die in der CUDA-Laufzeit-API 4002 angegeben sind, in eine beliebige Anzahl von Aufrufen zu Funktionen, die in der HIP-Laufzeit-API 4032 angegeben sind, um.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4020 ein als hipify-perl bekanntes Werkzeug, das einen textbasierten Übersetzungsprozess ausführt. In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4020 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 4020 durchgeführt werden, erfordern.
  • In mindestens einer Ausführungsform ist der HIP-Compilertreiber 4040 ein Frontend, das ein Zielgerät 4046 bestimmt und dann einen mit dem Zielgerät 4046 kompatiblen Compiler konfiguriert, um den HIP-Quellcode 4030 zu kompilieren. In mindestens einer Ausführungsform ist das Zielgerät 4046 ein Prozessor, der für die parallele Befehlsverarbeitung optimiert ist. In mindestens einer Ausführungsform kann der HIP-Compilertreiber 4040 das Zielgerät 4046 auf jede technisch machbare Weise bestimmen.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 4046 mit CUDA kompatibel ist (z.B. die CUDA-fähige GPU 4094), der HIP-Compilertreiber 4040 einen HIP/NVCC-Kompilierungsbefehl 4042. In mindestens einer Ausführungsform und wie in Verbindung mit 40B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 4042 den CUDA-Compiler 4050 zum Kompilieren des HIP-Quellcodes 4030 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 4042 erzeugt der CUDA-Compiler 4050 den ausführbaren Host-Code 4070(1) und den ausführbaren CUDA-Geräte-Code 4084.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 4046 nicht mit CUDA kompatibel ist, der HIP-Compilertreiber 4040 einen HIP/HCC-Kompilierungsbefehl 4044. In mindestens einer Ausführungsform und wie in Verbindung mit 40C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 4044 den HCC 4060 zum Kompilieren von HIP-Quellcode 4030 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 4044 erzeugt der HCC 4060 ausführbaren Host-Code 4070(2) und ausführbaren HCC-Geräte-Code 4082. In mindestens einer Ausführungsform ist der ausführbare HCC-Geräte-Code 4082 eine kompilierte Version des in dem HIP-Quellcode 4030 enthaltenen Geräte-Codes, der auf der GPU 4092 ausführbar ist. In mindestens einer Ausführungsform kann die GPU 4092 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 4092 von der AMD Corporation in Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform ist GPU, 4092 eine nicht CUDA-fähige GPU 4092.
  • Nur zu Erläuterungszwecken sind in 40A drei verschiedene Abläufe dargestellt, die in mindestens einer Ausführungsform implementiert sein können, um den CUDA-Quellcode 4010 für die Ausführung auf der CPU 4090 und verschiedenen Geräten zu kompilieren. In mindestens einer Ausführungsform kompiliert ein direkter CUDA-Ablauf den CUDA-Quellcode 4010 für die Ausführung auf der CPU 4090 und der CUDA-fähigen GPU 4094, ohne den CUDA-Quellcode 4010 in den HIP-Quellcode 4030 zu übersetzen. In mindestens einer Ausführungsform übersetzt ein indirekter CUDA-Ablauf den CUDA-Quellcode 4010 in den HIP-Quellcode 4030 und kompiliert dann den HIP-Quellcode 4030 zur Ausführung auf der CPU 4090 und der CUDA-fähigen GPU 4094. In mindestens einer Ausführungsform übersetzt ein CUDA/HCC-Ablauf den CUDA-Quellcode 4010 in HIP-Quellcode 4030 und kompiliert dann den HIP-Quellcode 4030 für die Ausführung auf der CPU 4090 und der GPU 4092.
  • Ein direkter CUDA-Ablauf, der in mindestens einer Ausführungsform implementiert sein kann, ist durch gestrichelte Linien und eine Reihe von Blasen mit Bezeichnungen A1-A3 dargestellt. In mindestens einer Ausführungsform und wie in der mit A1 bezeichneten Blase dargestellt, empfängt der CUDA-Compiler 4050 den CUDA-Quellcode 4010 und einen CUDA-Kompilierbefehl 4048, der den CUDA-Compiler 4050 für die Kompilierung des CUDA-Quellcodes 4010 konfiguriert. In mindestens einer Ausführungsform ist der CUDA-Quellcode 4010, 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 4048 generiert der CUDA-Compiler 4050 den ausführbaren Host-Code 4070(1) und den ausführbaren CUDA-Geräte-Code 4084 (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 4070(1) und der ausführbare CUDA-Geräte-Code 4084 auf der CPU 4090 bzw. der CUDA-fähigen GPU 4094 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4084 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4084, ohne darauf beschränkt zu sein, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • Ein indirekter CUDA-Ablauf, der in mindestens einer Ausführungsform implementiert sein kann, ist durch gestrichelte Linien und eine Reihe von Blasen mit der Bezeichnung B1-B6 dargestellt. In mindestens einer Ausführungsform und wie in der mit B1 gekennzeichneten Blase dargestellt, empfängt das CUDA-HIP-Übersetzungswerkzeug 4020 den CUDA-Quellcode 4010. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung B2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 4020 den CUDA-Quellcode 4010 in den HIP-Quellcode 4030. In mindestens einer Ausführungsform und wie in der mit B3 bezeichneten Blase dargestellt, empfängt der HIP-Compilertreiber 4040 den HIP-Quellcode 4030 und bestimmt, dass das Zielgerät 4046 CUDA-fähig ist.
  • In mindestens einer Ausführungsform und wie mit der mit B4 bezeichneten Blase dargestellt, erzeugt der HIP-Compilertreiber 4040 den HIP/NVCC-Kompilierbefehl 4042 und überträgt sowohl den HIP/NVCC-Kompilierbefehl 4042 als auch den HIP-Quellcode 4030 an den CUDA-Compiler 4050. In mindestens einer Ausführungsform und wie in Verbindung mit 40B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 4042 den CUDA-Compiler 4050 zum Kompilieren des HIP-Quellcodes 4030 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 4042 erzeugt der CUDA-Compiler 4050 den ausführbaren Host-Code 4070(1) und den ausführbaren CUDA-Geräte-Code 4084 (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 4070(1) und der ausführbare CUDA-Geräte-Code 4084 auf der CPU 4090 bzw. der CUDA-fähigen GPU 4094 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4084 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4084, ohne darauf beschränkt zu sein, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • Ein CUDA/HCC-Ablauf, der in mindestens einer Ausführungsform implementiert sein kann, wird durch durchgezogene Linien und eine Reihe von Blasen mit der Bezeichnung C1-C6 dargestellt. In mindestens einer Ausführungsform und wie in der Blase mit der Bezeichnung C1 dargestellt, empfängt das CUDA-HIP-Übersetzungswerkzeug 4020 den CUDA-Quellcode 4010. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung C2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 4020 den CUDA-Quellcode 4010 in den HIP-Quellcode 4030. In mindestens einer Ausführungsform und wie mit der Blase C3 dargestellt, empfängt der HIP-Compilertreiber 4040 den HIP-Quellcode 4030 und bestimmt, dass das Zielgerät 4046 nicht CUDA-fähig ist.
  • In mindestens einer Ausführungsform erzeugt der HIP-Compilertreiber 4040 den HIP/HCC-Kompilierbefehl 4044 und überträgt sowohl den HIP/HCC-Kompilierbefehl 4044 als auch den HIP-Quellcode 4030 an den HCC 4060 (dargestellt durch die mit C4 bezeichnete Blase). In mindestens einer Ausführungsform und wie in Verbindung mit 40C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 4044 den HCC 4060, um den HIP-Quellcode 4030 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 4044 erzeugt der HCC 4060 einen ausführbaren Host-Code 4070(2) und einen ausführbaren HCC-Geräte-Code 4082 (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 4070(2) und der ausführbare HCC-Geräte-Code 4082 auf der CPU 4090 bzw. der GPU 4092 ausgeführt werden.
  • In mindestens einer Ausführungsform kann, nachdem der CUDA-Quellcode 4010 in HIP-Quellcode 4030 übersetzt wurde, der HIP-Compilertreiber 4040 anschließend verwendet werden, um ausführbaren Code entweder für die CUDA-fähige GPU 4094 oder die GPU 4092 zu erzeugen, ohne CUDA-HIP-Übersetzungswerkzeug 4020 erneut auszuführen. In mindestens einer Ausführungsform übersetzt das CUDA-zu-HIP-Übersetzungswerkzeug 4020 den CUDA-Quellcode 4010 in HIP-Quellcode 4030, der dann im Speicher abgelegt wird. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4040 dann den HCC 4060, um den ausführbaren Host-Code 4070(2) und den ausführbaren HCC-Geräte-Code 4082 basierend auf dem HIP-Quellcode 4030 zu erzeugen. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4040 anschließend den CUDA-Compiler 4050, um auf der Grundlage des gespeicherten HIP-Quellcodes 4030 den ausführbaren Host-Code 4070(1) und den ausführbaren CUDA-Geräte-Code 4084 zu erzeugen.
  • In mindestens einer Ausführungsform wird mindestens eine in 40A gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4000 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4000 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 40B veranschaulicht ein System 4004, das so konfiguriert ist, dass es den CUDA-Quellcode 4010 von 40A unter Verwendung der CPU 4090 und der CUDA-fähigen GPU 4094 gemäß mindestens einer Ausführungsform kompiliert und ausführt. In mindestens einer Ausführungsform umfasst das System 4004, ohne Beschränkung darauf, den CUDA-Quellcode 4010, das CUDA-HIP-Übersetzungswerkzeug 4020, den HIP-Quellcode 4030, den HIP-Compilertreiber 4040, den CUDA-Compiler 4050, den ausführbaren Host-Code 4070(1), den ausführbaren CUDA-Geräte-Code 4084, die CPU 4090 und die CUDA-fähige GPU 4094.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 40A beschrieben, enthält der CUDA-Quellcode 4010, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4012, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4014, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4016 und eine beliebige Anzahl (einschließlich Null) von Host/GeräteFunktionen 4018. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4010 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 4020 den CUDA-Quellcode 4010 in den HIP-Quellcode 4030. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 4020 jeden Kernel-Aufruf in dem CUDA-Quellcode 4010 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem CUDA-Quellcode 4010 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt HIP-Compilertreiber 4040, dass das Zielgerät 4046 CUDA-fähig ist, und erzeugt den HIP/NVCC-Kompilierungsbefehl 4042. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4040 dann den CUDA-Compiler 4050 über den HIP/NVCC-Kompilierbefehl 4042, um den HIP-Quellcode 4030 zu kompilieren. In mindestens einer Ausführungsform stellt der HIP-Compilertreiber 4040 Zugriff auf einen HIP-zu-CUDA-Übersetzungsheader 4052 als Teil der Konfiguration des CUDA-Compilers 4050 bereit. In mindestens einer Ausführungsform übersetzt der HIP-zu-CUDA-Übersetzungsheader 4052 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 4050 den HIP-zu-CUDA-Übersetzungsheader 4052 in Verbindung mit einer CUDA-Laufzeitbibliothek 4054, die der CUDA-Laufzeit-API 4002 entspricht, um den ausführbaren Host-Code 4070(1) und den ausführbaren CUDA-Geräte-Code 4084 zu erzeugen. In mindestens einer Ausführungsform können der ausführbare Host-Code 4070(1) und der ausführbare CUDA-Geräte-Code 4084 dann auf der CPU 4090 bzw. der CUDA-fähigen GPU 4094 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4084 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4084, ohne Beschränkung darauf, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • In mindestens einer Ausführungsform wird mindestens eine in 40B gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4004 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4004 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 40C zeigt ein System 4006, das so konfiguriert ist, dass es den CUDA-Quellcode 4010 von 40A unter Verwendung einer CPU 4090 und einer nicht-CUDA-fähigen GPU 4092 kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das System 4006, ohne Beschränkung darauf, den CUDA-Quellcode 4010, das CUDA-zu-HIP-Übersetzungswerkzeug 4020, den HIP-Quellcode 4030, den HIP-Compilertreiber 4040, den HCC 4060, den ausführbaren Host-Code 4070(2), den ausführbaren HCC-Geräte-Code 4082, die CPU 4090 und die GPU 4092.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 40A beschrieben, enthält der CUDA-Quellcode 4010, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4012, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4014, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4016 und eine beliebige Anzahl (einschließlich Null) von Host/GeräteFunktionen 4018. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4010 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 4020 den CUDA-Quellcode 4010 in den HIP-Quellcode 4030. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 4020 jeden Kernel-Aufruf in dem CUDA-Quellcode 4010 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 4010 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt der HIP-Compilertreiber 4040 anschließend, dass das Zielgerät 4046 nicht CUDA-fähig ist, und erzeugt den HIP/HCC-Kompilierbefehl 4044. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4040 dann den HCC 4060, um den HIP/HCC-Kompilierbefehl 4044 auszuführen, um den HIP-Quellcode 4030 zu kompilieren. In mindestens einer Ausführungsform konfiguriert der HIP/HCC-Kompilierbefehl 4044 den HCC 4060 so, dass er, ohne Beschränkung darauf, eine HIP/HCC-Laufzeitbibliothek 4058 und einen HCC-Header 4056 verwendet, um ausführbaren Host-Code 4070(2) und ausführbaren HCC-Geräte-Code 4082 zu erzeugen. In mindestens einer Ausführungsform entspricht die HIP/HCC-Laufzeitbibliothek 4058 der HIP-Laufzeit-API 4032. In mindestens einer Ausführungsform enthält der HCC-Header 4056, 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 4070(2) und der ausführbare HCC-Geräte-Code 4082 auf der CPU 4090 bzw. der GPU 4092 ausgeführt werden.
  • In mindestens einer Ausführungsform wird mindestens eine in 40C gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die im Zusammenhang mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4006 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Element des Systems 4006 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 41 veranschaulicht einen beispielhaften Kernel, der von dem CUDA-zu-HIP-Übersetzungswerkzeug 3920 von 39C übersetzt wurde, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform unterteilt der CUDA-Quellcode 3910 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 3910 Thread-Blöcke, die einem bestimmten Kernel zugeordnet sind, in ein eindimensionales, zweidimensionales oder dreidimensionales Gitter von Thread-Blöcken. In mindestens einer Ausführungsform beinhaltet jeder Thread-Block, ohne Beschränkung darauf, eine beliebige Anzahl von Threads, und beinhaltet ein Gitter, ohne Beschränkung darauf, eine beliebige Anzahl von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist ein Kernel eine Funktion in dem Geräte-Code, die unter Verwendung eines „_global_“-Deklarationsbezeichners definiert ist. In mindestens einer Ausführungsform werden die Dimension eines Gitters, das einen Kernel für einen bestimmten Kernelaufruf ausführt, und zugehörige Streams unter Verwendung einer CUDA-Kernel-Startsyntax 4110 spezifiziert. In mindestens einer Ausführungsform wird die CUDA-Kernel-Start-Syntax 4110 als „KernelName<<<GridSize, BlockSize, SharedMemorySize, Stream>>> (KernelArguments);“ spezifiziert. In mindestens einer Ausführungsform ist eine Ausführungskonfigurationssyntax ein „<<<...>>>“-Konstrukt, das zwischen einem Kernelnamen („KernelName“) und einer eingeklammerten Liste von Kernelargumenten („KernelArguments“) eingefügt wird. In mindestens einer Ausführungsform umfasst die CUDA-Kernel-Startsyntax 4110, ohne Beschränkung darauf, eine CUDA-Startfunktionssyntax anstelle einer Ausführungskonfigurations-syntax.
  • In mindestens einer Ausführungsform ist „GridSize“ von einem Typ dim3 und spezifiziert die Dimension und die Größe eines Gitters. In mindestens einer Ausführungsform ist der Typ dim3 eine CUDA-definierte Struktur, die, ohne Beschränkung darauf, vorzeichenlose Ganzzahlen x, y und z beinhaltet. In mindestens einer Ausführungsform ist z standardmäßig gleich eins, falls z nicht spezifiziert ist. In mindestens einer Ausführungsform ist y standardmäßig gleich eins, falls y nicht spezifiziert ist. In mindestens einer Ausführungsform ist die Anzahl von Thread-Blöcken in einem Gitter gleich dem Produkt aus GridSize.x, GridSize.y und GridSize.z. In mindestens einer Ausführungsform ist „BlockSize“ vom Typ dim3 und gibt die Dimension und die Größe jedes Thread-Blocks an. In mindestens einer Ausführungsform ist die Anzahl der Threads pro Thread-Block gleich dem Produkt aus BlockSize.x, BlockSize.y und BlockSize.z. In mindestens einer Ausführungsform erhält jeder Thread, der einen Kernel ausführt, eine eindeutige Thread-ID, die innerhalb des Kernels über eine eingebaute Variable (z.B. „threadIdx“) zugänglich ist.
  • In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 4110 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 4110 ist „SharedMemorySize“ standardmäßig auf null gesetzt. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 4110 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 3910, 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 4110 wird der Kernel MatAdd unter Verwendung eines Gitters von Thread-Blöcken mit einer Dimension N/16 mal N/16 ausgeführt, wobei jeder Thread-Block eine Dimension von 16 mal 16 hat. In mindestens einer Ausführungsform umfasst jeder Thread-Block 286 Threads, wird ein Gitter mit genügend Blöcken erstellt, um einen Thread pro Matrixelement zu haben, und führt jeder Thread in einem solchen Gitter den Kernel MatAdd aus, um eine paarweise Addition durchzuführen.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 4020 während des Übersetzens von CUDA-Quellcode 4010 in HIP-Quellcode 4030 jeden Kernelaufruf in dem CUDA-Quellcode 4010 von der CUDA-Kernel-Start-Syntax 4110 in eine HIP-Kernel-Start-Syntax 4120 und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 4010 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe. In mindestens einer Ausführungsform ist die HIP-Kernel-Start-Syntax 4120 als „hipLaunchKemelGGL(KernelName,GridSize, BlockSize, SharedMemorySize, Stream, Kernel Arguments);“ spezifiziert. In mindestens einer Ausführungsform hat jeder der Parameter KernelName, GridSize, BlockSize, ShareMemorySize, Stream und KernelArguments in der HIP-Kernel-Start-Syntax 4120 die gleiche Bedeutung wie in der CUDA-Kernel-Start-Syntax 4110 (hierin zuvor beschrieben). In mindestens einer Ausführungsform sind die Argumente SharedMemorySize und Stream in der HIP-Kernel-Startsyntax 4120 erforderlich und in der CUDA-Kernel-Startsyntax 4110 optional.
  • In mindestens einer Ausführungsform ist ein Teil des in 41 dargestellten HIP-Quellcodes 4030 identisch mit einem Teil des in 41 dargestellten CUDA-Quellcodes 4010, 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 4030 mit demselben Deklarationsbezeichner „_global_“ definiert, mit dem der Kernel MatAdd in dem CUDA-Quellcode 4010 definiert ist. In mindestens einer Ausführungsform lautet ein Kernelaufruf in dem HIP-Quellcode 4030 „hipLaunchKemelGGL(MatAdd, numBlocks, threadsPerBlock, 0, 0, A, B, C);“, während ein entsprechender Kernelaufruf in dem CUDA-Quellcode 4010 „MatAdd<<<numBlocks, threadsPerBlock>>(A, B, C);“ lautet.
  • In mindestens einer Ausführungsform wird mindestens eine in 41 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens eine der Komponenten CUDA-Quellcode 4110, CUDA-HIP-Übersetzungswerkzeug 4120 oder HIP-Quellcode 4130 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein CUDA-Quellcode 4110, ein CUDA-HIP-Übersetzungswerkzeug 4120 oder ein HIP-Quellcode 4130 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 42 veranschaulicht die nicht-CUDA-fähige GPU 4092 von 40C in größerem Detail, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird die GPU 4092 von der AMD Corporation in Santa Clara entwickelt. In mindestens einer Ausführungsform kann die GPU 4092 so konfiguriert sein, dass sie Rechenoperationen hochparallel durchführt. In mindestens einer Ausführungsform ist die GPU 4092 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 4092 so konfiguriert, dass sie Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist die GPU 4092 so konfiguriert, dass sie sowohl grafikbezogene als auch grafikfremde Operationen ausführt. In mindestens einer Ausführungsform kann die GPU 4092 so konfiguriert sein, dass sie Geräte-Code ausführt, der in dem HIP-Quellcode 4030 enthalten ist.
  • In mindestens einer Ausführungsform umfasst die GPU 4092, ohne Beschränkung darauf, eine beliebige Anzahl von programmierbaren Verarbeitungseinheiten 4220, einen Befehlsprozessor 4210, einen L2-Cache 4222, Speichercontroller 4270, DMA-Engines 4280(1), Systemspeichercontroller 4282, DMA-Engines 4280(2) und GPU-Controller 4284. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 4220, ohne Beschränkung darauf, einen Arbeitslastverwalter 4230 und eine beliebige Anzahl von Recheneinheiten 4240. In mindestens einer Ausführungsform liest der Befehlsprozessor 4210 Befehle aus einer oder mehreren Befehlswarteschlangen (nicht dargestellt) und verteilt die Befehle an Arbeitslastverwalter 4230. In mindestens einer Ausführungsform verteilt der zugehörige Arbeitslastverwalter 4230 für jede programmierbare Verarbeitungseinheit 4220 Arbeit an in der programmierbaren Verarbeitungseinheit 4220 enthaltene Recheneinheiten 4240. In mindestens einer Ausführungsform kann jede Recheneinheit 4240 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 4240 ausgeführt. In mindestens einer Ausführungsform ist eine Arbeitsgruppe ein Thread-Block.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 4240, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 4250 und einen gemeinsamen Speicher 4260. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 4250 eine SIMD-Architektur und ist zur parallelen Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform beinhaltet jede SIMD-Einheit 4250, ohne Beschränkung darauf, eine Vektor-ALU 4252 und eine Vektorregisterdatei 4254. In mindestens einer Ausführungsform führt jede SIMD-Einheit 4250 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 4260 kommunizieren.
  • In mindestens einer Ausführungsform werden programmierbare Verarbeitungseinheiten 4220 als „Shader-Engines“ bezeichnet. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 4220, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware zusätzlich zu Recheneinheiten 4240. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 4220, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich null) von Geometrieprozessoren, eine beliebige Anzahl (einschließlich null) von Rasterisierern, eine beliebige Anzahl (einschließlich null) von Render-Backends, einen Arbeitslastverwalter 4230 und eine beliebige Anzahl von Recheneinheiten 4240.
  • In mindestens einer Ausführungsform teilen sich die Recheneinheiten 4240 einen L2-Cache 4222. In mindestens einer Ausführungsform ist der L2-Cache 4222 partitioniert. In mindestens einer Ausführungsform ist ein GPU-Speicher 4290 für alle Recheneinheiten 4240 in der GPU 4092 zugänglich. In mindestens einer Ausführungsform erleichtern Speichercontroller 4270 und Systemspeichercontroller 4282 die Datenübertragung zwischen der GPU 4092 und einem Host, und ermöglichen die DMA-Engines 4280(1) asynchrone Speicherübertragungen zwischen der GPU 4092 und einem solchen Host. In mindestens einer Ausführungsform erleichtern Speichercontroller 4270 und GPU-Controller 4284 Datenübertragungen zwischen der GPU 4092 und anderen GPUs 4092, und ermöglichen DMA-Engines 4280(2) asynchrone Speicherübertragungen zwischen der GPU 4092 und anderen GPUs 4092.
  • In mindestens einer Ausführungsform beinhaltet die GPU 4092, 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 4092 sein können, hinweg erleichtern. In mindestens einer Ausführungsform beinhaltet die GPU 4092, ohne Beschränkung darauf, eine beliebige Anzahl und Art von E/A-Schnittstellen (z.B. PCIe), die mit einer beliebigen Anzahl und Art von Peripheriegeräten gekoppelt sind. In mindestens einer Ausführungsform kann die GPU 4092, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von Display-Engines und eine beliebige Anzahl (einschließlich Null) von Multimedia-Engines enthalten. In mindestens einer Ausführungsform implementiert die GPU 4092 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und eine beliebige Art von Speichercontrollern (z.B. Speichercontroller 4270 und Systemspeichercontroller 4282) und Speichervorrichtungen (z.B. gemeinsam genutzte Speicher 4260) umfasst, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die GPU 4092 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Cache 4222) umfasst, die jeweils für eine beliebige Anzahl von Komponenten (z.B. SIMD-Einheiten 4250, Recheneinheiten 4240 und programmierbare Verarbeitungseinheiten 4220) reserviert oder von diesen gemeinsam genutzt werden können.
  • In mindestens einer Ausführungsform wird mindestens eine in 42 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens eine in 42 gezeigte oder beschriebene Komponente verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens eine in 42 gezeigte oder beschriebene Komponente verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 43 veranschaulicht, wie Threads eines beispielhaften CUDA-Grids 4320 auf verschiedene Recheneinheiten 4240 von 42 abgebildet werden, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform und nur zu Erläuterungszwecken hat das Raster 4220 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 4220 daher, ohne Beschränkung darauf, (BX * BY) Thread-Blöcke 4230 und umfasst jeder Thread-Block 4230, ohne Beschränkung darauf, (TX * TY) Threads 4240. Die Threads 4240 sind in 42 als verschnörkelte Pfeile dargestellt.
  • In mindestens einer Ausführungsform wird das Raster 4320 auf die programmierbare Verarbeitungseinheit 4220(1) abgebildet, die, ohne Beschränkung darauf, die Recheneinheiten 4240(1)-4240(C) umfasst. In mindestens einer Ausführungsform und wie gezeigt werden (BJ * BY) Thread-Blöcke 4330 auf die Recheneinheit 4240(1) abgebildet, und werden die restlichen Thread-Blöcke 4330 auf die Recheneinheit 4240(2) abgebildet. In mindestens einer Ausführungsform kann jeder Thread-Block 4330, ohne Beschränkung darauf, eine beliebige Anzahl von Warps enthalten, und ist jeder Warp einer anderen SIMD-Einheit 4250 von 42 zugeordnet.
  • In mindestens einer Ausführungsform können Warps in einem gegebenen Thread-Block 4330 zusammen synchronisieren und über gemeinsam genutzten Speicher 4260 in der zugeordneten Recheneinheit 4240 kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 4330(BJ,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 4260(1) kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 4330(BJ+1,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 4260(2) kommunizieren.
  • In mindestens einer Ausführungsform wird mindestens eine in 43 gezeigte oder in Bezug darauf beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grids 4320 verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grids 4320 verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • 44 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 4400 als Eingabe für ein DPC++-Kompatibilitätstool 4402 bereitgestellt, um menschenlesbares DPC++ 4404 zu erzeugen. In mindestens einer Ausführungsform enthält der für den Menschen lesbare DPC++ 4404 Inline-Kommentare, die vom DPC++-Kompatibilitätstool 4402 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 4406 abzuschließen und dadurch den DPC++-Quellcode 4408 zu erzeugen.
  • In mindestens einer Ausführungsform ist oder enthält der CUDA-Quellcode 4400 eine Sammlung von menschenlesbarem Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Quellcode 4400 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 sequenzielle Anweisungsverarbeitung optimiert ist, wie beispielsweise eine CPU. Der in Verbindung mit 43 beschriebene CUDA-Quellcode 4400 kann mit den an anderer Stelle in diesem Dokument beschriebenen Quellcodes übereinstimmen.
  • In mindestens einer Ausführungsform bezieht sich das DPC++-Kompatibilitätswerkzeug 4402 auf ein ausführbares Werkzeug, ein Programm, eine Anwendung oder eine andere geeignete Art von Werkzeug, das zur Erleichterung der Migration von CUDA-Quellcode 4400 zu DPC++-Quellcode 4408 verwendet wird. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 4402 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 4402 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++ 4404 bezeichnet wird. In mindestens einer Ausführungsform enthält das menschenlesbare DPC++ 4404 Kommentare, die vom DPC++-Kompatibilitätswerkzeug 4402 erzeugt werden, um anzuzeigen, wo ein Benutzereingriff erforderlich sein kann. In mindestens einer Ausführungsform ist ein Benutzereingriff erforderlich, wenn der CUDA-Quellcode 4400 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 4300 (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 4402; das Abschließen der Migration und das Überprüfen der Korrektheit, wodurch DPC++-Quellcode 4408 erzeugt wird; und das Kompilieren von DPC++-Quellcode 4408 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 4402 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 4402 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 4402 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 4402 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 4402 menschenlesbaren DPC++ 4404, bei dem es sich um DPC++-Code handeln kann, der in der vom DPC++-Kompatibilitätstool 4402 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 4402 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 44002 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 4402 direkt DPC++-Quellcode 4408, der von einem DPC++-Compiler kompiliert wird, ohne dass ein menschliches Eingreifen erforderlich ist oder genutzt wird, um den vom DPC++-Kompatibilitätswerkzeug 4402 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 4402 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[threadIdx.x] = threadIdx.x + 1.0f;
         B[threadIdx.x] = threadIdx.x + 1.0f;
         C[threadIdx.x] = A[threadIdx.x] + B[threadIdx.x];
       }
       int main()
       {
         float *d_A, *d_B, *d_C;
         cudaMalloc(& d_A, VECTOR_SIZE*sizeof(float));
         cudaMalloc(& d_B, VECTOR_SIZE*sizeof(float));
         cudaMalloc(& d_C, VECTOR_SIZE*sizeof(float));
         VectorAddKernel<<<1, VECTOR_SIZE>> >(d_A, d_B, d_C);
         float Result[VECTOR_SIZE] = { };
         cudaMemcpy(Result, d_C, VECTOR_SIZE*sizeof(float),
        cudaMemcpyDeviceToHost);
         cudaFree(d_A);
         cudaFree(d_B);
         cudaFree(d_C),
         for (int i=0; i<VECTOR_SIZE; i++ {
           if (i % 16 == 0) {
             printf("\n");
       }
           printf("%f", Result[i]);
      }
     return 0;
    }
  • In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei analysiert das DPC++-Kompatibilitätswerkzeug 4402 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 4402 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 4402 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 4402 geändert zu werden. In mindestens einer Ausführungsform modifiziert das DPC++-Kompatibilitätswerkzeug 4402 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++ 4404 (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++ 4404 auf die vom DPC++-Kompatibilitätswerkzeug 4402 erzeugte Ausgabe und kann auf die eine oder andere Weise optimiert werden. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätstool 4402 erzeugte, für den Menschen lesbare DPC++ 4404 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 44002 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 4402 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 4402 ü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 4402 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 4402; 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.
  • In mindestens einer Ausführungsform verwenden eine oder mehrere der hierin beschriebenen Techniken ein oneAPI-Programmiermodell. In mindestens einer Ausführungsform bezieht sich ein oneAPI-Programmiermodell auf ein Programmiermodell für die Interaktion mit verschiedenen Compute Accelerator-Architekturen. In mindestens einer Ausführungsform bezieht sich oneAPI auf eine Anwendungsprogrammierschnittstelle (API), die für die Interaktion mit verschiedenen Compute Accelerator-Architekturen entwickelt wurde. In mindestens einer Ausführungsform verwendet ein oneAPI-Programmiermodell eine DPC++-Programmiersprache. In mindestens einer Ausführungsform bezieht sich eine DPC++-Programmiersprache auf eine Hochsprache für die Produktivität der datenparallelen Programmierung. In mindestens einer Ausführungsform basiert eine DPC++-Programmiersprache zumindest teilweise auf den Programmiersprachen C und/oder C++. In mindestens einer Ausführungsform ist ein oneAPI-Programmiermodell ein Programmiermodell, wie es von der Intel Corporation in Santa Clara, CA, entwickelt wurde.
  • In mindestens einer Ausführungsform wird oneAPI und/oder oneAPI-Programmiermodell verwendet, um mit verschiedenen Beschleuniger-, GPU-, Prozessor-Architekturen und/oder Variationen davon zu interagieren. In mindestens einer Ausführungsform umfasst oneAPI eine Reihe von Bibliotheken, die verschiedene Funktionalitäten implementieren. In mindestens einer Ausführungsform umfasst oneAPI mindestens eine oneAPI-DPC++-Bibliothek, eine oneAPI-Mathematik-Kernel-Bibliothek, eine oneAPI-Datenanalysebibliothek, eine oneAPI-Bibliothek für tiefe neuronale Netzwerke, eine oneAPI-Bibliothek für kollektive Kommunikation, eine oneAPI-Bibliothek für Threading-Bausteine, eine oneAPI-Bibliothek für Videoverarbeitung und/oder Variationen davon.
  • In mindestens einer Ausführungsform ist eine oneAPI-DPC++-Bibliothek, auch oneDPL genannt, eine Bibliothek, die Algorithmen und Funktionen zur Beschleunigung der DPC++-Kernelprogrammierung implementiert. In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere Funktionen der Standard Template Library (STL). In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere parallele STL-Funktionen. In mindestens einer Ausführungsform bietet oneDPL einen Satz von Bibliotheksklassen und - funktionen wie parallele Algorithmen, Iteratoren, Funktionsobjektklassen, bereichsbasierte API und/oder Variationen davon. In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere Klassen und/oder Funktionen einer C++-Standardbibliothek. In mindestens einer Ausführungsform implementiert oneDPL eine oder mehrere Zufallszahlengeneratorfunktionen.
  • In mindestens einer Ausführungsform ist eine oneAPI-Mathematik-Kernel-Bibliothek, die auch als oneMKL bezeichnet wird, eine Bibliothek, die verschiedene optimierte und parallelisierte Routinen für verschiedene mathematische Funktionen und/oder Operationen implementiert. In mindestens einer Ausführungsform implementiert oneMKL ein oder mehrere Basic Linear Algebra Subprograms (BLAS) und/oder Linear Algebra Package (LAPACK) Dense Linear Algebra Routines. In mindestens einer Ausführungsform implementiert oneMKL eine oder mehrere dünn besetzte BLAS-Routinen für lineare Algebra. In mindestens einer Ausführungsform implementiert oneMKL einen oder mehrere Zufallszahlengeneratoren (RNGs). In mindestens einer Ausführungsform implementiert oneMKL eine oder mehrere Vektormathematik (VM)-Routinen für mathematische Operationen mit Vektoren. In mindestens einer Ausführungsform implementiert oneMKL eine oder mehrere Fast-Fourier-Transformationsfunktionen (FFT).
  • In mindestens einer Ausführungsform ist eine oneAPI-Datenanalysebibliothek, die auch als oneDAL bezeichnet wird, eine Bibliothek, die verschiedene Datenanalyseanwendungen und verteilte Berechnungen implementiert. In mindestens einer Ausführungsform implementiert oneDAL verschiedene Algorithmen für die Vorverarbeitung, Transformation, Analyse, Modellierung, Validierung und Entscheidungsfindung für die Datenanalyse in Stapel-, Online- und verteilten Verarbeitungsmodi der Berechnung. In mindestens einer Ausführungsform implementiert oneDAL verschiedene C++ und/oder Java APIs und verschiedene Konnektoren zu einer oder mehreren Datenquellen. In mindestens einer Ausführungsform implementiert oneDAL DPC++ API-Erweiterungen zu einer herkömmlichen C++-Schnittstelle und ermöglicht die Nutzung von GPUs für verschiedene Algorithmen.
  • In mindestens einer Ausführungsform ist eine oneAPI-Bibliothek für tiefe neuronale Netzwerke, die auch als oneDNN bezeichnet wird, eine Bibliothek, die verschiedene Funktionen des Deep Learning implementiert. In mindestens einer Ausführungsform implementiert oneDNN verschiedene neuronale Netzwerk-, maschinelle Lern- und Deep-Learning-Funktionen, Algorithmen und/oder Variationen davon.
  • In mindestens einer Ausführungsform ist eine kollektive oneAPI-Kommunikationsbibliothek, die auch als oneCCL bezeichnet wird, eine Bibliothek, die verschiedene Anwendungen für Deep Learning und maschinelles Lernen implementiert. In mindestens einer Ausführungsform baut oneCCL auf Kommunikations-Middleware auf niedrigerer Ebene auf, wie z. B. Message Passing Interface (MPI) und libfabrics. In mindestens einer Ausführungsform ermöglicht oneCCL eine Reihe von Deep-Learning-spezifischen Optimierungen, wie z. B. Priorisierung, persistente Operationen, Ausführungen außerhalb der Reihenfolge und/oder Variationen davon. In mindestens einer Ausführungsform implementiert oneCCL verschiedene CPU- und GPU-Funktionen.
  • In mindestens einer Ausführungsform ist eine oneAPI-Threading-Building-Blocks-Bibliothek, die auch als oneTBB bezeichnet wird, eine Bibliothek, die verschiedene parallelisierte Prozesse für verschiedene Anwendungen implementiert. In mindestens einer Ausführungsform wird oneTBB für die aufgabenbasierte, gemeinsame parallele Programmierung auf einem Host verwendet. In mindestens einer Ausführungsform implementiert oneTBB generische parallele Algorithmen. In mindestens einer Ausführungsform implementiert oneTBB nebenläufige Container. In mindestens einer Ausführungsform implementiert oneTBB einen skalierbaren Speicherallokator. In mindestens einer Ausführungsform implementiert oneTBB einen Aufgabenplaner, der Arbeit stiehlt. In mindestens einer Ausführungsform implementiert oneTBB Synchronisationsprimitive auf niedriger Ebene. In mindestens einer Ausführungsform ist oneTBB compilerunabhängig und kann auf verschiedenen Prozessoren wie GPUs, PPUs, CPUs und/oder Variationen davon eingesetzt werden.
  • In mindestens einer Ausführungsform ist eine oneAPI-Videoverarbeitungsbibliothek, die auch als oneVPL bezeichnet wird, eine Bibliothek, die zur Beschleunigung der Videoverarbeitung in einer oder mehreren Anwendungen eingesetzt wird. In mindestens einer Ausführungsform implementiert oneVPL verschiedene Videodekodierungs-, -kodierungs- und -verarbeitungsfunktionen. In mindestens einer Ausführungsform implementiert oneVPL verschiedene Funktionen für Medien-Pipelines auf CPUs, GPUs und anderen Beschleunigern. In mindestens einer Ausführungsform implementiert oneVPL die Geräteerkennung und -auswahl in medienzentrierten und videoanalytischen Workloads. In mindestens einer Ausführungsform implementiert oneVPL API-Primitive für die gemeinsame Nutzung von Null-Kopie-Puffern.
  • In mindestens einer Ausführungsform wird für ein oneAPI-Programmiermodell eine DPC++-Programmiersprache verwendet. In mindestens einer Ausführungsform ist eine DPC++-Programmiersprache eine Programmiersprache, die ohne Einschränkung funktional ähnliche Versionen von CUDA-Mechanismen enthält, um Gerätecode zu definieren und zwischen Gerätecode und Hostcode zu unterscheiden. In mindestens einer Ausführungsform kann eine DPC++-Programmiersprache eine Teilmenge der Funktionalität einer CUDA-Programmiersprache enthalten. In mindestens einer Ausführungsform werden eine oder mehrere CUDA-Programmiermodelloperationen unter Verwendung eines oneAPI-Programmiermodells mit einer DPC++-Programmiersprache durchgeführt.
  • In mindestens einer Ausführungsform wird mindestens eine in 44 dargestellte oder beschriebene Komponente verwendet, um Techniken und/oder Funktionen zu implementieren, die in Verbindung mit 1-12 beschrieben sind. In mindestens einer Ausführungsform wird mindestens eine in 44 gezeigte oder beschriebene Komponente verwendet, um eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchzuführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen. In mindestens einer Ausführungsform wird mindestens eine in 44 gezeigte oder beschriebene Komponente verwendet, um mindestens einen Aspekt durchzuführen, der in Bezug auf das beispielhafte Computersystem 100, die beispielhafte Speicherabbildung 200, die beispielhafte Speicherabbildung 300, die beispielhafte Speicherabbildung 400, das beispielhafte Computersystem 500, den beispielhaften Prozess 600, das beispielhafte Codefragment 700, das beispielhafte Codefragment 800, die beispielhaften Laufzeitrichtlinien 900, den beispielhaften Prozess 1000, den beispielhaften Prozess 1100, die beispielhaften Softwareversionen 1200 und/oder andere hierin beschriebene Betriebsabläufe beschrieben ist.
  • Es wird angemerkt, dass sich die hierin beschriebenen Ausführungsbeispiele zwar auf ein CUDA-Programmiermodell beziehen können, die hierin beschriebenen Techniken jedoch mit jedem geeigneten Programmiermodell, wie HIP, oneAPI (z. B. unter Verwendung einer oneAPI-basierten Programmierung zur Durchführung oder Implementierung eines hierin offengelegten Verfahrens) und/oder Variationen davon, verwendet werden können.
  • In mindestens einer Ausführungsform können eine oder mehrere Komponenten der oben offenbarten Systeme und/oder Prozessoren mit einer oder mehreren CPUs, ASICs, GPUs, FPGAs oder anderen Hardware-, Schaltkreis- oder integrierten Schaltkreiskomponenten kommunizieren, die z. B. einen Upscaler oder Upsampler zum Hochskalieren eines Bildes, einen Image Blender oder eine Image Blender-Komponente zum Überblenden, Mischen oder Zusammenfügen von Bildern, einen Sampler zum Abtasten eines Bildes (z. B., als Teil eines DSP), eine neuronale Netzwerkschaltung, die so konfiguriert ist, dass sie einen Upscaler ausführt, um ein Bild hochzuskalieren (z. B. von einem Bild mit niedriger Auflösung zu einem Bild mit hoher Auflösung), oder andere Hardware, um ein Bild, einen Rahmen oder ein Video zu modifizieren oder zu erzeugen, um seine Auflösung, Größe oder Pixel einzustellen; eine oder mehrere Komponenten von Systemen und/oder Prozessoren, die vorstehend offenbart wurden, können Komponenten verwenden, die in dieser Offenbarung beschrieben werden, um Verfahren, Operationen oder Anweisungen auszuführen, die ein Bild erzeugen oder modifizieren.
  • Mindestens eine Ausführungsform der Offenbarung kann im Hinblick auf die folgenden Abschnitte beschrieben werden:
    1. 1. Prozessor, umfassend:
      • eine oder mehrere Schaltungen zum Ausführen einer oder mehrerer Versionen von einer Vielzahl von Versionen von Programmcode, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    2. 2. Prozessor nach Abschnitt 1, wobei zumindest eine der einen oder mehreren Versionen ein Software-Kernel ist.
    3. 3. Prozessor nach Abschnitt 1 oder 2, wobei die eine oder die mehreren Schaltungen angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf Einträgen in einer aktuellen Tabelle.
    4. 4. Prozessor nach einem der Abschnitte 1-3, wobei die eine oder die mehreren Schaltungen angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Referenzzählung von Speicherplätzen.
    5. 5. Prozessor nach einem der Abschnitte 1-4, wobei zumindest eine der Vielzahl von Versionen eine optimierte Version des Programmcodes ist.
    6. 6. Prozessor nach einem der Abschnitte 1-5, wobei zumindest eine der Vielzahl von Versionen eine Version des Programmcodes ist, die auf eine oder mehrere Prozessorarchitekturen ausgerichtet ist.
    7. 7. Prozessor nach einem der Abschnitte 1-6, wobei die eine oder die mehreren Versionen unter Verwendung einer Grafikverarbeitungseinheit (GPU) durchzuführen sind.
    8. 8. Prozessor nach einem der Abschnitte 1-7, wobei die Vielzahl von Versionen von Programmcode basierend zumindest teilweise auf einer oder mehrerer Direktiven in dem Programmcode erzeugt werden.
    9. 9. Prozessor nach einem der Abschnitte 1-8, wobei die eine oder die mehreren Schaltungen angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Speichertabelle auf einer ersten Vorrichtung, die eine oder mehrere Kennungen von einem oder mehreren Speicherbereichen auf einer zweiten Vorrichtung enthält.
    10. 10. Computerimplementiertes Verfahren, umfassend:
      • Durchführen einer oder mehrerer Versionen von einer Vielzahl von Versionen von Programmcode, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    11. 11. Computerimplementiertes Verfahren nach Abschnitt 10, ferner umfassend:
      • Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einem oder mehreren Einträgen einer Speichertabelle.
    12. 12. Computerimplementiertes Verfahren nach Abschnitt 10 oder 11, ferner umfassend:
      • Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Anzahl von Speicherplätzen.
    13. 13. Computerimplementiertes Verfahren nach einem der Abschnitte 10-12, wobei zumindest eine der Vielzahl von Versionen eine parallelisierte Version des Programmcodes ist.
    14. 14. Computerimplementiertes Verfahren nach einem der Abschnitte 10-13, wobei zumindest eine der Vielzahl von Versionen eine sequenzielle Version des Programmcodes ist.
    15. 15. Computerimplementiertes Verfahren nach einem der Abschnitte 10-14, wobei die eine oder die mehreren Versionen unter Verwendung eines Grafikbeschleunigers durchzuführen sind.
    16. 16. Computerimplementiertes Verfahren nach einem der Abschnitte 10-15, ferner umfassend:
      • Erzeugen der einen oder mehreren Versionen von Programmcode, basierend zumindest teilweise auf einer oder mehreren Compiler-Direktiven, die dem Programmcode hinzugefügt sind.
    17. 17. Computerimplementiertes Verfahren nach einem der Abschnitte 10-16, ferner umfassend:
      • Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Speichertabelle auf einer ersten Vorrichtung, die eine oder mehrere Kennungen von einem oder mehreren Speicherbereichen auf einer zweiten Vorrichtung enthält.
    18. 18. Computerimplementiertes Verfahren nach einem der Abschnitte 10-17, ferner umfassend:
      • Auswählen der einen oder der mehreren Versionen der Vielzahl von Versionen von auszuführendem Programmcode, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf die überlappenden Speicherplätze zugreifen sollen.
    19. 19. Computersystem, umfassend:
      • einen oder mehrere Prozessoren und Speicher, der ausführbare Anweisungen speichert, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    20. 20. Computersystem nach Abschnitt 19, wobei zumindest eine der einen oder mehreren Versionen ein Kernel einer Grafikverarbeitungseinheit, GPU, ist.
    21. 21. Computersystem nach Abschnitt 19 oder 20, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Erkennen, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einem Nachschlagen in einer Speichertabelle.
    22. 22. Computersystem nach einem der Abschnitte 19-21, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Anzahl und einer Speicheradresse, die aus einer Speicher-Nachschlagetabelle abgerufen wird.
    23. 23. Computersystem nach einem der Abschnitte 19-22, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Erkennen, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf aktuellen Daten, die aus einer ausgeglichenen Baumstruktur erhalten wurden werden.
    24. 24. Computersystem nach einem der Abschnitte 19-23, wobei zumindest eine der Vielzahl von Versionen eine nicht optimierte Version des Programmcodes ist.
    25. 25. Computersystem nach einem der Abschnitte 19-24, wobei zumindest eine der Vielzahl von Versionen eine optimierte Version des Programmcodes ist.
    26. 26. Computersystem nach einem der Abschnitte 19-25, wobei die eine oder die mehreren Versionen unter Verwendung einer Grafikverarbeitungseinheit, GPU, auszuführen sind.
    27. 27. Computersystem nach einem der Abschnitte 19-26, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Erkennen, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer oder mehreren Kennungen eines oder mehrerer Speicherbereiche einer GPU.
    28. 28. Maschinenlesbares Medium, auf dem ein Satz von Anweisungen gespeichert ist, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    29. 29. Maschinenlesbares Medium nach Abschnitt 28, wobei zumindest eine der einen oder mehreren Versionen unter Verwendung eines Grafikbeschleunigers auszuführen ist.
    30. 30. Maschinenlesbares Medium nach Abschnitt 28 oder 29, wobei der Satz von Anweisungen Anweisungen enthält, die angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Tabelle.
    31. 31. Maschinenlesbares Medium nach einem der Abschnitte 28-30, wobei der Satz von Anweisungen Anweisungen enthält, die angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Anzahl und einer Speicheradresse.
    32. 32. Maschinenlesbares Medium nach einem der Abschnitte 28-31, wobei zumindest eine der Vielzahl von Versionen durch eine Vielzahl von Threads durchzuführen ist.
    33. 33. Maschinenlesbares Medium nach einem der Abschnitte 28-32, wobei die Vielzahl von Versionen von Programmcode basierend zumindest teilweise auf einer oder mehrerer Prozessor-Direktiven in dem Programmcode erzeugt wird.
    34. 34. Maschinenlesbares Medium nach einem der Abschnitte 28-33, wobei:
      • die eine oder die mehreren Anweisungen Anweisungen enthalten, die angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Speichertabelle, die auf einem ersten Prozessor des einen oder der mehreren Prozessoren gespeichert ist; und
      • die Speichertabelle eine oder mehrere Kennungen von einem oder mehreren Speicherbereichen eines zweiten Prozessors des einen oder der mehreren Prozessoren enthält.
    35. 35. Maschinenlesbares Medium nach einem der Abschnitte 28-34, wobei die eine oder die mehreren Versionen der Vielzahl von Versionen von Programmcode, der durchzuführen ist, basierend zumindest teilweise darauf ausgewählt werden, welche der Vielzahl von Versionen von Programmcode auf die überlappenden Speicherbereiche zugreifen sollen.
  • 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) implementiert sind, die gemeinsam auf einem oder mehreren Prozessoren, durch Hardware oder Kombinationen davon ausgeführt werden. In mindestens einer Ausführungsform ist der Code auf einem computerlesbaren Speichermedium gespeichert, z.B. in Form eines Computerprogramms, das eine Vielzahl von Anweisungen umfasst, die von einem oder mehreren Prozessoren ausgeführt werden können. In mindestens einer Ausführungsform ist ein computerlesbares Speichermedium ein nicht-transitorisches computerlesbares Speichermedium, das transitorische Signale (z.B. eine sich ausbreitende transiente elektrische oder elektromagnetische Übertragung) ausschließt, aber nicht-transitorische Datenspeicherschaltungen (z.B. Puffer, Cache und Warteschlangen) innerhalb der Transceiver von transitorischen Signalen enthält. In mindestens einer Ausführungsform ist der Code (z.B. ausführbarer Code oder Quellcode) auf einem Satz von einem oder mehreren nicht-transitorischen computerlesbaren Speichermedien gespeichert, auf denen ausführbare Anweisungen (oder ein anderer Speicher zum Speichern von ausführbaren Anweisungen) gespeichert sind, die, wenn sie von einem oder mehreren Prozessoren eines Computersystems ausgeführt werden (d.h. als Ergebnis der Ausführung), das Computersystem veranlassen, hierin beschriebene Operationen durchzuführen. In mindestens einer Ausführungsform umfasst der Satz nicht-transitorischer computerlesbarer Speichermedien mehrere nicht-transitorische computerlesbare Speichermedien, und einem oder mehreren der einzelnen nicht-transitorischen Speichermedien der mehreren nicht-transitorischen computerlesbaren Speichermedien fehlt der gesamte Code, während die mehreren nicht-transitorischen computerlesbaren Speichermedien gemeinsam den gesamten Code speichern. In mindestens einer Ausführungsform werden ausführbare Befehle so ausgeführt, dass verschiedene Befehle von verschiedenen Prozessoren ausgeführt werden - zum Beispiel speichert ein nicht-transitorisches computerlesbares Speichermedium Befehle und führt eine zentrale Verarbeitungseinheit („CPU“) einige der Befehle aus, während eine Grafikverarbeitungseinheit („GPU“) andere Befehle ausführt. In mindestens einer Ausführungsform haben verschiedene Komponenten eines Computersystems separate Prozessoren und verschiedene Prozessoren führen verschiedene Teilmengen von Anweisungen aus.
  • Demgemäß sind in mindestens einer Ausführungsform Computersysteme dazu konfiguriert, einen oder mehrere Dienste zu implementieren, die einzeln oder gemeinsam Operationen der hierin beschriebenen Prozesse durchführen, und sind solche Computersysteme mit anwendbarer Hardware und/oder Software konfiguriert, die die Durchführung der Operationen ermöglichen. Ferner ist ein Computersystem, das mindestens eine Ausführungsform der Erfindung implementiert, eine einzelne Vorrichtung und in einer anderen Ausführungsform ein verteiltes Computersystem, das mehrere Vorrichtungen umfasst, die unterschiedlich arbeiten, so dass das verteilte Computersystem die hierin beschriebenen Operationen durchführt und eine einzelne Vorrichtung nicht alle Operationen durchführt.
  • Die Verwendung von Beispielen oder beispielhaften Ausdrücken (z.B. „wie beispielsweise“) dient lediglich der besseren Veranschaulichung von Ausführungsformen der Offenbarung und stellt keine 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 Verfahren umfassen kann und Verfahren als System betrachtet werden können.
  • In mindestens einer Ausführungsform ist eine Arithmetik-Logik-Einheit ein Satz von kombinatorischen Logikschaltungen, die einen oder mehrere Eingänge verarbeiten, um ein Ergebnis zu erzeugen. In mindestens einer Ausführungsform wird eine Arithmetik-Logik-Einheit von einem Prozessor verwendet, um mathematische Operationen wie Addition, Subtraktion oder Multiplikation durchzuführen. In mindestens einer Ausführungsform wird eine Arithmetik-Logik-Einheit verwendet, um logische Operationen wie logisches UND/ODER oder XOR zu implementieren. In mindestens einer Ausführungsform ist eine Arithmetik-Logik-Einheit zustandslos und besteht aus physikalischen Schaltkomponenten wie Halbleitertransistoren, die zur Bildung logischer Gatter angeordnet sind. In mindestens einer Ausführungsform kann eine Arithmetik-Logik-Einheit intern als zustandsabhängige Logikschaltung mit einem zugehörigen Taktgeber arbeiten. In mindestens einer Ausführungsform kann eine Arithmetik-Logik-Einheit als asynchrone Logikschaltung aufgebaut sein, deren interner Zustand nicht in einem zugehörigen Registersatz gehalten wird. In mindestens einer Ausführungsform wird eine Arithmetik-Logik-Einheit von einem Prozessor verwendet, um in einem oder mehreren Registern des Prozessors gespeicherte Operanden zu kombinieren und eine Ausgabe zu erzeugen, die vom Prozessor in einem anderen Register oder einem Speicherplatz gespeichert werden kann.
  • In mindestens einer Ausführungsform gibt der Prozessor als Ergebnis der Verarbeitung eines vom Prozessor abgerufenen Befehls einen oder mehrere Eingänge oder Operanden an eine Arithmetik-Logik-Einheit weiter, wodurch die Arithmetik-Logik-Einheit veranlasst wird, ein Ergebnis zu erzeugen, das zumindest teilweise auf einem Befehlscode basiert, der den Eingängen der arithmetischen Logikeinheit bereitgestellt wird. In mindestens einer Ausführungsform basieren die vom Prozessor an die ALU gelieferten Befehlscodes zumindest teilweise auf dem vom Prozessor ausgeführten Befehl. In mindestens einer Ausführungsform verarbeitet die kombinatorische Logik in der ALU die Eingänge und erzeugt einen Ausgang, der auf einen Bus innerhalb des Prozessors gelegt wird. In mindestens einer Ausführungsform wählt der Prozessor ein Zielregister, einen Speicherplatz, ein Ausgabegerät oder einen Ausgabespeicherplatz auf dem Ausgangsbus aus, so dass das Takten des Prozessors bewirkt, dass die von der ALU erzeugten Ergebnisse an den gewünschten Ort gesendet werden.
  • Im vorliegenden Dokument kann auf das Beschaffen, Erfassen, Empfangen oder Eingeben von analogen oder digitalen Daten in ein Teilsystem, ein Computersystem oder eine computerimplementierte Maschine Bezug genommen werden. Der Prozess des Erhaltens, Erfassens, Empfangens oder Eingebens analoger und digitaler Daten kann auf verschiedene Weise erfolgen, z.B. durch Empfangen von Daten als Parameter eines Funktionsaufrufs oder eines Aufrufs an eine Anwendungsprogrammierschnittstelle. In einigen Implementierungen kann der Prozess des Erhaltens, Erfassens, Empfangens oder Eingebens von analogen oder digitalen Daten durch die Übertragung von Daten über eine serielle oder parallele Schnittstelle durchgeführt werden. In einer anderen Implementierung kann der Prozess des Erhaltens, Erfassens, Empfangens oder Eingebens analoger oder digitaler Daten durch die Übertragung von Daten über ein Computernetzwerk von der bereitstellenden Einheit zur erfassenden Einheit durchgeführt werden. Es kann auch auf das Bereitstellen, Ausgeben, Übertragen, Senden oder Präsentieren analoger oder digitaler Daten Bezug genommen werden. In verschiedenen Beispielen kann das Bereitstellen, Ausgeben, Übertragen, Senden oder Darstellen analoger oder digitaler Daten durch die Übertragung von Daten als Eingabe- oder Ausgabeparameter eines Funktionsaufrufs, eines Parameters einer Anwendungsprogrammierschnittstelle oder eines Interprozess-Kommunikationsmechanismus erfolgen.
  • Obwohl die obige Diskussion Beispielimplementierungen der beschriebenen Techniken darlegt, können auch andere Architekturen verwendet werden, um die beschriebene Funktionalität zu implementieren, und sie sollen in den Anwendungsbereich dieser Offenlegung fallen. Darüber hinaus können verschiedene Funktionen und Verantwortlichkeiten je nach den Umständen auf unterschiedliche Weise verteilt und aufgeteilt werden, auch wenn oben zu Diskussionszwecken eine bestimmte Verteilung der Verantwortlichkeiten definiert wurde.
  • Auch wenn der Gegenstand in einer Sprache beschrieben wurde, die sich auf strukturelle Merkmale und/oder methodische Handlungen bezieht, versteht sich ferner, dass der in den beigefügten Ansprüchen beanspruchte Gegenstand nicht notwendigerweise auf die beschriebenen spezifischen Merkmale oder Handlungen beschränkt ist. Vielmehr werden die spezifischen Merkmale und Handlungen als beispielhafte Formen der Umsetzung der Ansprüche offenbart.
  • Claims (35)

    1. Prozessor, umfassend: eine oder mehrere Schaltungen zum Ausführen einer oder mehrerer Versionen von einer Vielzahl von Versionen von Programmcode, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    2. Prozessor nach Anspruch 1, wobei zumindest eine der einen oder mehreren Versionen ein Software-Kernel ist.
    3. Prozessor nach Anspruch 1 oder 2, wobei die eine oder die mehreren Schaltungen angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf Einträgen in einer aktuellen Tabelle.
    4. Prozessor nach einem der vorhergehenden Ansprüche, wobei die eine oder die mehreren Schaltungen angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Referenzzählung von Speicherplätzen.
    5. Prozessor nach einem der vorhergehenden Ansprüche, wobei zumindest eine der Vielzahl von Versionen eine optimierte Version des Programmcodes ist.
    6. Prozessor nach einem der vorhergehenden Ansprüche, wobei zumindest eine der Vielzahl von Versionen eine Version des Programmcodes ist, die auf eine oder mehrere Prozessorarchitekturen ausgerichtet ist.
    7. Prozessor nach einem der vorhergehenden Ansprüche, wobei die eine oder die mehreren Versionen unter Verwendung einer Grafikverarbeitungseinheit, GPU, durchzuführen sind.
    8. Prozessor nach einem der vorhergehenden Ansprüche, wobei die Vielzahl von Versionen von Programmcode basierend zumindest teilweise auf einer oder mehrerer Direktiven in dem Programmcode erzeugt werden.
    9. Prozessor nach einem der vorhergehenden Ansprüche, wobei die eine oder die mehreren Schaltungen angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Speichertabelle auf einer ersten Vorrichtung, die eine oder mehrere Kennungen von einem oder mehreren Speicherbereichen auf einer zweiten Vorrichtung enthält.
    10. Computerimplementiertes Verfahren, umfassend: Durchführen einer oder mehrerer Versionen von einer Vielzahl von Versionen von Programmcode, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    11. Computerimplementiertes Verfahren nach Anspruch 10, ferner umfassend: Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einem oder mehreren Einträgen einer Speichertabelle.
    12. Computerimplementiertes Verfahren nach Anspruch 10 oder 11, ferner umfassend: Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Anzahl von Speicherplätzen.
    13. Computerimplementiertes Verfahren nach einem der Ansprüche 10 bis 12, wobei zumindest eine der Vielzahl von Versionen eine parallelisierte Version des Programmcodes ist.
    14. Computerimplementiertes Verfahren nach einem der Ansprüche 10 bis 13, wobei zumindest eine der Vielzahl von Versionen eine sequenzielle Version des Programmcodes ist.
    15. Computerimplementiertes Verfahren nach einem der Ansprüche 10 bis 14, wobei die eine oder die mehreren Versionen unter Verwendung eines Grafikbeschleunigers durchzuführen sind.
    16. Computerimplementiertes Verfahren nach einem der Ansprüche 10 bis 15, ferner umfassend: Erzeugen der einen oder mehreren Versionen von Programmcode, basierend zumindest teilweise auf einer oder mehreren Compiler-Direktiven, die dem Programmcode hinzugefügt sind.
    17. Computerimplementiertes Verfahren nach einem der Ansprüche 10 bis 16, ferner umfassend: Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Speichertabelle auf einer ersten Vorrichtung, die eine oder mehrere Kennungen von einem oder mehreren Speicherbereichen auf einer zweiten Vorrichtung enthält.
    18. Computerimplementiertes Verfahren nach einem der Ansprüche 10 bis 17, ferner umfassend: Auswählen der einen oder der mehreren Versionen der Vielzahl von Versionen von auszuführendem Programmcode, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf die überlappenden Speicherplätze zugreifen sollen.
    19. Computersystem, umfassend: einen oder mehrere Prozessoren und Speicher, der ausführbare Anweisungen speichert, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    20. Computersystem nach Anspruch 19, wobei zumindest eine der einen oder mehreren Versionen ein Kernel einer Grafikverarbeitungseinheit, GPU, ist.
    21. Computersystem nach Anspruch 19 oder 20, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Erkennen, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einem Nachschlagen in einer Speichertabelle.
    22. Computersystem nach einem der Ansprüche 19 bis 21, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Anzahl und einer Speicheradresse, die aus einer Speicher-Nachschlagetabelle abgerufen wird.
    23. Computersystem nach einem der Ansprüche 19 bis 22, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Erkennen, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf aktuellen Daten, die aus einer ausgeglichenen Baumstruktur erhalten wurden werden.
    24. Computersystem nach einem der Ansprüche 19 bis 23, wobei zumindest eine der Vielzahl von Versionen eine nicht optimierte Version des Programmcodes ist.
    25. Computersystem nach einem der Ansprüche 19 bis 24, wobei zumindest eine der Vielzahl von Versionen eine optimierte Version des Programmcodes ist.
    26. Computersystem nach einem der Ansprüche 19 bis 25, wobei die eine oder die mehreren Versionen unter Verwendung einer Grafikverarbeitungseinheit, GPU, auszuführen sind.
    27. Computersystem nach einem der Ansprüche 19 bis 26, wobei der eine oder die mehreren Prozessoren angeordnet sind zum Erkennen, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer oder mehreren Kennungen eines oder mehrerer Speicherbereiche einer GPU.
    28. Maschinenlesbares Medium, auf dem ein Satz von Anweisungen gespeichert ist, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, eine oder mehrere Versionen einer Vielzahl von Versionen von Programmcode durchführen, basierend zumindest teilweise darauf, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen.
    29. Maschinenlesbares Medium nach Anspruch 28, wobei zumindest eine der einen oder mehreren Versionen unter Verwendung eines Grafikbeschleunigers auszuführen ist.
    30. Maschinenlesbares Medium nach Anspruch 28 oder 29, wobei der Satz von Anweisungen Anweisungen enthält, die angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Tabelle.
    31. Maschinenlesbares Medium nach einem der Ansprüche 28 bis 30, wobei der Satz von Anweisungen Anweisungen enthält, die angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer aktuellen Anzahl und einer Speicheradresse.
    32. Maschinenlesbares Medium nach einem der Ansprüche 28 bis 31, wobei zumindest eine der Vielzahl von Versionen durch eine Vielzahl von Threads durchzuführen ist.
    33. Maschinenlesbares Medium nach einem der Ansprüche 28 bis 32, wobei die Vielzahl von Versionen von Programmcode basierend zumindest teilweise auf einer oder mehrerer Prozessor-Direktiven in dem Programmcode erzeugt wird.
    34. Maschinenlesbares Medium nach einem der Ansprüche 28 bis 33, wobei: Die eine oder die mehreren Anweisungen Anweisungen enthalten, die angeordnet sind zum Identifizieren, welche der Vielzahl von Versionen von Programmcode auf überlappende Speicherplätze zugreifen sollen, basierend zumindest teilweise auf einer Speichertabelle, die auf einem ersten Prozessor des einen oder der mehreren Prozessoren gespeichert ist; und die Speichertabelle eine oder mehrere Kennungen von einem oder mehreren Speicherbereichen eines zweiten Prozessors des einen oder der mehreren Prozessoren enthält.
    35. Maschinenlesbares Medium nach einem der Ansprüche 28 bis 34, wobei die eine oder die mehreren Versionen der Vielzahl von Versionen von Programmcode, der durchzuführen ist, basierend zumindest teilweise darauf ausgewählt werden, welche der Vielzahl von Versionen von Programmcode auf die überlappenden Speicherbereiche zugreifen sollen.
    DE102023114219.4A 2022-06-09 2023-05-31 Programmcode-Versionen Pending DE102023114219A1 (de)

    Applications Claiming Priority (2)

    Application Number Priority Date Filing Date Title
    US17/836,810 US20240095024A1 (en) 2022-06-09 2022-06-09 Program code versions
    US17/836,810 2022-06-09

    Publications (1)

    Publication Number Publication Date
    DE102023114219A1 true DE102023114219A1 (de) 2023-12-14

    Family

    ID=88874081

    Family Applications (1)

    Application Number Title Priority Date Filing Date
    DE102023114219.4A Pending DE102023114219A1 (de) 2022-06-09 2023-05-31 Programmcode-Versionen

    Country Status (3)

    Country Link
    US (1) US20240095024A1 (de)
    CN (1) CN117215630A (de)
    DE (1) DE102023114219A1 (de)

    Family Cites Families (7)

    * Cited by examiner, † Cited by third party
    Publication number Priority date Publication date Assignee Title
    US5146571A (en) * 1988-03-28 1992-09-08 Emc Corporation Remapping defects in a storage system through the use of a tree structure
    US8370823B2 (en) * 2007-08-27 2013-02-05 International Business Machines Corporation Device, system, and method of computer program optimization
    US9250877B2 (en) * 2013-09-20 2016-02-02 Cray Inc. Assisting parallelization of a computer program
    US9710245B2 (en) * 2014-04-04 2017-07-18 Qualcomm Incorporated Memory reference metadata for compiler optimization
    EP3491521A4 (de) * 2016-07-27 2020-04-01 Intel Corporation Vorrichtung und verfahren zur unterstützung der codeoptimierung
    US20190286327A1 (en) * 2018-03-15 2019-09-19 Apple Inc. Memory Objects
    US10956318B2 (en) * 2018-06-19 2021-03-23 Macronix International Co., Ltd. Overlapping ranges of pages in memory systems

    Also Published As

    Publication number Publication date
    US20240095024A1 (en) 2024-03-21
    CN117215630A (zh) 2023-12-12

    Similar Documents

    Publication Publication Date Title
    DE102021102589A1 (de) Berechnungsgraph-optimierung
    DE102021103492A1 (de) Anwendungsprogrammierschnittstelle zum beschleunigen von matrixoperationen
    DE102021104561A1 (de) Asynchrone datenbewegungspipeline
    DE112021005433T5 (de) Verfahren zur leistungsbalancierung mehrerer chips
    DE112022001140T5 (de) Durchführung einer matrixwertangabe
    DE112022003222T5 (de) Multi-architektur-ausführungsgraphen
    DE102021106797A1 (de) Techniken zur orchestrierung von phasen der thread-synchronisation
    DE112022002140T5 (de) Licht-Resampling mit Strahlenverfolgung und Sichtbarkeit im Bildschirmraum
    DE102023101893A1 (de) Graphenbasierter speicher
    DE102022132008A1 (de) Asynchrone speicherdeallokation
    DE102022131530A1 (de) Verfahren zum modifizieren von graphencode
    DE102022132013A1 (de) Anwendungsprogrammierschnittstellen für interoperabilität
    DE102022131708A1 (de) Anwendungsprogrammierschnittstelle zum begrenzen von speicher
    DE112022001917T5 (de) Synchronisieren einer graphausführung
    DE102022124362A1 (de) Benutzerkonfigurierbare speicherzuweisung
    DE112022002953T5 (de) Parallele verarbeitung von thread-gruppen
    DE112022000425T5 (de) Gleichzeitiges einführen von code
    DE102022114509A1 (de) Speicherzuweisung unter verwendung von graphen
    DE102022107673A1 (de) Räumlich-zeitliches resampling mit entkoppeltem shading und wiederverwendung
    DE112022002258T5 (de) Tensormodifikation basierend auf der verarbeitung von ressourcen
    DE102022104253A1 (de) Tonwertverwaltung unter Verwendung von Tonwertverstärkungsfunktionen für Bildgebungsanwendungen mit hohem Dynamikbereich
    DE112021007132T5 (de) Berechnung der bewegung von pixeln zwischen bildern
    DE102023114219A1 (de) Programmcode-Versionen
    DE112022000413T5 (de) Anwendungsprogrammierschnittstelle zur identifizierung von funktionsversionen
    DE102022131710A1 (de) Asynchrone speicherzuweisung

    Legal Events

    Date Code Title Description
    R012 Request for examination validly filed