DE112023000204T5 - Anwendungsprogrammierschnittstelle zur Angabe der Ausführung von Graph-Knoten - Google Patents

Anwendungsprogrammierschnittstelle zur Angabe der Ausführung von Graph-Knoten Download PDF

Info

Publication number
DE112023000204T5
DE112023000204T5 DE112023000204.5T DE112023000204T DE112023000204T5 DE 112023000204 T5 DE112023000204 T5 DE 112023000204T5 DE 112023000204 T DE112023000204 T DE 112023000204T DE 112023000204 T5 DE112023000204 T5 DE 112023000204T5
Authority
DE
Germany
Prior art keywords
graph
node
execution
processor
api
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
DE112023000204.5T
Other languages
English (en)
Inventor
Stephen Anthony Bernard Jones
Jason David Gaiser
David Anthony Fontaine
Tessa Stevenson Sally
Steven Arthur Gurfinkel
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nvidia Corp
Original Assignee
Nvidia Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US17/572,385 external-priority patent/US20230222019A1/en
Priority claimed from US17/572,391 external-priority patent/US20230222010A1/en
Application filed by Nvidia Corp filed Critical Nvidia Corp
Publication of DE112023000204T5 publication Critical patent/DE112023000204T5/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

Vorrichtungen, Systeme und Verfahren, um eine Steuerung von Ausführungsgraphen zu ermöglichen, werden offenbart. Bei mindestens einer Ausführungsform wird eine Anwendungsprogrammierschnittstelle verwendet, die einen oder mehrere Parameter umfasst, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.

Description

  • QUERVERWEIS AUF VERWANDTE ANWENDUNGEN
  • ANSPRUCH AUF PRIORITÄT
  • Diese Anmeldung beruft sich auf die US-Patentanmeldung 17/572,391 , eingereicht am 10. Januar 2022, mit dem Titel „APPLICATION PROGRAMMING INTERFACE TO INDICATE EXECUTION OF GRAPH NODES“ und auf die US-Patentanmeldung Nr. 17/572,385 , eingereicht am 10. Januar 2022, mit dem Titel „APPLICATION PROGRAMMING INTERFACE TO INDICATE EXECUTION OF GRAPH NODES“, die hiermit in vollem Umfang und für alle Zwecke in das vorliegende Dokument aufgenommen werden.
  • GEBIET
  • Mindestens eine Ausführungsform bezieht sich auf Verarbeitungsressourcen, die zur Ausführung eines oder mehrerer CUDA-Programme verwendet werden. Zum Beispiel bezieht sich mindestens eine Ausführungsform auf Prozessoren oder Rechensysteme, die zur Ausführung eines oder mehrerer CUDA-Programme verwendet werden, die unter Verwendung von Ausführungsgraphen und einer dynamischen Steuerung und/oder Angabe einer Ausführung von Knoten des Ausführungsgraphen instanziiert werden.
  • HINTERGRUND
  • Die Durchführung von Rechenoperationen kann erhebliche Speicher-, Zeit- oder Rechenressourcen beanspruchen. Der Umfang an Speicher, Zeit oder Rechenressourcen, der für die Durchführung der Rechenoperationen verwendet wird, kann durch die Verwendung eines instanziierten Ausführungsgraphen verbessert werden, um eine GPU so zu konfigurieren, dass Rechenoperationen effizient und/oder parallel durchgeführt werden.
  • KURZE BESCHREIBUNG DER ZEICHNUNGEN
    • 1 veranschaulicht ein beispielhaftes Computersystem zur Definition und Instanziierung eines Ausführungsgraphen gemäß mindestens einer Ausführungsform;
    • 2 veranschaulicht ein beispielhaftes Ausführungsgraph-Template gemäß mindestens einer Ausführungsform;
    • 3 veranschaulicht eine beispielhafte Stromdarstellung eines instanziierten Ausführungsgraphen gemäß mindestens einer Ausführungsform;
    • 4 veranschaulicht beispielhafte Startsequenzen eines instanziierten Ausführungsgraphen gemäß mindestens einer Ausführungsform;
    • 5 veranschaulicht beispielhafte wiederholte Startsequenzen eines instanziierten Ausführungsgraphen gemäß mindestens einer Ausführungsform;
    • 6 veranschaulicht ein beispielhaftes Verfahren zum Erstellen und Starten eines Ausführungsgraphen gemäß mindestens einer Ausführungsform;
    • 7 veranschaulicht ein beispielhaftes Ausführungsgraph-Template gemäß mindestens einer Ausführungsform;
    • 8 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Ausführungsgraphen, bei dem Graph-Knoten deaktiviert sind;
    • 9 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Ausführungsgraphen, bei dem Graph-Knoten aktiviert und deaktiviert sind;
    • 10 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Ausführungsgraphen, bei dem Graph-Knoten einzeln aktiviert sind;
    • 11 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Ausführungsgraphen, bei dem Graph-Knoten einzeln deaktiviert sind;
    • 12 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Ausführungsgraphen, bei dem alle Graph-Knoten deaktiviert sind;
    • 13 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Verfahren zum Deaktivieren von Graph-Knoten eines Ausführungsgraphen;
    • 14 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Verfahren zum Aktivieren von Graph-Knoten eines Ausführungsgraphen;
    • 15 veranschaulicht gemäß mindestens einer Ausführungsform eine beispielhafte Umgebung, in der deaktivierte Graph-Knoten eines Ausführungsgraphen aktualisiert werden;
    • 16 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Verfahren zum Aktualisieren deaktivierter Graph-Knoten eines Ausführungsgraphen;
    • 17 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Softwarestack, in dem Aufrufe einer Anwendungsverarbeitungsschnittstelle verarbeitet werden;
    • 18 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Rechenzentrum;
    • 19 veranschaulicht gemäß mindestens einer Ausführungsform ein Verarbeitungssystem;
    • 20 veranschaulicht gemäß mindestens einer Ausführungsform ein Computersystem;
    • 21 veranschaulicht gemäß mindestens einer Ausführungsform ein System;
    • 22 veranschaulicht gemäß mindestens einer Ausführungsform eine beispielhafte integrierte Schaltung;
    • 23 veranschaulicht gemäß mindestens einer Ausführungsform ein Computersystem;
    • 24 veranschaulicht gemäß mindestens einer Ausführungsform eine APU;
    • 25 veranschaulicht gemäß mindestens einer Ausführungsform eine CPU;
    • 26 veranschaulicht gemäß mindestens einer Ausführungsform ein beispielhaftes Beschleunigerintegrations-Slice;
    • 27A-27B veranschaulichen gemäß mindestens einer Ausführungsform beispielhafte Grafikprozessoren;
    • 28A veranschaulicht gemäß mindestens einer Ausführungsform einen Grafikkern;
    • 28B veranschaulicht gemäß mindestens einer Ausführungsform eine GPGPU;
    • 29A veranschaulicht gemäß mindestens einer Ausführungsform einen Parallelprozessor;
    • 29B veranschaulicht gemäß mindestens einer Ausführungsform einen Verarbeitungscluster;
    • 29C veranschaulicht gemäß mindestens einer Ausführungsform einen Grafik-Multiprozessor;
    • 30 veranschaulicht gemäß mindestens einer Ausführungsform einen Grafikprozessor;
    • 31 veranschaulicht gemäß mindestens einer Ausführungsform einen Prozessor;
    • 32 veranschaulicht gemäß mindestens einer Ausführungsform einen Prozessor;
    • 33 veranschaulicht gemäß mindestens einer Ausführungsform einen Graf ikprozessorkern;
    • 34 veranschaulicht gemäß mindestens einer Ausführungsform eine PPU;
    • 35 veranschaulicht gemäß mindestens einer Ausführungsform einen GPC;
    • 36 veranschaulicht gemäß mindestens einer Ausführungsform einen Streaming-Multiprozessor;
    • 37 veranschaulicht gemäß mindestens einer Ausführungsform einen Software-Stack einer Programmierplattform;
    • 38 veranschaulicht gemäß mindestens einer Ausführungsform eine CUDA-Implementierung eines Software-Stacks aus 37;
    • 39 veranschaulicht gemäß mindestens einer Ausführungsform eine ROCm-Implementierung eines Software-Stacks aus 37;
    • 40 veranschaulicht gemäß mindestens einer Ausführungsform eine OpenCL-Implementierung eines Software-Stacks aus 37;
    • 41 veranschaulicht gemäß mindestens einer Ausführungsform Software, die von einer Programmierplattform unterstützt wird;
    • 42 veranschaulicht gemäß mindestens einer Ausführungsform die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 37-40;
    • 43 veranschaulicht gemäß mindestens einer Ausführungsform ausführlicher die Kompilierung von Code zur Ausführung auf den Programmierplattformen der 37-40;
    • 44 veranschaulicht gemäß mindestens einer Ausführungsform die Übersetzung von Quellcode vor der Kompilierung des Quellcodes;
    • 45A veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um CUDA-Quellcode unter Verwendung verschiedener Typen von Verarbeitungseinheiten zu kompilieren und auszuführen;
    • 45B veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um den CUDA-Quellcode von 45A unter Verwendung einer CPU und eines CUDA-fähigen Grafikprozessors zu kompilieren und auszuführen;
    • 45C veranschaulicht gemäß mindestens einer Ausführungsform ein System, das ausgestaltet ist, um den CUDA-Quellcode von 45A unter Verwendung einer CPU und einer nicht CUDA-fähigen GPU zu kompilieren und auszuführen;
    • 46 veranschaulicht gemäß mindestens einer Ausführungsform einen beispielhaften Kernel, der durch das CUDA-zu-HIP-Übersetzungswerkzeug von 45C übersetzt wurde;
    • 47 veranschaulicht gemäß mindestens einer Ausführungsform die nicht-CUDA-fähige GPU von 45C mit mehr Details;
    • 48 veranschaulicht gemäß mindestens einer Ausführungsform, wie Threads eines beispielhaften CUDA-Grids auf verschiedene Recheneinheiten von 47 abgebildet werden; und
    • 49 veranschaulicht gemäß mindestens einer Ausführungsform, wie bestehender CUDA-Code zu Data Parallel C++-Code zu migrieren ist.
  • DETAILLIERTE BESCHREIBUNG
  • 1 veranschaulicht ein beispielhaftes Computersystem 100 zur Definition und Instanziierung eines Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform weist ein Prozessor 102 einen Prozessorspeicher 104 auf. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Single-Core-Prozessor. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Multi-Core-Prozessor. Bei mindestens einer Ausführungsform ist ein oder sind mehrere zusätzliche Prozessoren, die nicht dargestellt sind, mit dem Prozessorspeicher 104 verbunden. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Verarbeitungssystems, wie des hier beschriebenen Verarbeitungssystems 1900. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Computersystems, wie des hier beschriebenen Computersystems 2000. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Systems, wie des hier beschriebenen Systems 2100. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Element eines Computersystems, wie des hier beschriebenen Computersystems 2300. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Element einer Recheneinheit, wie der hier beschriebenen Recheneinheit 4740. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Grafikprozessor, wie des hier beschriebenen Grafikprozessors 2710. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Grafikprozessor, wie der hier beschriebene Grafikprozessor 2740. Bei mindestens einer Ausführungsform ist der Prozessor 102 eine Allzweck-Grafikverarbeitungseinheit wie die hier beschriebene GPGPU 2830. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Grafik-Multiprozessor, wie der hier beschriebene Grafik-Multiprozessor 2934. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Grafikprozessor wie der hier beschriebene Grafikprozessor 3000. Bei mindestens einer Ausführungsform ist der Prozessor 102 ein Grafikprozessor wie der hier beschriebene Grafikprozessor 3208. Bei mindestens einer Ausführungsform ist der Prozessor 102 eine Parallelverarbeitungseinheit wie die hier beschriebene PPU 3400. Bei mindestens einer Ausführungsform ist der Prozessor 102 eine GPU, wie die hier beschriebene GPU 4792.
  • Bei mindestens einer Ausführungsform weist der Prozessor 102 Anweisungen auf, die bei ihrer Ausführung einen Ausführungsgraphen 106 definieren. Bei mindestens einer Ausführungsform werden die Anweisungen, die bei ihrer Ausführung den Ausführungsgraphen 106 definieren, aus dem Prozessorspeicher 104 geladen. Bei mindestens einer Ausführungsform werden die Anweisungen, die bei ihrer Ausführung den Ausführungsgraphen 106 definieren, von dem Computersystem 100 geladen. Bei mindestens einer Ausführungsform sind die Anweisungen für den Prozessor 102, die bei ihrer Ausführung den Ausführungsgraphen 106 definieren, in dem Prozessorspeicher 104 gespeichert. Bei mindestens einer Ausführungsform werden die Anweisungen, die bei ihrer Ausführung den Ausführungsgraphen 106 definieren, von einem Prozess, einem Prozessor, einem Thread, einer Thread-Gruppe oder einer anderen derartigen Einheit ausgeführt, wenn dieser Prozess, Prozessor, Thread, diese Thread-Gruppe oder die andere derartige Einheit Zugriff auf den Prozessorspeicher 104 hat. Bei mindestens einer Ausführungsform sind die Anweisungen für den Prozess, den Prozessor, den Thread, die Thread-Gruppe oder die andere derartige Einheit, die bei ihrer Ausführung den Ausführungsgraphen 106 definieren, in dem Prozessorspeicher 104 gespeichert. Bei mindestens einer Ausführungsform wird bei der Ausführung der Anweisungen, die den Ausführungsgraphen 106 definieren, ein Graph-Template 108 erstellt. Bei mindestens einer Ausführungsform ist das Graph-Template 108 eine Darstellung eines Ausführungsgraphen, wie z. B. ein Definieren eines Ausführungsgraphen 106, die eines oder mehreres aufweist von: einer Beschreibung der Knoten des Ausführungsgraphen, einer Beschreibung der Beziehungen oder Abhängigkeiten zwischen den Knoten des Ausführungsgraphen und Parametern für die Knoten des Ausführungsgraphen. Bei mindestens einer Ausführungsform ist das Graph-Template 108 in dem Prozessorspeicher 104 gespeichert. Bei mindestens einer Ausführungsform ist das Graph-Template 108 in einem anderen, dem Prozessor 102 zugeordneten Speicher gespeichert, der beispielsweise eine dem Prozessor 102 zugeordnete externe Speichereinrichtung aufweist.
  • Bei mindestens einer Ausführungsform weist der Prozessor 102 Anweisungen auf, die bei ihrer Ausführung den Ausführungsgraphen 110 instanziieren. Bei mindestens einer Ausführungsform sind die Anweisungen für den Prozessor 102, die, wenn sie ausgeführt werden, den Ausführungsgraphen instanziieren 110, in dem Prozessorspeicher 104 gespeichert. Bei mindestens einer Ausführungsform werden die Anweisungen, die bei ihrer Ausführung den Ausführungsgraphen instanziieren 110, von einem Prozess, einem Prozessor, einem Thread, einer Thread-Gruppe oder einer anderen derartigen Einheit ausgeführt, wenn dieser Prozess, Prozessor, Thread, diese Thread-Gruppe oder die andere derartige Einheit Zugriff auf den Prozessorspeicher 104 hat. Bei mindestens einer Ausführungsform sind die Anweisungen für den Prozess, den Prozessor, den Thread, die Thread-Gruppe oder die andere derartige Einheit, die bei ihrer Ausführung den Ausführungsgraphen instanziieren 110, in dem Prozessorspeicher 104 gespeichert. Bei mindestens einer Ausführungsform wird bei der Ausführung der Anweisungen, die den Ausführungsgraphen instanziieren 110, das Graph-Template 108 zur Instanziierung einer Graph-Instanz 116 verwendet. Bei mindestens einer Ausführungsform bewirken die Anweisungen, die bei ihrer Ausführung die Instanziierung der Graph-Instanz 116 bewirken, die Erstellung einer ausführbaren Instanz des Ausführungsgraphen, die auf dem Graph-Template 108 basiert. Bei mindestens einer Ausführungsform bewirken die Anweisungen, die bei ihrer Ausführung die Instanziierung der Graph-Instanz 116 bewirken, die Erzeugung einer ausführbaren Instanz des Ausführungsgraphen von einer Graph-Instanziierungs-API. Bei mindestens einer Ausführungsform bewirken die Anweisungen, die, wenn sie ausgeführt werden, die Instanziierung der Graph-Instanz 116 bewirken, die Erzeugung einer ausführbaren Instanz des Ausführungsgraphen von einem Ausführungsstrom.
  • Bei mindestens einer Ausführungsform wird bei der Ausführung der Anweisungen, die den Ausführungsgraphen instanziieren 110, eine Ausführungsgraph-Topologie 118 von dem Ausführungsgraph-Template 108 erzeugt. Bei mindestens einer Ausführungsform weist die Ausführungsgraph-Topologie 118 Forminformationen des Ausführungsgraph-Templates 108 auf, einschließlich, aber nicht beschränkt auf, Informationen über Typen von Knoten in dem Ausführungsgraph-Template 108, Informationen über Verbindungen zwischen Knoten in dem Ausführungsgraph-Template 108, Informationen über Knotenabhängigkeiten für den Ausführungsgraphen und/oder Informationen über Teilgraph-Knoten des Ausführungsgraph-Templates 108.
  • Bei mindestens einer Ausführungsform wird bei der Ausführung der Anweisungen, die den Ausführungsgraphen instanziieren 110, die Graph-Instanz 116 in dem Grafikprozessorspeicher 114 des Grafikprozessors 112 instanziiert. Bei mindestens einer Ausführungsform wird bei der Ausführung der Anweisungen, die den Ausführungsgraphen instanziieren 110, die Graph-Instanz 116 außerhalb des Grafikprozessorspeichers 114 des Grafikprozessors 112 instanziiert und dann in dem Grafikprozessorspeicher 114 gespeichert. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Single-Core-Prozessor. Bei mindestens einer Ausführungsform handelt es sich bei dem Grafikprozessor 112 um einen Multi-Core-Prozessor. Bei mindestens einer Ausführungsform sind ein oder mehrere zusätzliche Prozessoren, die nicht dargestellt sind, mit dem Grafikprozessorspeicher 114 verbunden. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Element eines Verarbeitungssystems, wie es hier beschrieben ist, nämlich des Verarbeitungssystems 1900. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Element eines Computersystems, wie des hier beschriebenen Computersystems 2000. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Element eines Systems wie des hier beschriebenen Systems 2100. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Element einer integrierten Schaltung wie der hier beschriebenen integrierten Schaltung 2200. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Element eines Computersystems, wie des hier beschriebenen Computersystems 2300. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Grafikprozessor wie der hier beschriebene Grafikprozessor 2710. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Grafikprozessor wie der hier beschriebene Grafikprozessor 2740. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Grafik-Multiprozessor, wie der hier beschriebene Grafik-Multiprozessor 2934. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 eine Allzweck-Grafikverarbeitungseinheit wie die hier beschriebene GPGPU 2830. Bei mindestens einer Ausführungsform handelt es sich bei dem Grafikprozessor 112 um einen Grafikprozessor wie den hier beschriebenen Grafikprozessor 3000. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 ein Grafikprozessor wie der hier beschriebene Grafikprozessor 3208. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 eine Parallelverarbeitungseinheit wie die hier beschriebene PPU 3400. Bei mindestens einer Ausführungsform ist der Grafikprozessor 112 eine GPU, wie die hier beschriebene GPU 4792.
  • Bei mindestens einer Ausführungsform umfasst ein Prozessor wie der Prozessor 102 eine oder mehrere Schaltungen zur Durchführung einer API, um zu steuern, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform umfasst der Prozessor wie der Prozessor 102 eine oder mehrere Schaltungen zur Durchführung der API, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform umfasst ein Grafikprozessor, z. B. der Grafikprozessor 112, eine oder mehrere Schaltungen zur Durchführung der API, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen sind. Bei mindestens einer Ausführungsform umfasst der Grafikprozessor wie der Grafikprozessor 112 eine oder mehrere Schaltungen zur Durchführung der API, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist.
  • Bei mindestens einer Ausführungsform implementiert ein Prozessor wie der Prozessor 102 ein computerimplementiertes Verfahren zur Durchführung der API, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform implementiert der Prozessor wie der Prozessor 102 das computerimplementierte Verfahren zur Durchführung der API, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform implementiert der Grafikprozessor, z. B. der Grafikprozessor 112, ein computerimplementiertes Verfahren zur Durchführung der API, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform implementiert der Grafikprozessor wie der Grafikprozessor 112 das computerimplementierte Verfahren zur Durchführung der API, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist.
  • Bei mindestens einer Ausführungsform verwendet ein Prozessor, wie z. B. der Prozessor 102, einen Speicher, wie z. B. den Prozessorspeicher 104, um ausführbare Anweisungen zu speichern, die als Ergebnis der Ausführung den Prozessor 102 veranlassen, die API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform verwendet der Prozessor, z. B. der Prozessor 102, einen Speicher, z. B. den Prozessorspeicher 104, um die ausführbaren Anweisungen zu speichern, die als Ergebnis der Ausführung den Prozessor 102 veranlassen, die API auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform verwendet ein Grafikprozessor, z. B. der Grafikprozessor 112, einen Speicher, z. B. den Grafikprozessorspeicher 114, um ausführbare Anweisungen zu speichern, die als Ergebnis der Ausführung den Grafikprozessor 112 veranlassen, die API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform verwendet der Grafikprozessor wie der Grafikprozessor 112 einen Speicher wie den Grafikprozessorspeicher 114, um die ausführbaren Anweisungen zu speichern, die als Ergebnis der Ausführung den Grafikprozessor 112 veranlassen, die API auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist.
  • Bei mindestens einer Ausführungsform ist auf einem maschinenlesbaren Medium (in 1 nicht dargestellt) ein Satz von Anweisungen gespeichert, die, wenn sie von einem Prozessor wie dem Prozessor 102 ausgeführt werden, den Prozessor 102 veranlassen, die API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform ist auf dem maschinenlesbaren Medium (in 1 nicht dargestellt) der Satz von Anweisungen gespeichert, die, wenn sie von dem Prozessor wie dem Prozessor 102 ausgeführt werden, den Prozessor 102 veranlassen, die API auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. In mindestens einer Ausführungsform ist auf dem maschinenlesbaren Medium (in 1 nicht dargestellt) der Satz von Anweisungen gespeichert, die, wenn sie von dem Grafikprozessor wie dem Grafikprozessor 112 ausgeführt werden, den Grafikprozessor 112 veranlassen, die API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform ist auf dem maschinenlesbaren Medium (in 1 nicht dargestellt) der Satz von Anweisungen gespeichert, die, wenn sie von dem Grafikprozessor wie dem Grafikprozessor 112 ausgeführt werden, den Grafikprozessor 112 veranlassen, die API auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist.
  • Bei mindestens einer Ausführungsform führt der Prozessor wie der Prozessor 102 die API aus, die einen oder mehrere Parameter umfasst, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform führt der Prozessor wie der Prozessor 102 die API aus, die einen oder mehrere Parameter umfasst, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform führt der Grafikprozessor wie der Grafikprozessor 112 die API aus, die einen oder mehrere Parameter umfasst, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform führt der Grafikprozessor wie der Grafikprozessor 112 die API aus, die einen oder mehrere Parameter umfasst, um anzugeben, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist.
  • 2 veranschaulicht ein beispielhaftes Ausführungsgraph-Template 200 gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform weist das Ausführungsgraph-Template 202 einen oder mehrere Knoten und eine oder mehrere Beziehungen zwischen diesem einen oder diesen mehreren Knoten auf. Bei mindestens einer Ausführungsform weist das Ausführungsgraph-Template 202 einen Knoten „A“ 204, einen Knoten „B“ 206, einen Knoten „C“ 210, einen Knoten „D“ 212, einen Knoten „E“ 214, einen Knoten „X“ 208 und einen Knoten „Y“ 216 auf. Bei mindestens einer Ausführungsform weist das Ausführungsgraph-Template 202 einen Startknoten 218 und einen Endknoten 220 auf. Bei mindestens einer Ausführungsform handelt es sich bei dem Ausführungsgraph-Template 202 um einen gerichteten azyklischen Graphen. Bei mindestens einer Ausführungsform ist das Ausführungsgraph-Template 202 eine Darstellung eines Ausführungsgraphen, das Knotentypen der Knoten in dem Ausführungsgraph-Template 202 angibt. Bei mindestens einer Ausführungsform ist das Ausführungsgraph-Template 202 eine Darstellung eines Ausführungsgraphen, das Verbindungen zwischen Knoten angibt, um eine Ausführungsreihenfolge und/oder Abhängigkeiten zwischen Operationen anzugeben, die durch die Knoten des Ausführungsgraph-Templates 202 dargestellt werden.
  • Bei mindestens einer Ausführungsform wird die Ausführungsreihenfolge des Ausführungsgraph-Templates 202 durch Kanten des Ausführungsgraph-Templates 202 angegeben. Bei mindestens einer Ausführungsform wird eine Abhängigkeit zwischen den Knoten des Ausführungsgraph-Templates 202 durch Kanten des Ausführungsgraph-Templates 202 angegeben. Bei mindestens einer Ausführungsform ist eine Kante zwischen z. B. dem Knoten „A“ 204 und dem Knoten „B“ 206 ein Hinweis darauf, dass der Knoten „B“ 206 nach Abschluss des Knotens „A“ 204 ausgeführt wird. Bei mindestens einer Ausführungsform ist eine Kante zwischen z. B. dem Knoten „A“ 204 und dem Knoten „B“ 206 ein Hinweis darauf, dass der Knoten „B“ 206 von dem Knoten „A“ 204 abhängt.
  • Bei mindestens einer Ausführungsform weist ein Knoten des Ausführungsgraph-Templates 202 eine einzige eingehende Kante (z. B. der Knoten „B“ 206) auf. Bei mindestens einer Ausführungsform ist ein Knoten eines Ausführungsgraph-Templates mit einer einzigen eingehenden Kante ein Knoten mit einer einzigen Abhängigkeit. Bei mindestens einer Ausführungsform ist beispielsweise der Knoten „B“ 206 nur von dem Knoten „A“ 204 abhängig. Bei mindestens einer Ausführungsform hat ein Knoten des Ausführungsgraph-Templates 202 eine Vielzahl von eingehenden Kanten (z. B. der Knoten „E“ 214). Bei mindestens einer Ausführungsform ist ein Knoten eines Ausführungsgraph-Templates mit einer Vielzahl von eingehenden Kanten ein Knoten mit einer Vielzahl von Abhängigkeiten. Bei mindestens einer Ausführungsform ist beispielsweise der Knoten „E“ 214 von dem Knoten „C“ 210 und von dem Knoten „D“ 212 abhängig. Bei mindestens einer Ausführungsform weist ein Knoten des Ausführungsgraph-Templates 202 keine eingehenden Kanten auf (z. B. der Startknoten 218). Bei mindestens einer Ausführungsform weist ein Knoten ohne eingehenden Kanten keine Abhängigkeiten auf. Bei mindestens einer Ausführungsform kann ein Knoten ohne Abhängigkeiten ein Startknoten oder Wurzelknoten des Ausführungsgraph-Templates 202 sein. Bei mindestens einer Ausführungsform kann ein Knoten ohne eingehende Kanten auch keine ausgehenden Kanten haben, so dass ein einzelner Knoten, der eine einzelne Operation darstellt, ein vollständiger Graph ist.
  • Bei mindestens einer Ausführungsform hat ein Knoten des Ausführungsgraph-Templates 202 eine einzige ausgehende Kante (zum Beispiel der Knoten „X“ 208). Bei mindestens einer Ausführungsform ist ein Knoten eines Ausführungsgraph-Templates mit einer einzigen ausgehenden Kante ein Knoten mit einem einzigen Abhängigen. Bei mindestens einer Ausführungsform weist z. B. der Knoten „X“ 208 mit dem Knoten „Y“ 216 einen einzigen Abhängigen auf. Bei mindestens einer Ausführungsform hat ein Knoten des Ausführungsgraph-Templates 202 mehrere ausgehende Kanten (z. B. der Knoten „B“ 206). Bei mindestens einer Ausführungsform ist ein Knoten eines Ausführungsgraph-Templates mit einer Vielzahl von ausgehenden Kanten ein Knoten mit einer Vielzahl von Abhängigen. Bei mindestens einer Ausführungsform hat zum Beispiel der Knoten „B“ 206 mit dem Knoten „C“ 210 einen ersten Abhängigen und mit dem Knoten „D“ 212 einen zweiten Abhängigen. Bei mindestens einer Ausführungsform hat ein Knoten des Ausführungsgraph-Templates 202 keine ausgehende Kante (z. B. der Endknoten 220). Bei mindestens einer Ausführungsform hat ein Knoten ohne ausgehende Kante keine Abhängigen. Bei mindestens einer Ausführungsform kann ein Knoten ohne Abhängigen ein Endknoten oder ein Blattknoten des Ausführungsgraph-Templates 202 sein. Bei mindestens einer Ausführungsform kann das Ausführungsgraph-Template 202 eine Vielzahl von Endknoten aufweisen.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Kindgraph-Knoten, also ein Knoten, der einen eingebetteten (oder Kind-) Graph darstellt. Bei mindestens einer Ausführungsform stellt ein Kindgraph-Knoten einen neuen Ausführungsgraph dar, der einen Kindgraph-Knoten ersetzen kann, wenn das Ausführungsgraph-Template 202 instanziiert wird, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform hat ein Kindgraph-Knoten null, eine oder eine Vielzahl von eingehenden Kanten und null, eine oder eine Vielzahl von ausgehenden Kanten. Bei mindestens einer Ausführungsform ist ein Kindgraph-Knoten mit z. B. einer einzigen eingehenden Kante von einem einzigen Knoten abhängig. Bei mindestens einer Ausführungsform ist beispielsweise, wenn der Knoten „B“ 206 ein Kindgraph-Knoten ist, der Knoten „B“ 206 ein Abhängiger von dem Knoten „A“ 204, und nachdem der Knoten „A“ 204 abgeschlossen ist, kann dann der Graph ausgeführt werden, den der Knoten „B“ 206 darstellt bzw. repräsentiert.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keine Kindgraph-Knoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Kindgraph-Knoten auf. Bei mindestens einer Ausführungsform wird ein Kindgraph-Knoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und einen Kindgraphen erhält. Bei mindestens einer Ausführungsform gibt die API, die den Kindgraph-Knoten zu dem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des Kindgraph-Knotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Kindgraph-Knoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Kindraph-Knoten hinzugefügt wird. Bei mindestens einer Ausführungsform speichert die API, die den Kindgraph-Knoten zu dem Ausführungsgraphen hinzufügt, beim Hinzufügen des Kindgraph-Knotens Topologieinformationen des Kindgraphen oder Teilgraphen, der durch den Kindgraph-Knoten dargestellt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Ereigniserfassungsknoten, also ein Knoten, der ein Ereignis erfasst. Bei mindestens einer Ausführungsform kann ein Knoten, der ein Ereignis erfasst, verwendet werden, um anderen Prozessen zu signalisieren, dass eine Operation abgeschlossen ist oder dass ein Stadium einer Ausführung eines Ausführungsgraphen erreicht wurde. Bei mindestens einer Ausführungsform kann ein Ereigniserfassungsknoten ein Ereignis erfassen, auf das ein oder mehrere externe Prozesse warten. Bei mindestens einer Ausführungsform kann ein erfasstes Ereignis verwendet werden, um andere Prozesse auf einer GPU und/oder einer CPU zu signalisieren. Bei mindestens einer Ausführungsform kann der Knoten „E“ 214 beispielsweise ein Ereigniserfassungsknoten sein, der einem externen Prozess signalisiert, dass die Operationen des Knotens „C“ 210 und des Knotens „D“ 212 abgeschlossen sind. Bei mindestens einer Ausführungsform kann ein Ereigniserfassungsknoten ein Ereignis erfassen, auf das ein externer Prozess wartet. Bei mindestens einer Ausführungsform kann ein Ereigniserfassungsknoten ein Ereignis erfassen, auf das eine Vielzahl von externen Prozessen wartet.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keine Ereigniserfassungsknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Ereigniserfassungsknoten auf. Bei mindestens einer Ausführungsform wird ein Ereigniserfassungsknoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und ein Ereignis erhält. Bei mindestens einer Ausführungsform gibt die API, die einen Ereigniserfassungsknoten zu dem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg einer Operation zum Hinzufügen des Ereigniserfassungsknotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Ereigniserfassungsknoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Ereigniserfassungsknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Ereigniswarteknoten, d.h. ein Knoten, der auf ein Ereignis wartet. Bei mindestens einer Ausführungsform kann ein Knoten, der auf ein Ereignis wartet, von einem Ausführungsgraphen verwendet werden, um die Ausführung anzuhalten, bis ein Ereignis erfasst wird. Bei mindestens einer Ausführungsform kann ein Ereigniswarteknoten auf ein Ereignis warten, das von einem externen Prozess erfasst wird. Bei mindestens einer Ausführungsform kann ein Ereigniswarteknoten auf ein Ereignis von anderen Prozessen auf einer GPU und/oder einer CPU warten. Bei mindestens einer Ausführungsform kann der Knoten „B“ 206 beispielsweise ein Ereigniswarteknoten sein, der auf ein Signal von einem externen Prozess wartet, bevor Operationen des Knotens „C“ 210 und des Knotens „D“ 212 beginnen können. Bei mindestens einer Ausführungsform kann etwas von einem Ereigniserfassungsknoten eines ersten Ausführungsgraphen von einem Ereigniswarteknoten eines zweiten Ausführungsgraphen empfangen werden. Bei mindestens einer Ausführungsform kann ein Ereigniswarteknoten ein singulärer Ereigniswarteknoten sein, der auf ein von einem externen Prozess erfasstes Ereignis wartet. Bei mindestens einer Ausführungsform kann ein Ereigniswarteknoten einer aus einer Vielzahl von Ereigniswarteknoten sein, die auf ein einzelnes, von einem externen Prozess erfasstes Ereignis warten.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keine Ereigniswarteknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Ereigniswarteknoten auf. Bei mindestens einer Ausführungsform wird ein Ereigniswarteknoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und ein Ereignis erhält. Bei mindestens einer Ausführungsform gibt die API, die einen Ereigniswarteknoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg einer Operation zum Hinzufügen des Ereigniswarteknotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Ereigniswarteknoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Ereigniswarteknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Semaphorsignalisierungsknoten, d. h. ein Knoten, der eine ähnliche Funktionalität wie ein Ereigniserfassungsknoten hat, aber ein Knoten ist, der den Ausführungsstatus unter Verwendung eines Semaphors signalisiert. Bei mindestens einer Ausführungsform sendet ein Semaphorsignalisierungsknoten ein Semaphorsignal an einen oder mehrere andere Prozesse, die für den Empfang des Semaphorsignals konfiguriert sind. Bei mindestens einer Ausführungsform kann ein Semaphorsignalisierungsknoten verwendet werden, um anderen Prozessen zu signalisieren, dass eine Operation abgeschlossen ist oder dass ein Ausführungsstadium eines Ausführungsgraphen erreicht wurde. Bei mindestens einer Ausführungsform kann der Knoten „E“ 214 beispielsweise ein Semaphorsignalisierungsknoten sein, der ein Semaphorsignal an externe Prozesse sendet, um anzugeben, dass die Operationen der Knoten „C“ 210 und „D“ 212 abgeschlossen sind. Bei mindestens einer Ausführungsform kann ein Semaphorsignalisierungsknoten einen Semaphor signalisieren, auf das ein externer Prozess wartet. Bei mindestens einer Ausführungsform kann ein Semaphorsignalisierungsknoten einen Semaphor signalisieren, auf das eine Vielzahl von externen Prozessen wartet.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Semaphorsignalisierungsknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Semaphorsignalisierungsknoten auf. Bei mindestens einer Ausführungsform wird ein Semaphorsignalisierungsknoten zu einem Ausführungsgraphen hinzugefügt, wobei eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und einen Satz von Semaphorsignalisieungsknotenparametern empfängt. Bei mindestens einer Ausführungsform gibt die API, die einen Semaphorsignalisierungsknoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder einen Misserfolg der Operation zum Hinzufügen des Semaphorsignalisierungsknotens zu einem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die einen Semaphorsignalisierungsknoten zu einem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Semaphorsignalisierungsknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Semaphorwarteknoten, d.h. ein Knoten, der eine ähnliche Funktionalität wie ein Ereigniswarteknoten hat, aber ein Knoten ist, der auf einen Semaphor wartet. Bei mindestens einer Ausführungsform kann ein Knoten, der auf einen Semaphor wartet, von einem Ausführungsgraphen verwendet werden, um die Ausführung anzuhalten, bis der Semaphor signalisiert wird. Bei mindestens einer Ausführungsform kann ein Semaphorwarteknoten auf einen Semaphor warten, der von einem externen Prozess aufgezeichnet wurde. Bei mindestens einer Ausführungsform kann ein Semaphorwarteknoten auf einen Semaphor von anderen Prozessen auf einer GPU und/oder auf einer CPU warten. Bei mindestens einer Ausführungsform kann der Knoten „B“ 206 beispielsweise ein Semaphorwarteknoten sein, der auf einen Semaphor von einem externen Prozess wartet, bevor die Operationen des Knotens „C“ 210 und des Knotens „D“ 212 beginnen können. Bei mindestens einer Ausführungsform kann etwas von einem Semaphorsignalisierungsknoten eines ersten Ausführungsgraphen von einem Semaphorwarteknoten eines zweiten Ausführungsgraphen empfangen werden. Bei mindestens einer Ausführungsform kann ein Semaphorwarteknoten ein singulärer Semaphorwarteknoten sein, der auf einen von einem externen Prozess signalisierten Semaphor wartet. Bei mindestens einer Ausführungsform kann ein Semaphorwarteknoten einer aus einer Vielzahl von Semaphorwarteknoten sein, die auf einen einzelnen Semaphor warten, der von einem externen Prozess signalisiert wird.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Semaphorwarteknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Semaphorwarteknoten auf. Bei mindestens einer Ausführungsform wird ein Semaphorwarteknoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und einen Satz von Semaphorsignalisierungsknotenparametern empfängt. Bei mindestens einer Ausführungsform gibt die API, die einen Semaphorwarteknoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des Semaphorwarteknotens zu dem Ausführungsgraphen anzeigt. Bei mindestens einer Ausführungsform speichert die API, die einen Semaphorwarteknoten zu einem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Semaphorwarteknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Host-Knoten, d. h. ein Knoten, der eine oder mehrere Operationen auf einer Host-CPU ausführt. Bei mindestens einer Ausführungsform führt ein Host-Knoten eine Funktion auf einer Host-CPU aus, indem die Funktion zu einem Ausführungsstrom hinzugefügt wird, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform führt der Host-Knoten eine Funktion aus, nachdem die derzeit in der Warteschlange stehenden Operationen des Datenstroms abgeschlossen sind. Bei mindestens einer Ausführungsform blockiert ein Host-Knoten nachfolgende Strom-Operationen, bis eine Funktion, die dem Host-Knoten zugeordnet ist, abgeschlossen ist. Bei mindestens einer Ausführungsform kann der Knoten „D“ 212 beispielsweise ein Host-Knoten sein, der eine Funktion auf einer Host-CPU ausführt, indem die Funktion zu einem Ausführungsstrom hinzugefügt wird.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Host-Knoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Host-Knoten auf. Bei mindestens einer Ausführungsform wird ein Host-Knoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knotenabhängigen, eine Anzahl der Knotenabhängigen und einen Satz von Host-Knotenparametern empfängt. Bei mindestens einer Ausführungsform gibt die API, die einen Host-Knoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg einer Operation zum Hinzufügen des Host-Knotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die einen Host-Knoten zu einem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Host-Knoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Kernel-Knoten, d. h. ein Knoten, der eine oder mehrere Operationen auf einer GPU ausführt. Bei mindestens einer Ausführungsform ruft ein Kernel-Knoten eine Kernel-Funktion auf einer GPU auf, indem die Kernel-Funktion unter Verwendung eines Thread-Blocks ausgeführt wird, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform kann der Knoten „C“ 210 beispielsweise ein Kernel-Knoten sein, der eine Kernel-Funktion auf einer GPU aufruft, indem die Kernel-Funktion unter Verwendung eines Thread-Blocks ausgeführt wird.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Kernel-Knoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Kernel-Knoten auf. Bei mindestens einer Ausführungsform wird ein Kernel-Knoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und einen Satz von Kernel-Knotenparametern erhält. Bei mindestens einer Ausführungsform gibt die API, die einen Kernel-Knoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des Kernel-Knotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Kernel-Knoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Kernel-Knoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Speicherallokierungsknoten, d.h. ein Knoten, der Speicher zur Verwendung durch GPU-Operationen des Ausführungsgraphen allokiert bzw. zuweist. Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Speicherfreigabeknoten, der ein Knoten ist, der von einem Speicherallokierungsknoten allokierten Speicher freigibt. Bei mindestens einer Ausführungsform kann der von dem Speicherallokierungsknoten des Ausführungsgraphen allokierte Speicher von einem entsprechenden Speicherfreigabeknoten freigegeben werden. Bei mindestens einer Ausführungsform kann der von dem Speicherallokierungsknoten allokierte Speicher verwendet werden, bis er von einem entsprechenden Speicherfreigabeknoten freigegeben wird. Bei mindestens einer Ausführungsform, wenn beispielsweise der Knoten „A“ 204 ein Speicherallokierungsknoten und der Knoten „E“ 214 ein entsprechender Speicherfreigabeknoten ist, können der Knoten „B“ 206, der Knoten „C“ 210 und der Knoten „D“ 212 den in dem Knoten „A“ 204 allokierten und in dem Knoten „E“ 214 freigegebenen Speicher verwenden. Bei mindestens einer Ausführungsform kann der Knoten „X“ 208 den in dem Knoten „A“ 204 zugeordneten Speicher verwenden, wenn der Knoten „X“ 208 vor dem Knoten „E“ 214 ausgeführt wird. Bei mindestens einer Ausführungsform kann der Knoten „Y“ 216 auch den in dem Knoten „A“ 204 allokierten Speicher verwenden, wenn der Knoten „Y“ 216 vor dem Knoten „E“ 214 ausgeführt wird. Bei mindestens einer Ausführungsform kann der von einem Speicherallokierungsknoten allokierte Speicher, der nicht von einem entsprechenden Speicherfreigabeknoten freigegeben ist, von allen Knoten in einem Ausführungsgraphen verwendet werden, die nach der Speicherallokierung ausgeführt werden. Bei mindestens einer Ausführungsform kann der von einem Speicherallokierungsknoten allokierte Speicher, der nicht von einem entsprechenden Speicherfreigabeknoten freigegeben ist, von Strömen außerhalb des Ausführungsgraphen verwendet werden, bis er freigegeben wird. Bei mindestens einer Ausführungsform kann der mit einem Speicherallokierungsknoten allokierte Speicher durch eine externe Speicherfreigabeoperation freigegeben werden.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Speicherallokierungsknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Speicherallokierungsknoten auf. Bei mindestens einer Ausführungsform wird ein Speicherallokierungsknoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knotenabhängigen, eine Anzahl der Knotenabhängigen und einen Satz von Speicherallokierungsknotenparametern erhält. Bei mindestens einer Ausführungsform gibt die API, die einen Speicherallokierungsknoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des Speicherallokierungsknotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Speicherallokierungsknoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Speicherallokierungsknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Speicherfreigabeknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Speicherfreigabeknoten auf. Bei mindestens einer Ausführungsform wird ein Speicherfreigabeknoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und einen Ort des freizugebenden Speichers erhält. Bei mindestens einer Ausführungsform kann es sich bei dem freizugebenden Speicher um einen von einem Speicherallokierungsknoten allokierten Speicher handeln. Bei mindestens einer Ausführungsform gibt die API, die einen Speicherfreigabeknoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des Speicherfreigabekotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Speicherfreigabeknoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Speicherfreigabeknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein Speicherverwaltungsknoten. Bei mindestens einer Ausführungsform ist ein Speicherverwaltungsknoten ein Speicherkopierknoten, der ein Knoten ist, der Speicherdaten zwischen GPU-Objekten kopiert. Bei mindestens einer Ausführungsform kann ein Speicherkopierknoten Speicher von einem ersten GPU-Objekt, z. B. einem Texturobjekt, zu einem zweiten GPU-Objekt kopieren. Bei mindestens einer Ausführungsform kopiert der Speicherkopierknoten eindimensionale Daten zwischen GPU-Objekten. Bei mindestens einer Ausführungsform kopiert der Speicherkopierknoten Speicher von einem Ort auf einer GPU, der durch ein benanntes Symbol angegeben ist. Bei mindestens einer Ausführungsform kopiert der Speicherkopierknoten Speicher an einen Ort auf einer GPU, der durch ein benanntes Symbol angegeben ist. Bei mindestens einer Ausführungsform ist ein Speicherverwaltungsknoten ein Speichersetzknoten, d. h. ein Knoten, der eine Ansammlung von Speicherdaten auf einer GPU auf einen Anfangswert setzt und/oder eine Ansammlung von Speicherdaten auf einer GPU auf einen aktualisierten Wert aktualisiert.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Speicherkopierknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Speicherkopierknoten auf. Bei mindestens einer Ausführungsform wird ein Speicherkopierknoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und einen Satz von Speicherkopierparametern empfängt. Bei mindestens einer Ausführungsform wird der Speicherkopierknoten zu dem Ausführungsgraphen hinzugefügt, wobei die API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen, ein Ziel, eine Quelle, ein Umfang der zu kopierenden Bytes und einen Typ der Übertragung empfängt. Bei mindestens einer Ausführungsform wird der Speicherkopierknoten zu dem Ausführungsgraphen hinzugefügt, indem die API verwendet wird, die als Eingaben einen Graph-Knoten, den Ausführungsgraphen, einen Satz von Knoten-Abhängigen, die Anzahl der Knoten-Abhängigen, ein Ziel, ein Gerätesymbol, von dem zu kopieren ist, ein Umfang der zu kopierenden Bytes, einen Offset von einem Start des Gerätesymbols und einen Typ der Übertragung empfängt. Bei mindestens einer Ausführungsform wird der Speicherkopierknoten zu dem Ausführungsgraphen hinzugefügt, wobei die API verwendet wird, die als Eingaben einen Graph-Knoten, den Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen, ein Gerätesymbol, zu dem zu kopieren ist, eine Quelle, einen Umfang der zu kopierenden Bytes, einen Offset von einem Start des Gerätesymbols und einen Typ der Übertragung empfängt. Bei mindestens einer Ausführungsform gibt die API, die einen Speicherkopierknoten zu dem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des Speicherkopierknotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Speicherkopierknoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Speicherkopierknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen Speichersetzknoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere Speichersetzknoten auf. Bei mindestens einer Ausführungsform wird ein Speichersetzknoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen, eine Anzahl der Knoten-Abhängigen und Speichersetzparameter erhält. Bei mindestens einer Ausführungsform gibt die API, die einen Speichersetzknoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des Speichersetzknotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den Speichersetzknoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der Speichersetzknoten hinzugefügt wird.
  • Bei mindestens einer Ausführungsform ist ein Ausführungsgraph-Knoten ein leerer Knoten, d. h. ein Knoten, dem keine Operation zugeordnet ist. Bei mindestens einer Ausführungsform kann ein leerer Knoten für die Ablaufsteuerung der Graph-Ausführung verwendet werden. Bei mindestens einer Ausführungsform kann ein leerer Knoten beispielsweise verwendet werden, um sicherzustellen, dass eine Vielzahl von Operationen abgeschlossen ist, bevor eine Operation fortgesetzt wird, indem ein leerer Knoten als ein Abhängiger zu einem Knoten erzeugt wird, der die Vielzahl von Operationen repräsentiert.
  • Bei mindestens einer Ausführungsform weist ein Ausführungsgraph keinen leeren Knoten auf. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph einen oder mehrere leere Knoten auf. Bei mindestens einer Ausführungsform wird ein leerer Knoten zu einem Ausführungsgraphen hinzugefügt, indem eine API verwendet wird, die als Eingaben einen Graph-Knoten, einen Ausführungsgraphen, einen Satz von Knoten-Abhängigen und eine Anzahl der Knoten-Abhängigen erhält. Bei mindestens einer Ausführungsform gibt die API, die einen leeren Knoten zu einem Ausführungsgraphen hinzufügt, einen Fehlercode an einen aufrufenden Prozess zurück, der einen Erfolg oder Misserfolg der Operation zum Hinzufügen des leeren Knotens zu dem Ausführungsgraphen angibt. Bei mindestens einer Ausführungsform speichert die API, die den leeren Knoten zu dem Ausführungsgraphen hinzufügt, Topologieinformationen des Ausführungsgraphen, wenn der leere Knoten hinzugefügt wird.
  • 3 zeigt eine beispielhafte Stromdarstellung 300 eines instanziierten Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform ist ein Ausführungsgraph 302 eine Instanziierung des hier beschriebenen Ausführungsgraph-Templates 202. In mindestens einer Ausführungsform veranschaulicht die beispielhafte Stromdarstellung 300 die Abhängigkeiten des Ausführungsgraphen 302. Bei mindestens einer Ausführungsform weist der Strom 304 einen ersten Abhängigkeitspfad des Ausführungsgraphen 302 auf. Bei mindestens einer Ausführungsform weist der Strom 306 einen zweiten Abhängigkeitspfad des Ausführungsgraphen 302 auf. Bei mindestens einer Ausführungsform weist der Strom 308 einen dritten Abhängigkeitspfad des Ausführungsgraphen 302 auf.
  • Bei mindestens einer Ausführungsform beginnt der Strom 304 mit einem Startknoten (z. B. dem Startknoten 218) und führt dann eine Operation aus, die durch den Knoten „A“ 204 dargestellt wird. Bei mindestens einer Ausführungsform beginnt der Strom 306 mit einem Warteknoten 310, da der Strom 306 möglicherweise erst dann mit der Ausführung beginnt, wenn andere Abhängigkeiten von anderen Strömen erfüllt sind. Bei mindestens einer Ausführungsform beginnt der Strom 308 mit einem Warteknoten 312, weil der Datenstrom 308 ebenfalls erst dann mit der Ausführung beginnen darf, wenn andere Abhängigkeiten von anderen Strömen erfüllt sind.
  • Bei mindestens einer Ausführungsform ist eine erste Abhängigkeit des Knotens „A“ 204 der Knoten „B“ 206. Bei mindestens einer Ausführungsform kann eine durch den Knoten „B“ 206 dargestellte Operation in dem Strom 304 ausgeführt werden, nachdem eine durch den Knoten „A“ 204 dargestellte Operation abgeschlossen ist. Bei mindestens einer Ausführungsform ist eine zweite Abhängigkeit des Knotens „A“ 204 der Knoten „X“ 208. Bei mindestens einer Ausführungsform kann eine durch den Knoten „X“ 208 dargestellte Operation in dem Strom 308 ausgeführt werden, nachdem eine durch den Knoten „A“ 204 dargestellte Operation abgeschlossen ist. Bei mindestens einer Ausführungsform empfängt der Warteknoten 312 des Stroms 308 ein Abschlusssignal von dem Knoten „A“ 204, so dass eine durch den Knoten „X“ 208 dargestellte Operation in dem Strom 308 ausgeführt werden kann. Bei mindestens einer Ausführungsform wird eine durch den Knoten „Y“ 216 dargestellte Operation in dem Strom 308 ausgeführt, nachdem eine durch den Knoten „X“ 208 dargestellte Operation abgeschlossen wurde.
  • Bei mindestens einer Ausführungsform ist eine erste Abhängigkeit des Knotens „B“ 206 der Knoten „C“ 210. Bei mindestens einer Ausführungsform kann eine durch den Knoten „C“ 210 dargestellte Operation in dem Strom 304 ausgeführt werden, nachdem eine durch den Knoten „B“ 206 dargestellte Operation abgeschlossen ist. Bei mindestens einer Ausführungsform ist eine zweite Abhängigkeit des Knotens „B“ 206 der Knoten „D“ 212. Bei mindestens einer Ausführungsform kann eine durch den Knoten „D“ 212 dargestellte Operation in dem Strom 306 ausgeführt werden, nachdem eine durch den Knoten „B“ 206 dargestellte Operation abgeschlossen ist. Bei mindestens einer Ausführungsform empfängt der Warteknoten 310 des Stroms 306 ein Abschlusssignal von dem Knoten „B“ 206, so dass eine durch den Knoten „D“ 212 dargestellte Operation in dem Strom 306 ausgeführt werden kann.
  • Bei mindestens einer Ausführungsform wartet der Strom 304 nach Abschluss der Ausführung einer durch Knoten „C“ 210 dargestellten Operation in dem Strom 304 auf den Abschluss einer durch Knoten „D“ 212 dargestellten Operation, die in dem Strom 306 ausgeführt wird. Bei mindestens einer Ausführungsform empfängt ein Warteknoten 314 in dem Strom 304 nach Abschluss einer durch den Knoten „D“ 212 dargestellten Operation ein Abschlusssignal von dem Knoten „D“ 212. Bei mindestens einer Ausführungsform kann, nachdem der Warteknoten 314 in dem Strom 304 ein Abschlusssignal von dem Knoten „D“ 212 empfängt, eine durch den Knoten „E“ 214 dargestellte Operation in dem Strom 304 ausgeführt werden.
  • Bei mindestens einer Ausführungsform wartet der Strom 304, nachdem die Ausführung einer durch den Knoten „E“ 214 dargestellten Operation in dem Strom 304 abgeschlossen ist, auf den Abschluss einer durch den Knoten „Y“ 216 dargestellten Operation, die in dem Strom 308 ausgeführt wird. Bei mindestens einer Ausführungsform empfängt ein Warteknoten 316 in dem Strom 304 nach Abschluss einer durch den Knoten „Y“ 216 dargestellten Operation ein Abschlusssignal von dem Knoten „Y“ 216. Bei mindestens einer Ausführungsform wird die Ausführung des Stroms 304 mit einem Endknoten (Endknoten 220) abgeschlossen, nachdem der Warteknoten 316 in dem Strom 304 ein Abschlusssignal von dem Knoten „Y“ 216 empfangen hat. Bei mindestens einer Ausführungsform wird die Ausführung des Stroms 306 abgeschlossen, nachdem das Abschlusssignal an den Warteknoten 314 gesendet wurde. Bei mindestens einer Ausführungsform endet die Ausführung des Stroms 308, nachdem ein Abschlusssignal an den Warteknoten 316 gesendet wurde.
  • 4 zeigt beispielhafte Startsequenzen 400 eines instanziierten Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph-Template 402 einen einfachen Graphen mit vier Knoten „A“-„D“ und einen einfachen Abhängigkeitspfad von „A“ zu „B“ zu „C“ zu „D“ auf. Bei mindestens einer Ausführungsform zeigt ein Strom 442 eine Startsequenz, bei der die durch die Knoten „A“-„D“ dargestellten Operationen nacheinander gestartet werden, ohne dass ein Ausführungsgraph verwendet wird. Bei mindestens einer Ausführungsform zeigt ein Strom 444 eine Startsequenz, bei der Operationen, die durch die Knoten „A“-„D“ dargestellt werden, unter Verwendung eines Ausführungsgraphen gestartet werden.
  • Bei mindestens einer Ausführungsform wird eine Anweisung 404 zum Starten einer durch den Knoten „A“ dargestellten Operation ausgegeben. Bei mindestens einer Ausführungsform wird nach einer Ausführungsverzögerung 406 die durch den Knoten „A“ dargestellte Operation 408 auf dem Strom 442 ausgeführt. Bei mindestens einer Ausführungsform wird eine Anweisung 410 zum Starten einer durch den Knoten „B“ dargestellten Operation ausgegeben. Bei mindestens einer Ausführungsform wird nach einer Ausführungsverzögerung die durch den Knoten „B“ dargestellte Operation 412 auf dem Strom 442 ausgeführt. Bei mindestens einer Ausführungsform darf die Operation 412, die durch den Knoten „B“ dargestellt wird, nicht auf dem Strom 442 ausgeführt werden, bevor die Operation 408, die durch den Knoten „A“ dargestellt wird, abgeschlossen ist. Bei mindestens einer Ausführungsform wird eine Anweisung 414 zum Starten einer durch den Knoten „C“ dargestellten Operation ausgegeben. Bei mindestens einer Ausführungsform wird nach einer Ausführungsverzögerung eine Operation 416, die durch den Knoten „C“ dargestellt wird, auf dem Strom 442 ausgeführt. Bei mindestens einer Ausführungsform darf die Operation 416, die durch den Knoten „C“ dargestellt wird, nicht auf dem Strom 442 ausgeführt werden, bevor die Operation 412, die durch den Knoten „B“ dargestellt wird, abgeschlossen ist. Bei mindestens einer Ausführungsform wird eine Anweisung 418 zum Starten einer durch den Knoten „D“ dargestellten Operation ausgegeben. Bei mindestens einer Ausführungsform wird nach einer Ausführungsverzögerung eine Operation 420, die durch den Knoten „D“ dargestellt wird, auf dem Strom 442 ausgeführt. Bei mindestens einer Ausführungsform kann die Operation 420, die durch den Knoten „D“ dargestellt wird, nicht auf dem Strom 442 ausgeführt werden, bevor die Operation 416, die durch den Knoten „C“ dargestellt wird, abgeschlossen ist. Bei mindestens einer Ausführungsform ist eine CPU nach der Ausgabe der Anweisung 418 zum Starten einer durch den Knoten „D“ dargestellten Operation frei 422, um andere Operationen auszuführen, während die durch den Knoten „D“ dargestellte Operation 420 auf dem Strom 442 ausgeführt wird.
  • Bei mindestens einer Ausführungsform wird eine Anweisung 424 zum Erstellen eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, von einem Ausführungsgraph-Template ausgeführt. Bei mindestens einer Ausführungsform kann die Anweisung 424 zum Erstellen des Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ von dem Ausführungsgraph-Template dargestellt werden, zuvor und/oder unter Verwendung eines anderen Prozesses, Prozessors, Threads, einer Thread-Gruppe oder eines Stroms ausgeführt werden. Bei mindestens einer Ausführungsform wird eine Anweisung 426 zum Starten des Ausführungsgraphen für die durch die Knoten „A“-„D“ dargestellten Operationen ausgegeben. Bei mindestens einer Ausführungsform wird nach einer Ausführungsverzögerung 428 eine durch den Knoten „A“ dargestellte Operation 430 auf dem Strom 444 ausgeführt. Bei mindestens einer Ausführungsform wird unmittelbar nach Abschluss der Operation 430, die durch den Knoten „A“ dargestellt wird, auf dem Strom 444 eine Operation 432, die durch den Knoten „B“ dargestellt wird, auf dem Strom 444 ausgeführt. Bei mindestens einer Ausführungsform wird unmittelbar nach Abschluss der Operation 432, die durch den Knoten „B“ dargestellt wird, auf dem Strom 444 eine Operation 434, die durch den Knoten „C“ dargestellt wird, auf dem Strom 444 ausgeführt. Bei mindestens einer Ausführungsform wird unmittelbar nach Abschluss der Operation 434, die durch den Knoten „C“ dargestellt wird, auf dem Strom 444 eine Operation 436, die durch den Knoten „D“ dargestellt wird, auf dem Strom 444 ausgeführt. Bei mindestens einer Ausführungsform ist eine CPU nach Ausgabe der Anweisung 426 zum Starten des Ausführungsgraphen für die Operationen, die durch die Knoten „A“-„D“ dargestellt werden, frei 438, um andere Operationen auszuführen, während die durch den Knoten „D“ dargestellte Operation 436 auf dem Strom 444 ausgeführt wird. Bei mindestens einer Ausführungsform wird die durch den Knoten „D“ dargestellte Operation 436, die als Ergebnis des Starts des Ausführungsgraphen für durch die Knoten „A“-„D“ dargestellte Operationen auf dem Strom 444 ausgeführt wird, früher abgeschlossen als die durch den Knoten „D“ dargestellte Operation 420, die als Ergebnis des Starts von durch die Knoten „A“-„D“ dargestellten Operationen sequentiell auf dem Strom 442 ausgeführt wird, was zu einer Zeitersparnis 440 führt.
  • 5 zeigt ein Beispiel für eine wiederholte Startsequenz 500 eines instanziierten Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform weist ein Ausführungsgraph-Template 502 einen einfachen Graphen mit vier Knoten „A“-„D“ und einen einfachen Abhängigkeitspfad von „A“ zu „B“ zu „C“ zu „D“ auf. Bei mindestens einer Ausführungsform veranschaulicht die beispielhafte wiederholte Startsequenz 500 einen Strom für eine Startsequenz, bei der durch die Knoten „A“-„D“ dargestellte Operationen unter Verwendung eines Ausführungsgraphen wiederholt gestartet werden.
  • Bei mindestens einer Ausführungsform wird eine Anweisung 504 zum Erstellen eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ von dem Ausführungsgraph-Template dargestellt werden, ausgeführt. Bei mindestens einer Ausführungsform kann die Anweisung 504 zum Erstellen des Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ von dem Ausführungsgraph-Template dargestellt werden, zuvor und/oder unter Verwendung eines anderen Prozesses, Prozessors, Threads, einer anderen Thread-Gruppe oder eines anderen Stroms ausgeführt werden.
  • Bei mindestens einer Ausführungsform wird eine erste Anweisung 506 zum Starten eines Ausführungsgraphen für die durch die Knoten „A“-„D“ dargestellten Operationen ausgegeben. Bei mindestens einer Ausführungsform kann die erste Anweisung 506 zum Starten des Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, in einem ersten Strom 508 ausgeführt werden. Bei mindestens einer Ausführungsform wird als Ergebnis der ersten Anweisung 506 zum Starten des Ausführungsgraphen für die Operationen, die durch die Knoten „A“-„D“ dargestellt werden, eine durch den Knoten „A“ dargestellte Operation in dem Strom 508 ausgeführt. Bei mindestens einer Ausführungsform wird nach Abschluss der durch den Knoten „A“ dargestellten Operation die durch den Knoten „B“ dargestellte Operation in dem Strom 508 ausgeführt. Bei mindestens einer Ausführungsform wird nach Abschluss der durch den Knoten „B“ dargestellten Operation die durch den Knoten „C“ dargestellte Operation auf dem Strom 508 ausgeführt. Bei mindestens einer Ausführungsform wird nach Abschluss der durch den Knoten „C“ dargestellten Operation die durch den Knoten „D“ dargestellte Operation auf dem Strom 508 ausgeführt.
  • Bei mindestens einer Ausführungsform wird eine zweite Anweisung 510 zum Starten eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, ausgegeben. Bei mindestens einer Ausführungsform kann die zweite Anweisung 510 zum Starten des Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, unmittelbar nach der Ausgabe der ersten Anweisung 506 zum Starten des Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, ausgegeben werden. Bei mindestens einer Ausführungsform kann die zweite Anweisung 510 zum Starten eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, gleichzeitig mit der Ausgabe der ersten Anweisung 506 zum Starten eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, ausgegeben werden. Bei mindestens einer Ausführungsform kann die zweite Anweisung 510 zum Starten eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, parallel zu der ersten Anweisung 506 zum Starten eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, ausgegeben werden.
  • Bei mindestens einer Ausführungsform kann die zweite Anweisung 510 zum Starten eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, in einem zweiten Strom 512 ausgeführt werden. Bei mindestens einer Ausführungsform können die durch die Knoten „A“-„D“ dargestellten Operationen in dem ersten Strom 508 gleichzeitig mit den durch die Knoten „A“-„D“ dargestellten Operationen ausgeführt werden, die in dem zweiten Strom 512 ausgeführt werden. Bei mindestens einer Ausführungsform können die durch die Knoten „A“-„D“ dargestellten Operationen in dem ersten Strom 508 parallel zu den durch die Knoten „A“-„D“ dargestellten Operationen ausgeführt werden, die in dem zweiten Strom 512 ausgeführt werden. Bei mindestens einer Ausführungsform werden die durch den Knoten „A“ dargestellten Operationen in dem zweiten Strom 512 ausgeführt, gefolgt von der Ausführung der durch den Knoten „B“ dargestellten Operationen, gefolgt von der Ausführung der durch den Knoten „C“ dargestellten Operationen und gefolgt von der Ausführung der durch den Knoten „D“ dargestellten Operationen.
  • Bei mindestens einer Ausführungsform kann eine dritte Anweisung 514 zum Starten eines Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, in einem dritten Strom 516 ausgeführt werden. Bei mindestens einer Ausführungsform werden die durch den Knoten „A“ dargestellten Operationen in dem dritten Strom 516 ausgeführt, gefolgt von der Ausführung der durch den Knoten „B“ dargestellten Operationen, gefolgt von der Ausführung der durch den Knoten „C“ dargestellten Operationen und gefolgt von der Ausführung der durch den Knoten „D“ dargestellten Operationen. Bei mindestens einer Ausführungsform können die durch die Knoten „A“-„D“ dargestellten Operationen in dem dritten Strom 516 gleichzeitig mit den durch die Knoten „A“-„D“ dargestellten Operationen, die in dem zweiten Strom 512 ausgeführt werden, und/oder gleichzeitig mit den durch die Knoten „A“-„D“ dargestellten Operationen, die in dem ersten Strom 508 ausgeführt werden, ausgeführt werden.
  • Bei mindestens einer Ausführungsform, die in 5 nicht dargestellt ist, können nachfolgende Anweisungen zum Starten von Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, in zusätzlichen Strömen ausgeführt werden. Bei mindestens einer in 5 nicht dargestellten Ausführungsform können nachfolgende Anweisungen zum Starten von Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, in dem Strom 508, in dem Strom 512 und/oder in dem Strom 516 nach Abschluss der zuvor ausgeführten Operationen, die durch die Knoten „A“-„D“ dargestellt werden, ausgeführt werden. Bei mindestens einer in 5 nicht dargestellten Ausführungsform können nachfolgende Anweisungen zum Starten von Ausführungsgraphen für Operationen, die durch die Knoten „A“-„D“ dargestellt werden, ausgeführt werden, wenn der Strom 508 die Ausführung von Operationen, die durch den Knoten „D“ dargestellt werden, abgeschlossen hat, oder wenn der Strom 512 die Ausführung von Operationen, die durch den Knoten „D“ dargestellt werden, abgeschlossen hat oder wenn der Strom 516 die Ausführung von Operationen, die durch den Knoten „D“ dargestellt werden, abgeschlossen hat.
  • 6 zeigt ein beispielhaftes Verfahren 600 zum Erstellen und Starten eines Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform führt ein Prozessor wie der Prozessor 102 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 600 auszuführen. Bei mindestens einer Ausführungsform führt ein Grafikprozessor wie der Grafikprozessor 112 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 600 auszuführen. Bei mindestens einer Ausführungsform wird in Schritt 602 ein Ausführungsgraph unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, erstellt. Bei mindestens einer Ausführungsform wird der Ausführungsgraph anhand eines Ausführungsgraph-Templates erstellt. Bei mindestens einer Ausführungsform wird der Ausführungsgraph mit Hilfe einer Graphkonstruktions-API erstellt. Bei mindestens einer Ausführungsform wird der Ausführungsgraph von einem Ausführungsstrom erstellt. Bei mindestens einer Ausführungsform geht die Ausführung nach Schritt 602 zu Schritt 604 über.
  • Bei mindestens einer Ausführungsform wird in Schritt 604 festgestellt, ob der Ausführungsgraph ein gültiger Ausführungsgraph ist. Bei mindestens einer Ausführungsform wird in Schritt 604 festgestellt, ob der Ausführungsgraph ein gültiger Ausführungsgraph ist, indem der Ausführungsgraph durchlaufen wird, um festzustellen, ob die Knoten des Ausführungsgraphen gültige Knoten sind. Bei mindestens einer Ausführungsform wird festgestellt, ob der Ausführungsgraph ein gültiger Ausführungsgraph ist, indem der Ausführungsgraph durchlaufen wird, um festzustellen, ob die Abhängigkeiten zwischen den Knoten des Ausführungsgraphen gültige Abhängigkeiten sind. Bei mindestens einer Ausführungsform wird festgestellt, ob der Ausführungsgraph ein gültiger Ausführungsgraph ist, indem eine Topologie des Ausführungsgraphen ausgewertet wird. Bei mindestens einer Ausführungsform wird festgestellt, ob der Ausführungsgraph ein gültiger Ausführungsgraph ist, indem die mit dem Ausführungsgraph verbundenen Forminformationen ausgewertet werden.
  • Bei mindestens einer Ausführungsform wird, wenn in Schritt 604 festgestellt wird, dass der Ausführungsgraph kein gültiger Ausführungsgraph ist („nein“-Verzweigung), die Ausführung bei Schritt 606 fortgesetzt. Bei mindestens einer Ausführungsform wird, wenn in Schritt 604 festgestellt wird, dass der Ausführungsgraph ein gültiger Ausführungsgraph ist („ja“-Zweig), die Ausführung bei Schritt 608 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 606 ein Fehler zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler an den aufrufenden Prozess zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung einer Fehlerberichts-API zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Signals zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Semaphors zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Sentinel-Wertes zurückgegeben. Bei mindestens einer Ausführungsform wird nach Schritt 606 die Ausführung des beispielhaften Verfahrens 600 beendet.
  • Bei mindestens einer Ausführungsform wird in Schritt 608 unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, bestimmt, ob der Ausführungsgraph zu aktualisieren ist. Bei mindestens einer Ausführungsform wird auf der Grundlage des Empfangs einer Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen vor dem Starten der Graph-Instanz des Ausführungsgraphen bestimmt, dass der Ausführungsgraph zu aktualisieren ist. Bei mindestens einer Ausführungsform wird die Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen von einem aufrufenden Prozess empfangen. Bei mindestens einer Ausführungsform ist der aufrufende Prozess, der die Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen sendet, ein Prozess, der auf einer CPU ausgeführt wird. Bei mindestens einer Ausführungsform handelt es sich bei dem aufrufenden Prozess, der die Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen sendet, um einen Prozess, der auf einer GPU ausgeführt wird.
  • Bei mindestens einer Ausführungsform wird in Schritt 608 bestimmt, dass der Ausführungsgraph zu aktualisieren ist, wenn eine Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen von einem aufrufenden Prozess empfangen wird. Bei mindestens einer Ausführungsform wird in Schritt 608 bestimmt, dass der Ausführungsgraph zu aktualisieren ist, wenn die Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen über eine API empfangen wird. Bei mindestens einer Ausführungsform wird die Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen über ein Signal empfangen. Bei mindestens einer Ausführungsform wird die Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen unter Verwendung eines Semaphors empfangen. Bei mindestens einer Ausführungsform wird die Anweisung zur Aktualisierung der Parameter des Ausführungsgraphen unter Verwendung eines Sentinel-Wertes empfangen.
  • Bei mindestens einer Ausführungsform wird in Schritt 608 auf der Grundlage eines dem Ausführungsgraphen zugeordneten Parameters bestimmt, ob die Parameter des Ausführungsgraphen zu aktualisieren sind. Bei mindestens einer Ausführungsform wird in Schritt 608 auf der Grundlage einer mit dem Ausführungsgraphen verknüpften Richtlinie bestimmt, ob die Parameter des Ausführungsgraphen zu aktualisieren sind. Bei mindestens einer Ausführungsform wird in Schritt 608 auf der Grundlage eines dem Ausführungsgraphen zugeordneten Flags bestimmt, ob die Parameter des Ausführungsgraphen zu aktualisieren sind. Bei mindestens einer Ausführungsform wird in Schritt 608 auf der Grundlage des Empfangs eines aktualisierten Ausführungsgraph-Templates bestimmt, dass die Parameter des Ausführungsgraphen zu aktualisieren sind.
  • Bei mindestens einer Ausführungsform wird, wenn in Schritt 608 festgestellt bzw. bestimmt wird, dass der Ausführungsgraph zu aktualisieren ist, („ja“-Verzweigung), mit Schritt 610 fortgefahren. Bei mindestens einer Ausführungsform wird, wenn in Schritt 608 bestimmt wird, dass der Ausführungsgraph nicht zu aktualisieren ist („nein“-Verzweigung), mit Schritt 612 fortgefahren, um eine Ausführungsgraph-Instanz zu starten.
  • Bei mindestens einer Ausführungsform werden in Schritt 610 die Parameter des Ausführungsgraphen mit Hilfe von Systemen und Verfahren, wie sie hier beschrieben sind, gesetzt bzw. eingestellt oder aktualisiert. Bei mindestens einer Ausführungsform werden die Parameter des Ausführungsgraphen unter Verwendung eines aktualisierten Ausführungsgraph-Templates gesetzt oder aktualisiert. Bei mindestens einer Ausführungsform werden die Parameter des Ausführungsgraphen mit Hilfe einer Graphenaktualisierungs-API gesetzt oder aktualisiert. Bei mindestens einer Ausführungsform geht die Ausführung nach Schritt 610 bei Schritt 612 weiter, um eine Ausführungsgraph-Instanz zu starten.
  • Bei mindestens einer Ausführungsform wird in Schritt 612 eine Ausführungsgraph-Instanz von dem Ausführungsgraphen gestartet. Bei mindestens einer Ausführungsform wird die Ausführungsgraph-Instanz auf einer GPU gestartet. Bei mindestens einer Ausführungsform wird die Ausführungsgraph-Instanz als Ergebnis des Empfangs einer Anweisung zum Starten der Ausführungsgraph-Instanz gestartet. Bei mindestens einer Ausführungsform wird die Anweisung zum Starten der Ausführungsgraph-Instanz von einem aufrufenden Prozess empfangen. Bei mindestens einer Ausführungsform wird die Anweisung zum Starten der Ausführungsgraph-Instanz von einem aufrufenden Prozess empfangen, der auf einer CPU ausgeführt wird. Bei mindestens einer Ausführungsform wird die Anweisung zum Starten der Ausführungsgraph-Instanz von einem aufrufenden Prozess empfangen, der auf einer GPU ausgeführt wird. Bei mindestens einer Ausführungsform wird die Anweisung zum Starten der Ausführungsgraph-Instanz von einem aufrufenden Prozess unter Verwendung einer API empfangen. Bei mindestens einer Ausführungsform wird nach Schritt 612 die Ausführung bei Schritt 614 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 614 unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, bestimmt, ob ein Ausführung-Graph neu zu starten ist. Bei mindestens einer Ausführungsform wird auf der Grundlage des Empfangs einer Anweisung zum Starten einer neuen Graph-Instanz des Ausführungsgraphen bestimmt, dass ein Ausführungs-Graph neu zu starten ist. Bei mindestens einer Ausführungsform wird die Anweisung zum erneuten Starten eines Ausführungs-Graphen von einem aufrufenden Prozess empfangen. Bei mindestens einer Ausführungsform handelt es sich bei dem aufrufenden Prozess, der die Anweisung zum erneuten Starten eines Ausführungs-Graphen sendet, um einen Prozess, der auf einer CPU ausgeführt wird. Bei mindestens einer Ausführungsform handelt es sich bei dem aufrufenden Prozess, der die Anweisung zum erneuten Starten eines Ausführungs-Graphen sendet, um einen Prozess, der auf einer GPU ausgeführt wird.
  • Bei mindestens einer Ausführungsform kehrt die Ausführung, wenn in Schritt 614 festgestellt bzw. bestimmt wird, dass ein Ausführungs-Graph neu zu starten ist („JA“-Verzweigung), zu Schritt 608 zurück, wo festgestellt wird, ob der Ausführungsgraph zu aktualisieren ist, wie es vorab beschrieben ist. Bei mindestens einer Ausführungsform kann der Ausführungsgraph mit unveränderten Parametern neu gestartet werden, wenn in Schritt 608 bestimmt wurde, dass der Ausführungsgraph nicht zu aktualisieren ist. Bei mindestens einer Ausführungsform kann der Ausführungsgraph nach der Aktualisierung der Graph-Parameter neu gestartet werden, nachdem in Schritt 608 bestimmt wurde, dass der Ausführungsgraph zu aktualisieren ist. In mindestens einer Ausführungsform kann der Ausführungsgraph bei einigen Instanziierungen mit unveränderten Parametern und bei einigen Instanziierungen mit aktualisierten Parametern neu gestartet werden.
  • Bei mindestens einer Ausführungsform wird, wenn in Schritt 614 festgestellt wird, dass der Ausführungsgraph nicht neu zu starten ist („nein“-Zweig), mit Schritt 616 fortgefahren. Bei mindestens einer Ausführungsform kehrt das beispielhafte Verfahren 600 in Schritt 616 zum Aufrufer zurück. Bei mindestens einer Ausführungsform wird in Schritt 616 ein Hinweis auf den erfolgreichen Abschluss des Verfahrens 600 zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 600 an einen aufrufenden Prozess zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 600 über eine Berichts-API zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 600 über ein Signal zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 600 unter Verwendung eines Semaphors zurückgegeben. Bei mindestens einer Ausführungsform wird ein Hinweis auf den erfolgreichen Abschluss des Verfahrens 600 unter Verwendung eines Sentinel-Wertes zurückgegeben. Bei mindestens einer Ausführungsform wird nach Schritt 616 die Ausführung des beispielhaften Verfahrens 600 beendet.
  • Bei mindestens einer Ausführungsform werden die in 6 dargestellten Operationen des beispielhaften Verfahrens 600 in einer anderen Reihenfolge als in 6 angegeben ausgeführt. Bei mindestens einer Ausführungsform werden die in 6 dargestellten Operationen des beispielhaften Verfahrens 600 gleichzeitig (oder parallel) durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 6 dargestellten beispielhaften Verfahrens 600 von einer Vielzahl von Threads ausgeführt, die auf einem Prozessor wie dem Prozessor 102, der hier zumindest im Zusammenhang mit 1 beschrieben ist, laufen. Bei mindestens einer Ausführungsform werden die Operationen des in 6 dargestellten beispielhaften Verfahrens 600 von einer Vielzahl von Threads ausgeführt, die auf einem Grafikprozessor wie dem hier zumindest in Verbindung mit 1 beschriebenen Grafikprozessor 112 ausgeführt werden.
  • 7 veranschaulicht ein beispielhaftes Ausführungsgraph-Template 700 gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform weist ein Superset-Ausführungsgraph-Template 702 einen Startknoten 704 und einen oder mehrere Graph-Knoten auf, wie sie hier beschrieben sind. Bei mindestens einer Ausführungsform wird das Superset-Ausführungsgraph-Template 702 verwendet, um Ausführungsgraphen zu instanziieren, wie es hier in Verbindung mit 8 bis 12 beschrieben ist. In mindestens einer Ausführungsform hat der Startknoten 704 einen einzigen untergeordneten Knoten, den Graph-Knoten 706, der, wie es in 7 dargestellt ist, als Knoten A bezeichnet wird. In mindestens einer Ausführungsform wird ein untergeordneter Knoten wie der Graph-Knoten 706 als abhängiger Knoten bezeichnet. Bei mindestens einer Ausführungsform wird ein untergeordneter Knoten, wie der Graph-Knoten 706, als Nachfolgeknoten bezeichnet. Bei mindestens einer Ausführungsform hat der Graph-Knoten 706 eine Vielzahl von Kindknoten, Graph-Knoten 708. Bei mindestens einer Ausführungsform hat der Graph-Knoten 706 beispielsweise fünf Kindknoten, die als Knoten B1, B2, B3, B4 und B5 bezeichnet werden. Bei mindestens einer Ausführungsform ist der Graph-Knoten 706 ein Graph-Knoten eines Typs, der Typen von Graph-Knoten, wie sie hier beschrieben sind, einschließt, aber nicht darauf beschränkt ist. Bei mindestens einer Ausführungsform wird der Graph-Knoten 706 als Elterknoten eines Kindknotens, wie z.B. Knoten B1, bezeichnet. Bei mindestens einer Ausführungsform wird ein Elterknoten, wie der Graph-Knoten 706, als Vorgängerknoten bezeichnet. Bei mindestens einer Ausführungsform werden die Graph-Knoten 708 als Nachfahren des Graph-Knotens 706 bezeichnet. Bei mindestens einer Ausführungsform werden Kindknoten des Graph-Knotens 708 (sowie Kindknoten von Kindknoten von Graph-Knoten 708 usw.) als Nachkommen des Graph-Knotens 706 bezeichnet. Bei mindestens einer Ausführungsform werden Eltern eines Graph-Knotens, wie z.B. Knoten B1 (sowie Eltern von Eltern eines Graph-Knotens, usw.) als Vorfahren des Graph-Knotens bezeichnet.
  • Bei mindestens einer Ausführungsform stellen für ein Superset-Ausführungsgraph-Template, wie das Superset-Ausführungsgraph-Template 702, die Graph-Knoten 708 fünf mögliche Operationen dar, die nach Ausführung des Graph-Knotens 706 ausgeführt werden können. Bei mindestens einer Ausführungsform kann eine Operation, die durch einen der Graph-Knoten 708 dargestellt wird, nach der Ausführung des Graph-Knotens 706 ausgeführt werden, wenn z. B. der jeweilige Knoten der Graph-Knoten 708 aktiviert ist, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform kann eine Vielzahl von Operationen, die durch die Graph-Knoten 708 dargestellt werden, nach der Ausführung des Graph-Knotens 706 ausgeführt werden, wenn z. B. die Vielzahl von Knoten der Graph-Knoten 708 aktiviert ist, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform können alle durch die Graph-Knoten 708 dargestellten Operationen nach der Ausführung des Graph-Knotens 706 ausgeführt werden, wenn z. B. alle Knoten der Graph-Knoten 708 aktiviert sind, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform kann nach der Ausführung des Graph-Knotens 706 keine der durch die Graph-Knoten 708 dargestellten Operationen ausgeführt werden, wenn z. B. kein Knoten der Graph-Knoten 708 aktiviert ist, wie es hier beschrieben ist. Bei mindestens einer Ausführungsform sind die Graph-Knoten 708 Graph-Knoten von Typen, die die hier beschriebenen Typen von Graph-Knoten einschließen, aber nicht darauf beschränkt sind.
  • Bei mindestens einer Ausführungsform haben die Knoten der Graph-Knoten 708 einen einzigen Kindknoten, den Graph-Knoten 710, der, wie es in 7 dargestellt ist, als Knoten C bezeichnet wird. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 710 eine Operation dar, die Ergebnisse der Graph-Knoten 708 verarbeitet. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 710 eine Warteoperation dar, wie sie hier beschrieben ist, die darauf wartet, dass die Ausführung aller aktivierten Knoten der Graph-Knoten 708 abgeschlossen wird. Bei mindestens einer Ausführungsform ist der Graph-Knoten 710 ein Graph-Knoten eines Typs, der die hier beschriebenen Typen von Graph-Knoten einschließt, aber nicht auf diese beschränkt ist.
  • Bei mindestens einer Ausführungsform hat der Graph-Knoten 710 einen einzigen Kindknoten, den Graph-Knoten 712, der, wie es in 7 dargestellt ist, als Knoten D bezeichnet wird. Bei mindestens einer Ausführungsform hat der Graph-Knoten 712 eine Vielzahl von Kindknoten, Graph-Knoten 714. Bei mindestens einer Ausführungsform hat der Graph-Knoten 712 beispielsweise fünf Kindknoten, die als Knoten E1, E2, E3, E4 und E5 bezeichnet werden. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 712 eine Operation dar, die Daten für die Verwendung durch die Graph-Knoten 714 aufbereitet. Bei mindestens einer Ausführungsform ist der Graph-Knoten 712 ein Graph-Knoten eines Typs, der die hier beschriebenen Typen von Graph-Knoten einschließt, aber nicht auf diese beschränkt ist.
  • Bei mindestens einer Ausführungsform, wie es vorab beschrieben ist, stellen die Graph-Knoten 714 fünf mögliche Operationen dar, die nach der Ausführung des Graph-Knotens 712 ausgeführt werden können. Bei mindestens einer Ausführungsform kann zum Beispiel keine Operation ausgeführt werden, wenn keiner der Graph-Knoten 714 aktiviert ist. Bei mindestens einer Ausführungsform kann z. B. eine Operation ausgeführt werden, wenn einer der Graph-Knoten 714 aktiviert ist. Bei mindestens einer Ausführungsform können z. B. zwei, drei, vier oder alle fünf Operationen ausgeführt werden, je nachdem, welche der Graph-Knoten 714 aktiviert sind. Bei mindestens einer Ausführungsform sind die Graph-Knoten 714 Graph-Knoten von Typen, die die hier beschriebenen Typen von Graph-Knoten einschließen, aber nicht darauf beschränkt sind.
  • In mindestens einer Ausführungsform hat ein Graph-Knoten 714 einen einzigen Kindknoten, den Graph-Knoten 716, der, wie es in 7 dargestellt ist, als Knoten F bezeichnet wird. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 716 eine Operation dar, die Ergebnisse der Graph-Knoten 714 verarbeitet. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 716 eine Warteoperation dar, wie sie hier beschrieben ist. Bei mindestens einer Ausführungsform ist der Graph-Knoten 716 ein Graph-Knoten eines Typs, der die hier beschriebenen Typen von Graph-Knoten einschließt, aber nicht darauf beschränkt ist.
  • Bei mindestens einer Ausführungsform hat der Graph-Knoten 716 einen einzigen Kindknoten, den Graph-Knoten 718, der, wie es in 7 dargestellt ist, als Knoten G bezeichnet wird. Bei mindestens einer Ausführungsform hat der Graph-Knoten 718 einen einzigen Kindknoten, den Graph-Knoten 720, der, wie es in 7 dargestellt ist, als Knoten H bezeichnet wird. Bei mindestens einer Ausführungsform hat der Graph-Knoten 720 eine Vielzahl von Kindknoten, die Graph-Knoten 722. Bei mindestens einer Ausführungsform hat der Graph-Knoten 720 beispielsweise fünf Kindknoten, die als Knoten I1, I2, I3, I4 und I5 bezeichnet werden. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 720 eine Operation dar, die Daten für die Verwendung durch die Graph-Knoten 722 aufbereitet. Bei mindestens einer Ausführungsform ist der Graph-Knoten 720 ein Graph-Knoten eines Typs, der die hier beschriebenen Typen von Graph-Knoten einschließt, aber nicht auf diese beschränkt ist.
  • Bei mindestens einer Ausführungsform, wie es vorab beschrieben ist, stellen die Graph-Knoten 722 fünf mögliche Operationen dar, die nach der Ausführung des Graph-Knotens 720 ausgeführt werden können. Bei mindestens einer Ausführungsform kann zum Beispiel keine Operation ausgeführt werden, wenn keiner der Graph-Knoten 722 aktiviert ist. Bei mindestens einer Ausführungsform kann z. B. eine Operation ausgeführt werden, wenn einer der Graph-Knoten 722 aktiviert ist. Bei mindestens einer Ausführungsform können z. B. zwei, drei, vier oder alle fünf Operationen ausgeführt werden, je nachdem, welche der Graph-Knoten 722 aktiviert sind. Bei mindestens einer Ausführungsform sind die Graph-Knoten 722 Graph-Knoten von Typen, die die hier beschriebenen Typen von Graph-Knoten einschließen, aber nicht darauf beschränkt sind.
  • In mindestens einer Ausführungsform hat ein Graph-Knoten 722 einen einzigen Kindknoten, den Graph-Knoten 724, der, wie es in 7 dargestellt ist, als Knoten J bezeichnet wird. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 724 eine Operation dar, die Ergebnisse der Graph-Knoten 722 verarbeitet. Bei mindestens einer Ausführungsform stellt der Graph-Knoten 724 eine Warteoperation dar, wie sie hier beschrieben ist. Bei mindestens einer Ausführungsform ist der Graph-Knoten 724 ein Graph-Knoten eines Typs, der die hier beschriebenen Typen von Graph-Knoten einschließt, aber nicht auf diese beschränkt ist. Bei mindestens einer Ausführungsform hat der Graph-Knoten 724 ein einziges Kind, den Endknoten 726.
  • 8 zeigt gemäß mindestens einer Ausführungsform ein Beispiel eines Ausführungsgraphen 800, bei dem Graph-Knoten deaktiviert sind. In mindestens einer Ausführungsform wird das hier zumindest in Verbindung mit 7 beschriebene Superset-Ausführungsgraph-Template 702 verwendet, um einen Ausführungsgraphen wie den Ausführungsgraphen 802 zu instanziieren. Bei mindestens einer Ausführungsform kann ein oder können mehrere Knoten des Ausführungsgraphen 802 nach der Graph-Instanziierung und/oder während der Graph-Ausführung unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, aktiviert oder deaktiviert werden. Bei mindestens einer Ausführungsform stellt der Ausführungsgraph 802 einen Zustand einer Instanziierung des Superset-Ausführungsgraph-Templates 702 dar, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform, wie es in 8 dargestellt ist, sind zwei der Graph-Knoten 804 aktiviert (B1 und B4) und drei der Graph-Knoten 804 sind deaktiviert (als Ø bezeichnet). Bei mindestens einer Ausführungsform sind die Graph-Knoten 804 Instanzen der Graph-Knoten 708 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 8 dargestellt ist, sind drei der Graph-Knoten 806 aktiviert (E2, E3 und E4) und zwei der Graph-Knoten 806 sind deaktiviert (als Ø bezeichnet). Bei mindestens einer Ausführungsform sind die Graph-Knoten 806 Instanzen der Graph-Knoten 714 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 8 dargestellt ist, ist der Graph-Knoten 808 deaktiviert (bezeichnet als Ø). Bei mindestens einer Ausführungsform ist der Graph-Knoten 808 eine Instanziierung des Graph-Knotens 718 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest im Zusammenhang mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 8 dargestellt ist, sind alle fünf Graph-Knoten 810 aktiviert (I1, I2, I3, I4 und I5) und keiner ist deaktiviert. Bei mindestens einer Ausführungsform handelt es sich bei den Graph-Knoten 810 um Instanziierungen der Graph-Knoten 722 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform beginnt der Ausführungsgraph 802, führt den Knoten A aus, führt die Knoten B1 und B4 aus, führt den Knoten C aus, führt den Knoten D aus, führt die Knoten E2, E3 und E4 aus, führt den Knoten F aus, führt den Knoten H aus, führt die Knoten I1, I2, I3, I4 und I5 aus, führt den Knoten J aus und endet.
  • 9 zeigt ein Beispiel eines Ausführungsgraphen 900, in dem Graph-Knoten gemäß mindestens einer Ausführungsform aktiviert und deaktiviert sind. Bei mindestens einer Ausführungsform wird das Superset-Ausführungsgraph-Template 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist, zur Instanziierung eines Ausführungsgraphen wie dem Ausführungsgraphen 902 verwendet. Bei mindestens einer Ausführungsform kann ein oder können mehrere Knoten des Ausführungsgraphen 902 nach der Instanziierung des Graphen und/oder während der Ausführung des Graphen mit Hilfe von Systemen und Verfahren, wie sie hier beschrieben sind, aktiviert oder deaktiviert werden. Bei mindestens einer Ausführungsform stellt der Ausführungsgraph 902 einen Zustand einer Instanziierung des Superset-Ausführungsgraph-Templates 702 dar, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform, wie es in 9 dargestellt ist, sind zwei der Graph-Knoten 904 aktiviert (B2 und B3) und drei der Graph-Knoten 904 sind deaktiviert (als Ø bezeichnet). Bei mindestens einer Ausführungsform sind die Graph-Knoten 904 Instanzen der Graph-Knoten 708 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 9 dargestellt ist, sind drei der Graph-Knoten 906 aktiviert (E1, E2 und E5) und zwei der Graph-Knoten 906 sind deaktiviert (bezeichnet als Ø). Bei mindestens einer Ausführungsform handelt es sich bei den Graph-Knoten 906 um Instanzen der Graph-Knoten 714 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 9 dargestellt ist, sind zwei der Graph-Knoten 910 aktiviert (I2 und I4) und drei der Graph-Knoten 910 sind deaktiviert (Ø). Bei mindestens einer Ausführungsform handelt es sich bei den Graph-Knoten 910 um Instanziierungen der Graph-Knoten 722 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform beginnt der Ausführungsgraph 902, führt den Knoten A aus, führt die Knoten B2 und B3 aus, führt den Knoten C aus, führt den Knoten D aus, führt die Knoten E1, E2 und E5 aus, führt den Knoten F aus, führt den Knoten G aus, führt den Knoten H aus, führt die Knoten I2 und I4 aus, führt den Knoten J aus, und endet.
  • 10 zeigt ein Beispiel eines Ausführungsgraphen 1000, bei dem die Knoten des Graphen gemäß mindestens einer Ausführungsform einzeln aktiviert sind. Bei mindestens einer Ausführungsform wird das Superset-Ausführungsgraph-Template 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist, zur Instanziierung eines Ausführungsgraphen wie des Ausführungsgraphen 1002 verwendet. Bei mindestens einer Ausführungsform kann ein oder können mehrere Knoten des Ausführungsgraphen 1002 nach der Instanziierung des Graphen und/oder während der Ausführung des Graphen mit Hilfe von Systemen und Verfahren, wie sie hier beschrieben sind, aktiviert oder deaktiviert werden. Bei mindestens einer Ausführungsform stellt der Ausführungsgraph 1002 einen Zustand einer Instanziierung des Superset-Ausführungsgraph-Templates 702 dar, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform, wie es in 10 dargestellt ist, ist einer der Graph-Knoten 1004 aktiviert (B3) und vier der Graph-Knoten 1004 sind deaktiviert (mit Ø bezeichnet). Bei mindestens einer Ausführungsform handelt es sich bei den Graph-Knoten 1004 um Instanziierungen der Graph-Knoten 708 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 10 dargestellt ist, ist einer der Graph-Knoten 1006 aktiviert (E5) und vier der Graph-Knoten 1006 sind deaktiviert (mit Ø bezeichnet). Bei mindestens einer Ausführungsform handelt es sich bei den Graph-Knoten 1006 um Instanzen der Graph-Knoten 714 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 10 dargestellt ist, ist einer der Graph-Knoten 1010 aktiviert (12) und vier der Graph-Knoten 1010 sind deaktiviert (mit Ø bezeichnet). Bei mindestens einer Ausführungsform sind die Graph-Knoten 1010 Instanziierungen der Graph-Knoten 722 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform beginnt der Ausführungsgraph 1002, führt den Knoten A aus, führt den Knoten B3 aus, führt den Knoten C aus, führt den Knoten D aus, führt den Knoten E5 aus, führt den Knoten F aus, führt den Knoten G aus, führt den Knoten H aus, führt den Knoten I2 aus, führt den Knoten J aus, und endet. Bei mindestens einer Ausführungsform stellt der Ausführungsgraph 1002 eine einzige Option an jeder Knotenmenge des Superset-Ausführungsgraph-Templates 702 dar, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • 11 zeigt ein Beispiel eines Ausführungsgraphen 1100, bei dem gemäß mindestens einer Ausführungsform Graph-Knoten einzeln deaktiviert sind. Bei mindestens einer Ausführungsform wird das Superset-Ausführungsgraph-Template 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist, zur Instanziierung eines Ausführungsgraphen wie des Ausführungsgraphen 1102 verwendet. Bei mindestens einer Ausführungsform kann ein oder können mehrere Knoten des Ausführungsgraphen 1102 nach der Instanziierung des Graphen und/oder während der Ausführung des Graphen mit Hilfe von Systemen und Verfahren, wie sie hier beschrieben sind, aktiviert oder deaktiviert werden. Bei mindestens einer Ausführungsform stellt der Ausführungsgraph 1102 einen Zustand einer Instanziierung des Superset-Ausführungsgraph-Templates 702 dar, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform, wie es in 11 dargestellt ist, ist keiner der Graph-Knoten 1104 aktiviert (alle sind deaktiviert, bezeichnet als Ø). Bei mindestens einer Ausführungsform sind die Graph-Knoten 1104 Instanziierungen der Graph-Knoten 708 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 11 dargestellt ist, ist keiner der Graph-Knoten 1106 aktiviert (alle sind deaktiviert, bezeichnet als Ø). Bei mindestens einer Ausführungsform sind die Graph-Knoten 1106 Instanzen der Graph-Knoten 714 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest im Zusammenhang mit 7 beschrieben ist. Bei mindestens einer Ausführungsform, wie es in 11 dargestellt ist, ist keiner der Graph-Knoten 1110 aktiviert (alle sind deaktiviert, bezeichnet als Ø). Bei mindestens einer Ausführungsform sind die Graph-Knoten 1110 Instanziierungen der Graph-Knoten 722 des Superset-Ausführungsgraph-Templates 702, wie es hier zumindest im Zusammenhang mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform beginnt der Ausführungsgraph 1102, führt den Knoten A aus, führt den Knoten C aus, führt den Knoten D aus, führt den Knoten F aus, führt den Knoten G aus, führt den Knoten H aus, führt den Knoten J aus, und endet. Bei mindestens einer Ausführungsform führt der Ausführungsgraph 1102 keine Option an jeder Knotenmenge des Superset-Ausführungsgraph-Templates 702 aus, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • 12 zeigt ein Beispiel für einen Ausführungsgraphen 1200, bei dem gemäß mindestens einer Ausführungsform alle Graph-Knoten deaktiviert sind. Bei mindestens einer Ausführungsform wird das Superset-Ausführungsgraph-Template 702, wie es hier zumindest in Verbindung mit 7 beschrieben ist, zur Instanziierung eines Ausführungsgraphen wie des Ausführungsgraphen 1202 verwendet. Bei mindestens einer Ausführungsform kann ein oder können mehrere Knoten des Ausführungsgraphen 1202 nach der Instanziierung des Graphen und/oder während der Ausführung des Graphen mit Hilfe von Systemen und Verfahren, wie sie hier beschrieben sind, aktiviert oder deaktiviert werden. Bei mindestens einer Ausführungsform stellt der Ausführungsgraph 1202 einen Zustand einer Instanziierung des Superset-Ausführungsgraph-Templates 702 dar, wie es hier zumindest in Verbindung mit 7 beschrieben ist.
  • Bei mindestens einer Ausführungsform, wie es in 12 dargestellt ist, sind keine Graph-Knoten aktiviert. Bei mindestens einer Ausführungsform ist beispielsweise keiner der Graph-Knoten 1204 aktiviert (alle sind deaktiviert, als Ø bezeichnet), keiner der Graph-Knoten 1206 ist aktiviert (alle sind deaktiviert, als Ø bezeichnet), keiner der Graph-Knoten 1210 ist aktiviert (alle sind deaktiviert, als Ø bezeichnet), und keine anderen Graph-Knoten sind aktiviert. Bei mindestens einer Ausführungsform beginnt der Ausführungsgraph 1202, führt keinen Knoten aus und endet. Bei mindestens einer Ausführungsform stellt der Ausführungsgraph 1202 einen gültigen, aber vollständig deaktivierten Ausführungsgraph dar.
  • Bei mindestens einer Ausführungsform, die hier nicht dargestellt ist, können auch alle Graph-Knoten aktiviert sein. Wenn beispielsweise alle Graph-Knoten eines Ausführungsgraphen, der durch das Superset-Ausführungsgraph-Template 702 instanziiert wird, wie es hier zumindest in Verbindung mit 7 beschrieben, aktiviert sind, kann ein solcher Ausführungsgraph beginnen, den Knoten A ausführen, die Knoten B1, B2, B3, B4 und B5 ausführen, den Knoten C ausführen, den Knoten D ausführen, die Knoten E1, E2, E3, E4 und E5 ausführen, den Knoten F ausführen, den Knoten G ausführen, den Knoten H ausführen, die Knoten I1, I2, I3, I4 und I5 ausführen, den Knoten J ausführen und enden. Bei mindestens einer Ausführungsform können kein, ein, mehrere oder alle Knoten eines Ausführungsgraphen unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, aktiviert oder deaktiviert sein.
  • 13 veranschaulicht ein beispielhaftes Verfahren 1300 zum Deaktivieren von Graph-Knoten eines Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform führt ein Prozessor wie der Prozessor 102 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 1300 auszuführen. Bei mindestens einer Ausführungsform führt ein Grafikprozessor wie der Grafikprozessor 112 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 1300 auszuführen. In mindestens einer Ausführungsform wird in Schritt 1302 ein Ausführungsgraph unter Verwendung eines Superset-Ausführungsgraph-Templates wie dem Superset-Ausführungsgraph-Template 702, das hier zumindest in Verbindung mit 7 beschrieben ist, instanziiert, wobei Systeme und Verfahren wie die hier beschriebenen verwendet werden. Bei mindestens einer Ausführungsform geht die Ausführung nach Schritt 1302 zu Schritt 1304 über.
  • Bei mindestens einer Ausführungsform wird in Schritt 1304 überprüft, ob eine Anweisung zur Deaktivierung eines Knotens empfangen wurde. Bei mindestens einer Ausführungsform wird in Schritt 1304, wenn festgestellt wird, dass eine Anweisung zum Deaktivieren eines Knotens empfangen wurde („ja“-Zweig), die Ausführung des beispielhaften Verfahrens 1300 bei Schritt 1306 fortgesetzt. Bei mindestens einer Ausführungsform wird bei Schritt 1304, wenn festgestellt wird, dass keine Anweisung zum Deaktivieren eines Knotens empfangen wurde („nein“-Zweig), die Ausführung des beispielhaften Verfahrens 1300 bei Schritt 1316 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 1306 versucht, einen Knoten zu lokalisieren, der mit einer in Schritt 1304 empfangenen Anweisung zur Deaktivierung eines Knotens verbunden ist. Bei mindestens einer Ausführungsform wird in Schritt 1308 bestimmt, ob der Knoten, der mit der Anweisung zur Deaktivierung eines Knotens verbunden ist, lokalisiert wurde. Bei mindestens einer Ausführungsform wird bei Schritt 1308, wenn festgestellt wird, dass der mit der Anweisung zum Deaktivieren eines Knotens verbundene Knoten nicht lokalisiert wurde („nein“-Verzweigung), die Ausführung des beispielhaften Verfahrens 1300 bei Schritt 1310 fortgesetzt. Bei mindestens einer Ausführungsform wird bei Schritt 1308, wenn festgestellt wird, dass der Knoten, der mit der Anweisung zum Deaktivieren eines Knotens verbunden ist, lokalisiert wurde („ja“-Zweig), die Ausführung des beispielhaften Verfahrens 1300 bei Schritt 1312 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 1310 ein Fehler zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler an einen aufrufenden Prozess zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung einer Fehlerberichts-API zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Signals zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Semaphors zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Sentinel-Wertes zurückgegeben. Bei mindestens einer Ausführungsform, die in 13 nicht dargestellt ist, geht das beispielhafte Verfahren 1300 nach dem Schritt 1310 zum unten beschriebenen Schritt 1316 über. Bei mindestens einer Ausführungsform wird nach Schritt 1310 das beispielhafte Verfahren 1300 beendet.
  • Bei mindestens einer Ausführungsform wird in Schritt 1312 bestimmt, ob der lokalisierte Knoten, der mit der Anweisung zum Deaktivieren eines Knotens verbunden ist, aktuell aktiviert ist. Bei mindestens einer Ausführungsform wird bei Schritt 1312, wenn festgestellt wird, dass der lokalisierte Knoten, der mit der Anweisung zum Deaktivieren eines Knotens verbunden ist, aktuell nicht aktiviert ist („nein“-Zweig), die Ausführung des beispielhaften Verfahrens bei Schritt 1316 fortgesetzt. Bei mindestens einer Ausführungsform wird bei Schritt 1312, wenn festgestellt wird, dass der lokalisierte Knoten, der mit der Anweisung zum Deaktivieren eines Knotens verbunden ist, gegenwärtig aktiviert ist („ja“-Zweig), die Ausführung des beispielhaften Verfahrens bei Schritt 1314 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 1314 der aktivierte lokalisierte Knoten, der mit der Anweisung zum Deaktivieren eines Knotens verbunden ist, unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, deaktiviert. Bei mindestens einer Ausführungsform wird bei der Deaktivierung des Knotens, der mit der Anweisung zur Deaktivierung eines Knotens verbunden ist, eine Datenstruktur gespeichert, die zur Beschreibung der mit dem Knoten verbundenen Funktionalität verwendet wird. Bei mindestens einer Ausführungsform ist die Datenstruktur, die zur Beschreibung der mit dem Knoten verbundenen Funktionalität verwendet wird, eine Compute-Work-Item-Datenstruktur, die hier als „QMD“ bezeichnet werden kann. Bei mindestens einer Ausführungsform kann einem deaktivierten Knoten eine Null-Datenstruktur zugeordnet werden, die angibt, dass der Knoten keine Rechenressourcen benötigt, wenn er mit einer Anweisung zur Deaktivierung eines Knotens verbunden ist. Bei mindestens einer Ausführungsform ist eine Null-Datenstruktur, die angibt, dass ein Knoten keine Rechenressourcen benötigt, ein Null-QMD. Bei mindestens einer Ausführungsform ist ein Null-QMD ein QMD mit einem oder mehreren auf Null gesetzten Parametern. Bei mindestens einer Ausführungsform ist ein Null-QMD ein QMD, bei dem eine oder mehrere Gitterdimensionen (Grid Dimensions) auf Null gesetzt sind. Bei mindestens einer Ausführungsform ist ein Null-Kernel dem deaktivierten Knoten zugeordnet, wenn der Knoten, der der Anweisung zur Deaktivierung eines Knotens zugeordnet ist, deaktiviert ist. Bei mindestens einer Ausführungsform wird nach Schritt 1314 die Ausführung des beispielhaften Verfahrens 1300 bei Schritt 1316 fortgesetzt. Bei mindestens einer Ausführungsform, die in 13 nicht dargestellt ist, kehrt das beispielhafte Verfahren 1300 zu Schritt 1304 zurück, um einen oder mehrere weitere Knoten zu deaktivieren, bevor es bei Schritt 1316 weitergeht. In mindestens einer Ausführungsform, die in 13 nicht dargestellt ist, fährt das beispielhafte Verfahren bei Schritt 1404 des beispielhaften Verfahrens 1400, das hier zumindest in Verbindung mit 14 beschrieben ist, fort, um einen oder mehrere Knoten zu aktivieren, bevor es bei Schritt 1316 und/oder bei Schritt 1416 des beispielhaften Verfahrens 1400 weitergeht.
  • Bei mindestens einer Ausführungsform wird in Schritt 1316 der instanziierte Ausführungsgraph mit deaktivierten und/oder aktivierten Knoten unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, ausgeführt. Bei mindestens einer Ausführungsform wird nach Schritt 1316 das beispielhafte Verfahren 1300 beendet. Bei mindestens einer Ausführungsform wird das beispielhafte Verfahren 1300 nach Schritt 1316 bei Schritt 1304 fortgesetzt, um zusätzliche Anweisungen zur Deaktivierung von Knoten zu empfangen. Bei mindestens einer Ausführungsform wird das beispielhafte Verfahren 1300 nach Schritt 1316 bei Schritt 1404 des beispielhaften Verfahrens 1400 fortgesetzt, um Anweisungen zur Aktivierung von Knoten zu empfangen. Bei mindestens einer Ausführungsform, die hier nicht dargestellt ist, kann das beispielhafte Verfahren 1300 und/oder das beispielhafte Verfahren 1400 eine Vielzahl von Anweisungen zum Deaktivieren von Knoten und/oder eine Vielzahl von Anweisungen zum Aktivieren von Knoten verarbeiten, bevor in Schritt 1316 ein instanziierter Ausführungsgraph mit deaktivierten und/oder aktivierten Knoten ausgeführt wird.
  • Bei mindestens einer Ausführungsform werden die Operationen des in 13 dargestellten beispielhaften Verfahrens 1300 in einer anderen Reihenfolge als in 13 angegeben ausgeführt. Bei mindestens einer Ausführungsform werden die Operationen des in 13 dargestellten beispielhaften Verfahrens 1300 gleichzeitig (oder parallel) durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 13 dargestellten beispielhaften Verfahrens 1300 von einer Vielzahl von Threads ausgeführt, die auf einem Prozessor wie dem Prozessor 102, der hier zumindest in Verbindung mit 1 beschrieben ist, laufen. Bei mindestens einer Ausführungsform werden die Operationen des in 13 dargestellten beispielhaften Verfahrens 1300 von einer Vielzahl von Threads ausgeführt, die auf einem Grafikprozessor wie dem hier zumindest in Verbindung mit 1 beschriebenen Grafikprozessor 112 ausgeführt werden.
  • 14 veranschaulicht ein beispielhaftes Verfahren 1400 zur Aktivierung von Graph-Knoten eines Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform führt ein Prozessor wie der Prozessor 102 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 1400 auszuführen. Bei mindestens einer Ausführungsform führt ein Grafikprozessor wie der Grafikprozessor 112 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 1400 auszuführen. In mindestens einer Ausführungsform wird in Schritt 1402 ein Ausführungsgraph unter Verwendung eines Superset-Ausführungsgraph-Templates wie des Superset-Ausführungsgraph-Templates 702, das hier zumindest in Verbindung mit 7 beschrieben ist, instanziiert, wobei Systeme und Verfahren wie die hier beschriebenen verwendet werden. Bei mindestens einer Ausführungsform geht die Ausführung nach Schritt 1402 zu Schritt 1404 über.
  • Bei mindestens einer Ausführungsform wird in Schritt 1404 überprüft, ob eine Anweisung zur Aktivierung eines Knotens empfangen wurde. Bei mindestens einer Ausführungsform wird in Schritt 1404, wenn festgestellt wird, dass eine Anweisung zur Aktivierung eines Knotens empfangen wurde („ja“-Zweig), die Ausführung des beispielhaften Verfahrens 1400 bei Schritt 1406 fortgesetzt. Bei mindestens einer Ausführungsform wird in Schritt 1404, wenn festgestellt wird, dass keine Anweisung zur Aktivierung eines Knotens empfangen wurde („nein“-Zweig), die Ausführung des beispielhaften Verfahrens 1400 bei Schritt 1414 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 1406 versucht, den Knoten zu lokalisieren, der mit der in Schritt 1404 empfangenen Anweisung zur Aktivierung eines Knotens verbunden ist. Bei mindestens einer Ausführungsform wird in Schritt 1408 bestimmt, ob der Knoten, der mit der Anweisung zur Aktivierung eines Knotens verbunden ist, lokalisiert wurde. Bei mindestens einer Ausführungsform wird bei Schritt 1408, wenn festgestellt wird, dass der mit der Anweisung zur Aktivierung eines Knotens verbundene Knoten nicht lokalisiert wurde („nein“-Verzweigung), die Ausführung des beispielhaften Verfahrens 1400 bei Schritt 1410 fortgesetzt. Bei mindestens einer Ausführungsform wird bei Schritt 1408, wenn festgestellt wird, dass der mit der Anweisung zur Aktivierung eines Knotens verbundene Knoten lokalisiert wurde („ja“-Zweig), die Ausführung des beispielhaften Verfahrens 1400 bei Schritt 1412 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 1410 ein Fehler zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler an einen aufrufenden Prozess zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung einer Fehlerberichts-API zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Signals zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Semaphors zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Sentinel-Wertes zurückgegeben. Bei mindestens einer Ausführungsform, die in 14 nicht dargestellt ist, geht das beispielhafte Verfahren 1400 nach dem Schritt 1410 zum Schritt 1416 über, der im Folgenden beschrieben wird. Bei mindestens einer Ausführungsform wird nach Schritt 1410 das beispielhafte Verfahren 1400 beendet.
  • Bei mindestens einer Ausführungsform wird in Schritt 1412 bestimmt, ob der lokalisierte Knoten, der mit der Anweisung zur Aktivierung eines Knotens verbunden ist, aktuell deaktiviert ist. Bei mindestens einer Ausführungsform wird in Schritt 1412, wenn festgestellt wird, dass der lokalisierte Knoten, der mit der Anweisung zur Aktivierung eines Knotens verbunden ist, aktuell nicht deaktiviert ist („nein“-Verzweigung), die Ausführung des beispielhaften Verfahrens bei Schritt 1416 fortgesetzt. Bei mindestens einer Ausführungsform wird in Schritt 1412, wenn festgestellt wird, dass der lokalisierte Knoten, der mit der Anweisung zur Aktivierung eines Knotens verbunden ist, derzeit deaktiviert ist („ja“-Zweig), die Ausführung des beispielhaften Verfahrens bei Schritt 1414 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 1414 der deaktivierte lokalisierte Knoten, der mit der Anweisung zur Aktivierung eines Knotens verbunden ist, unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, aktiviert. Bei mindestens einer Ausführungsform wird, wenn ein Knoten, der mit der Anweisung zur Aktivierung eines Knotens verbunden ist, aktiviert wird, eine Datenstruktur, die zur Beschreibung der mit dem Knoten verbundenen Funktionalität verwendet wird, wiederhergestellt. Bei mindestens einer Ausführungsform ist eine Datenstruktur, die zur Beschreibung der mit einem Knoten verbundenen Funktionalität verwendet wird, ein QMD. Bei mindestens einer Ausführungsform wird, wenn ein Knoten, der mit einer Anweisung zur Aktivierung eines Knotens verbunden ist, aktiviert wird, eine zuvor mit dem Knoten verbundene Funktionalität wiederhergestellt. Bei mindestens einer Ausführungsform wird nach Schritt 1414 die Ausführung des beispielhaften Verfahrens 1400 bei Schritt 1416 fortgesetzt. Bei mindestens einer Ausführungsform, die in 14 nicht dargestellt ist, kehrt das beispielhafte Verfahren 1400 zu Schritt 1404 zurück, um einen oder mehrere zusätzliche Knoten zu aktivieren, bevor es bei Schritt 1416 weitergeht. In mindestens einer Ausführungsform, die in 14 nicht dargestellt ist, fährt das beispielhafte Verfahren bei Schritt 1304 des beispielhaften Verfahrens 1300, das hier zumindest in Verbindung mit 13 beschrieben ist, fort, um einen oder mehrere Knoten zu deaktivieren, bevor es bei Schritt 1416 und/oder bei Schritt 1316 des beispielhaften Verfahrens 1300 weitergeht.
  • Bei mindestens einer Ausführungsform wird in Schritt 1416 ein instanziierter Ausführungsgraph mit deaktivierten und/oder aktivierten Knoten unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, ausgeführt. Bei mindestens einer Ausführungsform wird nach Schritt 1416 das beispielhafte Verfahren 1400 beendet. Bei mindestens einer Ausführungsform wird das beispielhafte Verfahren 1400 nach Schritt 1416 bei Schritt 1404 fortgesetzt, um zusätzliche Anweisungen zur Aktivierung von Knoten zu empfangen. Bei mindestens einer Ausführungsform wird das beispielhafte Verfahren 1400 nach dem Schritt 1416 bei dem Schritt 1304 des beispielhaften Verfahrens 1300 fortgesetzt, um Anweisungen zur Deaktivierung von Knoten zu empfangen. Bei mindestens einer Ausführungsform, die hier nicht dargestellt ist, kann das beispielhafte Verfahren 1400 und/oder das beispielhafte Verfahren 1300 eine Vielzahl von Anweisungen zum Deaktivieren von Knoten und/oder eine Vielzahl von Anweisungen zum Aktivieren von Knoten verarbeiten, bevor in Schritt 1416 ein instanziierter Ausführungsgraph mit deaktivierten und/oder aktivierten Knoten ausgeführt wird.
  • Bei mindestens einer Ausführungsform werden die Operationen des in 14 dargestellten beispielhaften Verfahrens 1400 in einer anderen Reihenfolge als in 14 angegeben ausgeführt. Bei mindestens einer Ausführungsform werden die Operationen des in 14 dargestellten beispielhaften Verfahrens 1400 gleichzeitig (oder parallel) durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 14 dargestellten beispielhaften Verfahrens 1400 von einer Vielzahl von Threads ausgeführt, die auf einem Prozessor wie dem Prozessor 102, der hier zumindest in Verbindung mit 1 beschrieben ist, laufen. Bei mindestens einer Ausführungsform werden Operationen des in 14 dargestellten beispielhaften Verfahrens 1400 von einer Vielzahl von Threads ausgeführt, die auf einem Grafikprozessor wie dem hier zumindest in Verbindung mit 1 beschriebenen Grafikprozessor 112 ausgeführt werden.
  • 15 veranschaulicht eine beispielhafte Umgebung 1500, in der gemäß mindestens einer Ausführungsform deaktivierte Graph-Knoten eines Ausführungsgraphen aktualisiert werden. Bei mindestens einer Ausführungsform empfängt ein Graph 1502 eine Anweisung 1504 zur Deaktivierung des Knotens „C“ unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind. Bei mindestens einer Ausführungsform ist in einem resultierenden Graphen 1506 der Knoten „C“ durch einen deaktivierten Knoten (bezeichnet als Ø) ersetzt. Bei mindestens einer Ausführungsform können, wenn der Graph 1510 (der mit dem sich ergebenden Graph1506 identisch ist) eine erste Aktualisierung 1508 des deaktivierten Knotens „C“ empfängt, die Daten für die erste Aktualisierung 1508 unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, in einem Speicher gespeichert werden. Bei mindestens einer Ausführungsform, wenn der Graph 1510 eine zweite Aktualisierung 1512 für den deaktivierten Knoten „C“ empfängt, können die Daten für die zweite Aktualisierung 1512 in dem Speicher gespeichert werden, wobei Systeme und Verfahren wie die hier beschriebenen verwendet werden.
  • Bei mindestens einer Ausführungsform empfängt der Graph 1510 eine Anweisung 1514 zur Aktivierung des Knotens „C“ unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind. Bei mindestens einer Ausführungsform ist in einem resultierenden Graphen 1516 der deaktivierte Knoten (mit Ø bezeichnet) durch einen wiederhergestellten Knoten „C“ ersetzt, wobei Systeme und Verfahren wie die hier beschriebenen verwendet wurden. Bei mindestens einer Ausführungsform kann beim Ersetzen des deaktivierten Knotens (mit Ø bezeichnet) durch den wiederhergestellten Knoten eine jüngste bzw. aktuellste Aktualisierung auf den wiederhergestellten Knoten „C“ angewendet werden. Bei mindestens einer Ausführungsform kann beispielsweise die zweite Aktualisierung 1512 auf den wiederhergestellten Knoten „C“ angewendet werden, wenn der Knoten „C“ wiederhergestellt wird. Bei mindestens einer Ausführungsform können beim Ersetzen des deaktivierten Knotens (mit Ø bezeichnet) durch den wiederhergestellten Knoten alle zuvor gespeicherten Aktualisierungen auf den wiederhergestellten Knoten „C“ angewendet werden. Bei mindestens einer Ausführungsform kann zum Beispiel die erste Aktualisierung 1508 zuerst auf den Knoten „C“ angewendet werden, wenn der Knoten „C“ wiederhergestellt wird, und dann kann die zweite Aktualisierung 1512 auf den wiederhergestellten Knoten „C“ angewendet werden.
  • 16 illustriert ein beispielhaftes Verfahren 1600 zum Aktualisieren von deaktivierten Graph-Knoten eines Ausführungsgraphen gemäß mindestens einer Ausführungsform. Bei mindestens einer Ausführungsform führt ein Prozessor wie der Prozessor 102 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 1600 auszuführen. Bei mindestens einer Ausführungsform führt ein Grafikprozessor wie der Grafikprozessor 112 Anweisungen aus, um mindestens einen Abschnitt des beispielhaften Verfahrens 1600 auszuführen. In mindestens einer Ausführungsform wird in Schritt 1602 ein Ausführungsgraph unter Verwendung eines Superset-Ausführungsgraph-Templates wie des Superset-Ausführungsgraph-Templates 702, das hier zumindest in Verbindung mit 7 beschrieben ist, instanziiert, wobei Systeme und Verfahren wie die hier beschriebenen verwendet werden. Bei mindestens einer Ausführungsform geht die Ausführung nach Schritt 1602 zu Schritt 1604 über.
  • Bei mindestens einer Ausführungsform wird in Schritt 1604 eine Knotenaktualisierung empfangen. Bei mindestens einer Ausführungsform weist eine Knotenaktualisierung ein oder mehrere Datenelemente auf, die zur Aktualisierung von mit dem Knoten verbundenen Daten verwendet werden können. Bei mindestens einer Ausführungsform kann eine Knotenaktualisierung zum Beispiel ein oder mehrere Datenelemente aufweisen, die Parameter für den Knoten angeben. Bei mindestens einer Ausführungsform geht die Ausführung des beispielhaften Verfahrens 1600 nach Schritt 1604 zu Schritt 1606 über.
  • Bei mindestens einer Ausführungsform wird in Schritt 1606 eine Suche nach einem Knoten, der mit der Knotenaktualisierung verbunden ist, durchgeführt. Bei mindestens einer Ausführungsform geht das beispielhafte Verfahren 1600 nach Schritt 1606 zu Schritt 1608 über.
  • Bei mindestens einer Ausführungsform wird in Schritt 1608 bestimmt, ob der mit der Knotenaktualisierung (in Schritt 1606) verbundene Knoten gefunden wurde. Bei mindestens einer Ausführungsform wird in Schritt 1608, wenn festgestellt wird, dass der mit der Knotenaktualisierung verbundene Knoten nicht gefunden wurde („nein“-Verzweigung), die Ausführung des beispielhaften Verfahrens 1600 bei Schritt 1610 fortgesetzt. Bei mindestens einer Ausführungsform wird bei Schritt 1608, wenn festgestellt wird, dass der mit der Knotenaktualisierung verbundene Knoten gefunden wurde („ja“-Zweig), die Ausführung des beispielhaften Verfahrens 1600 bei Schritt 1612 fortgesetzt.
  • Bei mindestens einer Ausführungsform wird in Schritt 1610 ein Fehler zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler an einen aufrufenden Prozess zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung einer Fehlerberichts-API zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Signals zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Semaphors zurückgegeben. Bei mindestens einer Ausführungsform wird der Fehler unter Verwendung eines Sentinel-Wertes zurückgegeben. Bei mindestens einer Ausführungsform wird das beispielhafte Verfahren 1600 nach Schritt 1610 beendet. Bei mindestens einer Ausführungsform, die in 16 nicht dargestellt ist, wird das beispielhafte Verfahren nach dem Schritt 1610 bei Schritt 1618 fortgesetzt, wie es hier beschrieben ist.
  • Bei mindestens einer Ausführungsform wird in Schritt 1612 bestimmt, ob der mit der Knotenaktualisierung verbundene Knoten aktiviert ist. Bei mindestens einer Ausführungsform wird bei Schritt 1612, wenn festgestellt wird, dass der mit der Knotenaktualisierung verbundene Knoten nicht aktiviert ist („nein“-Verzweigung), die Ausführung des beispielhaften Verfahrens 1600 bei Schritt 1614 fortgesetzt. Bei mindestens einer Ausführungsform wird bei Schritt 1612, wenn festgestellt wird, dass der mit der Knotenaktualisierung verbundene Knoten aktiviert ist („ja“-Zweig), die Ausführung des beispielhaften Verfahrens 1600 bei Schritt 1616 fortgesetzt.
  • Bei mindestens einer Ausführungsform werden in Schritt 1614 Knotendaten, die mit der Knotenaktualisierung an dem nicht aktivierten Knoten verbunden sind, zur späteren Aktivierung gespeichert. Bei mindestens einer Ausführungsform werden die Knotendaten, die mit der Knotenaktualisierung an dem nicht aktivierten Knoten verbunden sind, zur späteren Aktivierung in einem Speicher wie dem Prozessorspeicher 104 gespeichert, wie es hier zumindest in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform werden die Knotendaten, die mit der Knotenaktualisierung an dem nicht aktivierten Knoten verbunden sind, zur späteren Aktivierung in einem Speicher wie dem Grafikprozessorspeicher 114 gespeichert, der hier zumindest in Verbindung mit 1 beschrieben ist. Bei mindestens einer Ausführungsform geht das beispielhafte Verfahren 1600 nach Schritt 1614 zu Schritt 1618 über.
  • In mindestens einer Ausführungsform, die in 16 nicht dargestellt ist, können, wenn ein Knoten später unter Verwendung von Systemen und Verfahren wie den hier beschriebenen aktiviert wird, in dem Speicher gespeicherte Knotendaten für die spätere Aktivierung verwendet werden, um den später aktivierten Knoten zu aktualisieren, wie es hier zumindest in Verbindung mit 15 beschrieben ist.
  • Bei mindestens einer Ausführungsform werden in Schritt 1616 Knotendaten, die mit einer Knotenaktualisierung eines aktivierten Knotens verbunden sind, verwendet, um den mit der Knotenaktualisierung verbundenen Knoten unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind, zu aktualisieren. Bei mindestens einer Ausführungsform geht das beispielhafte Verfahren 1600 nach Schritt 1616 zu Schritt 1618 über.
  • Bei mindestens einer Ausführungsform wird in Schritt 1618 bestimmt, ob eine nächste Aktualisierung durchgeführt werden kann. Bei mindestens einer Ausführungsform wird bei Schritt 1618, wenn festgestellt wird, dass keine nächste Aktualisierung durchgeführt werden kann („nein“-Verzweigung), die Ausführung des beispielhaften Verfahrens 1600 bei Schritt 1620 fortgesetzt. Bei mindestens einer Ausführungsform wird bei Schritt 1618, wenn festgestellt wird, dass eine nächste Aktualisierung durchgeführt werden kann („ja“-Zweig), die Ausführung des beispielhaften Verfahrens 1600 bei Schritt 1604 fortgesetzt, um eine nächste Knotenaktualisierung zu empfangen.
  • Bei mindestens einer Ausführungsform wird in Schritt 1620 ein Hinweis des erfolgreichen Abschlusses des Verfahrens 1600 zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 1600 an einen aufrufenden Prozess zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 1600 über eine Berichts-API zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 1600 unter Verwendung eines Signals zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 1600 unter Verwendung eines Semaphors zurückgegeben. Bei mindestens einer Ausführungsform wird der Hinweis auf den erfolgreichen Abschluss des Verfahrens 1600 unter Verwendung eines Sentinel-Wertes zurückgegeben. Bei mindestens einer Ausführungsform wird nach Schritt 1620 das beispielhafte Verfahren 1600 beendet. Bei mindestens einer Ausführungsform, die in 16 nicht dargestellt ist, wird das beispielhafte Verfahren 1600 nach Schritt 1620 bei Schritt 1604 fortgesetzt, um eine nächste Knotenaktualisierung zu empfangen.
  • Bei mindestens einer Ausführungsform werden die Operationen des in 16 dargestellten beispielhaften Verfahrens 1600 in einer anderen Reihenfolge als in 16 angegeben durchgeführt. Bei mindestens einer Ausführungsform werden die Operationen des in 16 dargestellten beispielhaften Verfahrens 1600 gleichzeitig (oder parallel) durchgeführt. In mindestens einer Ausführungsform werden die Operationen des in 16 dargestellten beispielhaften Verfahrens 1600 von einer Vielzahl von Threads ausgeführt, die auf einem Prozessor wie dem Prozessor 102, der hier zumindest in Verbindung mit 1 beschrieben ist, laufen. Bei mindestens einer Ausführungsform werden Operationen des in 16 dargestellten beispielhaften Verfahrens 1600 von einer Vielzahl von Threads ausgeführt, die auf einem Grafikprozessor wie dem hier zumindest in Verbindung mit 1 beschriebenen Grafikprozessor 112 ausgeführt werden.
  • 17 zeigt einen beispielhaften Softwarestack 1700, in dem gemäß mindestens einer Ausführungsform Aufrufe einer Anwendungsverarbeitungsschnittstelle verarbeitet werden. Bei mindestens einer Ausführungsform führt eine Anwendung 1702 eine Anweisung aus, um festzustellen, ob ein Merkmal 1704 unterstützt wird. Bei mindestens einer Ausführungsform führt eine Anwendung 1702 eine Anweisung aus, um festzustellen, ob ein Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten unterstützt wird. Bei mindestens einer Ausführungsform führt eine Anwendung 1702 eine Anweisung aus, um festzustellen, ob ein Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist, unterstützt wird. Bei mindestens einer Ausführungsform führt eine Anwendung 1702 eine Anweisung aus, um festzustellen, ob ein Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird.
  • Bei mindestens einer Ausführungsform verwendet 1706 eine Anwendung 1702 eine oder mehrere Laufzeit-APIs 1708, um festzustellen, ob ein Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten unterstützt wird. Bei mindestens einer Ausführungsform verwendet 1706 eine Anwendung 1702 die eine oder die mehreren Laufzeit-APIs 1708, um festzustellen, ob ein Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist, unterstützt wird. Bei mindestens einer Ausführungsform verwendet 1706 eine Anwendung 1702 die eine oder die mehreren Laufzeit-APIs 1708, um zu bestimmen, ob ein Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist, unterstützt wird.
  • Bei mindestens einer Ausführungsform verwenden 1710 die Laufzeit-APIs 1708 eine oder mehrere Treiber-APIs 1712, um festzustellen, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten unterstützt wird. Bei mindestens einer Ausführungsform verwenden 1710 die Laufzeit-APIs 1708 die eine oder die mehreren Treiber-APIs 1712, um festzustellen, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird. Bei mindestens einer Ausführungsform verwenden 1710 die Laufzeit-APIs 1708 die eine oder die mehreren Treiber-APIs 1712, um festzustellen, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird.
  • Bei mindestens einer Ausführungsform, die in 17 nicht dargestellt ist, verwendet eine Anwendung 1702 die eine oder die mehreren Treiber-APIs 1712, um festzustellen, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten unterstützt wird. Bei mindestens einer Ausführungsform, die in 17 nicht dargestellt ist, verwendet eine Anwendung 1702 die eine oder die mehreren Treiber-APIs 1712, um festzustellen, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird. Bei mindestens einer in 17 nicht gezeigten Ausführungsform verwendet eine Anwendung 1702 die eine oder die mehreren Treiber-APIs 1712, um festzustellen, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird.
  • Bei mindestens einer Ausführungsform fragen 1714 die Treiber-APIs 1712 eine Computersystem-Hardware 1716 ab, um festzustellen, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten unterstützt wird. Bei mindestens einer Ausführungsform fragen 1714 die Treiber-APIs 1712 die Computersystem-Hardware 1716 ab, um festzustellen, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird. Bei mindestens einer Ausführungsform fragen 1714 die Treiber-APIs 1712 die Computersystem-Hardware 1716 ab, um festzustellen, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird.
  • Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten von einem Prozessor 1734 unterstützt wird, indem ein Satz von Fähigkeiten abgefragt wird, die dem Prozessor 1734 zugeordnet sind. Bei mindestens einer Ausführungsform stellt die Computersystem-Hardware 1716 fest, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Prozessor 1734 unterstützt wird, indem der Satz von Fähigkeiten abgefragt wird, die dem Prozessor 1734 zugeordnet sind. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Prozessor 1734 unterstützt wird, indem ein Satz von Fähigkeiten abgefragt wird, die dem Prozessor 1734 zugeordnet sind.
  • Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten von dem Prozessor 1734 unterstützt wird, wobei ein Betriebssystem des Prozessors 1734 verwendet wird. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Prozessor 1734 unterstützt wird, wobei das Betriebssystem des Prozessors 1734 verwendet wird. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des GraphenCodes auszuführen ist, von dem Prozessor 1734 unterstützt wird, wobei das Betriebssystem des Prozessors 1734 verwendet wird.
  • Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten von einem Grafikprozessor 1736 unterstützt wird, indem ein Satz von Fähigkeiten abgefragt wird, die dem Grafikprozessor 1736 zugeordnet sind. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graphencodes auszuführen ist, von dem Grafikprozessor 1736 unterstützt wird, indem der Satz von Fähigkeiten abgefragt wird, die dem Grafikprozessor 1736 zugeordnet sind. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Grafikprozessor 1736 unterstützt wird, indem der Satz von Fähigkeiten abgefragt wird, die dem Grafikprozessor 1736 zugeordnet sind.
  • Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten von dem Grafikprozessor 1736 unterstützt wird, indem ein Betriebssystem des Prozessors 1734 verwendet wird. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Grafikprozessor 1736 unterstützt wird, wobei das Betriebssystem des Prozessors 1734 verwendet wird. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Grafikprozessor 1736 unterstützt wird, wobei das Betriebssystem des Prozessors 1734 verwendet wird.
  • Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten von dem Graphikprozessor 1736 unterstützt wird, wobei ein Betriebssystem des Graphikprozessors 1736 verwendet wird. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Grafikprozessor 1736 unterstützt wird, wobei das Betriebssystem des Grafikprozessors 1736 verwendet wird. Bei mindestens einer Ausführungsform bestimmt die Computersystem-Hardware 1716, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, von dem Grafikprozessor 1736 unterstützt wird, wobei das Betriebssystem des Grafikprozessors 1736 verwendet wird.
  • Bei mindestens einer Ausführungsform gibt die Computersystem-Hardware 1716, nachdem die Computersystem-Hardware bestimmt bzw. festgestellt hat, ob das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten unterstützt wird, ein Bestimmungsergebnis zurück 1718, wobei die Treiber-APIs 1712 verwendet werden, die ein Bestimmungsergebnis zurückgeben können 1720, wobei die Laufzeit-APIs 1708 verwendet werden, die ein Bestimmungsergebnis an die Anwendung 1702 zurückgeben können 1722. Bei mindestens einer Ausführungsform gibt die Computersystem-Hardware 1716, nachdem die Computersystem-Hardware bestimmt bzw. festgestellt hat, ob das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird, ein Bestimmungsergebnis zurück 1718, wobei die Treiber-APIs 1712 verwendet werden, die ein Bestimmungsergebnis zurückgeben können 1720, wobei die Laufzeit-APIs 1708 verwendet werden, die ein Bestimmungsergebnis an die Anwendung 1702 zurückgeben können 1722. Bei mindestens einer Ausführungsform gibt die Computersystem-Hardware 1716, nachdem die Computersystem-Hardware 1716 bestimmt bzw. festgestellt hat, ob das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird, ein Bestimmungsergebnis zurück 1718, wobei die Treiber-APIs 1712 verwendet werden, die ein Bestimmungsergebnis zurückgeben können 1720, wobei die Laufzeit-APIs 1708 verwendet werden, die ein Bestimmungsergebnis an die Anwendung 1702 zurückgeben können 1722.
  • Bei mindestens einer Ausführungsform, wenn eine Anwendung 1702 ein Bestimmungsergebnis erhält, das angibt, dass das Merkmal 1704 zum Aktivieren und/oder Deaktivieren von Graph-Knoten unterstützt wird 1724, aktiviert und/oder deaktiviert 1726 die Anwendung 1702 Graph-Knoten unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind. Bei mindestens einer Ausführungsform, wenn die Anwendung 1702 ein Bestimmungsergebnis empfängt, das angibt, dass das Merkmal 1704 zur Steuerung, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird 1724, aktiviert und/oder deaktiviert 1726 die Anwendung 1702 Graph-Knoten unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind. Bei mindestens einer Ausführungsform, wenn die Anwendung 1702 ein Bestimmungsergebnis erhält, das angibt, dass das Merkmal 1704 zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, unterstützt wird 1724, aktiviert und/oder deaktiviert 1726 die Anwendung 1702 Graph-Knoten unter Verwendung von Systemen und Verfahren, wie sie hier beschrieben sind.
  • Bei mindestens einer Ausführungsform aktiviert und/oder deaktiviert 1726 die Anwendung 1702 Graph-Knoten unter Verwendung 1728 der Laufzeit-APIs 1708. Bei mindestens einer Ausführungsform aktivieren und/oder deaktivieren 1726 die Laufzeit-APIs 1708 die Graph-Knoten unter Verwendung 1730 der Treiber-APIs 1712. Bei mindestens einer Ausführungsform, die in 17 nicht dargestellt ist, aktiviert und/oder deaktiviert 1726 die Anwendung 1702 die Graph-Knoten unter Verwendung 1730 der Treiber-APIs 1712. Bei mindestens einer Ausführungsform aktivieren und/oder deaktivieren 1726 die Treiber-APIs 1712 die Graph-Knoten unter Verwendung 1732 der Computersystem-Hardware 1716.
  • In der folgenden Beschreibung werden zahlreiche spezifische Details dargelegt, um ein gründlicheres Verständnis von mindestens einer Ausführungsform zu ermöglichen. Dem Fachmann ist jedoch klar, dass die erfindungsgemäßen Konzepte auch ohne eines oder mehrere dieser spezifischen Details ausgeführt werden können.
  • Rechenzentrum
  • 18 veranschaulicht ein beispielhaftes Rechenzentrum 1800, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Rechenzentrum 1800, ohne darauf beschränkt zu sein, eine Rechenzentrum-Infrastrukturschicht 1810, eine Frameworkschicht 1820, eine Softwareschicht 1830 und eine Anwendungsschicht 1840.
  • In mindestens einer Ausführungsform, wie in 18 gezeigt, kann die Rechenzentrum-Infrastrukturschicht 1810 einen Ressourcenorchestrator 1812, gruppierte Rechenressourcen 1814 und Knoten-Rechenressourcen („Knoten-C.R.s“) 1816(1)-1816(N) beinhalten, wobei „N“ eine beliebige ganze, positive Zahl darstellt. In mindestens einer Ausführungsform können die Knoten-C.R.s 1816(1)-1816(N), ohne darauf beschränkt zu sein, eine beliebige Anzahl von Zentralverarbeitungseinheiten („CPUs“) oder anderen Prozessoren (einschließlich Beschleunigern, feldprogrammierbaren Gate-Arrays („FPGAs“), Datenverarbeitungseinheiten bzw. Data Processing Units („DPUs“) in Netzwerkeinrichtungen, Grafikprozessoren usw.), Speichervorrichtungen (z.B. dynamischer Festspeicher), Speichervorrichtungen (z.B. Solid-State- oder Festplattenlaufwerke), Netzwerk-Eingabe-/Ausgabe-Geräte („NW E/A“), Netzwerk-Switches, virtuelle Maschinen („VMs“), Leistungsmodule und Kühlmodule usw. beinhalten. In mindestens einer Ausführungsform können ein oder mehrere Knoten-C.R.s unter den Knoten-C.R.s 1816(1)-1816(N) ein Server mit einer oder mehreren der vorstehend erwähnten Rechenressourcen sein.
  • In mindestens einer Ausführungsform können die gruppierten Rechenressourcen 1814 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 1814 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 1812 einen oder mehrere Knoten-CRs 1816(1)-1816(N) und/oder gruppierte Rechenressourcen 1814 konfigurieren oder anderweitig steuern. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 1812 eine Software-Design-Infrastruktur („SDI“)-Verwaltungseinheit für das Rechenzentrum 1800 beinhalten. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 1812 Hardware, Software oder eine Kombination davon umfassen.
  • In mindestens einer Ausführungsform, wie in 12 gezeigt, beinhaltet die Frameworkschicht 1820, ohne Beschränkung darauf, einen Job-Scheduler 1832, einen Konfigurationsmanager 1834, einen Ressourcen-Manager 1836 und ein verteiltes Dateisystem 1838. In mindestens einer Ausführungsform kann die Frameworkschicht 1820 ein Framework zur Unterstützung der Software 1852 der Softwareschicht 1830 und/oder einer oder mehrerer Anwendung(en) 1842 der Anwendungsschicht 1840 beinhalten. In mindestens einer Ausführungsform können die Software 1852 oder die Anwendung(en) 1842 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 1820 eine Art von freiem und quelloffenem Software-Webanwendungs-Framework wie Apache SparkTM (nachstehend „Spark“) sein, das ein verteiltes Dateisystem 1838 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 1832 einen Spark-Treiber enthalten, um die Planung von Arbeitslasten zu erleichtern, die von verschiedenen Schichten des Rechenzentrums 1800 unterstützt werden. In mindestens einer Ausführungsform kann der Konfigurationsmanager 1834 in der Lage sein, verschiedene Schichten zu konfigurieren, wie beispielsweise die Softwareschicht 1830 und die Frameworkschicht 1820, einschließlich Spark und das verteilte Dateisystem 1838 zur Unterstützung der Verarbeitung großer Datenmengen. In mindestens einer Ausführungsform kann der Ressourcen-Manager 1836 in der Lage sein, geclusterte oder gruppierte Rechenressourcen zu verwalten, die zur Unterstützung des verteilten Dateisystems 1838 und des Job-Schedulers 1832 gemappt oder zugeordnet sind. In mindestens einer Ausführungsform können geclusterte oder gruppierte Rechenressourcen die gruppierten Rechenressourcen 1814 auf der Rechenzentrums-Infrastrukturschicht 1810 umfassen. In mindestens einer Ausführungsform kann sich der Ressourcen-Manager 1836 mit dem Ressourcenorchestrator 1812 koordinieren, um diese gemappten oder zugeordneten Rechenressourcen zu verwalten.
  • In mindestens einer Ausführungsform kann die in der Softwareschicht 1830 enthaltene Software 1852 Software enthalten, die von mindestens Teilen der Knoten C.R.s 1816(1)-1816(N), den gruppierten Rechenressourcen 1814 und/oder dem verteilten Dateisystem 1838 der Frameworkschicht 1820 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 1840 enthaltene(n) Anwendung(en) 1842 eine oder mehrere Arten von Anwendungen beinhalten, die von mindestens Teilen der Knoten C.R.s 1816(1)-1816(N), den gruppierten Rechenressourcen 1814 und/oder dem verteilten Dateisystem 1838 der Frameschicht 1820 verwendet werden. Mindestens eine oder mehrere Arten von Anwendungen können, ohne Beschränkung darauf, CU-DA-Anwendungen beinhalten.
  • In mindestens einer Ausführungsform können der Konfigurationsmanager 1834, der Ressourcen-Manager 1836 und der Ressourcenorchestrator 1812 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 1800 davon entlasten, möglicherweise schlechte Konfigurationsentscheidungen zu treffen und möglicherweise nicht ausgelastete und/oder schlecht leistende Teile eines Rechenzentrums zu vermeiden.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 18 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens eine der gruppierten Rechenressourcen 1814 und der Knoten C.R. 1816(1-N) verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine der gruppierten Rechenressourcen 1814 und der Knoten C.R. 1816(1-N) verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine der gruppierten Rechenressourcen 1814 und des Knotens C.R. 1816(1-N) verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 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.
  • 19 veranschaulicht ein Verarbeitungssystem 1900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Verarbeitungssystem 1900 einen oder mehrere Prozessoren 1902 und einen oder mehrere Grafikprozessoren 1908, und kann ein Einzelprozessor-Desktop-System, ein Multiprozessor-Workstation-System oder ein Serversystem mit einer großen Anzahl von Prozessoren 1902 oder Prozessorkernen 1907 sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 1900 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 1900 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 1900 ein Mobiltelefon, ein Smartphone, ein Tablet-Computergerät oder ein mobiles Internetgerät. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1900 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 1900 ein Fernseh- oder Set-Top-Box-Gerät mit einem oder mehreren Prozessoren 1902 und einer grafischen Oberfläche, die von einem oder mehreren Grafikprozessoren 1908 erzeugt wird.
  • In mindestens einer Ausführungsform enthalten ein oder mehrere Prozessoren 1902 jeweils einen oder mehrere Prozessorkerne 1907 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 1907 so konfiguriert, dass er einen bestimmten Befehlssatz 1909 verarbeitet. In mindestens einer Ausführungsform kann der Befehlssatz 1909 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 1907 jeweils einen anderen Befehlssatz 1909 verarbeiten, der Anweisungen enthalten kann, um die Emulation anderer Befehlssätze zu erleichtern. In mindestens einer Ausführungsform kann der Prozessorkern 1907 auch andere Verarbeitungsvorrichtungen enthalten, wie z.B. einen digitalen Signalprozessor („DSP“).
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 1902 einen Cachespeicher („Cache“) 1904. In mindestens einer Ausführungsform kann der Prozessor 1902 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform wird der Cachespeicher von verschiedenen Komponenten des Prozessors 1902 gemeinsam genutzt. In mindestens einer Ausführungsform verwendet der Prozessor 1902 auch einen externen Cache (z.B. einen Level 3 („L3“)-Cache oder Last Level Cache („LLC“)) (nicht dargestellt), der von den Prozessorkernen 1907 unter Verwendung bekannter Cache-Kohärenztechniken gemeinsam genutzt werden kann. In mindestens einer Ausführungsform ist zusätzlich eine Registerdatei 1906 in dem Prozessor 1902 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 1906 Universalregister oder andere Register enthalten.
  • In mindestens einer Ausführungsform ist/sind ein oder mehrere Prozessor(en) 1902 mit einem oder mehreren Schnittstellenbus(en) 1910 gekoppelt, um Kommunikationssignale wie Adress-, Daten- oder Steuersignale zwischen dem Prozessor 1902 und anderen Komponenten in dem Verarbeitungssystem 1900 zu übertragen. In mindestens einer Ausführungsform kann der Schnittstellenbus 1910 ein Prozessorbus sein, wie z.B. eine Version eines Direct Media Interface („DMI“)-Busses. In mindestens einer Ausführungsform ist der Schnittstellenbus 1910 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) 1902 eine integrierte Speichersteuerung 1916 und einen Plattformsteuerungs-Hub 1930. In mindestens einer Ausführungsform erleichtert die Speichersteuerung 1916 die Kommunikation zwischen einem Speichervorrichtung und anderen Komponenten des Verarbeitungssystems 1900, während der Plattformsteuerungs-Hub („PCH“) 1930 Verbindungen zu Eingabe/Ausgabe-Geräten („I/O“) über einen lokalen I/O-Bus bereitstellt.
  • In mindestens einer Ausführungsform kann die Speichervorrichtung 1920 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 1920 als Systemspeicher für das Verarbeitungssystem 1900 arbeiten, um Daten 1922 und Anweisungen 1921 zur Verwendung zu speichern, wenn ein oder mehrere Prozessoren 1902 eine Anwendung oder einen Prozess ausführen. In mindestens einer Ausführungsform koppelt die Speichersteuerung 1916 auch mit einem optionalen externen Grafikprozessor 1912, der mit einem oder mehreren Grafikprozessoren 1908 in den Prozessoren 1902 kommunizieren kann, um Grafik- und Medienoperationen durchzuführen. In mindestens einer Ausführungsform kann eine Anzeigevorrichtung 1911 mit dem/den Prozessor(en) 1902 verbunden sein. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 1911 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 1911 eine kopfmontierte Anzeige („HMD“), wie beispielsweise eine stereoskopische Anzeigevorrichtung zur Verwendung in Anwendungen der virtuellen Realität („VR“) oder der erweiterten Realität („AR“), beinhalten.
  • In mindestens einer Ausführungsform ermöglicht der Plattformsteuerungs-Hub 1930 die Verbindung von Peripheriegeräten mit der Speichervorrichtung 1920 und dem Prozessor 1902 über einen Hochgeschwindigkeits-I/O-Bus. In mindestens einer Ausführungsform beinhalten die I/O-Peripheriegeräte, ohne darauf beschränkt zu sein, eine Audiosteuerung 1946, eine Netzwerksteuerung 1934, eine Firmware-Schnittstelle 1928, einen drahtlosen Transceiver 1926, Berührungssensoren 1925 und eine Datenspeichervorrichtung 1924 (z.B. ein Festplattenlaufwerk, einen Flash-Speicher usw.). In mindestens einer Ausführungsform kann die Datenspeichervorrichtung 1924 ü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 1925 Touchscreen-Sensoren, Drucksensoren oder Fingerabdrucksensoren beinhalten. In mindestens einer Ausführungsform kann der drahtlose Transceiver 1926 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 1928 eine Kommunikation mit System-Firmware und kann z.B. eine einheitliche erweiterbare Firmware-Schnittstelle („UEFI“) sein. In mindestens einer Ausführungsform kann die Netzwerksteuerung 1934 eine Netzwerkverbindung zu einem kabelgebundenen Netzwerk ermöglichen. In mindestens einer Ausführungsform koppelt eine Hochleistungs-Netzwerksteuerung (nicht dargestellt) mit dem Schnittstellenbus 1910. In mindestens einer Ausführungsform ist die Audiosteuerung 1946 eine Mehrkanal-High-Definition-Audiosteuerung. In mindestens einer Ausführungsform enthält das Verarbeitungssystem 1900 einen optionalen Legacy-I/O-Controller 1940 zur Kopplung von Legacy-Geräten (z.B. Personal System 2 („PS/2“)) mit dem Verarbeitungssystem 1900. In mindestens einer Ausführungsform kann der Plattformsteuerungs-Hub 1930 auch mit einem oder mehreren Universal Serial Bus („USB“)-Controllern 1942 verbinden, die Eingabevorrichtungen, wie z.B. Tastatur- und Mauskombinationen 1943, eine Kamera 1944 oder andere USB-Eingabevorrichtungen verbinden.
  • In mindestens einer Ausführungsform kann eine Instanz der Speichersteuerung 1916 und des Plattformsteuerungs-Hubs 1930 in einen diskreten externen Grafikprozessor, wie beispielsweise den externen Grafikprozessor 1912, integriert sein. In mindestens einer Ausführungsform können der Plattformsteuerungs-Hub 1930 und/oder die Speichersteuerung 1916 extern zu einem oder mehreren Prozessor(en) 1902 sein. In mindestens einer Ausführungsform kann das Verarbeitungssystem 1900 beispielsweise eine externe Speichersteuerung 1916 und einen Plattformsteuerungs-Hub 1930 enthalten, der als ein Speichersteuerungs-Hub und Peripheriesteuerungs-Hub innerhalb eines System-Chipsatzes konfiguriert sein kann, der mit dem/den Prozessor(en) 1902 in Verbindung steht.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 19 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens eine von dem bzw. den Prozessor(en) 1902 und dem externen Grafikprozessor 1912 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine von dem bzw. den Prozessor(en) 1902 und dem externen Grafikprozessor 1912 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine von dem bzw. den Prozessor(en) 1902 und dem externen Grafikprozessor 1912 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 20 veranschaulicht ein Computersystem 2000 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann das Computersystem 2000 ein System mit miteinander verbundenen Vorrichtungen und Komponenten, ein SOC oder eine Kombination davon sein. In mindestens einer Ausführungsform ist das Computersystem 2000 mit einem Prozessor 2002 ausgebildet, der Ausführungseinheiten zum Ausführen einer Anweisung enthalten kann. In mindestens einer Ausführungsform kann das Computersystem 2000, ohne Beschränkung darauf, eine Komponente, wie beispielsweise den Prozessor 2002, 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 2000 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 2000 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 2000 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 2000, ohne Beschränkung darauf, einen Prozessor 2002 enthalten, der, ohne Beschränkung darauf, eine oder mehrere Ausführungseinheiten 2008 enthalten kann, die so konfiguriert sein können, dass sie ein Compute Unified Device Architecture („CU-DA“)-Programm (CLIDA® 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 2000 ein Einzelprozessor-Desktop- oder ein Serversystem. In mindestens einer Ausführungsform kann das Computersystem 2000 ein Multiprozessorsystem sein. In mindestens einer Ausführungsform kann der Prozessor 2002, 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 2002 mit einem Prozessorbus 2010 gekoppelt sein, der Datensignale zwischen dem Prozessor 2002 und anderen Komponenten in dem Computersystem 2000 übertragen kann.
  • In mindestens einer Ausführungsform kann der Prozessor 2002, ohne Beschränkung darauf, einen internen Level 1 („L1“)-Cachespeicher („Cache“) 2004 enthalten. In mindestens einer Ausführungsform kann der Prozessor 2002 einen einzigen internen Cache oder mehrere Ebenen von internem Cache haben. In mindestens einer Ausführungsform kann sich der Cachespeicher außerhalb des Prozessors 2002 befinden. In mindestens einer Ausführungsform kann der Prozessor 2002 auch eine Kombination aus sowohl internen als auch externen Caches enthalten. In mindestens einer Ausführungsform kann eine Registerdatei 2006 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 2008, einschließlich, ohne Beschränkung darauf, von Logik zur Durchführung von Ganzzahl- und Gleitkommaoperationen, ebenfalls in dem Prozessor 2002. Der Prozessor 2002 kann auch einen Nur-Lese-Speicher („ROM“) für Mikrocode („u-code“) enthalten, der Mikrocode für bestimmte Makrobefehle speichert. In mindestens einer Ausführungsform kann die Ausführungseinheit 2008 Logik zur Verarbeitung eines gepackten Befehlssatzes 2009 enthalten. In mindestens einer Ausführungsform können durch Aufnahme des gepackten Befehlssatzes 2009 in einen Befehlssatz eines Universalprozessors 2002 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 2002 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 2008 auch in Mikrocontrollern, eingebetteten Prozessoren, Grafikvorrichtungen, DSPs und anderen Arten von Logikschaltungen verwendet werden. In mindestens einer Ausführungsform kann das Computersystem 2000, ohne Beschränkung darauf, einen Speicher 2020 enthalten. In mindestens einer Ausführungsform kann der Speicher 2020 als eine DRAM-Vorrichtung, eine SRAM-Vorrichtung, eine Flash-Speicher-Vorrichtung oder eine andere Speichervorrichtung implementiert sein. Der Speicher 2020 kann Anweisung(en) 2019 und/oder Daten 2021 speichern, die durch Datensignale repräsentiert werden, die von dem Prozessor 2002 ausgeführt werden können.
  • In mindestens einer Ausführungsform kann ein Systemlogikchip mit dem Prozessorbus 2010 und dem Speicher 2020 gekoppelt sein. In mindestens einer Ausführungsform kann der Systemlogikchip, ohne Beschränkung darauf, einen Speichersteuerungs-Hub („MCH“) 2016 enthalten, und kann der Prozessor 2002 mit dem MCH 2016 über den Prozessorbus 2010 kommunizieren. In mindestens einer Ausführungsform kann der MCH 2016 einen Speicherpfad 2018 mit hoher Bandbreite zu dem Speicher 2020 zur Befehls- und Datenspeicherung und zur Speicherung von Grafikbefehlen, Daten und Texturen bereitstellen. In mindestens einer Ausführungsform kann der MCH 2016 Datensignale zwischen dem Prozessor 2002, dem Speicher 2020 und anderen Komponenten in dem Computersystem 2000 leiten und Datensignale zwischen dem Prozessorbus 2010, dem Speicher 2020 und einer System-I/O 2022 überbrücken. In mindestens einer Ausführungsform kann der Systemlogikchip einen Grafik-Port zur Kopplung mit einer Grafiksteuerung bereitstellen. In mindestens einer Ausführungsform kann der MCH 2016 über einen Speicherpfad 2018 mit hoher Bandbreite mit dem Speicher 2020 gekoppelt sein, und kann die Grafik-/ Videokarte 2012 über eine Accelerated Graphics Port („AGP“)-Verbindung bzw. Zwischenverbindung bzw. Interconnect 2014 mit dem MCH 2016 gekoppelt sein.
  • In mindestens einer Ausführungsform kann das Computersystem 2000 einen System-I/O-Bus 2022 verwenden, der ein proprietärer Hub-Schnittstellenbus ist, um den MCH 2016 mit dem I/O-Controller-Hub („ICH“) 2030 zu koppeln. In mindestens einer Ausführungsform kann der ICH 2030 direkte Verbindungen zu einigen I/O-Geräten über einen lokalen I/O-Bus bereitstellen. In mindestens einer Ausführungsform kann der lokale I/O-Bus, ohne Beschränkung darauf, einen Hochgeschwindigkeits-I/O-Bus zur Verbindung von Peripheriegeräten mit dem Speicher 2020, einem Chipsatz und dem Prozessor 2002 umfassen. Beispiele können, ohne Beschränkung darauf, eine Audiosteuerung 2029, einen Firmware-Hub („Flash-BIOS“) 2028, einen drahtlosen Transceiver 2026, einen Datenspeicher 2024, einen Legacy-I/O-Controller 2023, der eine Benutzereingabeschnittstelle 2025 und eine Tastaturschnittstelle enthält, einen seriellen Erweiterungs-Port 2027, wie z.B. ein USB, und eine Netzwerksteuerung 2034 beinhalten. Der Datenspeicher 2024 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 20 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 20 ein beispielhaftes SoC veranschaulichen. In mindestens einer Ausführungsform können in 20 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 2000 unter Verwendung von Compute-Express-Link („CXL“)-Interconnects miteinander verbunden.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 20 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Prozessor 2002 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 2002 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 2002 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 21 veranschaulicht ein System 2100, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist das System 2100 eine elektronische Vorrichtung, das einen Prozessor 2110 verwendet. In mindestens einer Ausführungsform kann das System 2100 zum Beispiel, und ohne Beschränkung darauf, ein Notebook, ein Tower-Server, ein Rack-Server, ein Blade-Server, eine Edge-Einrichtung, die kommunikativ mit einem oder mit mehreren On-Premise- oder Cloud-Dienstanbietern gekoppelt ist, ein Laptop, ein Desktop, ein Tablet, eine mobile Vorrichtung, ein Telefon, ein eingebetteter Computer oder eine beliebige andere geeignete elektronische Vorrichtung sein.
  • In mindestens einer Ausführungsform kann das System 2100, ohne Beschränkung darauf, einen Prozessor 2110 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 2110 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 21 ein System, das miteinander verbundene Hardwaregeräte oder „Chips“ enthält. In mindestens einer Ausführungsform kann 21 ein beispielhaftes SoC darstellen. In mindestens einer Ausführungsform können die in 21 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 21 unter Verwendung von CXL-Interconnects miteinander verbunden.
  • In mindestens einer Ausführungsform kann 21 eine Anzeige 2124, einen Touchscreen 2125, ein Touchpad 2130, eine Near Field Communications („NFC“)-Einheit 2145, einen Sensor-Hub 2140, einen Wärmesensor 2146, einen Express-Chipsatz („EC“) 2135, ein Trusted Platform Module („TPM“) 2138, BIOS/Firmware/Flash-Speicher („BIOS, FW Flash“) 2122, einen DSP 2160, eine Solid State Disk („SSD“) oder eine Festplatte („HDD“) 2120, eine Wireless Local Area Network („WLAN“)-Einheit 2150, eine Bluetooth-Einheit 2152, eine Wireless Wide Area Network („WWAN“)-Einheit 2156, ein Global Positioning System („GPS“) 2155, eine Kamera („USB 3.0-Kamera“) 2154, wie z.B. eine USB 3.0-Kamera, oder eine Low Power Double Data Rate („LPDDR“)-Speichereinheit („LPDDR3“) 2115, 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 2110 verbunden sein. In mindestens einer Ausführungsform können ein Beschleunigungsmesser 2141, ein Umgebungslichtsensor („ALS“) 2142, ein Kompass 2143 und ein Gyroskop 2144 kommunikativ mit dem Sensor-Hub 2140 gekoppelt sein. In mindestens einer Ausführungsform können ein Wärmesensor 2139, ein Lüfter 2137, eine Tastatur 2146 und ein Touchpad 2130 kommunikativ mit dem EC 2135 gekoppelt sein. In mindestens einer Ausführungsform können ein Lautsprecher 2163, ein Kopfhörer 2164 und ein Mikrofon („mic“) 2165 kommunikativ mit einer Audioeinheit („audio codec and dass d amp“) 2164 gekoppelt sein, die ihrerseits kommunikativ mit dem DSP 2160 gekoppelt sein kann. In mindestens einer Ausführungsform kann die Audioeinheit 2164 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“) 2157 kommunikativ mit der WWAN-Einheit 2156 gekoppelt sein. In mindestens einer Ausführungsform können Komponenten wie beispielsweise die WLAN-Einheit 2150 und die Bluetooth-Einheit 2152 sowie die WWAN-Einheit 2156 in einem Next Generation Form Factor („NGFF“) implementiert sein.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 21 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Prozessor 2110 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 2110 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 2110 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 22 veranschaulicht eine beispielhafte integrierte Schaltung 2200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die beispielhafte integrierte Schaltung 2200 ein SoC, das unter Verwendung eines oder mehrerer IP-Cores hergestellt sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 2200 einen oder mehrere Anwendungsprozessor(en) 2205 (z.B. CPUs), mindestens einen Grafikprozessor 2210 und kann zusätzlich einen Bildprozessor 2215 und/oder einen Videoprozessor 2220 enthalten, von denen jeder ein modularer IP-Kern sein kann. In mindestens einer Ausführungsform enthält die integrierte Schaltung 2200 eine Peripherie- oder Bus-Logik einschließlich eines USB-Controllers 2225, eines UART-Controllers 2230, eines SPI/SDIO-Controllers 2235 und eines I2S/I2C-Controllers 2240. In mindestens einer Ausführungsform kann die integrierte Schaltung 2200 eine Anzeigevorrichtung 2245 enthalten, die mit einem oder mehreren eines High-Definition Multimedia Interface („HDMI“)-Controllers 2250 und einer Mobile Industry Processor Interface („MIPI“)-Anzeigeschnittstelle 2255 verbunden ist. In mindestens einer Ausführungsform kann der Speicher durch ein Flash-Speicher-Subsystem 2260 mit Flash-Speicher und einer Flash-Speichersteuerung bereitgestellt sein. In mindestens einer Ausführungsform kann eine Speicherschnittstelle über eine Speichersteuerung 2265 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 2270.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 22 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens einer von dem Anwendungsprozessor 2205, dem Grafikprozessor 2210, dem Bildprozessor 2215 oder dem Videoprozessor 2220 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens einer von dem Anwendungsprozessor 2205, dem Grafikprozessor 2210, dem Bildprozessor 2215 oder dem Videoprozessor 2220 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens einer von dem Anwendungsprozessor 2205, dem Grafikprozessor 2210, dem Bildprozessor 2215 oder dem Videoprozessor 2220 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 23 veranschaulicht ein Computer- bzw. Rechensystem 2300, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das Rechensystem 2300 ein Verarbeitungssubsystem 2301 mit einem oder mehreren Prozessor(en) 2302 und einem Systemspeicher 2304, der über einen Zwischenverbindungspfad bzw. Verbindungspfad kommuniziert, der einen Speicher-Hub 2305 enthalten kann. In mindestens einer Ausführungsform kann der Speicher-Hub 2305 eine separate Komponente innerhalb einer Chipsatzkomponente sein oder in einen oder mehrere Prozessor(en) 2302 integriert sein. In mindestens einer Ausführungsform ist der Speicher-Hub 2305 mit einem I/O-Subsystem 2311 über eine Kommunikationsverbindung 2306 gekoppelt. In mindestens einer Ausführungsform beinhaltet das I/O-Subsystem 2311 einen I/O-Hub 2307, der es dem Rechensystem 2300 ermöglichen kann, Eingaben von einer oder mehreren Eingabevorrichtung(en) 2308 zu empfangen. In mindestens einer Ausführungsform kann der I/O-Hub 2307 eine Anzeigesteuerung, der in einem oder mehreren Prozessor(en) 2302 enthalten sein kann, in die Lage versetzen, Ausgaben an eine oder mehrere Anzeigevorrichtung(en) 2310A zu liefern. In mindestens einer Ausführungsform kann/können ein oder mehrere Anzeigevorrichtung(en) 2310A, die mit dem I/O-Hub 2307 gekoppelt sind, eine lokale, interne oder eingebettete Anzeigevorrichtung beinhalten.
  • In mindestens einer Ausführungsform beinhaltet das Verarbeitungssubsystem 2301 einen oder mehrere Parallelprozessor(en) 2312, der/die über einen Bus oder eine andere Kommunikationsverbindung 2313 mit dem Speicher-Hub 2305 verbunden ist/sind. In mindestens einer Ausführungsform kann die Kommunikationsverbindung 2313 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) 2312 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 oder Rechnereinheiten. In mindestens einer Ausführungsform bilden ein oder mehrere Parallelprozessor(en) 2312 ein Grafikverarbeitungs-Subsystem, das Pixel an eine oder mehrere Anzeigevorrichtung(en) 2310A ausgeben kann, die über den I/O-Hub 2307 gekoppelt sind. In mindestens einer Ausführungsform können ein oder mehrere Parallelprozessor(en) 2312 auch eine Anzeigesteuerung und eine Anzeigeschnittstelle (nicht dargestellt) enthalten, um eine direkte Verbindung zu einer oder mehreren Anzeigevorrichtung(en) 2310B zu ermöglichen.
  • In mindestens einer Ausführungsform kann eine Systemspeichereinheit 2314 mit dem I/O-Hub 2307 verbunden sein, um einen Speichermechanismus für das Rechensystem 2300 bereitzustellen. In mindestens einer Ausführungsform kann ein I/O-Switch 2316 verwendet werden, um einen Schnittstellenmechanismus bereitzustellen, der Verbindungen zwischen dem I/O-Hub 2307 und anderen Komponenten ermöglicht, wie z.B. einem Netzwerkadapter 2318 und/oder einem drahtlosen Netzwerkadapter 2319, der in eine Plattform integriert sein kann, und verschiedenen anderen Vorrichtungen, die über ein oder mehrere Add-in-Vorrichtungen 2320 hinzugefügt werden können. In mindestens einer Ausführungsform kann der Netzwerkadapter 2318 ein Ethernet-Adapter oder ein anderer kabelgebundener Netzwerkadapter sein. In mindestens einer Ausführungsform kann der drahtlose Netzwerkadapter 2319 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 2300 weitere, nicht explizit dargestellte Komponenten enthalten, darunter USB- oder andere Portverbindungen, optische Speicherlaufwerke, Videoaufnahmevorrichtungen und dergleichen, die ebenfalls mit dem I/O-Hub 2307 verbunden sein können. In mindestens einer Ausführungsform können Kommunikationspfade, die verschiedene Komponenten in 23 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) 2312 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) 2312 Schaltkreise, die für allgemeine Verarbeitung optimiert sind. In mindestens einer Ausführungsform können Komponenten des Rechensystems 2300 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) 2312, der Speicher-Hub 2305, der/die Prozessor(en) 2302 und der I/O-Hub 2307 in eine integrierte SoC-Schaltung integriert sein. In mindestens einer Ausführungsform können Komponenten des Rechensystems 2300 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 2300 in ein Multi-Chip-Modul („MCM“) integriert sein, das mit anderen Multi-Chip-Modulen zu einem modularen Rechensystem zusammengeschaltet sein kann. In mindestens einer Ausführungsform sind das I/O-Subsystem 2311 und die Anzeigevorrichtungen 2310B nicht in dem Rechensystem 2300 enthalten.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 23 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens einer von dem bzw. den Prozessor(en) 2302 oder dem bzw. den Parallelprozessor(en) 2312 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens einer von dem bzw. den Prozessor(en) 2302 oder dem bzw. den Parallelprozessor(en) 2312 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens einer von dem bzw. den Prozessor(en) 2302 oder dem bzw. den Parallelprozessor(en) 2312 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 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.
  • 24 veranschaulicht eine beschleunigte Verarbeitungseinheit („APU“; accelerated processing unit) 2400, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die APU 2400 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die APU 2400 so konfiguriert sein, dass sie ein Anwendungsprogramm, wie z.B. ein CUDA-Programm, ausführt. In mindestens einer Ausführungsform umfasst die APU 2400, ohne Beschränkung darauf, einen Kernkomplex 2410, einen Grafikkomplex 2440, eine Struktur bzw. ein Fabric 2460, I/O-Schnittstellen 2470, Speichersteuerungen 2480, eine Anzeigesteuerung 2492 und eine Multimedia-Engine 2494. In mindestens einer Ausführungsform kann die APU 2400, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 2410, eine beliebige Anzahl von Grafikkomplexen 2450, eine beliebige Anzahl von Anzeigesteuerungen 2492 und eine beliebige Anzahl von Multimedia-Engines 2494 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 2410 eine CPU, ist der Grafikkomplex 2440 eine GPU und ist die APU 2400 eine Verarbeitungseinheit, die, ohne Beschränkung darauf, 2410 und 2440 auf einem einzigen Chip integriert. In mindestens einer Ausführungsform können einige Aufgaben dem Kernkomplex 2410 und andere Aufgaben dem Grafikkomplex 2440 zugewiesen werden. In mindestens einer Ausführungsform ist der Kernkomplex 2410 so konfiguriert, dass er eine Hauptsteuerungssoftware ausführt, die der APU 2400 zugeordnet ist, wie z.B. ein Betriebssystem. In mindestens einer Ausführungsform ist der Kernkomplex 2410 der Hauptprozessor der APU 2400, der Operationen bzw. Betriebsabläufe der anderen Prozessoren steuert und koordiniert. In mindestens einer Ausführungsform gibt der Kernkomplex 2410 Befehle aus, die den Betrieb des Grafikkomplexes 2440 steuern. In mindestens einer Ausführungsform kann der Kernkomplex 2410 so konfiguriert sein, dass er von dem CUDA-Quellcode abgeleiteten ausführbaren Host-Code ausführt, und kann der Grafikkomplex 2440 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 2410, ohne Beschränkung darauf, Kerne 2420(1)-2420(4) und einen L3-Cache 2430. In mindestens einer Ausführungsform kann der Kernkomplex 2410, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 2420 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 2420 so konfiguriert, dass sie Anweisungen einer bestimmten Befehlssatzarchitektur („ISA“) ausführen. In mindestens einer Ausführungsform ist jeder Kern 2420 ein CPU-Kern.
  • In mindestens einer Ausführungsform enthält jeder Kern 2420, ohne Beschränkung darauf, eine Abhol-/Dekodier-Einheit 2422, eine Ganzzahlausführungsmaschine 2424, eine Gleitkommaausführungsmaschine 2426 und einen L2-Cache 2428. In mindestens einer Ausführungsform holt die Abhol-/Dekodier-Einheit 2422 Anweisungen ab, dekodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungsmaschine 2424 und die Gleitkommaausführungsmaschine 2426. In mindestens einer Ausführungsform kann die Abhol-/Dekodier-Einheit 2422 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 2424 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 2426 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 2424, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 2426, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Dekodier-Einheit 2422 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 2424 als auch die Gleitkommaausführungsmaschine 2426 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 2420(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 2420 repräsentiert, auf den L2-Cache 2428(i) zugreifen, der in dem Kern 2420(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 2410(j) enthaltene Kern 2420, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2410 repräsentiert, mit anderen in dem Kernkomplex 2410(j) enthaltenen Kernen 2420 über den in dem Kernkomplex 2410(j) enthaltenen L3-Cache 2430(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 2410(j) enthaltenen Kerne 2420, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2410 repräsentiert, auf den gesamten L3-Cache 2430(j) zugreifen, der in dem Kernkomplex 2410(j) enthalten ist. In mindestens einer Ausführungsform kann der L3-Cache 2430, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform kann der Grafikkomplex 2440 so konfiguriert sein, dass er Rechenoperationen hochparallel ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 2440 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 2440 so konfiguriert, dass er Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist der Grafikkomplex 2440 so konfiguriert, dass er sowohl grafikbezogene als auch grafikfremde Operationen ausführt.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 2440, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 2450 und einen L2-Cache 2442. In mindestens einer Ausführungsform teilen sich die Recheneinheiten 2450 den L2-Cache 2442. In mindestens einer Ausführungsform ist der L2-Cache 2442 partitioniert. In mindestens einer Ausführungsform umfasst der Grafikkomplex 2440, ohne Beschränkung darauf, eine beliebige Anzahl von Recheneinheiten 2450 und eine beliebige Anzahl (einschließlich Null) und Art von Caches. In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 2440, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 2450, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 2452 und einen gemeinsamen Speicher 2454. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 2452 eine SIMD-Architektur und ist für die parallele Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform kann jede Recheneinheit 2450 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 2450 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 2452 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 2454 kommunizieren.
  • In mindestens einer Ausführungsform ist die Struktur 2460 eine Systemverbindung bzw. ein System-Interconnect, die bzw. der Daten- und Steuerungs-Übertragungen zwischen dem Kernkomplex 2410, dem Grafikkomplex 2440, den I/O-Schnittstellen 2470, den Speichersteuerungen 2480, der Anzeigesteuerung 2492 und der Multimedia-Engine 2494 ermöglicht. In mindestens einer Ausführungsform kann die APU 2400, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 2460 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 2400 sein können. In mindestens einer Ausführungsform sind die I/O-Schnittstellen 2470 repräsentativ für eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCI, PCI-Extended („PCI-X“), PCIe, Gigabit-Ethernet („GBE“), USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den I/O-Schnittstellen 2470 gekoppelt. Die Peripheriegeräte, die mit den I/O-Schnittstellen 2470 gekoppelt sind, können, ohne Beschränkung darauf, Tastaturen, Mäuse, Drucker, Scanner, Joysticks oder andere Arten von Spielsteuerungen, Medienaufzeichnungsvorrichtungen, externe Speichervorrichtungen, Netzwerkschnittstellenkarten usw. beinhalten.
  • In mindestens einer Ausführungsform zeigt die Anzeigesteuerung AMD92 Bilder auf einer oder mehreren Anzeigevorrichtungen an, z.B. auf einer Flüssigkristallanzeige („LCD“). In mindestens einer Ausführungsform umfasst die Multimedia-Engine 2494, ohne Beschränkung darauf, eine beliebige Menge und Art von Schaltkreisen, die sich auf Multimedia beziehen, wie z.B. einen Video-Dekoder, einen Video-Enkoder, einen Bildsignalprozessor usw. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 2480 die Datenübertragung zwischen der APU 2400 und einem einheitlichen Systemspeicher 2490. In mindestens einer Ausführungsform teilen sich der Kernkomplex 2410 und der Grafikkomplex 2440 den vereinheitlichten Systemspeicher 2490.
  • In mindestens einer Ausführungsform implementiert die APU 2400 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichersteuerungen 2480 und Speichervorrichtungen (z.B. den gemeinsam genutzten Speicher 2454) enthält, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die APU 2400 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 2528, L3-Cache 2430 und L2-Cache 2442) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 2420, Kernkomplex 2410, SIMD-Einheiten 2452, Recheneinheiten 2450 und Grafikkomplex 2440) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 24 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens einer von dem Kernkomplex 2410 oder dem Grafikkomplex 2440 der gruppierten Rechenressourcen 1814 und der Knoten C.R. 1816(1-N) verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens einer von dem Kernkomplex 2410 oder dem Grafikkomplex 2440 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens einer von dem Kernkomplex 2410 oder dem Grafikkomplex 2440 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 25 zeigt eine CPU 2500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die CPU 2500 von der AMD Corporation aus Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform kann die CPU 2500 so konfiguriert sein, dass sie ein Anwendungsprogramm ausführt. In mindestens einer Ausführungsform ist die CPU 2500 so konfiguriert, dass sie eine Hauptsteuerungssoftware, wie z.B. ein Betriebssystem, ausführt. In mindestens einer Ausführungsform gibt die CPU 2500 Befehle aus, die den Betrieb einer externen GPU (nicht dargestellt) steuern. In mindestens einer Ausführungsform kann die CPU 2500 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 2500, ohne Beschränkung darauf, eine beliebige Anzahl von Kernkomplexen 2510, ein Fabric 2560, I/O-Schnittstellen 2570 und Speichersteuerungen 2580.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 2510, ohne Beschränkung darauf, Kerne 2520(1)-2520(4) und einen L3-Cache 2530. In mindestens einer Ausführungsform kann der Kernkomplex 2510, ohne Beschränkung darauf, eine beliebige Anzahl von Kernen 2520 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination enthalten. In mindestens einer Ausführungsform sind die Kerne 2520 so konfiguriert, dass sie Anweisungen eines bestimmten ISA ausführen. In mindestens einer Ausführungsform ist jeder Kern 2520 ein CPU-Kern.
  • In mindestens einer Ausführungsform beinhaltet jeder Kern 2520, ohne Beschränkung darauf, eine Abhol-/Dekodier-Einheit 2522, eine Ganzzahlausführungsmaschine 2524, eine Gleitkommaausführungsmaschine 2526 und einen L2-Cache 2528. In mindestens einer Ausführungsform holt die Abhol-/Dekodier-Einheit 2522 Anweisungen ab, dekodiert solche Anweisungen, erzeugt Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahlausführungs-Engine 2524 und die Gleitkommaausführungsmaschine 2526. In mindestens einer Ausführungsform kann die Abhol-/Dekodier-Einheit 2522 gleichzeitig eine Mikroanweisung an die Ganzzahlausführungsmaschine 2524 und eine andere Mikroanweisung an die Gleitkommaausführungsmaschine 2526 senden. In mindestens einer Ausführungsform führt die Ganzzahlausführungsmaschine 2524, ohne Beschränkung darauf, Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkommamaschine 2526, ohne Beschränkung darauf, Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abhol-/Dekodier-Einheit 2522 Mikroanweisungen an eine einzige Ausführungsmaschine, die sowohl die Ganzzahlausführungsmaschine 2524 als auch die Gleitkommaausführungsmaschine 2526 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 2520(i), wobei i eine ganze Zahl ist, die eine bestimmte Instanz des Kerns 2520 repräsentiert, auf den L2-Cache 2528(i) zugreifen, der in dem Kern 2520(i) enthalten ist. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 2510(j) enthaltene Kern 2520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2510 repräsentiert, mit anderen Kernen 2520 in dem Kernkomplex 2510(j) über den in dem Kernkomplex 2510(j) enthaltenen L3-Cache 2530(j) verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 2510(j) enthaltenen Kerne 2520, wobei j eine ganze Zahl ist, die eine bestimmte Instanz des Kernkomplexes 2510 repräsentiert, auf den gesamten in dem Kernkomplex 2510(j) enthaltenen L3-Cache 2530(j) zugreifen. In mindestens einer Ausführungsform kann der L3-Cache 2530, ohne Beschränkung darauf, eine beliebige Anzahl von Slices enthalten.
  • In mindestens einer Ausführungsform ist das Fabric 2560 eine Systemverbindung, die Daten- und Steuerungs-Übertragungen über die Kernkomplexe 2510(1)-2510(N) (wobei N eine ganze Zahl größer als Null ist), I/O-Schnittstellen 2570 und Speichersteuerungen 2580 erleichtert. In mindestens einer Ausführungsform kann die CPU 2500, ohne Beschränkung darauf, eine beliebige Menge und Art von Systemverbindungen zusätzlich zu oder anstelle des Fabric 2560 enthalten, die Daten- und Steuerungs-Übertragungen über eine beliebige Anzahl und Art von direkt oder indirekt verbundenen Komponenten erleichtern, die intern oder extern zur CPU 2500 sein können. In mindestens einer Ausführungsform sind die I/O-Schnittstellen 2570 repräsentativ für eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCI , PCI-X, PCIe, GBE, USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit den I/O-Schnittstellen 2570 gekoppelt. Zu den Peripheriegeräten, die mit den I/O-Schnittstellen 2570 gekoppelt sind, gehören unter anderem Bildschirme, Tastaturen, Mäuse, Drucker, Scanner, Joysticks oder andere Arten von Spielsteuerungen, Medienaufzeichnungsvorrichtungen, externe Speichervorrichtungen, Netzwerkschnittstellenkarten usw.
  • In mindestens einer Ausführungsform erleichtern die Speichersteuerung 2580 Datenübertragungen zwischen der CPU 2500 und einem Systemspeicher 2590. In mindestens einer Ausführungsform teilen sich der Kernkomplex 2510 und der Grafikkomplex 2540 den Systemspeicher 2590. In mindestens einer Ausführungsform implementiert die CPU 2500 ein Speichersubsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und Art von Speichersteuerungen 2580 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 2500 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Caches 2528 und L3-Caches 2530) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z.B. Kerne 2520 und Kernkomplexe 2510) reserviert sein oder von diesen gemeinsam genutzt werden können.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 25 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510(1)-2510(n) verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510(1)-2510(n) verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Kernkomplexes 2510(1)-2510(n) verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 26 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice 2690, 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 2682 innerhalb eines Systemspeichers 2614 speichert Prozesselemente 2683. In einer Ausführungsform werden die Prozesselemente 2683 im Ansprechen auf GPU-Aufrufe 2681 von Anwendungen 2680, die auf dem Prozessor 2607 ausgeführt werden, gespeichert. Ein Prozesselement 2683 enthält den Prozessstatus für die entsprechende Anwendung 2680. Ein in dem Prozesselement 2683 enthaltener Arbeits- bzw. Workdeskriptor („WD“) 2684 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 2684 ein Zeiger auf eine Auftragsanforderungswarteschlange in dem effektiven Adressraum 2682 der Anwendung.
  • Das Grafikbeschleunigungsmodul 2646 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 2684 an das Grafikbeschleunigungsmodul 2646 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 2646 oder eine individuelle Grafikverarbeitungs-Engine. Weil das Grafikbeschleunigungsmodul 2646 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 2646 zugewiesen wird.
  • Im Betrieb holt eine WD-Abholeinheit 2691 in dem Beschleunigerintegrations-Slice 2690 den nächsten WD 2684 ab, der eine Angabe der Arbeit enthält, die von einer oder mehreren Grafikverarbeitungsmaschinen des Grafikbeschleunigungsmoduls 2646 zu erledigen ist. Daten aus dem WD 2684 können in Registern 2645 gespeichert und von einer Speicherverwaltungseinheit („MMU“) 2639, einer Unterbrechungs- bzw. Interrupt-Verwaltungsschaltung 2647 und/oder einer Kontextverwaltungsschaltung 2648 verwendet werden, wie dargestellt. Eine Ausführungsform der MMU 2639 beinhaltet beispielsweise einen Segment-/Seitenlauf-Schaltkreis für den Zugriff auf Segment-/Seitentabellen 2686 innerhalb des virtuellen Betriebssystemadressraums 2685. Die Interrupt-Verwaltungsschaltung 2647 kann von dem Grafikbeschleunigungsmodul 2646 empfangene Interrupt-Ereignisse („INT“) 2692 verarbeiten. Bei der Durchführung von Grafikoperationen wird eine von einer Grafikverarbeitungsmaschine erzeugte effektive Adresse 2693 von der MMU 2639 in eine reale Adresse übersetzt.
  • In einer Ausführungsform wird für jede Grafikverarbeitungs-Engine und/oder jedes Grafikbeschleunigungsmodul 2646 ein gleicher Satz von Registern 2645 dupliziert und kann von einem Hypervisor oder Betriebssystem initialisiert werden. Jedes dieser duplizierten Register kann in dem Beschleunigerintegrations-Slice 2690 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 2684 spezifisch für ein bestimmtes Grafikbeschleunigungsmodul 2646 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 26 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Prozessor 2607 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird Prozessor 2607 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird Prozessor 2607 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 27A und 27B veranschaulichen beispielhafte Grafikprozessoren, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann jeder der beispielhaften Grafikprozessoren unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein. Zusätzlich zu dem, was dargestellt ist, können andere Logik und Schaltungen in mindestens einer Ausführungsform enthalten sein, einschließlich zusätzlicher Grafikprozessoren/-kerne, Peripherieschnittstellensteuerungen oder Universalprozessorkerne. In mindestens einer Ausführungsform sind die beispielhaften Grafikprozessoren zur Verwendung innerhalb eines SoC vorgesehen.
  • 27A veranschaulicht einen beispielhaften Grafikprozessor 2710 eines integrierten SoC-Schaltkreises, der unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein kann, gemäß mindestens einer Ausführungsform. 27B veranschaulicht einen weiteren beispielhaften Grafikprozessor 2740 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 2710 von 27A ein stromsparender Grafikprozessorkern. In mindestens einer Ausführungsform ist der Grafikprozessor 2740 von 27B ein Grafikprozessorkern mit höherer Leistung. In mindestens einer Ausführungsform kann jeder der Grafikprozessoren 2710, 2740 eine Variante des Grafikprozessors 2210 von 22 sein.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2710 einen Vertex-Prozessor 2705 und einen oder mehrere Fragment-Prozessor(en) 2715A-2715N (z.B. 2715A, 2715B, 2715C, 2715D, bis 2715N-1 und 2715N). In mindestens einer Ausführungsform kann der Grafikprozessor 2710 verschiedene Shader-Programme über eine separate Logik ausführen, so dass der Vertex-Prozessor 2705 für die Ausführung von Operationen für Vertex-Shader-Programme optimiert ist, während ein oder mehrere Fragment-Prozessor(en) 2715A-2715N 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 2705 eine Vertex-Verarbeitungsstufe einer 3D-Grafik-Pipeline aus und erzeugt Primitive und Vertex-Daten. In mindestens einer Ausführungsform verwenden Fragmentprozessor(en) 2715A-2715N die von dem Vertex-prozessor 2705 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) 2715A-2715N 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 2710 zusätzlich eine oder mehrere MMU(s) 2720A-2720B, Cache(s) 2725A-2725B und Schaltungsverbindung(en) bzw. Interconnect(s) 2730A-2730B. In mindestens einer Ausführungsform sorgen eine oder mehrere MMU(s) 2720A-2720B für die Zuordnung von virtuellen zu physikalischen Adressen für den Grafikprozessor 2710, einschließlich für den Vertex-Prozessor 2705 und/oder den/die Fragment-Prozessoren) 2715A-2715N, 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) 2725A-2725B gespeichert sind. In mindestens einer Ausführungsform können eine oder mehrere MMU(s) 2720A-2720B mit anderen MMUs innerhalb eines Systems synchronisiert werden, einschließlich einer oder mehrerer MMUs, die einem oder mehreren Anwendungsprozessor(en) 2205, Bildprozessor(en) 2215 und/oder Videoprozessor(en) 2220 von 22 zugeordnet sind, so dass jeder Prozessor 2205-2220 an einem gemeinsamen oder vereinheitlichten virtuellen Speichersystem teilhaben kann. In mindestens einer Ausführungsform ermöglichen eine oder mehrere Schaltungsverbindung(en) 2730A-2730B dem Grafikprozessor 2710 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 2740 eine oder mehrere MMU(s) 2720A-2720B, Caches 2725A-2725B und Schaltungsverbindungen 2730A-2730B des Grafikprozessors 2710 von 27A. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2740 einen oder mehrere Shader-Kerne 2755A-2755N (z.B. 2755A, 2755B, 2755C, 2755D, 2755E, 2755F bis 2755N-1 und 2755N), 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 2740 einen Zwischenkern-Task-Manager bzw. Intercore-Task-Manager 2745, der als ein Thread-Dispatcher bzw. -Versender fungiert, um Ausführungs-Threads an einen oder mehrere Shader-Kerne 2755A-2755N zu verteilen, und eine Kacheleinheit 2758, 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 27A-27B gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Grafikprozessor 2710 und/oder der Grafikprozessor 2740 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikprozessor 2710 und/oder der Grafikprozessor 2740 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikprozessor 2710 und/oder der Grafikprozessor 2740 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 28A veranschaulicht einen Grafikkern 2800, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Grafikkern 2800 in dem Grafikprozessor 2210 von 22 enthalten sein. In mindestens einer Ausführungsform kann der Grafikkern 2800 ein einheitlicher Shader-Kern 2755A-2755N wie in 27B sein. In mindestens einer Ausführungsform beinhaltet der Grafikkern 2800 einen gemeinsam genutzten Befehlscache 2802, eine Textureinheit 2832 und einen Cache/gemeinsamen Speicher 2820, die den Ausführungsressourcen innerhalb des Grafikkerns 2800 gemeinsam sind. In mindestens einer Ausführungsform kann der Grafikkern 2800 mehrere Slices 2801A-2801 N oder Partitionen für jeden Kern enthalten, und kann ein Grafikprozessor mehrere Instanzen des Grafikkerns 2800 enthalten. Die Slices 2801A-2801 N können eine Unterstützungslogik enthalten, die einen lokalen Befehlscache 2804A-2804N, einen Thread-Planer bzw. Thread-Scheduler 2806A-2806N, einen Thread-Versender bzw. Thread-Dispatcher 2808A-2808N und einen Satz von Registern 2810A-2810N beinhaltet. In mindestens einer Ausführungsform können die Slices 2801A-2801N einen Satz zusätzlicher Funktionseinheiten („AFUs“) 2812A-2812N, Gleitkommaeinheiten („FPUs“) 2814A-2814N, ganzzahlige arithmetische Logikeinheiten („ALUs“) 2816-2816N, Adressberechnungseinheiten („ACUs“) 2813A-2813N, doppeltpräzise Gleitkommaeinheiten („DPFPUs“) 2815A-2815N und Matrixverarbeitungseinheiten („MPUs“) 2817A-2817N beinhalten.
  • In mindestens einer Ausführungsform können die FPUs 2814A-2814N Gleitkommaoperationen mit einfacher Genauigkeit (32 Bit) und halber Genauigkeit (16 Bit) durchführen, während die DPFPUs 2815A-2815N Gleitkommaoperationen mit doppelter Genauigkeit (64 Bit) durchführen. In mindestens einer Ausführungsform können die ALUs 2816A-2816N 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 2817A-2817N 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 2817-2817N 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 2812A-2812N zusätzliche logische Operationen durchführen, die nicht von Gleitkomma- oder Ganzzahleinheiten unterstützt werden, einschließlich trigonometrischer Operationen (z.B. Sinus, Cosinus usw.).
  • Bei mindestens einer Ausführungsform wird mindestens eine in 28A gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Grafikkern 2800 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikkern 2800 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikkern 2800 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 28B veranschaulicht eine Universal-Grafikverarbeitungseinheit („GPGPU“) 2830, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die GPGPU 2830 hochparallel und für den Einsatz auf einem Multi-Chip-Modul geeignet. In mindestens einer Ausführungsform kann die GPGPU 2830 so konfiguriert sein, dass hochparallele Rechenoperationen von einem Array von GPUs durchgeführt werden können. In mindestens einer Ausführungsform kann die GPGPU 2830 direkt mit anderen Instanzen der GPGPU 2830 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 2830 eine Host-Schnittstelle 2832, um eine Verbindung mit einem Hostprozessor zu ermöglichen. In mindestens einer Ausführungsform ist die Host-Schnittstelle 2832 eine PCIe-Schnittstelle. In mindestens einer Ausführungsform kann die Host-Schnittstelle 2832 eine herstellerspezifische Kommunikationsschnittstelle oder ein Kommunikations-Fabric sein. In mindestens einer Ausführungsform empfängt die GPGPU 2830 Befehle von einem Hostprozessor und verwendet einen globalen Planer bzw. Scheduler 2834, um Ausführungs-Threads, die mit diesen Befehlen verbunden sind, an einen Satz von Rechenclustern 2836A-2836H zu verteilen. In mindestens einer Ausführungsform teilen sich die Rechencluster 2836A-2836H einen Cachespeicher 2838. In mindestens einer Ausführungsform kann der Cachespeicher 2838 als ein übergeordneter Cache für Cachespeicher innerhalb von Rechenclustern 2836A-2836H dienen..
  • In mindestens einer Ausführungsform umfasst die GPGPU 2830 einen Speicher 2844A-2844B, der über eine Reihe von Speichersteuerungen 2842A-2842B mit den Rechenclustern 2836A-2836H verbunden ist. In mindestens einer Ausführungsform kann der Speicher 2844A-2844B 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 2836A-2836H jeweils einen Satz von Grafikkernen, wie z.B. den Grafikkern 2800 von 28A, 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 2836A-2836H 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 2830 so konfiguriert sein, dass sie als Rechencluster arbeiten. Die Rechencluster 2836A-2836H können beliebige technisch machbare Kommunikationstechniken zur Synchronisation und zum Datenaustausch implementieren. In mindestens einer Ausführungsform kommunizieren mehrere Instanzen der GPGPU 2830 über die Host-Schnittstelle 2832. In mindestens einer Ausführungsform enthält die GPGPU 2830 einen I/O-Hub 2839, der die GPGPU 2830 mit einer GPU-Verbindung 2840 koppelt, die eine direkte Verbindung zu anderen Instanzen der GPGPU 2830 ermöglicht. In mindestens einer Ausführungsform ist die GPU-Verbindung 2840 mit einer dedizierten GPU-zu-GPU-Brücke gekoppelt, die die Kommunikation und Synchronisation die zwischen mehreren Instanzen der GPGPU 2830 ermöglicht. In mindestens einer Ausführungsform koppelt die GPU-Verbindung 2840 mit einem Hochgeschwindigkeits-Interconnect, um Daten an andere GPGPUs 2830 oder Parallelprozessoren zu senden und von diesen zu empfangen. In mindestens einer Ausführungsform befinden sich mehrere Instanzen der GPGPU 2830 in separaten Datenverarbeitungssystemen und kommunizieren über eine Netzwerkvorrichtung, die über die Host-Schnittstelle 2832 zugänglich ist. In mindestens einer Ausführungsform kann die GPU-Verbindung 2840 so konfiguriert sein, dass sie zusätzlich oder alternativ zu der Host-Schnittstelle 2832 eine Verbindung zu einem Hostprozessor ermöglicht. In mindestens einer Ausführungsform kann die GPGPU 2830 so konfiguriert sein, dass sie ein CUDA-Programm ausführt.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 28B gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird die Universal-Grafikverarbeitungseinheit („GPGPU“) 2830 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird die Universal-Grafikverarbeitungseinheit („GPGPU“) 2830 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird die Universal-Grafikverarbeitungseinheit („GPGPU“) 2830 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 29A veranschaulicht einen Parallelprozessor 2900, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform können verschiedene Komponenten des Parallelprozessors 2900 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 2900 eine Parallelverarbeitungseinheit 2902. In mindestens einer Ausführungsform enthält die Parallelverarbeitungseinheit 2902 eine I/O-Einheit 2904, die die Kommunikation mit anderen Vorrichtungen ermöglicht, einschließlich anderer Instanzen der Parallelverarbeitungseinheit 2902. In mindestens einer Ausführungsform kann die I/O-Einheit 2904 direkt mit anderen Vorrichtungen verbunden sein. In mindestens einer Ausführungsform ist die I/O-Einheit 2904 über eine Hub- oder Switch-Schnittstelle, wie z.B. den Speicher-Hub 2905, mit anderen Vorrichtungen verbunden. In mindestens einer Ausführungsform bilden die Verbindungen zwischen dem Speicher-Hub 2905 und der I/O-Einheit 2904 eine Kommunikationsverbindung. In mindestens einer Ausführungsform ist die I/O-Einheit 2904 mit einer Host-Schnittstelle 2906 und einem Speicherkoppelfeld 2916 verbunden, wobei die Host-Schnittstelle 2906 Befehle zur Durchführung von Verarbeitungsvorgängen und das Speicherkoppelfeld 2916 Befehle zur Durchführung von Speicheroperationen empfängt.
  • In mindestens einer Ausführungsform kann die Host-Schnittstelle 2906 dann, wenn die Host-Schnittstelle einen Befehlspuffer über die I/O-Einheit 2904 empfängt, Arbeitsoperationen zur Ausführung dieser Befehle an ein Frontend 2908 leiten. In mindestens einer Ausführungsform ist das Frontend 2908 mit einem Planer bzw. Scheduler 2910 gekoppelt, der so konfiguriert ist, dass er Befehle oder andere Arbeitselemente an ein Verarbeitungsfeld bzw. Verarbeitungs-Array 2912 verteilt. In mindestens einer Ausführungsform stellt der Scheduler 2910 sicher, dass das Verarbeitungs-Array 2912 richtig konfiguriert ist und sich in einem gültigen Zustand befindet, bevor Aufgaben an das Verarbeitungs-Array 2912 verteilt werden. In mindestens einer Ausführungsform ist der Scheduler 2910 über Firmware-Logik implementiert, die auf einem Mikrocontroller ausgeführt wird. In mindestens einer Ausführungsform ist der in einem Mikrocontroller implementierte Scheduler 2910 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 2912 ausgeführt werden. In mindestens einer Ausführungsform kann die Hostsoftware Arbeitslasten für die Planung auf dem Verarbeitungs-Array 2912 über eine von mehreren Grafikverarbeitungs-Doorbells nachweisen. In mindestens einer Ausführungsform können die Arbeitslasten dann automatisch über das Verarbeitungs-Array 2912 durch die Logik des Schedulers 2910 in einem Mikrocontroller mit Scheduler 2910 verteilt werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2912 bis zu „N“ Cluster umfassen (z.B. Cluster 2914A, Cluster 2914B bis Cluster 2914N). In mindestens einer Ausführungsform kann jeder Cluster 2914A-2914N des Verarbeitungs-Arrays 2912 eine große Anzahl gleichzeitiger Threads ausführen. In mindestens einer Ausführungsform kann der Scheduler 2910 den Clustern 2914A-2914N des Verarbeitungs-Arrays 2912 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 2910 gehandhabt werden, oder kann teilweise durch die Compilerlogik während der Kompilierung der Programmlogik, die für die Ausführung durch das Verarbeitungs-Array 2912 konfiguriert ist, unterstützt werden. In mindestens einer Ausführungsform können verschiedene Cluster 2914A-2914N des Verarbeitungs-Arrays 2912 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 2912 so konfiguriert sein, dass es verschiedene Arten von parallelen Verarbeitungsoperationen durchführt. In mindestens einer Ausführungsform ist das Verarbeitungs-Array 2912 so konfiguriert, dass es parallele Universalrechenoperationen durchführt. Zum Beispiel kann in mindestens einer Ausführungsform das Verarbeitungs-Array 2912 Logik zur Ausführung von Verarbeitungs-Tasks enthalten, einschließlich der Filterung von Video- und/oder Audiodaten, der Durchführung von Modellierungsoperationen, einschließlich physikalischer Operationen, und der Durchführung von Datentransformationen.
  • In mindestens einer Ausführungsform ist das Verarbeitungs-Array 2912 so konfiguriert, dass es parallele Grafikverarbeitungsoperationen durchführt. In mindestens einer Ausführungsform kann das Verarbeitungsarray 2912 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 2912 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 2902 Daten aus dem Systemspeicher über die I/O-Einheit 2904 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 2922) gespeichert und dann in den Systemspeicher zurückgeschrieben werden.
  • In mindestens einer Ausführungsform kann dann, wenn die Parallelverarbeitungseinheit 2902 zur Durchführung der Grafikverarbeitung verwendet wird, der Scheduler 2910 so konfiguriert sein, dass er eine Verarbeitungslast in ungefähr gleich große Aufgaben aufteilt, um eine bessere Verteilung der Grafikverarbeitungsoperationen auf mehrere Cluster 2914A-2914N des Verarbeitungsarrays 2912 zu ermöglichen. In mindestens einer Ausführungsform können Teile des Verarbeitungs-Arrays 2912 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 2914A-2914N erzeugt werden, in Puffern gespeichert werden, damit Zwischendaten zur weiteren Verarbeitung zwischen den Clustern 2914A-2914N übertragen werden können.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 2912 Verarbeitungs-Tasks empfangen, die über den Scheduler 2910 auszuführen sind, der Befehle zur Definition von Verarbeitungs-Tasks von dem Frontend 2908 empfängt. In mindestens einer Ausführungsform können die Verarbeitungs-Tasks Indizes der zu verarbeitenden Daten enthalten, z.B. Oberflächen-(Patch-)Daten, Primitivdaten, Vertexdaten und/oder Pixeldaten, sowie Zustandsparameter und Befehle, die definieren, wie die Daten zu verarbeiten sind (z.B. welches Programm auszuführen ist). In mindestens einer Ausführungsform kann der Scheduler 2910 so konfiguriert sein, dass er den Aufgaben entsprechende Indizes abruft oder Indizes von dem Frontend 2908 empfängt. In mindestens einer Ausführungsform kann das Frontend 2908 so konfiguriert sein, dass es sicherstellt, dass das Verarbeitungs-Array 2912 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 2902 mit dem Parallelprozessorspeicher 2922 gekoppelt sein. In mindestens einer Ausführungsform kann auf den Parallelprozessorspeicher 2922 über ein Speicherkoppelfeld 2916 zugegriffen werden, die Speicheranforderungen von dem Verarbeitungs-Array 2912 sowie von der I/O-Einheit 2904 empfangen kann. In mindestens einer Ausführungsform kann die Speicher-Koppelfeld 2916 über eine Speicherschnittstelle 2918 auf den Parallelprozessorspeicher 2922 zugreifen. In mindestens einer Ausführungsform kann die Speicherschnittstelle 2918 mehrere Partitionseinheiten (z.B. eine Partitionseinheit 2920A, eine Partitionseinheit 2920B bis eine Partitionseinheit 2920N) beinhalten, die jeweils mit einem Teil (z.B. einer Speichereinheit) des Parallelprozessorspeichers 2922 gekoppelt sein können. In mindestens einer Ausführungsform ist eine Anzahl von Partitionseinheiten 2920A-2920N so konfiguriert, dass sie gleich einer Anzahl von Speichereinheiten ist, so dass eine erste Partitionseinheit 2920A eine entsprechende erste Speichereinheit 2924A hat, eine zweite Partitionseinheit 2920B eine entsprechende Speichereinheit 2924B hat und eine N-te Partitionseinheit 2920N eine entsprechende N-te Speichereinheit 2924N hat. In mindestens einer Ausführungsform kann die Anzahl der Partitionseinheiten 2920A-2920N nicht gleich der Anzahl der Speichereinheiten sein.
  • In mindestens einer Ausführungsform können die Speichereinheiten 2924A-2924N 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 2924A-2924N 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 2924A-2924N hinweg gespeichert werden, so dass die Partitionseinheiten 2920A-2920N Teile jedes Renderingziels parallel schreiben können, um die verfügbare Bandbreite des Parallelprozessorspeichers 2922 effizient zu nutzen. In mindestens einer Ausführungsform kann eine lokale Instanz des Parallelprozessorspeichers 2922 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 2914A-2914N des Verarbeitungs-Arrays 2912 Daten verarbeiten, die in jede der Speichereinheiten 2924A-2924N in dem Parallelprozessorspeicher 2922 geschrieben werden. In mindestens einer Ausführungsform kann das Speicher-Koppelfeld 2916 so konfiguriert sein, dass es eine Ausgabe jedes Clusters 2914A-2914N an eine beliebige Partitionseinheit 2920A-2920N oder an einen anderen Cluster 2914A-2914N überträgt, der zusätzliche Verarbeitungsoperationen an einer Ausgabe durchführen kann. In mindestens einer Ausführungsform kann jeder Cluster 2914A-2914N mit der Speicherschnittstelle 2918 über das Speicher-Koppelfeld 2916 kommunizieren, um von verschiedenen externen Speichervorrichtungen zu lesen oder in diese zu schreiben. In mindestens einer Ausführungsform hat das Speicher-Koppelfeld 2916 eine Verbindung zu der Speicherschnittstelle 2918, um mit der I/O-Einheit 2904 zu kommunizieren, sowie eine Verbindung zu einer lokalen Instanz des Parallelprozessorspeichers 2922, so dass die Verarbeitungseinheiten in den verschiedenen Clustern 2914A-2914N mit dem Systemspeicher oder einem anderen Speicher kommunizieren können, der nicht lokal zur Parallelverarbeitungseinheit 2902 ist. In mindestens einer Ausführungsform kann die Speicher-Koppelfeld 2916 virtuelle Kanäle verwenden, um Verkehrsstreams zwischen Clustern 2914A-2914N und Partitionseinheiten 2920A-2920N zu trennen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der Parallelverarbeitungseinheit 2902 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 2902 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 2902 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 2902 oder des Parallelprozessors 2900 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 29A gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Parallelprozessor 2900 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Parallelprozessor 2900 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Parallelprozessor 2900 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 29B zeigt einen Verarbeitungscluster 2994, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2994 in einer Parallelverarbeitungseinheit enthalten. In mindestens einer Ausführungsform ist der Verarbeitungscluster 2994 einer der Verarbeitungscluster 2914A-2914N von 29. In mindestens einer Ausführungsform kann der Verarbeitungscluster 2994 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 2994 ausgibt.
  • In mindestens einer Ausführungsform kann der Betrieb des Verarbeitungsclusters 2994 über einen Pipeline-Manager 2932 gesteuert werden, der Verarbeitungs-Tasks auf parallele SIMT-Prozessoren verteilt. In mindestens einer Ausführungsform empfängt der Pipeline-Manager 2932 Anweisungen von dem Scheduler 2910 von 29 und verwaltet die Ausführung dieser Anweisungen über einen Grafik-Multiprozessor 2934 und/oder eine Textureinheit 2936. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2934 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 2994 enthalten sein. In mindestens einer Ausführungsform können eine oder mehrere Instanzen des Grafik-Multiprozessors 2934 in dem Verarbeitungscluster 2994 enthalten sein. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2934 Daten verarbeiten und kann ein Daten-Koppelfeld 2940 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 2932 die Verteilung der verarbeiteten Daten erleichtern, indem er Ziele für die verarbeiteten Daten angibt, die über das Daten-Koppelfeld 2940 zu verteilen sind.
  • In mindestens einer Ausführungsform kann jeder Grafik-Multiprozessor 2934 innerhalb des Verarbeitungsclusters 2994 einen identischen Satz an funktioneller Ausführungslogik (z.B. arithmetische Logikeinheiten, Lade-/Speichereinheiten („LSUs“) usw.) enthalten. In mindestens einer Ausführungsform kann die funktionelle Ausführungslogik in einer Pipeline konfiguriert sein, in der neue Anweisungen ausgegeben werden können, bevor vorherige Anweisungen abgeschlossen sind. In mindestens einer Ausführungsform unterstützt die funktionelle Ausführungslogik eine Vielzahl von Operationen, darunter Ganzzahl- und Gleitkommaarithmetik, Vergleichsoperationen, boolesche Operationen, Bitverschiebung und die Berechnung verschiedener algebraischer Funktionen. In mindestens einer Ausführungsform kann dieselbe Hardware mit funktionellen Einheiten genutzt werden, um verschiedene Operationen auszuführen, und es kann eine beliebige Kombination von funktionellen Einheiten vorhanden sein.
  • In mindestens einer Ausführungsform bilden die an den Verarbeitungscluster 2994 ü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 2934 zugewiesen sein. In mindestens einer Ausführungsform kann eine Thread-Gruppe weniger Threads umfassen als die Anzahl der Verarbeitungs-Engines innerhalb des Grafik-Multiprozessors 2934. 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 2934 enthalten. Wenn eine Thread-Gruppe mehr Threads umfasst als die Anzahl der Verarbeitungs-Engines in dem Grafik-Multiprozessor 2934, 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 2934 ausgeführt werden.
  • In mindestens einer Ausführungsform enthält der Grafik-Multiprozessor 2934 einen internen Cachespeicher, um Lade- und Speicheroperationen durchzuführen. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2934 auf einen internen Cache verzichten und einen Cachespeicher (z.B. L1-Cache 2948) innerhalb des Verarbeitungsclusters 2994 verwenden. In mindestens einer Ausführungsform hat jeder Grafik-Multiprozessor 2934 auch Zugriff auf Level-2 („L2“)-Caches innerhalb von Partitionseinheiten (z.B. den Partitionseinheiten 2920A-2920N von 29A), die von allen Verarbeitungsclustern 2994 gemeinsam genutzt werden und zur Datenübertragung zwischen Threads verwendet werden können. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 2934 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 2902 als globaler Speicher verwendet werden. In mindestens einer Ausführungsform umfasst der Verarbeitungscluster 2994 mehrere Instanzen des Grafik-Multiprozessors 2934, die sich gemeinsame Anweisungen und Daten teilen können, die in dem L1-Cache 2948 gespeichert sein können.
  • In mindestens einer Ausführungsform kann jeder Verarbeitungscluster 2994 eine MMU 2945 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 2945 innerhalb der Speicherschnittstelle 2918 von 29 befinden. In mindestens einer Ausführungsform enthält die MMU 2945 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 2945 Adressübersetzungs-Lookaside-Puffer („TLBs“) oder Caches enthalten, die sich in dem Grafik-Multiprozessor 2934 oder in dem L1-Cache 2948 oder in dem Verarbeitungscluster 2994 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 2994 so konfiguriert sein, dass jeder Grafik-Multiprozessor 2934 mit einer Textureinheit 2936 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 2934 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 2934 eine verarbeitete Aufgabe an das Daten-Koppelfeld 2940 aus, um die verarbeitete Aufgabe einem anderen Verarbeitungscluster 2994 zur weiteren Verarbeitung bereitzustellen oder um die verarbeitete Aufgabe in einem L2-Cache, einem lokalen Parallelprozessorspeicher oder einem Systemspeicher über das Speicher-Koppelfeld 2916 zu speichern. In mindestens einer Ausführungsform ist eine Pre-Raster-Operations-Einheit („preROP“) 2942 so konfiguriert, dass sie Daten von dem Grafik-Multiprozessor 2934 empfängt und Daten an ROP-Einheiten weiterleitet, die sich bei den hierin beschriebenen Partitionseinheiten (z.B. den Partitionseinheiten 2920A-2920N in 29) befinden können. In mindestens einer Ausführungsform kann die PreROP 2942 Optimierungen für die Farbmischung durchführen, Pixelfarbdaten organisieren und Adressübersetzungen vornehmen.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 29B gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Grafikmultiprozessor 2934 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikmultiprozessor 2934 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikmultiprozessor 2934 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 29C veranschaulicht einen Grafik-Multiprozessor 2996, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2996 der Grafik-Multiprozessor 2934 von 29B. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 2996 mit dem Pipeline-Manager 2932 des Verarbeitungsclusters 2994 gekoppelt. In mindestens einer Ausführungsform hat der Grafik-Multiprozessor 2996 eine Ausführungs-Pipeline, die unter anderem einen Anweisungscache 2952, eine Anweisungseinheit 2954, eine Adressabbildungseinheit 2956, eine Registerdatei 2958, einen oder mehrere GPGPU-Kerne 2962 und eine oder mehrere LSUs 2966 beinhaltet. Die GPGPU-Kerne 2962 und die LSUs 2966 sind über eine Speicher- und Cache-Verbindung 2968 mit dem Cachespeicher 2972 und dem gemeinsamen Speicher 2970 gekoppelt.
  • In mindestens einer Ausführungsform empfängt der Anweisungscache 2952 einen Stream bzw. Strom von auszuführenden Befehlen von dem Pipeline-Manager 2932. In mindestens einer Ausführungsform werden die Befehle in dem Anweisungscache 2952 zwischengespeichert und von der Anweisungseinheit 2954 zur Ausführung bereitgestellt. In mindestens einer Ausführungsform kann die Anweisungseinheit 2954 Anweisungen als Thread-Gruppen (z.B. Warps) versenden, wobei jeder Thread einer Thread-Gruppe einer anderen Ausführungseinheit innerhalb des GPGPU-Kerns 2962 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 2956 verwendet werden, um Adressen in einem vereinheitlichten Adressraum in eine eindeutige Speicheradresse zu übersetzen, auf die die LSUs 2966 zugreifen können.
  • In mindestens einer Ausführungsform stellt die Registerdatei 2958 einen Satz von Registern für Funktionseinheiten des Grafik-Multiprozessors 2996 bereit. In mindestens einer Ausführungsform stellt die Registerdatei 2958 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten (z.B. GPGPU-Kerne 2962, LSUs 2966) des Grafik-Multiprozessors 2996 verbunden sind. In mindestens einer Ausführungsform ist die Registerdatei 2958 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 2958 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 2958 zwischen verschiedenen Thread-Gruppen aufgeteilt, die von dem Grafik-Multiprozessor 2996 ausgeführt werden.
  • In mindestens einer Ausführungsform können die GPGPU-Kerne 2962 jeweils FPUs und/oder Integer-ALUs enthalten, die zur Ausführung von Anweisungen des Grafik-Multiprozessors 2996 verwendet werden. Die GPGPU-Kerne 2962 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 2962 eine FPU mit einfacher Genauigkeit und eine Integer-ALU, während ein zweiter Teil der GPGPU-Kerne 2962 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 2996 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 2962 auch eine Logik mit fester oder spezieller Funktion enthalten.
  • In mindestens einer Ausführungsform enthalten die GPGPU-Kerne 2962 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 2962 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 2962 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 2968 ein Verbindungsnetzwerk, das jede Funktionseinheit des Grafik-Multiprozessors 2996 mit der Registerdatei 2958 und dem gemeinsamen Speicher 2970 verbindet. In mindestens einer Ausführungsform ist die Speicher- und Cache-Verbindung 2968 eine Koppelfeldverbindung, die es der LSU 2966 ermöglicht, Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher 2970 und der Registerdatei 2958 durchzuführen. In mindestens einer Ausführungsform kann die Registerdatei 2958 mit derselben Frequenz arbeiten wie die GPGPU-Kerne 2962, so dass die Datenübertragung zwischen den GPGPU-Kernen 2962 und der Registerdatei 2958 eine sehr geringe Latenz aufweist. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2970 verwendet werden, um die Kommunikation zwischen Threads zu ermöglichen, die auf Funktionseinheiten innerhalb des Grafik-Multiprozessors 2996 ausgeführt werden. In mindestens einer Ausführungsform kann der Cachespeicher 2972 z.B. als Datencache verwendet werden, um Texturdaten zu cachen, die zwischen Funktionseinheiten und der Textureinheit 2936 kommuniziert werden. In mindestens einer Ausführungsform kann der gemeinsame Speicher 2970 auch als programmverwalteter Cache verwendet werden. In mindestens einer Ausführungsform können Threads, die auf den GPGPU-Kernen 2962 ausgeführt werden, zusätzlich zu den automatisch zwischengespeicherten Daten, die in dem Cachespeicher 2972 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 29C gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Grafikmultiprozessor 2996 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikmultiprozessor 2996 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikmultiprozessor 2996 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 30 zeigt einen Grafikprozessor 3000, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst der Grafikprozessor 3000 eine Ringverbindung 3002, ein Pipeline-Frontend 3004, eine Media Engine 3037 und Grafikkerne 3080A-3080N. In mindestens einer Ausführungsform verbindet die Ringverbindung 3002 den Grafikprozessor 3000 mit anderen Verarbeitungseinheiten, einschließlich anderer Grafikprozessoren oder eines oder mehrerer Mehrzweckprozessorkerne. In mindestens einer Ausführungsform ist der Grafikprozessor 3000 einer von vielen Prozessoren, die in ein Multikern-Verarbeitungssystem integriert sind.
  • In mindestens einer Ausführungsform empfängt der Grafikprozessor 3000 Stapel von Befehlen über die Ringverbindung 3002. In mindestens einer Ausführungsform werden die eingehenden Befehle von einem Befehlsstreamer 3003 in dem Pipeline-Frontend 3004 interpretiert. In mindestens einer Ausführungsform enthält der Grafikprozessor 3000 eine skalierbare Ausführungslogik zur Durchführung der 3D-Geometrieverarbeitung und der Medienverarbeitung über den/die Grafikkern(e) 3080A-3080N. In mindestens einer Ausführungsform liefert der Befehlsstreamer 3003 für 3D-Geometrieverarbeitungsbefehle Befehle an die Geometrie-Pipeline 3036. In mindestens einer Ausführungsform liefert der Befehlsstreamer 3003 für mindestens einige Medienverarbeitungsbefehle Befehle an ein Video-Frontend 3034, das mit einer Medien-Engine 3037 gekoppelt ist. In mindestens einer Ausführungsform umfasst die Medien-Engine 3037 eine Video Quality Engine („VQE“) 3030 für die Video- und Bildnachbearbeitung und eine Multiformat-Kodier-/ Dekodier-Engine („MFX“) 3033 für die hardwarebeschleunigte Kodierung und Dekodierung von Mediendaten. In mindestens einer Ausführungsform erzeugen die Geometrie-Pipeline 3036 und die Medien-Engine 3037 jeweils Ausführungs-Threads für Thread-Ausführungsressourcen, die von mindestens einem Grafikkern 3080A bereitgestellt werden.
  • In mindestens einer Ausführungsform enthält der Grafikprozessor 3000 skalierbare Thread-Ausführungsressourcen mit modularen Grafikkernen 3080A-3080N (manchmal als Kern-Slices bezeichnet), die jeweils mehrere Subkerne 3050A-3050N, 3060A-3060N (manchmal als Kern-Sub-Slices bezeichnet) aufweisen. In mindestens einer Ausführungsform kann der Grafikprozessor 3000 eine beliebige Anzahl von Grafikkernen 3080A bis 3080N aufweisen. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 3000 einen Grafikkern 3080A mit mindestens einem ersten Subkern 3050A und einem zweiten Subkern 3060A. In mindestens einer Ausführungsform ist der Grafikprozessor 3000 ein Prozessor mit geringem Stromverbrauch und einem einzigen Subkern (z.B. dem Subkern 3050A). In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 3000 mehrere Grafikkerne 3080A-3080N, die jeweils einen Satz erster Subkerne 3050A-3050N und einen Satz zweiter Subkerne 3060A-3060N umfassen. In mindestens einer Ausführungsform enthält jeder Subkern in den ersten Subkernen 3050A-3050N mindestens einen ersten Satz von Ausführungseinheiten („EUs“) 3052A-3052N und Medien-/Textur-Sampler 3054A-3054N. In mindestens einer Ausführungsform enthält jeder Subkern in den zweiten Subkernen 3060A-3060N mindestens einen zweiten Satz von Ausführungseinheiten 3062A-3062N und Samplern 3064A-3064N. In mindestens einer Ausführungsform teilt sich jeder Subkern 3050A-3050N, 3060A-3060N einen Satz von gemeinsam genutzten Ressourcen 3070A-3070N. In mindestens einer Ausführungsform umfassen die gemeinsam genutzten Ressourcen 3070 den gemeinsam genutzten Cachespeicher und die Pixeloperationslogik.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 30 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Grafikprozessor 3000 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikprozessor 3000 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Grafikprozessor 3000 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 31 veranschaulicht einen Prozessor 3100, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Prozessor 3100, ohne Beschränkung darauf, Logikschaltungen zur Ausführung von Befehlen enthalten. In mindestens einer Ausführungsform kann der Prozessor 3100 Befehle ausführen, einschließlich x86-Befehle, ARM-Befehle, spezielle Befehle für ASICs usw. In mindestens einer Ausführungsform kann der Prozessor 3110 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 3110 Anweisungen zur Beschleunigung von CUDA-Programmen ausführen.
  • In mindestens einer Ausführungsform enthält der Prozessor 3100 ein In-Order-Front-End („Front-End“) 3101 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 3101 mehrere Einheiten beinhalten. In mindestens einer Ausführungsform holt ein Anweisungs-Vorabrufer bzw. -Prefetcher 3126 Anweisungen aus dem Speicher und leitet sie an einen Anweisungs-Dekodierer 3128 weiter, der seinerseits Anweisungen dekodiert oder interpretiert. In mindestens einer Ausführungsform dekodiert der Anweisungs-Dekodierer 3128 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 3128 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 3130 dekodierte Uops in programmgeordnete Sequenzen oder Traces in einer Uop-Warteschlange 3134 zur Ausführung zusammenstellen. In mindestens einer Ausführungsform stellt dann, wenn der Trace-Cache 3130 auf eine komplexe Anweisung stößt, ein Mikrocode-ROM 3132 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 3128 auf den Mikrocode-ROM 3132 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 3128 dekodiert werden. In mindestens einer Ausführungsform kann eine Anweisung in dem Mikrocode-ROM 3132 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 3130 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 3132 zu vervollständigen. In mindestens einer Ausführungsform kann das Front-End 3101 der Maschine, nachdem der Mikrocode-ROM 3132 die Sequenzierung von Mikro-Ops für eine Anweisung beendet hat, das Abrufen von Mikro-Ops aus dem Trace-Cache 3130 wieder aufnehmen.
  • In mindestens einer Ausführungsform kann die Out-of-Order-Ausführungs-Engine („Out of Order Engine“) 3103 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 3103 beinhaltet, ohne darauf beschränkt zu sein, einen Allokator/Register-Umbenenner 3140, eine Speicher-Uop-Warteschlange 3142, eine Ganzzahl-/Gleitkomma-Uop-Warteschlange 3144, einen Speicher-Scheduler 3146, einen schnellen Scheduler 3102, einen langsamen/allgemeinen Gleitkomma-Scheduler („langsamer/allgemeiner FP-Scheduler“) 3104 und einen einfachen Gleitkomma-Scheduler („einfacher FP-Scheduler“) 3106. In mindestens einer Ausführungsform werden der schnelle Scheduler 3102, der langsame/allgemeine Gleitkomma-Scheduler 3104 und der einfache Gleitkomma-Scheduler 3106 hierin auch gemeinsam als „Uop-Scheduler 3102, 3104, 3106“ bezeichnet. Der Allocator/Register-Umbenenner 3140 weist Maschinenpuffer und Ressourcen zu, die jede Uop zur Ausführung benötigt. In mindestens einer Ausführungsform benennt der Allocator/Register-Umbenenner 3140 logische Register auf Einträge in einer Registerdatei um. In mindestens einer Ausführungsform weist der Allocator/Register-Umbenenner 3140 auch einen Eintrag für jede Uop in einer von zwei Uop-Warteschlangen zu, der Speicher-Uop-Warteschlange 3142 für Speicheroperationen und der Ganzzahl-/Gleitkomma-Uop-Warteschlange 3144 für Nicht-Speicheroperationen, und zwar vor dem Speicher-Scheduler 3146 und den Uop-Schedulern 3102, 3104, 3106. In mindestens einer Ausführungsform bestimmen die Uop-Scheduler 3102, 3104, 3106, 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 3102 in jeder Hälfte des Haupttaktzyklus terminieren, während der langsame/allgemeine Gleitkomma-Scheduler 3104 und der einfache Gleitkomma-Scheduler 3106 einmal pro Hauptprozessortaktzyklus terminieren können. In mindestens einer Ausführungsform arbitrieren die Uop-Scheduler 3102, 3104, 3106 für Versende- bzw. Dispatch-Ports, um Uops für die Ausführung zu planen.
  • In mindestens einer Ausführungsform beinhaltet der Ausführungsblock 3111, ohne Beschränkung darauf, eine Ganzzahl-Registerdatei/ein Bypass-Netzwerk 3108, eine Gleitkommaregisterdatei/ein Bypass-Netzwerk („FP-Registerdatei/ein Bypass-Netzwerk“) 3110, Adressgenerierungseinheiten („AGUs“) 3112 und 3114, schnelle ALUs bzw. S-ALUSs 3116 und 3118, eine langsame ALU bzw. L-ALU 3120, eine Gleitkomma-ALU („FP“) 3122 und eine Gleitkomma-Bewegungseinheit („FP-Move“) 3124. In mindestens einer Ausführungsform werden die Ganzzahl-Registerdatei/das Bypass-Netzwerk 3108 und die Gleitkomma-Registerdatei/das Bypass-Netzwerk 3110 hierin auch als „Registerdateien 3108, 3110“ bezeichnet. In mindestens einer Ausführungsform werden die AGUs 3112 und 3114, die schnellen ALUs 3116 und 3118, die langsame ALU 3120, die Gleitkomma-ALU 3122 und die Gleitkomma-Bewegungseinheit 3124 hierin auch als „Ausführungseinheiten 3112, 3114, 3116, 3118, 3120, 3122 und 3124“ 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 3108, 3110 zwischen den Uop-Schedulern 3102, 3104, 3106 und den Ausführungseinheiten 3112, 3114, 3116, 3118, 3120, 3122 und 3124 angeordnet sein. In mindestens einer Ausführungsform führt das Ganzzahl-Registerdatei/das Bypass-Netzwerk 3108 Ganzzahloperationen durch. In mindestens einer Ausführungsform führt die Gleitkommaregisterdatei/das Bypass-Netzwerk 3110 Gleitkommaoperationen durch. In mindestens einer Ausführungsform kann jede der Registerdateien 3108, 3110, 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 3108, 3110 Daten miteinander austauschen. In mindestens einer Ausführungsform kann das Ganzzahl-Registerdatei/das Bypass-Netzwerk 3108, 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 3110, 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 3112, 3114, 3116, 3118, 3120, 3122, 3124 Anweisungen ausführen. In mindestens einer Ausführungsform speichern Registerdateien 3108, 3110 Ganzzahl- und Gleitkomma-Daten-Operandenwerte, die Mikroanweisungen ausführen müssen. In mindestens einer Ausführungsform kann der Prozessor 3100, ohne Beschränkung darauf, eine beliebige Anzahl und Kombination von Ausführungseinheiten 3112, 3114, 3116, 3118, 3120, 3122, 3124 enthalten. In mindestens einer Ausführungsform können die Gleitkomma-ALU 3122 und die Gleitkomma-Bewegungseinheit 3124 Gleitkomma-, MMX-, SIMD-, AVX- und SSE- oder andere Operationen ausführen. In mindestens einer Ausführungsform kann die Gleitkomma-ALU 3122, 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 3116, 3118 übergeben werden. In mindestens einer Ausführungsform können die schnellen ALUS 3116, 3118 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 3120, da die langsame ALU 3120, 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 3112, 3114 ausgeführt werden. In mindestens einer Ausführungsform können die schnelle ALU 3116, die schnelle ALU 3118 und die langsame ALU 3120 Ganzzahloperationen an 64-Bit-Datenoperanden durchführen. In mindestens einer Ausführungsform können die schnelle ALU 3116, die schnelle ALU 3118 und die langsame ALU 3120 so implementiert sein, dass sie eine Vielzahl von Datenbitgrößen unterstützen, einschließlich sechzehn, zweiunddreißig, 128, 256, usw. In mindestens einer Ausführungsform können die Gleitkomma-ALU 3122 und die Gleitkomma-Bewegungseinheit („FP MOVE“) 3124 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 3122 und die Gleitkomma-Bewegungseinheit 3124 mit 128 Bit breiten gepackten Datenoperanden in Verbindung mit SIMD- und Multimedia-Anweisungen arbeiten.
  • In mindestens einer Ausführungsform versenden die Uop-Scheduler 3102, 3104, 3106 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 3100 ausgeführt werden können, kann der Prozessor 3100 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 31 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Prozessor 3100 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 3100 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 3100 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 32 zeigt einen Prozessor 3200, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet der Prozessor 3200, ohne Beschränkung darauf, einen oder mehrere Prozessorkerne („Kerne“) 3202A-3202N, eine integrierte Speichersteuerung 3214 und einen integrierten Grafikprozessor 3208. In mindestens einer Ausführungsform kann der Prozessor 3200 zusätzliche Kerne bis hin zu und einschließlich des zusätzlichen Prozessorkerns 3202N enthalten, der durch gestrichelte, linierte Kästen dargestellt ist. In mindestens einer Ausführungsform enthält jeder der Prozessorkerne 3202A-3202N eine oder mehrere interne Cacheeinheiten 3204A-3204N. In mindestens einer Ausführungsform hat jeder Prozessorkern auch Zugriff auf eine oder mehrere gemeinsam genutzte Cacheeinheiten 3206.
  • In mindestens einer Ausführungsform repräsentieren die internen Cacheeinheiten 3204A-3204N und die gemeinsam genutzten Cacheeinheiten 3206 eine Cachespeicherhierarchie innerhalb des Prozessors 3200. In mindestens einer Ausführungsform können die Cachespeichereinheiten 3204A-3204N 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 3206 und 3204A-3204N aufrecht.
  • In mindestens einer Ausführungsform kann der Prozessor 3200 auch einen Satz von einer oder mehreren Bussteuereinheiten 3216 und einen Systemagent-Kern 3210 enthalten. In mindestens einer Ausführungsform verwalten eine oder mehrere Bussteuereinheiten 3216 einen Satz von Peripheriebussen, wie z.B. einen oder mehrere PCI- oder PCI-Express-Busse. In mindestens einer Ausführungsform stellt der Systemagent-Kern 3210 Verwaltungsfunktionen für verschiedene Prozessorkomponenten bereit. In mindestens einer Ausführungsform enthält der Systemagent-Kern 3210 einen oder mehrere integrierte Speichersteuerungen 3214 zur Verwaltung des Zugriffs auf verschiedene externe Speichervorrichtungen (nicht gezeigt).
  • In mindestens einer Ausführungsform beinhalten einer oder mehrere der Prozessorkerne 3202A-3202N Unterstützung für gleichzeitiges Multithreading. In mindestens einer Ausführungsform enthält der Systemagent-Kern 3210 Komponenten zum Koordinieren und Betreiben der Prozessorkerne 3202A-3202N während der Multithreading-Verarbeitung. In mindestens einer Ausführungsform kann der Systemagent-Kern 3210 zusätzlich eine Leistungssteuerungseinheit („PCU“) enthalten, die Logik und Komponenten zur Regelung eines oder mehrerer Leistungszustände der Prozessorkerne 3202A-3202N und des Grafikprozessors 3208 beinhaltet.
  • In mindestens einer Ausführungsform enthält der Prozessor 3200 zusätzlich einen Grafikprozessor 3208 zur Ausführung von Grafikverarbeitungsoperationen. In mindestens einer Ausführungsform ist der Grafikprozessor 3208 mit gemeinsam genutzten Cacheeinheiten 3206 und dem Systemagent-Kern 3210 gekoppelt, einschließlich einer oder mehrerer integrierter Speichersteuerungen 3214. In mindestens einer Ausführungsform enthält der Systemagent-Kern 3210 auch eine Anzeigesteuerung 3211, um die Ausgabe des Grafikprozessors an ein oder mehrere gekoppelte Anzeigen zu steuern. In mindestens einer Ausführungsform kann die Anzeigesteuerung 3211 auch ein separates Modul sein, das über mindestens eine Verbindung bzw. einen Interconnect mit dem Grafikprozessor 3208 gekoppelt ist, oder kann in den Grafikprozessor 3208 integriert sein.
  • In mindestens einer Ausführungsform wird eine ringbasierte Verbindungseinheit 3212 verwendet, um interne Komponenten des Prozessors 3200 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 3208 über eine I/O-Verbindung 3213 mit der Ringverbindung 3212 gekoppelt.
  • In mindestens einer Ausführungsform repräsentiert die I/O-Verbindung 3213 mindestens eine von mehreren Arten von I/O-Verbindungen, einschließlich einer On-Package-I/O-Verbindung, die die Kommunikation zwischen verschiedenen Prozessorkomponenten und einem eingebetteten Hochleistungsspeichermodul 3218, wie z.B. einem eDRAM-Modul, erleichtert. In mindestens einer Ausführungsform verwenden jeder der Prozessorkerne 3202A-3202N und der Grafikprozessor 3208 eingebettete Speichermodule 3218 als gemeinsame LLC.
  • In mindestens einer Ausführungsform sind die Prozessorkerne 3202A-3202N homogene Kerne, die eine gemeinsame Befehlssatzarchitektur ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 3202A-3202N heterogen in Bezug auf die ISA, wobei ein oder mehrere Prozessorkerne 3202A-3202N einen gemeinsamen Befehlssatz ausführen, während ein oder mehrere andere Kerne der Prozessorkerne 3202A-3202N eine Teilmenge eines gemeinsamen Befehlssatzes oder einen anderen Befehlssatz ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 3202A-3202N 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 3200 auf einem oder mehreren Chips oder als integrierte SoC-Schaltung implementiert sein.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 32 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Prozessor 3200 und/oder der Grafikprozessor 3208 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 3200 und/oder der Grafikprozessor 3208 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Prozessor 3200 und/oder der Grafikprozessor 3208 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 33 veranschaulicht einen Grafikprozessorkern 3300, gemäß mindestens einer beschriebenen Ausführungsform. In mindestens einer Ausführungsform ist der Grafikprozessorkern 3300 in einem Grafikkern-Array enthalten. In mindestens einer Ausführungsform kann der Grafikprozessorkern 3300, 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 3300 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 3300 einen Festfunktionsblock 3330 enthalten, der mit mehreren Subkernen 3301A-3301 F gekoppelt ist, die auch als Sub-Slices bezeichnet werden und modulare Blöcke von Logik allgemeiner und fester Funktion enthalten. Bei mindestens einer Ausführungsform umfasst der Grafikprozessorkern 3300.
  • In mindestens einer Ausführungsform beinhaltet der Festfunktionsblock 3330 eine Geometrie/Festfunktions-Pipeline 3336, die von allen Subkernen in dem Grafikprozessor 3300, 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 3336 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 3330 darüber hinaus eine Grafik-SoC-Schnittstelle 3337, einen Grafik-Mikrocontroller 3338 und eine Medienpipeline 3339. Die Grafik-SoC-Schnittstelle 3337 stellt eine Schnittstelle zwischen dem Grafikkern 3300 und anderen Prozessorkernen innerhalb einer integrierten SoC-Schaltung bereit. In mindestens einer Ausführungsform ist der Grafik-Mikrocontroller 3338 ein programmierbarer Subprozessor, der so konfiguriert werden kann, dass er verschiedene Funktionen des Grafikprozessors 3300 verwaltet, einschließlich Thread-Versendung, Planung und Präemption. In mindestens einer Ausführungsform enthält die Medienpipeline 3339 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 3339 Medienoperationen über Anforderungen an die Rechen- oder Abtastlogik innerhalb der Subkerne 3301-3301 F.
  • In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 3337 dem Grafikkern 3300 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 3337 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 3300 und CPUs innerhalb eines SoCs gemeinsam genutzt werden können. In mindestens einer Ausführungsform kann die SoC-Schnittstelle 3337 auch Energieverwaltungssteuerungen für den Grafikkern 3300 implementieren und eine Schnittstelle zwischen einer Taktdomäne des Grafikkerns 3300 und anderen Taktdomänen innerhalb eines SoCs ermöglichen. In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 3337 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 3339 gesendet werden, wenn Medienoperationen durchzuführen sind, oder an eine Geometrie- und Festfunktions-Pipeline (z.B. die Geometrie- und Festfunktions-Pipeline 3336, die Geometrie- und Festfunktions-Pipeline 3314), wenn Grafikverarbeitungsoperationen durchzuführen sind.
  • In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 3338 so konfiguriert sein, dass er verschiedene Planungs- und Verwaltungs-Tasks für den Grafikkern 3300 durchführt. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 3338 die Planung von Grafik- und/oder Rechenlasten auf verschiedenen parallelen Grafik-Engines in den Arrays 3302A-3302F, 3304A-3304F der Ausführungseinheiten (EU) in den Subkernen 3301A-3301F durchführen. In mindestens einer Ausführungsform kann Hostsoftware, die auf einem CPU-Kern eines SoC mit Grafikkern 3300 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 3338 auch Stromsparzustände oder Leerlaufzustände für den Grafikkern 3300 erleichtern, indem er dem Grafikkern 3300 eine Fähigkeit bereitstellt, Register innerhalb des Grafikkerns 3300 ü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 3300 mehr oder weniger als die dargestellten Subkerne 3301A-3301F haben, bis hin zu N modularen Subkernen. Für jeden Satz von N Subkernen kann der Grafikkern 3300 in mindestens einer Ausführungsform auch eine gemeinsam genutzte Funktionslogik 3310, einen gemeinsam genutzten Speicher und/oder Cachespeicher 3312, eine Geometrie-/ Festfunktions-Pipeline 3314 sowie eine zusätzliche Festfunktionslogik 3316 zur Beschleunigung verschiedener Grafik- und Rechenverarbeitungsvorgänge beinhalten. In mindestens einer Ausführungsform kann die gemeinsam genutzte Funktionslogik 3310 Logikeinheiten (z.B. Sampler-, Mathematik- und/oder Inter-Thread-Kommunikationslogik) umfassen, die von allen N Subkernen innerhalb des Grafikkerns 3300 gemeinsam genutzt werden können. Der gemeinsam genutzte Speicher und/oder Cachespeicher 3312 kann ein LLC für N Subkerne 3301A-3301F innerhalb des Grafikkerns 3300 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 3314 anstelle der Geometrie-/Festfunktions-Pipeline 3336 innerhalb des Festfunktionsblocks 3330 enthalten sein und kann gleiche oder ähnliche Logikeinheiten beinhalten.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkern 3300 zusätzliche feste Funktionslogik 3316, die verschiedene feste Funktionsbeschleunigungslogik zur Verwendung durch den Grafikkern 3300 enthalten kann. In mindestens einer Ausführungsform umfasst die zusätzliche Festfunktionslogik 3316 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 3316, 3336, und eine Cull-Pipeline, bei der es sich um eine zusätzliche Geometrie-Pipeline handelt, die in der zusätzlichen Festfunktionslogik 3316 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 3316 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 3316 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 3301A-3301F 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 3301A-3301F mehrere EU-Arrays 3302A-3302F, 3304A-3304F, Thread-Dispatch- und Inter-Thread-Kommunikationslogik („TD/IC“) 3303A-3303F, einen 3D (z.B. Textur-)- Sampler 3305A-3305F, einen Media-Sampler 3306A-3306F, einen Shader-Prozessor 3307A-3307F und gemeinsam genutzten lokalen Speicher („SLM“) 3308A-3308F. Die EU-Arrays 3302A-3302F, 3304A-3304F 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 3303A-3303F 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 3305A-3305F 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 3306A-3306F ä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 GrafikSubkern 3301A-3301F abwechselnd einen vereinheitlichten 3D- und Medien-Sampler enthalten. In mindestens einer Ausführungsform können Threads, die auf Ausführungseinheiten innerhalb jedes der Subkerne 3301A-3301F ausgeführt werden, den gemeinsamen lokalen Speicher 3308A-3308F 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 33 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3300 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3300 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Grafikprozessorkerns 3300 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 34 veranschaulicht eine Parallelverarbeitungseinheit („PPU“) 3400, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die PPU 3400 mit maschinenlesbarem Code konfiguriert, der, wenn er von der PPU 3400 ausgeführt wird, die PPU 3400 veranlasst, einige oder alle der hierin beschriebenen Prozesse und Techniken durchzuführen. In mindestens einer Ausführungsform ist die PPU 3400 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 3400 konfiguriert sind. In mindestens einer Ausführungsform ist die PPU 3400 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 3400 verwendet, um Berechnungen wie lineare Algebra-Operationen und Machine-Learning-Operationen durchzuführen. 34 veranschaulicht ein Beispiel für einen Parallelprozessor nur zu darstellenden Zwecken und ist als nicht ein beschränkendes Beispiel für eine Prozessorarchitektur zu verstehen, die in mindestens einer Ausführungsform implementiert sein kann.
  • In mindestens einer Ausführungsform sind eine oder mehrere PPUs 3400 so konfiguriert, dass sie High Performance Computing („HPC“)-, Rechenzentrums- und Machine Learning-Anwendungen beschleunigen. In mindestens einer Ausführungsform sind eine oder mehrere PPUs 3400 für die Beschleunigung von CUDA-Programmen konfiguriert. In mindestens einer Ausführungsform beinhaltet die PPU 3400, ohne Beschränkung darauf, eine I/O-Einheit 3406, eine Frontend-Einheit 3410, eine Scheduler-Einheit 3412, eine Arbeitsverteilungseinheit 3414, einen Hub 3416, ein Koppelfeld bzw. eine Crossbar („Xbar“) 3420, einen oder mehrere Universalverarbeitungscluster („GPCs“) 3418 und eine oder mehrere Partitionseinheiten („Speicherpartitionseinheiten“) 3422. In mindestens einer Ausführungsform ist die PPU 3400 mit einem Hostprozessor oder anderen PPUs 3400 über eine oder mehrere Hochgeschwindigkeits-GPU-Verbindungen („GPU-Interconnects“) 3408 verbunden. In mindestens einer Ausführungsform ist die PPU 3400 über eine Zwischenverbindung bzw. einen Interconnect 3402 mit einem Hostprozessor oder anderen Peripheriegeräten verbunden. In mindestens einer Ausführungsform ist die PPU 3400 mit einem lokalen Speicher verbunden, der ein oder mehrere Speichervorrichtungen („Speicher“) 3404 umfasst. In mindestens einer Ausführungsform beinhalten die Speichervorrichtungen 3404, 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 3408 auf eine drahtgebundene Mehrspur-Kommunikationsverbindung beziehen, die von Systemen verwendet wird, um zu skalieren und die eine oder mehrere PPUs 3400 in Kombination mit einer oder mehreren CPUs umfassen, die Cache-Kohärenz zwischen PPUs 3400 und CPUs sowie CPU-Mastering unterstützen. In mindestens einer Ausführungsform werden Daten und/oder Befehle über die Hochgeschwindigkeits-GPU-Verbindung 3408 durch den Hub 3416 zu/von anderen Einheiten der PPU 3400, wie z.B. einer oder mehreren Kopiermaschinen, Videokodierern, Video-Dekodierern, Energieverwaltungseinheiten und anderen Komponenten, die in 34 möglicherweise nicht explizit dargestellt sind, übertragen.
  • In mindestens einer Ausführungsform ist die I/O-Einheit 3406 so konfiguriert, dass sie Kommunikationen (z.B. Befehle, Daten) von einem Hostprozessor (in 34 nicht dargestellt) über den Systembus 3402 sendet und empfängt. In mindestens einer Ausführungsform kommuniziert die I/O-Einheit 3406 mit dem Hostprozessor direkt über den Systembus 3402 oder über ein oder mehrere Zwischenvorrichtungen, wie z.B. eine Speicherbrücke. In mindestens einer Ausführungsform kann die I/O-Einheit 3406 über den Systembus 3402 mit einem oder mehreren anderen Prozessoren kommunizieren, z.B. mit einer oder mehreren der PPUs 3400. In mindestens einer Ausführungsform implementiert die I/O-Einheit 3406 eine PCIe-Schnittstelle für die Kommunikation über einen PCIe-Bus. In mindestens einer Ausführungsform implementiert die I/O-Einheit 3406 Schnittstellen für die Kommunikation mit externen Geräten.
  • In mindestens einer Ausführungsform dekodiert die I/O-Einheit 3406 über den Systembus 3402 empfangene Pakete. In mindestens einer Ausführungsform repräsentieren mindestens einige Pakete Befehle, die so konfiguriert sind, dass sie die PPU 3400 veranlassen, verschiedene Operationen durchzuführen. In mindestens einer Ausführungsform sendet die I/O-Einheit 3406 dekodierte Befehle an verschiedene andere Einheiten der PPU 3400, wie durch Befehle vorgegeben. In mindestens einer Ausführungsform werden Befehle an die Frontend-Einheit 3410 und/oder an den Hub 3416 oder andere Einheiten der PPU 3400, wie z.B. eine oder mehrere Kopiermaschinen, einen Videokodierer, einen Video-Dekodierer, eine Energieverwaltungseinheit usw., (in 34 nicht explizit dargestellt) übertragen. In mindestens einer Ausführungsform ist die I/O-Einheit 3406 so konfiguriert, dass sie die Kommunikation zwischen und unter verschiedenen logischen Einheiten der PPU 3400 routet bzw. leitet.
  • In mindestens einer Ausführungsform kodiert ein von dem Hostprozessor ausgeführtes Programm einen Befehlsstrom in einem Puffer, der der PPU 3400 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 3400 zugreifen können (z.B. Lesen/Schreiben) - eine Host-Schnittstelleneinheit kann so konfiguriert sein, dass sie auf einen Puffer in einem mit dem Systembus 3402 verbundenen Systemspeicher über Speicheranforderungen zugreift, die über den Systembus 3402 von der I/O-Einheit 3406 ü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 3400, so dass die Frontend-Einheit 3410 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 3400 weiterleitet.
  • In mindestens einer Ausführungsform ist die Frontend-Einheit 3410 mit der Scheduler-Einheit 3412 gekoppelt, die verschiedene GPCs 3418 zur Verarbeitung von Aufgaben konfiguriert, die durch einen oder mehrere Befehlsströme definiert sind. In mindestens einer Ausführungsform ist die Scheduler-Einheit 3412 so konfiguriert, dass sie Zustandsinformationen mit Bezug zu verschiedenen Aufgaben nachverfolgt, die von der Scheduler-Einheit 3412 verwaltet werden, wobei die Zustandsinformationen angeben können, welchem der GPCs 3418 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 3412 die Ausführung einer Vielzahl von Aufgaben auf einem oder mehreren GPCs 3418.
  • In mindestens einer Ausführungsform ist die Scheduler-Einheit 3412 mit der Arbeitsverteilungseinheit 3414 gekoppelt, die so konfiguriert ist, dass sie Aufgaben zur Ausführung auf den GPCs 3418 versendet. In mindestens einer Ausführungsform nachverfolgt die Arbeitsverteilungseinheit 3414 eine Anzahl geplanter Aufgaben, die von der Scheduler-Einheit 3412 empfangen wurden, und verwaltet die Arbeitsverteilungseinheit 3414 einen Pool ausstehender Aufgaben und einen Pool aktiver Aufgaben für jeden GPC 3418. 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 3418 zugewiesen sind; der Pool aktiver Aufgaben kann eine Anzahl von Slots (z.B. 4 Slots) für Aufgaben umfassen, die aktiv von den GPCs 3418 verarbeitet werden, so dass dann, wenn einer der GPCs 3418 die Ausführung einer Aufgabe abschließt, diese Aufgabe aus dem Pool aktiver Aufgaben für den GPC 3418 entfernt wird und eine der anderen Aufgaben aus dem Pool anstehender Aufgaben ausgewählt und zur Ausführung auf dem GPC 3418 eingeplant wird. In mindestens einer Ausführungsform wird dann, wenn eine aktive Aufgabe auf dem GPC 3418 im Leerlauf ist, z.B. während auf die Auflösung einer Datenabhängigkeit gewartet wird, die aktive Aufgabe aus dem GPC 3418 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 3418 eingeplant wird.
  • In mindestens einer Ausführungsform kommuniziert die Arbeitsverteilungseinheit 3414 mit einem oder mehreren GPCs 3418 über das Koppelfeld bzw. die XBar 3420. In mindestens einer Ausführungsform ist die XBar 3420 ein Interconnect- bzw. Verbindungsnetzwerk, das viele Einheiten der PPU 3400 mit anderen Einheiten der PPU 3400 koppelt und so konfiguriert sein kann, dass es die Arbeitsverteilungseinheit 3414 mit einem bestimmten GPC 3418 koppelt. In mindestens einer Ausführungsform können auch eine oder mehrere andere Einheiten der PPU 3400 über den Hub 3416 mit der XBar 3420 verbunden sein.
  • In mindestens einer Ausführungsform werden Aufgaben von der Scheduler-Einheit 3412 verwaltet und von der Arbeitsverteilungseinheit 3414 an einen der GPCs 3418 weitergeleitet. Der GPC 3418 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 3418 verbraucht, über die XBar 3420 an einen anderen GPC 3418 weitergeleitet oder in dem Speicher 3404 gespeichert werden. In mindestens einer Ausführungsform können Ergebnisse in den Speicher 3404 über Partitionseinheiten 3422 geschrieben werden, die eine Speicherschnittstelle zum Lesen und Schreiben von Daten in/aus dem Speicher 3404 implementieren. In mindestens einer Ausführungsform können die Ergebnisse über die Hochgeschwindigkeits-GPU-Verbindung 3408 an eine andere PPU 3404 oder CPU übertragen werden. In mindestens einer Ausführungsform umfasst die PPU 3400, ohne Beschränkung darauf, eine Anzahl U von Partitionseinheiten 3422, die gleich der Anzahl der mit der PPU 3400 verbundenen separaten und unterschiedlichen Speichervorrichtungen 3404 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 3400 zu planen. In mindestens einer Ausführungsform werden mehrere Rechenanwendungen gleichzeitig von der PPU 3400 ausgeführt und stellt die PPU 3400 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 3400 zu generieren, und gibt der Treiberkern Aufgaben an einen oder mehrere Streams aus, die von der PPU 3400 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 34 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3400 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3400 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird die Parallelverarbeitungseinheit 3400 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 35 veranschaulicht einen GPC 3500, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der GPC 3500 der GPC 3418 von 34. In mindestens einer Ausführungsform beinhaltet jeder GPC 3500, ohne Beschränkung darauf, eine Anzahl von Hardware-Einheiten zur Verarbeitung von Aufgaben, und beinhaltet jeder GPC 3500, ohne Beschränkung darauf, einen Pipeline-Manager 3502, eine Pre-Raster-Operationseinheit („PROP“) 3504, eine Raster-Engine 3508, ein Arbeitsverteilungs-Koppelfeld („WDX“) 3516, eine MMU 3518, einen oder mehrere Datenverarbeitungscluster („DPCs“) 3506 und jede geeignete Kombination von Teilen.
  • In mindestens einer Ausführungsform wird der Betriebsablauf des GPC 3500 von dem Pipeline-Manager 3502 gesteuert. In mindestens einer Ausführungsform verwaltet der Pipeline-Manager 3502 die Konfiguration eines oder mehrerer DPCs 3506 zur Verarbeitung von Aufgaben, die dem GPC 3500 zugewiesen sind. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3502 mindestens eine des einen oder der mehreren DPCs 3506, um mindestens einen Teil einer Grafik-Rendering-Pipeline zu implementieren. In mindestens einer Ausführungsform ist der DPC 3506 so konfiguriert, dass er ein Vertex-Shader-Programm auf einem programmierbaren Streaming-Multiprozessor („SM“) 3514 ausführt. In mindestens einer Ausführungsform ist der Pipeline-Manager 3502 so konfiguriert, dass er von einer Arbeitsverteilungseinheit empfangene Pakete an entsprechende logische Einheiten innerhalb des GPC 3500 weiterleitet, und in mindestens einer Ausführungsform können einige Pakete an Hardwareeinheiten mit fester Funktion in dem PROP 3504 und/oder in der Raster-Engine 3508 weitergeleitet werden, während andere Pakete an die DPCs 3506 zur Verarbeitung durch eine Primitiv-Engine 3512 oder den SM 3514 weitergeleitet werden können. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3502 mindestens einen der DPCs 3506, um eine Rechenpipeline zu implementieren. In mindestens einer Ausführungsform konfiguriert der Pipeline-Manager 3502 mindestens einen der DPCs 3506, um mindestens einen Teil eines CUDA-Programms auszuführen.
  • In mindestens einer Ausführungsform ist die PROP-Einheit 3504 so konfiguriert, dass sie von der Raster-Engine 3508 und den DPCs 3506 erzeugte Daten an eine Raster Operations („ROP“)-Einheit in einer Partitionseinheit weiterleitet, wie z.B. die vorstehend in Verbindung mit 34 näher beschriebene Speicherpartitionseinheit 3422. In mindestens einer Ausführungsform ist die PROP-Einheit 3504 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 3508, 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 3508, 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 3508 Fragmente, die von einer geeigneten Einheit zu verarbeiten sind, z.B. von einem in dem DPC 3506 implementierten Fragment-Shader.
  • In mindestens einer Ausführungsform umfasst jeder in dem GPC 3500 enthaltene DPC 3506, ohne Beschränkung darauf, einen M-Pipe-Controller („MPC“) 3510, eine Primitiv-Engine 3512, einen oder mehrere SMs 3514 und jede geeignete Kombination davon. In mindestens einer Ausführungsform steuert der MPC 3510 den Betriebsablauf des DPC 3506, indem er von dem Pipeline-Manager 3502 empfangene Pakete an entsprechende Einheiten in dem DPC 3506 weiterleitet. In mindestens einer Ausführungsform werden Pakete, die einem Vertex zugeordnet sind, an die Primitive Engine 3512 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 3514 übertragen werden.
  • In mindestens einer Ausführungsform umfasst der SM 3514, 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 3514 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 3514 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 3514 wird in Verbindung mit 36 ausführlicher beschrieben.
  • In mindestens einer Ausführungsform stellt die MMU 3518 eine Schnittstelle zwischen dem GPC 3500 und einer Speicherpartitionseinheit (z.B. der Partitionseinheit 3422 in 34) bereit, und stellt die MMU 3518 eine Übersetzung virtueller Adressen in physische Adressen, einen Speicherschutz und eine Arbitrierung von Speicheranforderungen bereit. In mindestens einer Ausführungsform stellt die MMU 3518 einen oder mehrere Übersetzungs-Lookaside-Puffer (TLBs) zur Durchführung der Übersetzung virtueller Adressen in physische Adressen im Speicher bereit.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 35 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3500 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3500 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der allgemeine Verarbeitungscluster 3500 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 36 veranschaulicht einen Streaming-Multiprozessor („SM“) 3600, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der SM 3600 der SM 3514 von 35. In mindestens einer Ausführungsform beinhaltet der SM 3600, ohne Beschränkung darauf, einen Anweisungscache 3602; eine oder mehrere Schedulereinheiten 3604; eine Registerdatei 3608; einen oder mehrere Verarbeitungskerne („Cores“) 3610; eine oder mehrere Spezialfunktionseinheiten („SFUs“) 3612; eine oder mehrere LSUs 3614; ein Verbindungsnetzwerk 3616; einen gemeinsamen Speicher/L1-Cache 3618; 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 3600 zugewiesen. In mindestens einer Ausführungsform empfängt die Schedulereinheit 3604 Aufgaben von einer Arbeitsverteilungseinheit und verwaltet die Befehlsplanung für einen oder mehrere Thread-Blöcke, die dem SM 3600 zugewiesen sind. In mindestens einer Ausführungsform plant die Schedulereinheit 3604 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 3604 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 3610, SFUs 3612 und LSUs 3614) während jedes Taktzyklus verteilt.
  • In mindestens einer Ausführungsform kann sich „kooperative Gruppen“ auf ein Programmiermodell zum Organisieren von Gruppen kommunizierender Threads beziehen, das es Entwicklern ermöglicht, Granularität auszudrücken, mit der Threads kommunizieren, und so reichhaltigere, effizientere parallele Dekompositionen zu ermöglichen. In mindestens einer Ausführungsform unterstützen kooperative Start-APIs eine Synchronisierung zwischen Thread-Blöcken zur Ausführung paralleler Algorithmen. In mindestens einer Ausführungsform bieten APIs herkömmlicher Programmiermodelle ein einziges, einfaches Konstrukt zur Synchronisierung kooperierender Threads: eine Sperre über alle Threads eines Thread-Blocks (z.B. die Funktion syncthreads( )). In mindestens einer Ausführungsform können Programmierer jedoch Gruppen von Threads mit einer kleineren Granularität als der des Thread-Blocks definieren und innerhalb definierter Gruppen synchronisieren, um höhere Leistung, Designflexibilität und Software-Wiederverwendung in Form von gemeinsamen gruppenweiten Funktionsschnittstellen zu ermöglichen. In mindestens einer Ausführungsform ermöglichen es kooperative Gruppen Programmierern, Gruppen von Threads explizit auf Subblock- und Multiblock-Granularität zu definieren und kollektive Operationen wie beispielsweise Synchronisation auf Threads in einer kooperativen Gruppe durchzuführen. In mindestens einer Ausführungsform ist eine Subblock-Granularität so klein wie ein einzelner Thread. In mindestens einer Ausführungsform unterstützt ein Programmiermodell eine saubere Komposition über Softwaregrenzen hinweg, so dass Bibliotheken und Utility-Funktionen innerhalb ihres lokalen Kontexts sicher synchronisieren können, ohne Annahmen über Konvergenz treffen zu müssen. In mindestens einer Ausführungsform ermöglichen kooperative Gruppenprimitive neue Muster kooperativer Parallelität, einschließlich, ohne Beschränkung darauf, Produzenten-Verbraucher-Parallelität, opportunistischer Parallelität und globaler Synchronisierung über ein gesamtes Gitter bzw. Grid von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist eine Dispatcheinheit 3606 so konfiguriert, dass sie Befehle an eine oder mehrere Funktionseinheiten überträgt, und beinhaltet die Schedulereinheit 3604, ohne Beschränkung darauf, zwei Dispatcheinheiten 3606, 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 3604 eine einzelne Dispatcheinheit 3606 oder zusätzliche Dispatcheinheiten 3606.
  • In mindestens einer Ausführungsform enthält jeder SM 3600, ohne Beschränkung darauf, eine Registerdatei 3608, die einen Satz von Registern für Funktionseinheiten des SM 3600 bereitstellt. In mindestens einer Ausführungsform ist die Registerdatei 3608 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein dedizierter Teil der Registerdatei 3608 zugeordnet ist. In mindestens einer Ausführungsform ist die Registerdatei 3608 zwischen verschiedenen Warps aufgeteilt, die von dem SM 3600 ausgeführt werden, und stellt die Registerdatei 3608 einen temporären Speicher für Operanden bereit, die mit Datenpfaden von Funktionseinheiten verbunden sind. In mindestens einer Ausführungsform umfasst jeder SM 3600, ohne Beschränkung darauf, eine Vielzahl von L Verarbeitungskernen 3610. In mindestens einer Ausführungsform beinhaltet der SM 3600, ohne Beschränkung darauf, eine große Anzahl (z.B. 128 oder mehr) von unterschiedlichen Verarbeitungskernen 3610. In mindestens einer Ausführungsform beinhaltet jeder Verarbeitungskern 3610, 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 3610, 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 3610 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 3600, ohne Beschränkung darauf, M SFUs 3612, die spezielle Funktionen ausführen (z.B. Attributauswertung, reziproke Quadratwurzel und dergleichen). In mindestens einer Ausführungsform beinhalten die SFUs 3612, 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 3612, 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 3600 ausgeführt werden. In mindestens einer Ausführungsform werden die Texturkarten in dem gemeinsamen Speicher/L1-Cache 3618 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 3600, ohne Beschränkung darauf, zwei Textureinheiten.
  • In mindestens einer Ausführungsform umfasst jeder SM 3600, ohne Beschränkung darauf, N LSUs 3614, die Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher/L1-Cache 3618 und der Registerdatei 3608 implementieren. In mindestens einer Ausführungsform umfasst jeder SM 3600, ohne Beschränkung darauf, ein Verbindungsnetzwerk 3616, das jede der Funktionseinheiten mit der Registerdatei 3608 und die LSU 3614 mit der Registerdatei 3608 und dem gemeinsamen Speicher/L1-Cache 3618 verbindet. In mindestens einer Ausführungsform ist das Verbindungsnetzwerk 3616 ein Koppelfeld, das so konfiguriert werden kann, dass es jede der Funktionseinheiten mit jedem der Register in der Registerdatei 3608 verbindet und die LSUs 3614 mit der Registerdatei 3608 und Speicherplätzen in dem gemeinsamen Speicher/L1-Cache 3618 verbindet.
  • In mindestens einer Ausführungsform ist der gemeinsam genutzte Speicher/L1-Cache 3618 ein Array von On-Chip-Speicher, der die Datenspeicherung und Kommunikation zwischen dem SM 3600 und einer Primitiv-Engine sowie zwischen Threads in dem SM 3600 ermöglicht. In mindestens einer Ausführungsform umfasst der gemeinsam genutzte Speicher/L1-Cache 3618, ohne Beschränkung darauf, 128 KB Speicherkapazität und befindet sich in einem Pfad von dem SM 3600 zu einer Partitionseinheit. In mindestens einer Ausführungsform wird der gemeinsame Speicher/L1-Cache 3618 zum Zwischenspeichern von Lese- und Schreibvorgängen verwendet. In mindestens einer Ausführungsform sind einer oder mehrere von gemeinsamem Speicher/L1-Cache 3618, 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 3618, dass der gemeinsam genutzte Speicher/L1-Cache 3618 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 3600 zur Ausführung eines Programms und zur Durchführung von Berechnungen, der gemeinsame Speicher/L1-Cache 3618 zur Kommunikation zwischen Threads und die LSU 3614 zum Lesen und Schreiben des globalen Speichers über den gemeinsamen Speicher/L1-Cache 3618 und eine Speicherpartitionseinheit verwendet werden. In mindestens einer Ausführungsform schreibt der SM 3600, wenn er für allgemeine parallele Berechnungen konfiguriert ist, Befehle, die die Schedulereinheit 3604 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 36 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3600 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3600 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der Streaming-Multiprozessor 3600 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • Softwarekonstruktionen für Universalcomputing
  • Die folgenden Figuren zeigen, ohne Beschränkung darauf, beispielhafte Softwarekonstrukte zur Implementierung mindestens einer Ausführungsform.
  • 37 veranschaulicht einen Software-Stack einer Programmierplattform, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform eine Plattform zur Nutzung von Hardware auf einem Rechen- bzw. Computersystem, um Berechnungs-Tasks zu beschleunigen. In mindestens einer Ausführungsform kann eine Programmierplatt-form für Softwareentwickler über Bibliotheken, Compilerdirektiven und/oder Erweiterungen von Programmiersprachen zugänglich sein. In mindestens einer Ausführungsform kann eine Programmierplattform CUDA, Radeon Open Compute Platform („ROCm“), OpenCL (OpenCL™ wird von der Khronos-Gruppe entwickelt), SYCL oder Intel One API sein, ist aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform stellt ein Software-Stack 3700 einer Programmierplattform eine Ausführungsumgebung für eine Anwendung 3701 bereit. In mindestens einer Ausführungsform kann die Anwendung 3701 jede beliebige Computersoftware umfassen, die auf dem Software-Stack 3700 gestartet werden kann. In mindestens einer Ausführungsform kann die Anwendung 3701 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 3701 und der Software-Stack 3700 auf Hardware 3707. Die Hardware 3707 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 3700 herstellerspezifisch und nur mit Vorrichtungen bestimmter Hersteller kompatibel sein. In mindestens einer Ausführungsform, wie beispielsweise bei OpenCL, kann der Softwarestack 3700 mit Vorrichtungen verschiedener Hersteller verwendet werden. In mindestens einer Ausführungsform umfasst die Hardware 3707 einen Host, der mit einer oder mehreren Vorrichtungen verbunden ist, auf die zugegriffen werden kann, um Berechnungs-Tasks über API (Application Programming Interface)-Aufrufe durchzuführen. Eine Vorrichtung innerhalb der Hardware 3707 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 3707, 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 3700 einer Programmierplattform, ohne Beschränkung darauf, eine Reihe von Bibliotheken 3703, eine Laufzeit(umgebung) 3705 und einen Gerätekerneltreiber 3706. Jede der Bibliotheken 3703 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 3703 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 3703 Funktionen, die für die Ausführung auf einer oder mehreren Vorrichtungsarten optimiert sind. In mindestens einer Ausführungsform können die Bibliotheken 3703 Funktionen zur Durchführung von mathematischen, Deep-Learning- und/oder anderen Arten von Operationen auf Vorrichtungen enthalten, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform sind Bibliotheken 3803 entsprechenden APIs 3802 zugeordnet, die eine oder mehrere APIs enthalten können, die in den Bibliotheken 3803 implementierte Funktionen offenlegen.
  • In mindestens einer Ausführungsform ist die Anwendung 3701 als Quellcode geschrieben, der in ausführbaren Code kompiliert wird, wie nachstehend in Verbindung mit 40 - 42 näher erläutert wird. In mindestens einer Ausführungsform kann ausführbarer Code der Anwendung 3701 zumindest teilweise auf einer Ausführungsumgebung laufen, die von dem Software-Stack 3700 bereitgestellt wird. In mindestens einer Ausführungsform kann während der Ausführung der Anwendung 3701 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(umgebung) 3705 aufgerufen werden, um den erforderlichen Code auf das Gerät zu laden und zu starten. In mindestens einer Ausführungsform kann die Laufzeit(umgebung) 3705 jedes technisch machbare Laufzeitsystem umfassen, das die Ausführung der Anwendung S01 unterstützen kann.
  • In mindestens einer Ausführungsform ist die Laufzeit(umgebung) 3705 als eine oder mehrere Laufzeitbibliotheken implementiert, die mit entsprechenden APIs verbunden sind, die als API(s) 3704 dargestellt sind. Eine oder mehrere solcher Laufzeitbibliotheken können in mindestens einer Ausführungsform, ohne Beschränkung darauf, Funktionen zur Speicherverwaltung, Ausführungssteuerung, Geräteverwaltung, Fehlerbehandlung und/oder Synchronisation enthalten. In mindestens einer Ausführungsform können die Speicherverwaltungsfunktionen. Ohne Beschränkung darauf, Funktionen zum Zuweisen, Freigeben und Kopieren von Gerätespeicher sowie zum Übertragen von Daten zwischen dem Hostspeicher und dem Gerätespeicher umfassen. In mindestens einer Ausführungsform können Ausführungssteuerungsfunktionen Funktionen zum Starten einer Funktion (manchmal als ein „Kernel“ bezeichnet, wenn eine Funktion eine globale Funktion ist, die von einem Host aus aufgerufen werden kann) auf einem Gerät und zum Festlegen von Attributwerten in einem Puffer, der von einer Laufzeitbibliothek für eine gegebene, auf einem Gerät auszuführende Funktion verwaltet wird, enthalten, sind aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform können Laufzeitbibliotheken und entsprechende API(s) 3704 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 3706 so konfiguriert, dass er Kommunikation mit einem zugrunde liegenden Gerät erleichtert. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 3706 Low-Level-Funktionalitäten bereitstellen, auf die sich APIs, wie z.B. die API(s) 3704, und/oder andere Software stützen. In mindestens einer Ausführungsform kann der Gerätekerneltreiber 3706 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 3706 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 3706 den IR-Code zur Laufzeit kompilieren muss.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 37 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des Software-Stacks 3700 einer Programmierplattform verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Software-Stacks 3700 einer Programmierplattform verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Software-Stacks 3700 einer Programmierplattform verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 38 veranschaulicht eine CUDA-Implementierung des Software-Stacks 3700 von 37, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein CUDA-Software-Stack 3800, auf dem eine Anwendung 3801 gestartet werden kann, CUDA-Bibliotheken 3803, eine CUDA-Laufzeit(umgebung) 3805, einen CUDA-Treiber 3807 und einen Gerätekerneltreiber 3808. In mindestens einer Ausführungsform wird der CUDA-Software-Stack 3800 auf der Hardware 3809 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 3801, die CUDA-Laufzeit(umgebung) 3805 und der Gerätekerneltreiber 3808 ähnliche Funktionalitäten wie die Anwendung 3701, die Laufzeit(umgebung) 3705 bzw. der Gerätekerneltreiber 3706 ausführen, die vorstehend in Verbindung mit 37 beschrieben sind. In mindestens einer Ausführungsform umfasst der CUDA-Treiber 3807 eine Bibliothek (libcuda.so), die eine CUDA-Treiber-API 3806 implementiert. Ähnlich zu einer CUDA-Laufzeit-API 3804, die von einer CUDA-Laufzeitbibliothek (cudart) implementiert wird, kann die CUDA-Treiber-API 3806 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 3806 von der CUDA-Laufzeit-API 3804 dadurch, dass die CUDA-Laufzeit-API 3804 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 3804 ist die CUDA-Treiber-API 3806 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 3806 Funktionen zur Kontextverwaltung bereitstellen, die von der CUDA-Laufzeit-API 3804 nicht bereitgestellt werden. In mindestens einer Ausführungsform ist die CUDA-Treiber-API 3806 auch sprachunabhängig und unterstützt z.B. OpenCL zusätzlich zu der CUDA-Laufzeit-API 3804. Ferner können in mindestens einer Ausführungsform die Entwicklungsbibliotheken, einschließlich der CUDA-Laufzeit(umgebung) 3805, als getrennt von den Treiberkomponenten betrachtet werden, einschließlich des Benutzermodus-CUDA-Treibers 3807 und des Kernelmodus-Gerätetreibers 3808 (manchmal auch als „Anzeige“-Treiber bezeichnet).
  • In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3803 mathematische Bibliotheken, Deep-Learning-Bibliotheken, Bibliotheken paralleler Algorithmen und/oder Bibliotheken für Signal-/Bild-/Videoverarbeitung beinhalten, die von parallelen Rechenanwendungen wie der Anwendung 3801 verwendet werden können, sind aber nicht darauf beschränkt. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 3803 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 3803 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 38 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3800 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3800 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des CUDA-Software-Stacks 3800 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 39 veranschaulicht eine ROCm-Implementierung des Software-Stacks 3700 von 37, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein ROCm-Software-Stack 3900, auf dem eine Anwendung 3901 gestartet werden kann, eine Laufzeitumgebung 3903, eine Systemlaufzeit(umgebung) 3905, einen Thunk 3907, einen ROCm-Kerneltreiber 3908 und einen Gerätekerneltreiber. In mindestens einer Ausführungsform wird der ROCm-Software-Stack 3900 auf der Hardware 3909 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 3901 ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 37 besprochene Anwendung 3701. Darüber hinaus können die Laufzeitumgebung 3903 und das Laufzeitsystem 3905 in mindestens einer Ausführungsform ähnliche Funktionalitäten ausführen wie die vorstehend in Verbindung mit 37 beschriebene Laufzeit(umgebung) 3705. In mindestens einer Ausführungsform unterscheiden sich die Laufzeitumgebung 3903 und das Laufzeitsystem 3905 dadurch, dass das Laufzeitsystem 3905 eine sprachunabhängige Laufzeitumgebung ist, die eine ROCr-Systemlaufzeit-API 3904 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 zum Laufzeitsystem 3905 ist die Laufzeitumgebung 3903 in mindestens einer Ausführungsform eine Implementierung einer sprachspezifischen Laufzeitumgebungs-API 3902, die auf der ROCr-Laufzeitsystem-API 3904 aufliegt. In mindestens einer Ausführungsform kann die Laufzeitsystem-API unter anderem eine Heterogeneous Compute Interface for Portability („HIP“)-Laufzeitsystem-API, eine Heterogeneous Compute Compiler („HCC“)-Laufzeitumgebungs-API oder eine OpenCL-API umfassen, ist aber nicht darauf beschränkt. HIP-Sprache ist insbesondere eine Erweiterung der C++-Programmiersprache mit funktionell ähnlichen Versionen der CUDA-Mechanismen, und in mindestens einer Ausführungsform umfasst eine HIP-Sprach-Laufzeit-API Funktionen, die denen der vorstehend in Verbindung mit 38 besprochenen CUDA-Laufzeit-API 3804 ä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) 3907 eine Schnittstelle, die zur Interaktion mit dem zugrunde liegenden ROCm-Treiber 3908 verwendet werden kann. In mindestens einer Ausführungsform ist der ROCm-Treiber 3908 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 37 besprochene Gerätekerneltreiber 3706 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 3900 oberhalb der Laufzeitumgebung 3903 enthalten sein und eine ähnliche Funktionalität wie die CUDA-Bibliotheken 3803, die vorstehend in Verbindung mit 38 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 39 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des ROCm-Software-Stacks verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 40 veranschaulicht eine OpenCL-Implementierung des Software-Stacks 3700 von 37, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein OpenCL-Software-Stack 4000, auf dem eine Anwendung 4001 gestartet werden kann, ein OpenCL-Framework 4010, eine OpenCL-Laufzeitumgebung 4006 und einen Treiber 4007. In mindestens einer Ausführungsform wird der OpenCL-Software-Stack 4000 auf der Hardware 3809 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 4001, die OpenCL-Laufzeitumgebung 4006, der Gerätekerneltreiber 4007 und die Hardware 4008 ähnliche Funktionen ausführen wie die Anwendung 3701, die Laufzeit(umgebung) 3705, der Gerätekerneltreiber 3706 bzw. die Hardware 3707, die vorstehend in Verbindung mit 37 beschrieben sind. In mindestens einer Ausführungsform enthält die Anwendung 4001 außerdem einen OpenCL-Kernel 4002 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 4003 und Laufzeit-API 4005, bereit. In mindestens einer Ausführungsform verwendet die Laufzeit-API 4005 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 4005 verwenden kann, um Befehlswarteschlangen, Programmobjekte und Kernelobjekte, gemeinsam genutzte Speicherobjekte usw. für dieses Gerät zu verwalten. In mindestens einer Ausführungsform stellt die Plattform-API 4003 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 4004 in dem OpenCL-Framewerk 4010 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 4004 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 40 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4000 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4000 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des OpenCL-Software-Stacks 4000 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 41 veranschaulicht Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform 4104 so konfiguriert, dass sie verschiedene Programmiermodelle 4103, Middlewares und/oder Bibliotheken 4102 und Frameworks 4101 unterstützt, auf die sich eine Anwendung 4100 stützen kann. In mindestens einer Ausführungsform kann die Anwendung 4100 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 4104 eine der vorstehend in Verbindung mit 38, 39 bzw. 40 beschriebenen CUDA-, ROCm- oder OpenCL-Plattformen sein. In mindestens einer Ausführungsform unterstützt die Programmierplattform 4104 mehrere Programmiermodelle 4103, die Abstraktionen eines zugrunde liegenden Rechensystems sind, die Ausdrücke von Algorithmen und Datenstrukturen erlauben. In mindestens einer Ausführungsform können Programmiermodelle 4103 Merkmale zugrunde liegender Hardware offenlegen, um die Leistung zu verbessern. In mindestens einer Ausführungsform können die Programmiermodelle 4103 CUDA, HIP, OpenCL, C++ Accelerated Massive Parallelism („C++AMP“), Open Multi-Processing („O-penMP“), Open Accelerators („OpenACC“) und/oder Vulcan Compute umfassen, sind aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform stellen Bibliotheken und/oder Middlewares 4102 Implementierungen von Abstraktionen von Programmiermodellen 4104 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 4104 verfügbaren Dienste hinausgehen. In mindestens einer Ausführungsform können die Bibliotheken und/oder Middlewares 4102 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 4102 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 4101 von Bibliotheken und/oder Middlewares 4102 ab. In mindestens einer Ausführungsform ist jedes der Anwendungsframeworks 4101 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 41 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4100 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4100 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element der Anwendung 4100 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 42 veranschaulicht die Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 37 - 40, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform empfängt ein Compiler 4201 Quellcode 4200, der sowohl Host-Code als auch Geräte-Code enthält. In mindestens einer Ausführungsform ist der Compiler 4201 so konfiguriert, dass er den Quellcode 4200 in einen ausführbaren Host-Code 4202 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 4203 zur Ausführung auf einem Gerät umwandelt. In mindestens einer Ausführungsform kann der Quellcode 4200 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 4200 Code in einer beliebigen, von dem Compiler 4201 unterstützten Programmiersprache enthalten, wie z.B. C++, C, Fortran usw. In mindestens einer Ausführungsform kann der Quellcode 4200 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 4200 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 4201 so konfiguriert, dass er den Quellcode 4200 in einen ausführbaren Host-Code 4202 zur Ausführung auf einem Host und einen ausführbaren Geräte-Code 4203 zur Ausführung auf einem Gerät kompiliert. In mindestens einer Ausführungsform führt der Compiler 4201 Operationen durch, darunter ein Parsen des Quellcodes 4200 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 4200 eine Single-Source-Datei enthält, kann der Compiler 4201 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 4203 bzw. den ausführbaren Host-Code 4202 kompilieren und den ausführbaren Geräte-Code 4203 und den ausführbaren Host-Code 4202 in einer einzigen Datei miteinander verknüpfen, wie nachstehend unter Bezugnahme auf 43 ausführlicher erläutert.
  • In mindestens einer Ausführungsform können der ausführbare Host-Code 4202 und der ausführbare Geräte-Code 4203 in jedem geeigneten Format vorliegen, z.B. als Binärcode und/oder IR-Code. Im Fall von CUDA kann der ausführbare Host-Code 4202 in mindestens einer Ausführungsform nativen Objektcode beinhalten und kann der ausführbare Geräte-Code 4203 Code in PTX-Zwischendarstellung beinhalten. Im Fall von ROCm können sowohl der ausführbare Host-Code 4202 als auch der ausführbare Geräte-Code 4203 in mindestens einer Ausführungsform einen Ziel-Binärcode enthalten.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 42 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der ausführbare Host-Code 4202 und/oder der ausführbare Geräte-Code 4203, der in dem Quellcode 4200 spezifiziert ist, verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der ausführbare Host-Code 4202 und/oder der ausführbare Geräte-Code 4203, der in dem Quellcode 4200 spezifiziert ist, verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der ausführbare Host-Code 4202 und/oder der ausführbare Geräte-Code 4203, der in dem Quellcode 4200 spezifiziert ist, verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 43 ist eine detailliertere Darstellung der Kompilierung von Code zur Ausführung auf einer der Programmierplattformen von 37 - 40, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist ein Compiler 4301 so konfiguriert, dass er Quellcode 4300 empfängt, Quellcode 4300 kompiliert und eine ausführbare Datei 4308 ausgibt. In mindestens einer Ausführungsform ist der Quellcode 4300 eine Single-Source-Datei, wie z.B. eine .cu-Datei, eine .hip.cpp-Datei oder eine Datei in einem anderen Format, die sowohl Host- als auch Geräte-Code enthält. In mindestens einer Ausführungsform kann der Compiler 4301 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 4301 ein Compiler-Frontend 4302, einen Host-Compiler 4305, einen Geräte-Compiler 4306 und einen Linker 4309. In mindestens einer Ausführungsform ist das Compiler-Frontend 4302 so konfiguriert, dass es den Geräte-Code 4304 von dem Host-Code 4303 in dem Quellcode 4300 trennt. Geräte-Code 4304 wird von dem Gerätecompiler 4306 in ausführbaren Geräte-Code 4308 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 4303 von dem Host-Compiler 4305 in ausführbaren Host-Code 4307 kompiliert. In mindestens einer Ausführungsform kann für NVCC der Host-Compiler 4305, ohne darauf beschränkt zu sein, ein universeller C/C++-Compiler sein, der nativen Objektcode ausgibt, während der Geräte-Compiler 4306, 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 4305 als auch der Geräte-Compiler 4306 LLVM-basierte Compiler sein, die Ziel-Binärcode ausgeben, sind aber nicht darauf beschränkt.
  • Nach der Kompilierung des Quellcodes 4300 in einen ausführbaren Host-Code 4307 und einen ausführbaren Geräte-Code 4308 verknüpft der Linker 4309 in mindestens einer Ausführungsform den ausführbaren Host- und Geräte-Code 4307 und 4308 in einer ausführbaren Datei 4310. 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.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 43 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird die ausführbare Datei 4310, die in dem Quellcode 4300 spezifiziert ist, verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird die ausführbare Datei 4310, die in dem Quellcode 4300 spezifiziert ist, verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird die ausführbare Datei 4310, die in dem Quellcode 4300 spezifiziert ist, verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 44 veranschaulicht ein Übersetzen von Quellcode vor der Kompilierung des Quellcodes, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird Quellcode 4400 durch ein Übersetzungswerkzeug 4401 geleitet, das den Quellcode 4400 in übersetzten Quellcode 4402 übersetzt. In mindestens einer Ausführungsform wird ein Compiler 4403 verwendet, um den übersetzten Quellcode 4402 in einen ausführbaren Host-Code 4404 und einen ausführbaren Geräte-Code 4405 zu kompilieren, in einem Prozess, der der Kompilierung des Quellcodes 4200 durch den Compiler 4201 in einen ausführbaren Host-Code 4202 und einen ausführbaren Geräte-Code 4203 ähnelt, wie vorstehend in Verbindung mit 42 beschrieben wurde.
  • In mindestens einer Ausführungsform wird eine von dem Übersetzungswerkzeug 4401 durchgeführte Übersetzung verwendet, um den Quellcode 4400 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 4401 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 4400 ein Parsen des Quellcodes 4400 und ein Konvertieren von Aufrufen zu API(s), die von einem Programmiermodell (z.B. CU-DA) bereitgestellt werden, in entsprechende Aufrufe zu API(s), die von einem anderen Programmiermodell (z.B. HIP) bereitgestellt werden, beinhalten, wie nachstehend in Verbindung mit den 45A und 46 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 4401 durchgeführt werden, manchmal unvollständig sein, so dass zusätzlicher, manueller Aufwand erforderlich ist, um den Quellcode 4400 vollständig zu portieren.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 44 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird der ausführbare Host-Code 4404 und/oder der ausführbare Geräte-Code 4405, der in dem Quellcode 4400 spezifiziert ist, verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der ausführbare Host-Code 4404 und/oder der ausführbare Geräte-Code 4405, der in dem Quellcode 4400 spezifiziert ist, verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird der ausführbare Host-Code 4404 und/oder der ausführbare Geräte-Code 4405, der in dem Quellcode 4400 spezifiziert ist, verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 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.
  • 45A veranschaulicht ein System 4500, das so konfiguriert ist, dass es CUDA-Quellcode 4510 unter Verwendung verschiedener Arten von Verarbeitungseinheiten kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst das System 4500, ohne Beschränkung darauf, CUDA-Quellcode 4510, einen CUDA-Compiler 4550, ausführbaren Host-Code 4570(1), ausführbaren Host-Code 4570(2), ausführbaren CUDA-Geräte-Code 4584, eine CPU 4590, eine CUDA-fähige GPU 4594, eine GPU 4592, ein CUDA-zu-HIP-Übersetzungswerkzeug 4520, HIP-Quellcode 4530, einen HIP-Compilertreiber 4540, einen HCC 4560 und ausführbaren HCC-Geräte-Code 4582.
  • In mindestens einer Ausführungsform ist der CUDA-Quellcode 4510 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 4590, eine GPU 4592 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 4590.
  • In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4510, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4512, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4514, eine beliebige Anzahl (einschließlich Null) von Hostfunktionen 4516 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4518. In mindestens einer Ausführungsform können globale Funktionen 4512, Gerätefunktionen 4514, Hostfunktionen 4516 und Host/Geräte-Funktionen 4518 in dem CUDA-Quellcode 4510 gemischt sein. In mindestens einer Ausführungsform ist jede der globalen Funktionen 4512 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 4512 als Einstiegspunkte zu einem Gerät dienen. In mindestens einer Ausführungsform ist jede der globalen Funktionen 4512 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 4512 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 4514 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 4516 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 4516 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 4510 auch, ohne Beschränkung darauf, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die über eine CUDA-Laufzeit-API 4502 definiert sind. In mindestens einer Ausführungsform kann die CUDA-Laufzeit-API 4502, 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 4510 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 4502, 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 4502 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 4550 den eingegebenen CUDA-Code (z.B. den CUDA-Quellcode 4510), um den ausführbaren Host-Code 4570(1) und den ausführbaren CUDA-Geräte-Code 4584 zu erzeugen. In mindestens einer Ausführungsform ist der CUDA-Compiler 4550 ein NVCC. In mindestens einer Ausführungsform ist der ausführbare Host-Code 4570(1) eine kompilierte Version des Host-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CPU 4590 ausführbar ist. In mindestens einer Ausführungsform kann die CPU 4590 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 4584 eine kompilierte Version des Geräte-Codes, der in dem Eingabe-Quellcode enthalten ist, der auf der CUDA-fähigen GPU 4594 ausführbar ist. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4584, ohne Beschränkung darauf, Binärcode. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4584, 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 4594) kompiliert wird. In mindestens einer Ausführungsform kann der CUDA-fähige Grafikprozessor 4594 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 4594 von der NVIDIA Corporation in Santa Clara, CA, entwickelt.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4520 so konfiguriert, dass es den CUDA-Quellcode 4510 in einen funktionell ähnlichen HIP-Quellcode 4530 übersetzt. In mindestens einer Ausführungsform ist der HIP-Quellcode 4530 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 4512, 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 4512 nur von einem Host aus aufrufbar sein.
  • In mindestens einer Ausführungsform enthält der HIP-Quellcode 4530, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4512, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4514, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4516 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4518. In mindestens einer Ausführungsform kann der HIP-Quellcode 4530 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen enthalten, die in einer HIP-Laufzeit-API 4532 angegeben sind. In mindestens einer Ausführungsform enthält die HIP-Laufzeit-API 4532, ohne Beschränkung darauf, funktionell ähnliche Versionen einer Teilmenge von Funktionen, die in der CUDA-Laufzeit-API 4502 enthalten sind. In mindestens einer Ausführungsform kann der HIP-Quellcode 4530 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 4532, 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 4520 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 4520 eine beliebige Anzahl von Aufrufen zu Funktionen, die in der CUDA-Laufzeit-API 4502 angegeben sind, in eine beliebige Anzahl von Aufrufen zu Funktionen, die in der HIP-Laufzeit-API 4532 angegeben sind, um.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4520 ein als hipify-perl bekanntes Werkzeug, das einen textbasierten Übersetzungsprozess ausführt. In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 4520 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 CU-DA-zu-HIP-Übersetzungswerkzeug 4520 durchgeführt werden, erfordern.
  • In mindestens einer Ausführungsform ist der HIP-Compilertreiber 4540 ein Frontend, das ein Zielgerät 4546 bestimmt und dann einen mit dem Zielgerät 4546 kompatiblen Compiler konfiguriert, um den HIP-Quellcode 4530 zu kompilieren. In mindestens einer Ausführungsform ist das Zielgerät 4546 ein Prozessor, der für die parallele Befehlsverarbeitung optimiert ist. In mindestens einer Ausführungsform kann der HIP-Compilertreiber 4540 das Zielgerät 4546 auf jede technisch machbare Weise bestimmen.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 4546 mit CUDA kompatibel ist (z.B. die CUDA-fähige GPU 4594), der HIP-Compilertreiber 4540 einen HIP/NVCC-Kompilierungsbefehl 4542. In mindestens einer Ausführungsform und wie in Verbindung mit 45B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 4542 den CUDA-Compiler 4550 zum Kompilieren des HIP-Quellcodes 4530 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 4542 erzeugt der CUDA-Compiler 4550 den ausführbaren Host-Code 4570(1) und den ausführbaren CU-DA-Geräte-Code 4584.
  • In mindestens einer Ausführungsform erzeugt dann, wenn das Zielgerät 4546 nicht mit CUDA kompatibel ist, der HIP-Compilertreiber 4540 einen HIP/HCC-Kompilierungsbefehl 4544. In mindestens einer Ausführungsform und wie in Verbindung mit 45C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 4544 den HCC 4560 zum Kompilieren von HIP-Quellcode 4530 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 4544 erzeugt der HCC 4560 ausführbaren Host-Code 4570(2) und ausführbaren HCC-Geräte-Code 4582. In mindestens einer Ausführungsform ist der ausführbare HCC-Geräte-Code 4582 eine kompilierte Version des in dem HIP-Quellcode 4530 enthaltenen Geräte-Codes, der auf der GPU 4592 ausführbar ist. In mindestens einer Ausführungsform kann die GPU 4592 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 4592 von der AMD Corporation in Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform ist GPU, 4592 eine nicht CUDA-fähige GPU 4592.
  • Nur zu Erläuterungszwecken sind in 45A drei verschiedene Abläufe dargestellt, die in mindestens einer Ausführungsform implementiert sein können, um den CUDA-Quellcode 4510 für die Ausführung auf der CPU 4590 und verschiedenen Geräten zu kompilieren. In mindestens einer Ausführungsform kompiliert ein direkter CUDA-Ablauf den CUDA-Quellcode 4510 für die Ausführung auf der CPU 4590 und der CUDA-fähigen GPU 4594, ohne den CUDA-Quellcode 4510 in den HIP-Quellcode 4530 zu übersetzen. In mindestens einer Ausführungsform übersetzt ein indirekter CUDA-Ablauf den CUDA-Quellcode 4510 in den HIP-Quellcode 4530 und kompiliert dann den HIP-Quellcode 4530 zur Ausführung auf der CPU 4590 und der CUDA-fähigen GPU 4594. In mindestens einer Ausführungsform übersetzt ein CUDA/HCC-Ablauf den CUDA-Quellcode 4510 in HIP-Quellcode 4530 und kompiliert dann den HIP-Quellcode 4530 für die Ausführung auf der CPU 4590 und der GPU 4592.
  • 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 4550 den CUDA-Quellcode 4510 und einen CUDA-Kompilierbefehl 4548, der den CU-DA-Compiler 4550 für die Kompilierung des CUDA-Quellcodes 4510 konfiguriert. In mindestens einer Ausführungsform ist der CUDA-Quellcode 4510, 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 4548 generiert der CUDA-Compiler 4550 den ausführbaren Host-Code 4570(1) und den ausführbaren CUDA-Geräte-Code 4584 (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 4570(1) und der ausführbare CUDA-Geräte-Code 4584 auf der CPU 4590 bzw. der CUDA-fähigen GPU 4594 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4584 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4584, 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 4520 den CUDA-Quellcode 4510. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung B2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 4520 den CUDA-Quellcode 4510 in den HIP-Quellcode 4530. In mindestens einer Ausführungsform und wie in der mit B3 bezeichneten Blase dargestellt, empfängt der HIP-Compilertreiber 4540 den HIP-Quellcode 4530 und bestimmt, dass das Zielgerät 4546 CUDA-fähig ist.
  • In mindestens einer Ausführungsform und wie mit der mit B4 bezeichneten Blase dargestellt, erzeugt der HIP-Compilertreiber 4540 den HIP/NVCC-Kompilierbefehl 4542 und überträgt sowohl den HIP/NVCC-Kompilierbefehl 4542 als auch den HIP-Quellcode 4530 an den CUDA-Compiler 4550. In mindestens einer Ausführungsform und wie in Verbindung mit 45B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 4542 den CUDA-Compiler 4550 zum Kompilieren des HIP-Quellcodes 4530 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 4542 erzeugt der CUDA-Compiler 4550 den ausführbaren Host-Code 4570(1) und den ausführbaren CU-DA-Geräte-Code 4584 (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 4570(1) und der ausführbare CUDA-Geräte-Code 4584 auf der CPU 4590 bzw. der CUDA-fähigen GPU 4594 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CU-DA-Geräte-Code 4584 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4584, 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 4520 den CUDA-Quellcode 4510. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung C2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 4520 den CUDA-Quellcode 4510 in den HIP-Quellcode 4530. In mindestens einer Ausführungsform und wie mit der Blase C3 dargestellt, empfängt der HIP-Compilertreiber 4540 den HIP-Quellcode 4530 und bestimmt, dass das Zielgerät 4546 nicht CUDA-fähig ist.
  • In mindestens einer Ausführungsform erzeugt der HIP-Compilertreiber 4540 den HIP/HCC-Kompilierbefehl 4544 und überträgt sowohl den HIP/HCC-Kompilierbefehl 4544 als auch den HIP-Quellcode 4530 an den HCC 4560 (dargestellt durch die mit C4 bezeichnete Blase). In mindestens einer Ausführungsform und wie in Verbindung mit 45C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 4544 den HCC 4560, um den HIP-Quellcode 4530 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 4544 erzeugt der HCC 4560 einen ausführbaren Host-Code 4570(2) und einen ausführbaren HCC-Geräte-Code 4582 (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 4570(2) und der ausführbare HCC-Geräte-Code 4582 auf der CPU 4590 bzw. der GPU 4592 ausgeführt werden.
  • In mindestens einer Ausführungsform kann, nachdem der CUDA-Quellcode 4510 in HIP-Quellcode 4530 übersetzt wurde, der HIP-Compilertreiber 4540 anschließend verwendet werden, um ausführbaren Code entweder für die CUDA-fähige GPU 4594 oder die GPU 4592 zu erzeugen, ohne CUDA-HIP-Übersetzungswerkzeug 4520 erneut auszuführen. In mindestens einer Ausführungsform übersetzt das CUDA-zu-HIP-Übersetzungswerkzeug 4520 den CUDA-Quellcode 4510 in HIP-Quellcode 4530, der dann im Speicher abgelegt wird. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4540 dann den HCC 4560, um den ausführbaren Host-Code 4570(2) und den ausführbaren HCC-Geräte-Code 4582 basierend auf dem HIP-Quellcode 4530 zu erzeugen. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4540 anschließend den CUDA-Compiler 4550, um auf der Grundlage des gespeicherten HIP-Quellcodes 4530 den ausführbaren Host-Code 4570(1) und den ausführbaren CUDA-Geräte-Code 4584 zu erzeugen.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 45A gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4500 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4500 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4500 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 45B veranschaulicht ein System 4504, das so konfiguriert ist, dass es den CUDA-Quellcode 4510 von 45A unter Verwendung der CPU 4590 und der CUDA-fähigen GPU 4594 gemäß mindestens einer Ausführungsform kompiliert und ausführt. In mindestens einer Ausführungsform umfasst das System 4504, ohne Beschränkung darauf, den CUDA-Quellcode 4510, das CUDA-HIP-Übersetzungswerkzeug 4520, den HIP-Quellcode 4530, den HIP-Compilertreiber 4540, den CUDA-Compiler 4550, den ausführbaren Host-Code 4570(1), den ausführbaren CUDA-Geräte-Code 4584, die CPU 4590 und die CUDA-fähige GPU 4594.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 45A beschrieben, enthält der CUDA-Quellcode 4510, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4512, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4514, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4516 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4518. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4510 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 4520 den CUDA-Quellcode 4510 in den HIP-Quellcode 4530. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 4520 jeden Kernel-Aufruf in dem CUDA-Quellcode 4510 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem CUDA-Quellcode 4510 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt HIP-Compilertreiber 4540, dass das Zielgerät 4546 CUDA-fähig ist, und erzeugt den HIP/NVCC-Kompilierungsbefehl 4542. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4540 dann den CUDA-Compiler 4550 über den HIP/NVCC-Kompilierbefehl 4542, um den HIP-Quellcode 4530 zu kompilieren. In mindestens einer Ausführungsform stellt der HIP-Compilertreiber 4540 Zugriff auf einen HIP-zu-CUDA-Übersetzungsheader 4552 als Teil der Konfiguration des CUDA-Compilers 4550 bereit. In mindestens einer Ausführungsform übersetzt der HIP-zu-CUDA-Übersetzungsheader 4552 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 CU-DA-APIs spezifiziert sind. In mindestens einer Ausführungsform verwendet der CUDA-Compiler 4550 den HIP-zu-CUDA-Übersetzungsheader 4552 in Verbindung mit einer CUDA-Laufzeitbibliothek 4554, die der CUDA-Laufzeit-API 4502 entspricht, um den ausführbaren Host-Code 4570(1) und den ausführbaren CU-DA-Geräte-Code 4584 zu erzeugen. In mindestens einer Ausführungsform können der ausführbare Host-Code 4570(1) und der ausführbare CUDA-Geräte-Code 4584 dann auf der CPU 4590 bzw. der CUDA-fähigen GPU 4594 ausgeführt werden. In mindestens einer Ausführungsform umfasst der ausführbare CUDA-Geräte-Code 4584 Binärcode, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform enthält der ausführbare CUDA-Geräte-Code 4584, ohne Beschränkung darauf, PTX-Code und wird zur Laufzeit weiter in Binärcode für ein bestimmtes Zielgerät kompiliert.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 45B gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4504 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4504 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4504 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 45C zeigt ein System 4506, das so konfiguriert ist, dass es den CU-DA-Quellcode 4510 von 45A unter Verwendung einer CPU 4590 und einer nicht-CUDA-fähigen GPU 4592 kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das System 4506, ohne Beschränkung darauf, den CUDA-Quellcode 4510, das CUDA-zu-HIP-Übersetzungswerkzeug 4520, den HIP-Quellcode 4530, den HIP-Compilertreiber 4540, den HCC 4560, den ausführbaren Host-Code 4570(2), den ausführbaren HCC-Geräte-Code 4582, die CPU 4590 und die GPU 4592.
  • In mindestens einer Ausführungsform und wie zuvor hierin in Verbindung mit 45A beschrieben, enthält der CUDA-Quellcode 4510, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 4512, eine beliebige Anzahl (einschließlich Null) von Gerätefunktionen 4514, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 4516 und eine beliebige Anzahl (einschließlich Null) von Host/Geräte-Funktionen 4518. In mindestens einer Ausführungsform enthält der CUDA-Quellcode 4510 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 4520 den CUDA-Quellcode 4510 in den HIP-Quellcode 4530. In mindestens einer Ausführungsform konvertiert das CUDA-zu-HIP-Übersetzungswerkzeug 4520 jeden Kernel-Aufruf in dem CUDA-Quellcode 4510 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 4510 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform bestimmt der HIP-Compilertreiber 4540 anschließend, dass das Zielgerät 4546 nicht CUDA-fähig ist, und erzeugt den HIP/HCC-Kompilierbefehl 4544. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 4540 dann den HCC 4560, um den HIP/HCC-Kompilierbefehl 4544 auszuführen, um den HIP-Quellcode 4530 zu kompilieren. In mindestens einer Ausführungsform konfiguriert der HIP/HCC-Kompilierbefehl 4544 den HCC 4560 so, dass er, ohne Beschränkung darauf, eine HIP/HCC-Laufzeitbibliothek 4558 und einen HCC-Header 4556 verwendet, um ausführbaren Host-Code 4570(2) und ausführbaren HCC-Geräte-Code 4582 zu erzeugen. In mindestens einer Ausführungsform entspricht die HIP/HCC-Laufzeitbibliothek 4558 der HIP-Laufzeit-API 4532. In mindestens einer Ausführungsform enthält der HCC-Header 4556, 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 4570(2) und der ausführbare HCC-Geräte-Code 4582 auf der CPU 4590 bzw. der GPU 4592 ausgeführt werden.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 45C gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4506 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4506 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Element des Systems 4506 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 46 veranschaulicht einen beispielhaften Kernel, der von dem CUDA-zu-HIP-Übersetzungswerkzeug 4520 von 45C übersetzt wurde, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform unterteilt der CUDA-Quellcode 4510 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 4510 Thread-Blöcke, die einem bestimmten Kernel zugeordnet sind, in ein eindimensionales, zweidimensionales oder dreidimensionales Gitter bzw. Grid von Thread-Blöcken. In mindestens einer Ausführungsform beinhaltet jeder Thread-Block, ohne Beschränkung darauf, eine beliebige Anzahl von Threads, und beinhaltet ein Gitter bzw. Grid, ohne Beschränkung darauf, eine beliebige Anzahl von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist ein Kernel eine Funktion in dem Geräte-Code, die unter Verwendung eines „_global_“-Deklarationsbezeichners definiert ist. In mindestens einer Ausführungsform werden die Dimension eines Gitters bzw. Grids, das einen Kernel für einen bestimmten Kernelaufruf ausführt, und zugehörige Streams unter Verwendung einer CUDA-Kernel-Startsyntax 4610 spezifiziert. In mindestens einer Ausführungsform wird die CUDA-Kernel-Start-Syntax 4610 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 4610, ohne Beschränkung darauf, eine CUDA-Startfunktionssyntax anstelle einer Ausführungskonfigurationssyntax.
  • In mindestens einer Ausführungsform ist „GridSize“ von einem Typ dim3 und spezifiziert die Dimension und die Größe eines Gitters bzw. Grids. In mindestens einer Ausführungsform ist der Typ dim3 eine CUDA-definierte Struktur, die, ohne Beschränkung darauf, vorzeichenlose Ganzzahlen x, y und z beinhaltet. In mindestens einer Ausführungsform ist z standardmäßig gleich eins, falls z nicht spezifiziert ist. In mindestens einer Ausführungsform ist y standardmäßig gleich eins, falls y nicht spezifiziert ist. In mindestens einer Ausführungsform ist die Anzahl von Thread-Blöcken in einem Gitter bzw. Grid gleich dem Produkt aus GridSize.x, GridSize.y und GridSize.z. In mindestens einer Ausführungsform ist „BlockSize“ vom Typ dim3 und gibt die Dimension und die Größe jedes Thread-Blocks an. In mindestens einer Ausführungsform ist die Anzahl der Threads pro Thread-Block gleich dem Produkt aus BlockSize.x, BlockSize.y und BlockSize.z. In mindestens einer Ausführungsform erhält jeder Thread, der einen Kernel ausführt, eine eindeutige Thread-ID, die innerhalb des Kernels über eine eingebaute Variable (z.B. „threadldx“) zugänglich ist.
  • In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 4610 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 4610 ist „SharedMemorySize“ standardmäßig auf null gesetzt. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Start-Syntax 4610 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 4510, 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 4610 wird der Kernel MatAdd unter Verwendung eines Gitters bzw. Grids von Thread-Blöcken mit einer Dimension N/16 mal N/16 ausgeführt, wobei jeder Thread-Block eine Dimension von 16 mal 16 hat. In mindestens einer Ausführungsform umfasst jeder Thread-Block 256 Threads, wird ein Gitter bzw. Grid mit genügend Blöcken erstellt, um einen Thread pro Matrixelement zu haben, und führt jeder Thread in einem solchen Gitter bzw. Grid den Kernel MatAdd aus, um eine paarweise Addition durchzuführen.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 4520 während des Übersetzens von CUDA-Quellcode 4510 in HIP-Quellcode 4530 jeden Kernelaufruf in dem CUDA-Quellcode 4510 von der CUDA-Kernel-Start-Syntax 4610 in eine HIP-Kernel-Start-Syntax 4620 und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 4510 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe. In mindestens einer Ausführungsform ist die HIP-Kernel-Start-Syntax 4620 als „hipLaunchKernelGGL(KernelName,GridSize, BlockSize, SharedMemorySize, Stream, KernelArguments);“ spezifiziert. In mindestens einer Ausführungsform hat jeder der Parameter KernelName, GridSize, BlockSize, ShareMemorySize, Stream und KernelArguments in der HIP-Kernel-Start-Syntax 4620 die gleiche Bedeutung wie in der CUDA-Kernel-Start-Syntax 4610 (hierin zuvor beschrieben). In mindestens einer Ausführungsform sind die Argumente SharedMemorySize und Stream in der HIP-Kernel-Startsyntax 4620 erforderlich und in der CUDA-Kernel-Startsyntax 4610 optional.
  • In mindestens einer Ausführungsform ist ein Teil des in 46 dargestellten HIP-Quellcodes 4530 identisch mit einem Teil des in 45 dargestellten CUDA-Quellcodes 4510, 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 4530 mit demselben Deklarationsbezeichner „_global_“ definiert, mit dem der Kernel MatAdd in dem CUDA-Quellcode 4510 definiert ist. In mindestens einer Ausführungsform lautet ein Kernelaufruf in dem HIP-Quellcode 4530 „hipLaunchKernelGGL(MatAdd, numBlocks, threadsPerBlock, 0, 0, A, B, C);“, während ein entsprechender Kernelaufruf in dem CUDA-Quellcode 4510 „MatAdd«<numBlocks, threadsPerBlock»(A, B, C);“ lautet.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 46 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens eines von dem CU-DA-Quellcode 4610, dem CUDA-zu-HIP-Übersetzungswerkzeug 4620 oder dem HIP-Quellcode 4630 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eines von dem CUDA-Quellcode 4610, dem CUDA-zu-HIP-Übersetzungswerkzeug 4620 oder dem HIP-Quellcode 4630 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eines von dem CUDA-Quellcode 4610, dem CUDA-zu-HIP-Übersetzungswerkzeug 4620 oder dem HIP-Quellcode 4630 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 47 veranschaulicht die nicht-CUDA-fähige GPU 4592 von 45C in größerem Detail, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird die GPU 4592 von der AMD Corporation in Santa Clara entwickelt. In mindestens einer Ausführungsform kann die GPU 4592 so konfiguriert sein, dass sie Rechenoperationen hochparallel durchführt. In mindestens einer Ausführungsform ist die GPU 4592 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 4592 so konfiguriert, dass sie Operationen ausführt, die nichts mit Grafik zu tun haben. In mindestens einer Ausführungsform ist die GPU 4592 so konfiguriert, dass sie sowohl grafikbezogene als auch grafikfremde Operationen ausführt. In mindestens einer Ausführungsform kann die GPU 4592 so konfiguriert sein, dass sie Geräte-Code ausführt, der in dem HIP-Quellcode 4530 enthalten ist.
  • In mindestens einer Ausführungsform umfasst die GPU 4592, ohne Beschränkung darauf, eine beliebige Anzahl von programmierbaren Verarbeitungseinheiten 4720, einen Befehlsprozessor 4710, einen L2-Cache 4722, Speichersteuerungen 4770, DMA-Engines 4780(1), Systemspeichersteuerungen 4782, DMA-Engines 4780(2) und GPU-Controller 4784. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 4720, ohne Beschränkung darauf, einen Arbeitslast-Manager 4730 und eine beliebige Anzahl von Recheneinheiten 4740. In mindestens einer Ausführungsform liest der Befehlsprozessor 4710 Befehle aus einer oder mehreren Befehlswarteschlangen (nicht dargestellt) und verteilt die Befehle an Arbeitslast-Manager 4730. In mindestens einer Ausführungsform verteilt der zugehörige Arbeitslast-Manager 4730 für jede programmierbare Verarbeitungseinheit 4720 Arbeit an in der programmierbaren Verarbeitungseinheit 4720 enthaltene Recheneinheiten 4740. In mindestens einer Ausführungsform kann jede Recheneinheit 4740 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 4740 ausgeführt. In mindestens einer Ausführungsform ist eine Arbeitsgruppe ein Thread-Block.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 4740, ohne Beschränkung darauf, eine beliebige Anzahl von SIMD-Einheiten 4750 und einen gemeinsamen Speicher 4760. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 4750 eine SIMD-Architektur und ist zur parallelen Ausführung von Operationen konfiguriert. In mindestens einer Ausführungsform beinhaltet jede SIMD-Einheit 4750, ohne Beschränkung darauf, eine Vektor-ALU 4752 und eine Vektorregisterdatei 4754. In mindestens einer Ausführungsform führt jede SIMD-Einheit 4750 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 4760 kommunizieren.
  • In mindestens einer Ausführungsform werden programmierbare Verarbeitungseinheiten 4720 als „Shader-Engines“ bezeichnet. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 4720, ohne Beschränkung darauf, eine beliebige Menge an dedizierter Grafikhardware zusätzlich zu Recheneinheiten 4740. In mindestens einer Ausführungsform umfasst jede programmierbare Verarbeitungseinheit 4720, ohne Beschränkung darauf, eine beliebige Anzahl (einschließlich null) von Geometrieprozessoren, eine beliebige Anzahl (einschließlich null) von Rasterisierern, eine beliebige Anzahl (einschließlich null) von Render-Backends, einen Arbeitslast-Manager 4730 und eine beliebige Anzahl von Recheneinheiten 4740.
  • In mindestens einer Ausführungsform teilen sich die Recheneinheiten 4740 einen L2-Cache 4722. In mindestens einer Ausführungsform ist der L2-Cache 4722 partitioniert. In mindestens einer Ausführungsform ist ein GPU-Speicher 4790 für alle Recheneinheiten 4740 in der GPU 4592 zugänglich. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 4770 und Systemspeichersteuerungen 4782 die Datenübertragung zwischen der GPU 4592 und einem Host, und ermöglichen die DMA-Engines 4780(1) asynchrone Speicherübertragungen zwischen der GPU 4592 und einem solchen Host. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 4770 und GPU-Controller 4784 Datenübertragungen zwischen der GPU 4592 und anderen GPUs 4592, und ermöglichen DMA-Engines 4780(2) asynchrone Speicherübertragungen zwischen der GPU 4592 und anderen GPUs 4592.
  • In mindestens einer Ausführungsform beinhaltet die GPU 4592, 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 4592 sein können, hinweg erleichtern. In mindestens einer Ausführungsform beinhaltet die GPU 4592, ohne Beschränkung darauf, eine beliebige Anzahl und Art von I/O-Schnittstellen (z.B. PCIe), die mit einer beliebigen Anzahl und Art von Peripheriegeräten gekoppelt sind. In mindestens einer Ausführungsform kann die GPU 4592, 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 4592 ein Speicher-Subsystem, das, ohne Beschränkung darauf, eine beliebige Anzahl und eine beliebige Art von Speichersteuerungen (z.B. Speichersteuerung 4770 und Systemspeichersteuerung 4782) und Speichervorrichtungen (z.B. gemeinsam genutzte Speicher 4760) umfasst, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die GPU 4592 ein Cache-Subsystem, das, ohne Beschränkung darauf, einen oder mehrere Cachespeicher (z.B. L2-Cache 4722) umfasst, die jeweils für eine beliebige Anzahl von Komponenten (z.B. SIMD-Einheiten 4750, Recheneinheiten 4740 und programmierbare Verarbeitungseinheiten 4720) reserviert oder von diesen gemeinsam genutzt werden können.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 47 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens eine Komponente, die mit Bezug zu 47 gezeigt oder beschrieben wird, verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine Komponente, die mit Bezug zu 47 gezeigt oder beschrieben wird, verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine Komponente, die mit Bezug zu 47 gezeigt oder beschrieben wird, verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 48 veranschaulicht, wie Threads eines beispielhaften CUDA-Grids 4820 gemäß mindestens einer Ausführungsform auf verschiedene Recheneinheiten 4740 von 47 abgebildet werden. In mindestens einer Ausführungsform und nur zu Erläuterungszwecken hat das Raster 4820 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 4820 daher, ohne Beschränkung darauf, (BX * BY) Thread-Blöcke 4830 und umfasst jeder Thread-Block 4830, ohne Beschränkung darauf, (TX * TY) Threads 4840. Die Threads 4840 sind in 48 als verschnörkelte Pfeile dargestellt.
  • In mindestens einer Ausführungsform wird das Raster 4820 auf die programmierbare Verarbeitungseinheit 4720(1) abgebildet, die, ohne Beschränkung darauf, die Recheneinheiten 4740(1)-4740(C) umfasst. In mindestens einer Ausführungsform und wie gezeigt werden (BJ * BY) Thread-Blöcke 4830 auf die Recheneinheit 4740(1) abgebildet, und werden die restlichen Thread-Blöcke 4830 auf die Recheneinheit 4740(2) abgebildet. In mindestens einer Ausführungsform kann jeder Thread-Block 4830, ohne Beschränkung darauf, eine beliebige Anzahl von Warps enthalten, und ist jeder Warp einer anderen SIMD-Einheit 4750 von 47 zugeordnet.
  • In mindestens einer Ausführungsform können Warps in einem gegebenen Thread-Block 4830 zusammen synchronisieren und über gemeinsam genutzten Speicher 4760 in der zugeordneten Recheneinheit 4740 kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 4830(BJ,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 4760(1) kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 4830(BJ+1,1) zusammen synchronisieren und über den gemeinsam genutzten Speicher 4760(2) kommunizieren.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 48 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grids 4820 verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grids 4820 verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens ein Thread des beispielhaften CUDA-Grids 4820 verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • 49 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 4900 als Eingabe für ein DPC++-Kompatibilitätstool 4902 bereitgestellt, um menschenlesbares DPC++ 4904 zu erzeugen. In mindestens einer Ausführungsform enthält der für den Menschen lesbare DPC++ 4904 Inline-Kommentare, die vom DPC++-Kompatibilitätstool 4902 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 4906 abzuschließen und dadurch den DPC++-Quellcode 4908 zu erzeugen.
  • In mindestens einer Ausführungsform ist oder enthält der CUDA-Quellcode 4900 eine Sammlung von menschenlesbarem Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Quellcode 4900 ein von Menschen lesbarer Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist eine CUDA-Programmiersprache eine Erweiterung der Programmiersprache C++, die ohne Einschränkung Mechanismen zur Definition von Gerätecode und zur Unterscheidung zwischen Gerätecode und Hostcode enthält. In mindestens einer Ausführungsform ist der Gerätecode ein Quellcode, der nach der Kompilierung auf einem Gerät (z.B. einer GPU oder einem FPGA) ausführbar ist und mehrere parallelisierbare Arbeitsabläufe bzw. Workflows enthalten kann, die auf einem oder mehreren Prozessorkernen eines Geräts ausgeführt werden können. In mindestens einer Ausführungsform kann ein Gerät ein Prozessor sein, der für die parallele Befehlsverarbeitung optimiert ist, z.B. eine CUDA-fähige GPU, GPU oder eine andere GPGPU usw. In mindestens einer Ausführungsform ist der Hostcode ein Quellcode, der nach der Kompilierung auf einem Host ausführbar ist. In mindestens einer Ausführungsform können ein Teil oder der gesamte Hostcode und Gerätecode parallel auf einer CPU und einer GPU/FPGA ausgeführt werden. In mindestens einer Ausführungsform ist ein Host ein Prozessor, der für die sequentielle Anweisungsverarbeitung optimiert ist, wie beispielsweise eine CPU. Der in Verbindung mit 49 beschriebene CUDA-Quellcode 4900 kann mit den an anderer Stelle in diesem Dokument beschriebenen Quellcodes übereinstimmen.
  • In mindestens einer Ausführungsform bezieht sich das DPC++-Kompatibilitätswerkzeug 4902 auf ein ausführbares Werkzeug, ein Programm, eine Anwendung oder eine andere geeignete Art von Werkzeug, das zur Erleichterung der Migration von CUDA-Quellcode 4900 zu DPC++-Quellcode 4908 verwendet wird. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 4902 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 4902 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++ 4904 bezeichnet wird. In mindestens einer Ausführungsform enthält das menschenlesbare DPC++ 4904 Kommentare, die vom DPC++-Kompatibilitätswerkzeug 4902 erzeugt werden, um anzuzeigen, wo ein Benutzereingriff erforderlich sein kann. In mindestens einer Ausführungsform ist ein Benutzereingriff erforderlich, wenn der CUDA-Quellcode 4900 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 4900 (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 4902; das Abschließen der Migration und das Überprüfen der Korrektheit, wodurch DPC++-Quellcode 4908 erzeugt wird; und das Kompilieren von DPC++-Quellcode 4908 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 4902 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 4902 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 4902 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 4902 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 4902 menschenlesbaren DPC++ 4904, bei dem es sich um DPC++-Code handeln kann, der in der vom DPC++-Kompatibilitätstool 4902 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 4902 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 4902 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 4902 direkt DPC++-Quellcode 4908, der von einem DPC++-Compiler kompiliert wird, ohne dass ein menschliches Eingreifen erforderlich ist oder genutzt wird, um den vom DPC++-Kompatibilitätswerkzeug 4902 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 4902 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 CU-DA-Quelldatei eine <cuda.h>-Header-Datei und eine <stdio.h>-Header-Datei, die zum Drucken von Text verwendet werden kann. In mindestens einer Ausführungsform kann ein Teil einer Vektoradditionskern-CUDA-Quelldatei geschrieben werden als oder mit Bezug zu:
      #include <cuda.h>
      #include <stdio.h>
      #define VECTOR_SIZE 256

       [] global_void VectorAddKernel(float* A, float* B, float* C)

      {

       A[threadldx.x] = threadldx.x + 1.0f;
       B[threadldx.x] = threadldx.x + 1.0f;
       }C[threadldx.x] = A[threadldx.x] + B[threadldx.x];
       int main()

      { 


      float *d_A, *d_B, *d_C;

       cudaMalloc(& d_A, VECTOR_SIZE*sizeof(float));
       cudaMalloc(& d_B, VECTOR_SIZE*sizeof(float));
       cudaMalloc(& d_C, VECTOR_SIZE*sizeof(float));
       VectorAddKernel<<<1, VECTOR_SIZE>>>(d_A, d_B, d_C);
       float Result[VECTOR_SIZE] = { };
       cudaMemcpy(Result, d_C, VECTOR_SIZE*sizeof(float),
       cudaMemcpyDeviceToHost);
       cudaFree(d_A);
       cudaFree(d_B);
       cudaFree(d_C);
       for (int i=0; i<VECTOR_SIZE; i++ {

        wenn (i % 16 == 0) {
        printf("\n");
       }
        printf("%f ", Result[i]);

       }
       Return 0;
      }
  • In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei analysiert das DPC++-Kompatibilitätswerkzeug 4902 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 4902 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 4902 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 4902 geändert zu werden. In mindestens einer Ausführungsform modifiziert das DPC++-Kompatibilitätswerkzeug 4902 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++ 4904 (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++ 4904 auf die vom DPC++-Kompatibilitätswerkzeug 4902 erzeugte Ausgabe und kann auf die eine oder andere Weise optimiert werden. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätstool 4902 erzeugte, für den Menschen lesbare DPC++ 4904 von einem Entwickler nach der Migration manuell bearbeitet werden, um ihn wartbarer zu machen, die Leistung zu verbessern oder andere Aspekte zu berücksichtigen. In mindestens einer Ausführungsform kann der vom DPC++-Kompatibilitätstool 43002 erzeugte DPC++-Code, wie z.B. DPC++ disclosed, durch Entfernen der wiederholten Aufrufe von get_current_device() und/oder get_default_context() für jeden malloc_device()-Aufruf optimiert werden. In mindestens einer Ausführungsform verwendet der oben erzeugte DPC++-Code einen dreidimensionalen nd_range, der so umgestaltet werden kann, dass er nur eine einzige Dimension verwendet, wodurch die Speichernutzung reduziert wird. In mindestens einer Ausführungsform kann ein Entwickler den vom DPC++-Kompatibilitätstool 4902 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 4902 ü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 4902 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 4902; 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.
  • Bei mindestens einer Ausführungsform verwenden ein oder mehrere hier beschriebene Verfahren ein oneAPI-Programmiermodell. Bei mindestens einer Ausführungsform bezieht sich ein oneAPI-Programmiermodell auf ein Programmiermodell für die Interaktion mit verschiedenen Rechenbeschleunigungs-Architekturen. Bei mindestens einer Ausführungsform bezieht sich oneAPI auf eine Anwendungsprogrammierschnittstelle (API), die für die Interaktion mit verschiedenen Rechenbeschleunigungs-Architekturen entwickelt wurde. Bei mindestens einer Ausführungsform verwendet das oneAPI-Programmiermodell eine DPC++-Programmiersprache. Bei mindestens einer Ausführungsform bezieht sich eine DPC++-Programmiersprache auf eine Hochsprache für eine produktive datenparallele Programmierung. Bei mindestens einer Ausführungsform basiert eine DPC++-Programmiersprache zumindest teilweise auf den Programmiersprachen C und/oder C++. Bei mindestens einer Ausführungsform ist ein oneAPI-Programmiermodell ein Programmiermodell, wie es von der Intel Corporation in Santa Clara, CA, entwickelt wurde.
  • Bei mindestens einer Ausführungsform wird die oneAPI und/oder das oneAPI-Programmiermodell verwendet, um mit verschiedenen Beschleuniger-, GPU-, Prozessor- Architekturen und/oder Varianten davon zu interagieren. Bei mindestens einer Ausführungsform weist die oneAPI eine Reihe von Bibliotheken auf, die verschiedene Funktionalitäten implementieren. Bei mindestens einer Ausführungsform weist die oneAPI mindestens eine oneAPI-DPC++-Bibliothek, eine oneAPI-Mathe-Kernel-Bibliothek, eine oneAPI-Datenanalyse-Bibliothek, eine oneAPI-Bibliothek für tiefe neuronale Netze, eine oneAPI-Bibliothek für kollektive Kommunikation, eine oneAPI-Bibliothek für Threading-Bausteine, eine oneAPI-Bibliothek für Videoverarbeitung und/oder Variationen davon auf.
  • Bei mindestens einer Ausführungsform ist eine oneAPI-DPC++-Bibliothek, die auch als oneDPL bezeichnet wird, eine Bibliothek, die Algorithmen und Funktionen zur Beschleunigung der DPC++-Kernelprogrammierung implementiert. Bei mindestens einer Ausführungsform implementiert die oneDPL eine oder mehrere Funktionen der Standard Template Library (STL). Bei mindestens einer Ausführungsform implementiert die oneDPL eine oder mehrere parallele STL-Funktionen. Bei mindestens einer Ausführungsform stellt die oneDPL eine Reihe von Bibliotheksklassen und -funktionen, wie z. B. parallele Algorithmen, Iteratoren, Funktionsobjektklassen, eine bereichsbasierte API und/oder Variationen davon bereit. Bei mindestens einer Ausführungsform implementiert die oneDPL eine oder mehrere Klassen und/oder Funktionen einer C++-Standardbibliothek. Bei mindestens einer Ausführungsform implementiert die oneDPL eine oder mehrere Zufallszahlengeneratorfunktionen.
  • Bei mindestens einer Ausführungsform ist eine oneAPI-Mathe-Kernel-Bibliothek, die auch als oneMKL bezeichnet wird, eine Bibliothek, die verschiedene optimierte und parallelisierte Routinen für verschiedene mathematische Funktionen und/oder Operationen implementiert. Bei mindestens einer Ausführungsform implementiert die oneMKL ein oder mehrere Basic Linear Algebra Subprograms (BLAS) und/oder Linear Algebra Package (LAPACK) Dense Linear Algebra Routines. Bei mindestens einer Ausführungsform implementiert die oneMKL eine oder mehrere dünn besetzte (sparse) BLAS-Routinen für lineare Algebra. Bei mindestens einer Ausführungsform implementiert die oneMKL einen oder mehrere Zufallszahlengeneratoren (Random Number Generators (RNGs)). Bei mindestens einer Ausführungsform implementiert die oneMKL eine oder mehrere Vektormathematik (VM)-Routinen für mathematische Operationen mit Vektoren. Bei mindestens einer Ausführungsform implementiert die oneMKL eine oder mehrere schnelle Fouriertransformations- (Fast Fourier Transform- (FFT-)) Funktionen.
  • Bei mindestens einer Ausführungsform ist eine oneAPI-Datenanalysebibliothek, auch oneDAL genannt, eine Bibliothek, die verschiedene Datenanalyseanwendungen und verteilte Berechnungen implementiert. Bei mindestens einer Ausführungsform implementiert die oneDAL verschiedene Algorithmen für die Vorverarbeitung, Transformation, Analyse, Modellierung, Validierung und Entscheidungsfindung für die Datenanalyse in Batch-, Online- und verteilten Verarbeitungsmodi der Berechnung. Bei mindestens einer Ausführungsform implementiert die oneDAL verschiedene C++ und/oder Java APIs und verschiedene Konnektoren zu einer oder mehreren Datenquellen. Bei mindestens einer Ausführungsform implementiert die oneDAL DPC++ API-Erweiterungen zu einer herkömmlichen C++-Schnittstelle und ermöglicht die Nutzung einer GPU für verschiedene Algorithmen.
  • Bei mindestens einer Ausführungsform ist eine oneAPI-Bibliothek für tiefe neuronale Netze, die auch als oneDNN bezeichnet wird, eine Bibliothek, die verschiedene Funktionen für Deep Learning implementiert. Bei mindestens einer Ausführungsform implementiert die oneDNN verschiedene Funktionen, Algorithmen und/oder Variationen für neuronale Netze, maschinelles Lernen und Deep Learning.
  • Bei mindestens einer Ausführungsform ist eine oneAPI-Bibliothek für kollektive Kommunikation, die auch als oneCCL bezeichnet wird, eine Bibliothek, die verschiedene Anwendungen für Deep-Learning- und Machine-Learning-Workloads implementiert. Bei mindestens einer Ausführungsform baut die oneCCL auf Kommunikations-Middleware auf niedrigerer Ebene auf, wie z. B. Message Passing Interface (MPI) und libfabrics. Bei mindestens einer Ausführungsform ermöglicht die oneCCL eine Reihe von Deep-Learning-spezifischen Optimierungen, wie z. B. Priorisierung, persistente Operationen, Ausführen außerhalb der Reihenfolge und/oder Variationen davon. Bei mindestens einer Ausführungsform implementiert die oneCCL verschiedene CPU- und GPU-Funktionen.
  • Bei mindestens einer Ausführungsform ist eine oneAPI-Threading-Bausteinbibliothek, auch als oneTBB bezeichnet, eine Bibliothek, die verschiedene parallelisierte Prozesse für verschiedene Anwendungen implementiert. Bei mindestens einer Ausführungsform wird die oneTBB für die Task-basierte, gemeinsame parallele Programmierung auf einem Host verwendet. Bei mindestens einer Ausführungsform implementiert die oneTBB generische parallele Algorithmen. Bei mindestens einer Ausführungsform implementiert die oneTBB nebenläufige Container. Bei mindestens einer Ausführungsform implementiert die oneTBB einen skalierbaren Speicherallokator. Bei mindestens einer Ausführungsform implementiert die oneTBB einen Work-Stealing-Task-Scheduler. Bei mindestens einer Ausführungsform implementiert die oneTBB Low-Level-Synchronisationsprimitive. Bei mindestens einer Ausführungsform ist die oneTBB compilerunabhängig und auf verschiedenen Prozessoren, wie GPUs, PPUs, CPUs und/oder Variationen davon, verwendbar.
  • Bei mindestens einer Ausführungsform ist eine oneAPI-Bibliothek zur Videoverarbeitung, die auch als oneVPL bezeichnet wird, eine Bibliothek, die zur Beschleunigung der Videoverarbeitung in einer oder mehreren Anwendungen verwendet wird. Bei mindestens einer Ausführungsform implementiert die oneVPL verschiedene Videodekodierungs-, -kodierungs- und -verarbeitungsfunktionen. Bei mindestens einer Ausführungsform implementiert die oneVPL verschiedene Funktionen für Medienpipelines auf CPUs, GPUs und anderen Beschleunigern. Bei mindestens einer Ausführungsform implementiert die oneVPL die Erkennung und Auswahl von Einrichtungen in medienzentrierten und videoanalytischen Arbeitslasten. Bei mindestens einer Ausführungsform implementiert die oneVPL API-Primitive für die gemeinsame Nutzung von Pufferspeicher mit Zero-Copy.
  • Bei mindestens einer Ausführungsform verwendet ein oneAPI-Programmiermodell eine DPC++-Programmiersprache. Bei mindestens einer Ausführungsform ist eine DPC++-Programmiersprache eine Programmiersprache, die ohne Einschränkung funktional ähnliche Versionen von CUDA-Mechanismen aufweist, um Gerätecode zu definieren und zwischen Gerätecode und Hostcode zu unterscheiden. Bei mindestens einer Ausführungsform kann eine DPC++-Programmiersprache eine Teilmenge der Funktionalität einer CUDA-Programmiersprache aufweisen. Bei mindestens einer Ausführungsform werden eine oder mehrere CUDA-Programmiermodelloperationen unter Verwendung eines oneAPI-Programmiermodells mit einer DPC++-Programmiersprache durchgeführt.
  • Bei mindestens einer Ausführungsform wird mindestens eine in 49 gezeigte oder beschriebene Komponente verwendet, um Verfahren und/oder Funktionen zu implementieren, die in Verbindung mit den 1-17 beschrieben sind. Bei mindestens einer Ausführungsform wird mindestens eine Komponente, die mit Bezug zu 49 gezeigt oder beschrieben ist, verwendet, um eine API auszuführen, um zu steuern, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine Komponente, die mit Bezug zu 49 gezeigt oder beschrieben ist, verwendet, um eine API auszuführen, die angibt, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist. Bei mindestens einer Ausführungsform wird mindestens eine Komponente, die mit Bezug zu 49 gezeigt oder beschrieben ist, verwendet, um mindestens einen Aspekt auszuführen, der in Bezug auf das beispielhafte Computersystem 100, das beispielhafte Ausführungsgraph-Template 200, die beispielhafte Stromdarstellung 300, die beispielhaften Startsequenzen 400, die beispielhafte wiederholte Startsequenz 500, das beispielhafte Verfahren 600, das beispielhafte Ausführungsgraph-Template 700, den beispielhaften Ausführungsgraphen 800, den beispielhaften Ausführungsgraphen 900, den beispielhaften Ausführungsgraphen 1000, den beispielhaften Ausführungsgraphen 1100, den beispielhaften Ausführungsgraphen 1200, das beispielhafte Verfahren 1300, das beispielhafte Verfahren 1400, die beispielhafte Umgebung 1500, das beispielhafte Verfahren 1600 und/oder den beispielhaften Software-Stack 1700 beschrieben ist.
  • Es sollte beachtet werden, dass sich die hier beschriebenen Ausführungsformen zwar auf ein CUDA-Programmiermodell beziehen können, die hier beschriebenen Verfahren jedoch mit jedem geeigneten Programmiermodell, wie HIP, oneAPI und/oder Variationen davon, verwendet werden können.
  • Zumindest eine Ausführungsform der Erfindung kann im Hinblick auf die nachstehenden Sätze beschrieben werden:
    1. 1. Prozessor umfassend:
      • eine oder mehrere Schaltungen, um eine Anwendungsprogrammierschnittstelle, API, auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    2. 2. Prozessor nach Satz 1, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Ausführungsstatus für den Graph-Knoten spezifiziert.
    3. 3. Prozessor nach Satz 1 oder 2, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Speicherplatz zum Empfang eines Ausführungsstatus des Graph-Knotens spezifiziert.
    4. 4. Prozessor nach einem der Sätze 1-3, wobei die API eine Erfolgsangabe zurückgibt.
    5. 5. Prozessor nach einem der Sätze 1-4, wobei die eine oder die mehreren Schaltungen darüber hinaus Anweisungen zur Aktivierung eines Graph-Knotens des Graph-Codes ausführen.
    6. 6. Prozessor nach einem der Sätze 1-5, wobei die eine oder die mehreren Schaltungen darüber hinaus Anweisungen zum Deaktivieren eines Graph-Knotens des Graph-Codes ausführen.
    7. 7. Prozessor nach einem der Sätze 1-6, wobei der Graph-Code eine Instanziierung eines Graph-Templates ist.
    8. 8. Prozessor nach einem der Sätze 1-7, wobei der Graph-Code durch ein Superset-Graph-Template definiert ist.
    9. 9. Prozessor nach einem der Sätze 1-8, wobei die API eine Treiber-API ist.
    10. 10. Prozessor nach einem der Sätze 1-9, wobei die API eine Laufzeit-API ist.
    11. 11. Computer-implementiertes Verfahren, umfassend:
      • Ausführen einer Anwendungsprogrammierschnittstelle, API, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    12. 12. Computerimplementiertes Verfahren nach Satz 11, wobei die API zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, einen zu aktivierenden Graph-Knoten des Graph-Codes angibt.
    13. 13. Computerimplementiertes Verfahren nach Satz 11 oder 12, wobei die API zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, einen zu deaktivierenden Graph-Knoten des Graph-Codes angibt.
    14. 14. Computerimplementiertes Verfahren nach einem der Sätze 11-13, das darüber hinaus umfasst:
      • Bestimmen eines Graph-Knotens des Graph-Codes, der zu aktivieren ist,
      • zumindest teilweise auf der Grundlage der API; und
      • Aktivieren des Graph-Knotens.
    15. 15. Computerimplementiertes Verfahren nach einem der Sätze 11-14, das darüber hinaus umfasst:
      • Bestimmen eines Graph-Knotens des Graph-Codes, der zu deaktivieren ist,
      • zumindest teilweise auf der Grundlage der API; und
      • Deaktivieren des Graph-Knotens.
    16. 16. Computerimplementiertes Verfahren nach einem der Sätze 11-15, das darüber hinaus umfasst:
      • Bestimmen eines Ausführungsstatus eines Graph-Knotens des Graph-Codes.
    17. 17. Computerimplementiertes Verfahren nach einem der Sätze 11-16, das darüber hinaus umfasst:
      • Bestimmen eines Graph-Knotens des Graph-Codes, der zu aktivieren ist,
      • zumindest teilweise auf der Grundlage der API;
      • Bestimmen, ob der Graph-Knoten deaktiviert ist;
      • Bestimmen der zuvor definierten Funktionalität des Graph-Knotens zumindest teilweise auf der Grundlage eines Ausführungsgraph-Templates; Wiederherstellen eines Deskriptors des Graph-Knotens; und
      • Wiederherstellen der zuvor definierten Funktionalität des Graph-Knotens.
    18. 18. Computerimplementiertes Verfahren nach einem der Sätze 11-17, das darüber hinaus umfasst:
      • Bestimmen eines Graph-Knotens des Graph-Codes, der zu deaktivieren ist,
      • zumindest teilweise auf der Grundlage der API;
      • Bestimmen, ob der Graph-Knoten aktiviert ist;
      • Speichern von einem oder mehreren Datenelementen, die dem Graph-Knoten zugeordnet sind;
      • Setzen eines Deskriptors des Graph-Knotens auf einen Null-Deskriptor; und Setzen einer funktionalen Spezifikation des Graph-Knotens auf einen leeren Kernel.
    19. 19. Computerimplementiertes Verfahren nach einem der Sätze 11-18, das darüber hinaus umfasst:
      • Empfangen aktualisierter Daten für einen Graph-Knoten des Graph-Codes;
      • Bestimmen, dass der Graph-Knoten aktiviert ist, zumindest teilweise auf der Grundlage der API; und
      • Bereitstellen der aktualisierten Daten an den Graph-Knoten.
    20. 20. Computerimplementierte Verfahren nach einem der Sätze 11-19, das darüber hinaus umfasst:
      • Empfangen aktualisierter Daten für einen Graph-Knoten des Graph-Codes;
      • Bestimmen, dass der Graph-Knoten deaktiviert ist, zumindest teilweise auf der Grundlage der API;
      • Speichern der aktualisierten Daten;
      • Aktivieren des Graph-Knotens; und
      • Bereitstellen der gespeicherten aktualisierten Daten an den Graph-Knoten.
    21. 21. Computersystem umfassend:
      • einen oder mehrere Prozessoren und einen Speicher, der ausführbare Anweisungen speichert, die als Ergebnis der Ausführung durch den einen oder die mehreren Prozessoren den einen oder die mehreren Prozessoren veranlassen,
      • eine Anwendungsprogrammierschnittstelle, API, auszuführen, um anzugeben,
      • welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    22. 22. Computersystem nach Satz 21, wobei die API einen oder mehrere Parameter aufweist, die zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Ausführungsstatus für den Graph-Knoten angeben.
    23. 23. Computersystem nach Satz 21 oder 22, wobei die API einen oder mehrere Parameter aufweist, die zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Speicherplatz zum Empfang eines Ausführungsstatus des Graph-Knotens angeben.
    24. 24. Computersystem nach einem der Sätze 21-23, wobei die API eine Erfolgsangabe zurückgibt.
    25. 25. Computersystem nach einem der Sätze 21-24, wobei die ausführbaren Anweisungen darüber hinaus Anweisungen aufweisen, die als Ergebnis der Ausführung durch den einen oder die mehreren Prozessoren einen Graph-Knoten des Graph-Codes zumindest teilweise auf der Grundlage der API aktivieren.
    26. 26. Computersystem nach einem der Sätze 21-25, wobei die ausführbaren Anweisungen darüber hinaus Anweisungen aufweisen, die als Ergebnis der Ausführung durch den einen oder die mehreren Prozessoren einen Graph-Knoten des Graph-Codes zumindest teilweise auf der Grundlage der API deaktivieren.
    27. 27. Computersystem nach einem der Sätze 21-26, wobei mindestens einer des einen oder mehreren Prozessoren eine zentrale Verarbeitungseinheit, CPU, ist.
    28. 28. Computersystem nach einem der Sätze 21-27, wobei mindestens einer des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, ist.
    29. 29. Computersystem nach einem der Sätze 21-28, wobei mindestens einer des einen oder der mehreren Prozessoren eine Parallelverarbeitungseinheit, PPU, ist.
    30. 30. Computersystem nach einem der Sätze 21-29, wobei mindestens einer des einen oder der mehreren Prozessoren eine Mehrzweck-Grafikverarbeitungseinheit, GPGPU, ist.
    31. 31. Maschinenlesbares Medium, auf dem ein Satz von Anweisungen gespeichert ist, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, eine Anwendungsprogrammierschnittstelle, API, auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    32. 32. Maschinenlesbares Medium nach Satz 31, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Ausführungsstatus für den Graph-Knoten angibt.
    33. 33. Maschinenlesbares Medium nach Satz 31 oder 32, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Speicherplatz zum Empfangen eines Ausführungsstatus des Graph-Knotens angibt.
    34. 34. Maschinenlesbares Medium nach einem der Sätze 31-33, wobei die API eine Erfolgsangabe zurückgibt.
    35. 35. Maschinenlesbares Medium nach einem der Sätze 31-34, wobei der Satz von Anweisungen darüber hinaus Anweisungen aufweist, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, einen Graph-Knoten des Graph-Codes zu aktivieren.
    36. 36. Maschinenlesbares Medium nach einem der Sätze 31-35, wobei der Satz von Anweisungen darüber hinaus Anweisungen aufweist, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, einen Graph-Knoten des Graph-Codes zu deaktivieren.
    37. 37. Maschinenlesbares Medium nach einem der Sätze 31-36, wobei der Graph-Code eine Instanziierung eines Graph-Templates ist.
    38. 38. Maschinenlesbares Medium nach einem der Sätze 31-37, wobei der Graph-Code durch ein Superset-Ausführungsgraph-Template definiert ist.
    39. 39. Anwendungsprogrammierschnittstelle, API, umfassend:
      • einen oder mehrere Parameter, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    40. 40. API nach Satz 39, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der den Graph-Code angibt.
    41. 41. API nach Satz 39 oder 40, wobei der eine oder die mehreren Parameter mindestens einen Parameter aufweisen, der einen Graph-Knoten des Graph-Codes angibt.
    42. 42. API nach einem der Sätze 39-41, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der einen Graph-Knoten des Graph-Codes angibt, der zu aktivierten ist.
    43. 43. API nach einem der Sätze 39-42, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der einen Graph-Knoten des Graph-Codes angibt, der zu deaktivieren ist.
    44. 44. API nach einem der Sätze 39-43, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der einen Speicherplatz angibt, um einen Ausführungsstatus eines Graph-Knotens des Graph-Codes zu empfangen.
    45. 45. API nach einem der Sätze 39-44, wobei die API eine Erfolgsangabe zurückgibt.
    46. 46. API nach einem der Sätze 39-45, wobei die API eine Fehlerangabe zurückgibt.
    47. 47. API nach einem der Sätze 39-46, wobei die API einen Fehlerstatus zurückgibt.
  • 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 Methoden umfassen kann und Methoden als System betrachtet werden können.
  • Bei mindestens einer Ausführungsform handelt es sich bei einer arithmetischen Logikeinheit um einen Satz kombinatorischer Logikschaltungen, die eine oder mehrere Eingaben verarbeiten, um ein Ergebnis zu erzeugen. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit von einem Prozessor verwendet, um mathematische Operationen wie Addition, Subtraktion oder Multiplikation auszuführen. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit verwendet, um logische Operationen wie logisches UND/ODER oder XOR zu implementieren. Bei mindestens einer Ausführungsform ist eine arithmetische Logikeinheit zustandslos und besteht aus physikalischen Schaltkomponenten wie Halbleitertransistoren, die zur Ausbildung logischer Gatter angeordnet sind. Bei mindestens einer Ausführungsform kann eine arithmetische Logikeinheit intern als zustandsabhängige logische Schaltung mit einem zugehörigen Taktgeber arbeiten. Bei mindestens einer Ausführungsform kann eine arithmetische Logikeinheit als asynchrone logische Schaltung aufgebaut sein, deren interner Zustand nicht in einem zugehörigen Registersatz gehalten wird. Bei mindestens einer Ausführungsform wird eine arithmetische Logikeinheit von einem Prozessor verwendet, um in einem oder mehreren Registern des Prozessors gespeicherte Operanden zu kombinieren und eine Ausgabe zu erzeugen, die vom Prozessor in einem anderen Register oder einem Speicherplatz gespeichert werden kann.
  • Bei mindestens einer Ausführungsform übergibt der Prozessor als Ergebnis der Verarbeitung eines vom Prozessor abgerufenen Befehls einen oder mehrere Eingaben oder Operanden an eine arithmetische Logikeinheit, wodurch die arithmetische Logikeinheit veranlasst wird, ein Ergebnis zu erzeugen, das zumindest teilweise auf einem Befehlscode basiert, der den Eingängen der arithmetischen Logikeinheit bereitgestellt wird. Bei mindestens einer Ausführungsform basieren die vom Prozessor an die ALU gelieferten Befehlscodes zumindest teilweise auf dem vom Prozessor ausgeführten Befehl. Bei mindestens einer Ausführungsform verarbeitet die kombinatorische Logik in der ALU die Eingaben und erzeugt eine Ausgabe, die auf einen Bus innerhalb des Prozessors gelegt wird. Bei mindestens einer Ausführungsform wählt der Prozessor ein Zielregister, einen Speicherplatz, eine Ausgabeeinrichtung oder einen Ausgabespeicherplatz auf dem Ausgangsbus aus, so dass die Taktung des Prozessors bewirkt, dass die von der ALU erzeugten Ergebnisse an den gewünschten Ort gesendet werden.
  • Im vorliegenden Dokument kann auf das Beschaffen, Erfassen, Empfangen oder Eingeben von analogen oder digitalen Daten in ein Teilsystem, ein Computersystem oder eine computerimplementierte Maschine Bezug genommen werden. Der Prozess des Erhaltens, Erfassens, Empfangens oder Eingebens analoger und digitaler Daten kann auf verschiedene Weise erfolgen, z.B. durch Empfangen von Daten als Parameter eines Funktionsaufrufs oder eines Aufrufs an eine Anwendungsprogrammierschnittstelle. In einigen 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.
  • ZITATE ENTHALTEN IN DER BESCHREIBUNG
  • Diese Liste der vom Anmelder aufgeführten Dokumente wurde automatisiert erzeugt und ist ausschließlich zur besseren Information des Lesers aufgenommen. Die Liste ist nicht Bestandteil der deutschen Patent- bzw. Gebrauchsmusteranmeldung. Das DPMA übernimmt keinerlei Haftung für etwaige Fehler oder Auslassungen.
  • Zitierte Patentliteratur
    • US 17/572391 [0001]
    • US 17/572385 [0001]

    Claims (47)

    1. Prozessor umfassend: eine oder mehrere Schaltungen, um eine Anwendungsprogrammierschnittstelle, API, auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    2. Prozessor nach Anspruch 1, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Ausführungsstatus für den Graph-Knoten spezifiziert.
    3. Prozessor nach Anspruch 1, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Speicherplatz zum Empfang eines Ausführungsstatus des Graph-Knotens spezifiziert.
    4. Prozessor nach Anspruch 1, wobei die API eine Erfolgsangabe zurückgibt.
    5. Prozessor nach Anspruch 1, wobei die eine oder die mehreren Schaltungen darüber hinaus Anweisungen zur Aktivierung eines Graph-Knotens des Graph-Codes ausführen.
    6. Prozessor nach Anspruch 1, wobei die eine oder die mehreren Schaltungen darüber hinaus Anweisungen zum Deaktivieren eines Graph-Knotens des Graph-Codes ausführen.
    7. Prozessor nach Anspruch 1, wobei der Graph-Code eine Instanziierung eines Graph-Templates ist.
    8. Prozessor nach Anspruch 1, wobei der Graph-Code durch ein Superset-Graph-Template definiert ist.
    9. Prozessor nach Anspruch 1, wobei die API eine Treiber-API ist.
    10. Prozessor nach Anspruch 1, wobei die API eine Laufzeit-API ist.
    11. Computer-implementiertes Verfahren, umfassend: Ausführen einer Anwendungsprogrammierschnittstelle, API, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    12. Computerimplementiertes Verfahren nach Anspruch 11, wobei die API zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, einen zu aktivierenden Graph-Knoten des Graph-Codes angibt.
    13. Computerimplementiertes Verfahren nach Anspruch 11, wobei die API zur Angabe, welcher von einem oder mehreren Abschnitten des Graph-Codes auszuführen ist, einen zu deaktivierenden Graph-Knoten des Graph-Codes angibt.
    14. Computerimplementiertes Verfahren nach Anspruch 11, das darüber hinaus umfasst: Bestimmen eines Graph-Knotens des Graph-Codes, der zu aktivieren ist, zumindest teilweise auf der Grundlage der API; und Aktivieren des Graph-Knotens.
    15. Computerimplementiertes Verfahren nach Anspruch 11, das darüber hinaus umfasst: Bestimmen eines Graph-Knotens des Graph-Codes, der zu deaktivieren ist, zumindest teilweise auf der Grundlage der API; und Deaktivieren des Graph-Knotens.
    16. Computerimplementiertes Verfahren nach Anspruch 11, das darüber hinaus umfasst: Bestimmen eines Ausführungsstatus eines Graph-Knotens des Graph-Codes.
    17. Computerimplementiertes Verfahren nach Anspruch 11, das darüber hinaus umfasst: Bestimmen eines Graph-Knotens des Graph-Codes, der zu aktivieren ist, zumindest teilweise auf der Grundlage der API; Bestimmen, ob der Graph-Knoten deaktiviert ist; Bestimmen der zuvor definierten Funktionalität des Graph-Knotens zumindest teilweise auf der Grundlage eines Ausführungsgraph-Templates; Wiederherstellen eines Deskriptors des Graph-Knotens; und Wiederherstellen der zuvor definierten Funktionalität des Graph-Knotens.
    18. Computerimplementiertes Verfahren nach Anspruch 11, das darüber hinaus umfasst: Bestimmen eines Graph-Knotens des Graph-Codes, der zu deaktivieren ist, zumindest teilweise auf der Grundlage der API; Bestimmen, ob der Graph-Knoten aktiviert ist; Speichern von einem oder mehreren Datenelementen, die dem Graph-Knoten zugeordnet sind; Setzen eines Deskriptors des Graph-Knotens auf einen Null-Deskriptor; und Setzen einer funktionalen Spezifikation des Graph-Knotens auf einen leeren Kernel.
    19. Computerimplementiertes Verfahren nach Anspruch 11, das darüber hinaus umfasst: Empfangen aktualisierter Daten für einen Graph-Knoten des Graph-Codes; Bestimmen, dass der Graph-Knoten aktiviert ist, zumindest teilweise auf der Grundlage der API; und Bereitstellen der aktualisierten Daten an den Graph-Knoten.
    20. Computerimplementierte Verfahren nach Anspruch 11, das darüber hinaus umfasst: Empfangen aktualisierter Daten für einen Graph-Knoten des Graph-Codes; Bestimmen, dass der Graph-Knoten deaktiviert ist, zumindest teilweise auf der Grundlage der API; Speichern der aktualisierten Daten; Aktivieren des Graph-Knotens; und Bereitstellen der gespeicherten aktualisierten Daten an den Graph-Knoten.
    21. Computersystem umfassend: einen oder mehrere Prozessoren und einen Speicher, der ausführbare Anweisungen speichert, die als Ergebnis der Ausführung durch den einen oder die mehreren Prozessoren den einen oder die mehreren Prozessoren veranlassen, eine Anwendungsprogrammierschnittstelle, API, auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    22. Computersystem nach Anspruch 21, wobei die API einen oder mehrere Parameter aufweist, die zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Ausführungsstatus für den Graph-Knoten angeben.
    23. Computersystem nach Anspruch 21, wobei die API einen oder mehrere Parameter aufweist, die zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Speicherplatz zum Empfang eines Ausführungsstatus des Graph-Knotens angeben.
    24. Computersystem nach Anspruch 21, wobei die API eine Erfolgsangabe zurückgibt.
    25. Computersystem nach Anspruch 21, wobei die ausführbaren Anweisungen darüber hinaus Anweisungen aufweisen, die als Ergebnis der Ausführung durch den einen oder die mehreren Prozessoren einen Graph-Knoten des Graph-Codes zumindest teilweise auf der Grundlage der API aktivieren.
    26. Computersystem nach Anspruch 21, wobei die ausführbaren Anweisungen darüber hinaus Anweisungen aufweisen, die als Ergebnis der Ausführung durch den einen oder die mehreren Prozessoren einen Graph-Knoten des Graph-Codes zumindest teilweise auf der Grundlage der API deaktivieren.
    27. Computersystem nach Anspruch 21, wobei mindestens einer des einen oder mehreren Prozessoren eine zentrale Verarbeitungseinheit, CPU, ist.
    28. Computersystem nach Anspruch 21, wobei mindestens einer des einen oder der mehreren Prozessoren eine Grafikverarbeitungseinheit, GPU, ist.
    29. Computersystem nach Anspruch 21, wobei mindestens einer des einen oder der mehreren Prozessoren eine Parallelverarbeitungseinheit, PPU, ist.
    30. Computersystem nach Anspruch 21, wobei mindestens einer des einen oder der mehreren Prozessoren eine Mehrzweck-Grafikverarbeitungseinheit, GPGPU, ist.
    31. Maschinenlesbares Medium, auf dem ein Satz von Anweisungen gespeichert ist, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, eine Anwendungsprogrammierschnittstelle, API, auszuführen, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    32. Maschinenlesbares Medium nach Anspruch 31, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Ausführungsstatus für den Graph-Knoten angibt.
    33. Maschinenlesbares Medium nach Anspruch 31, wobei die API zumindest den Graph-Code, einen Graph-Knoten des Graph-Codes und einen Speicherplatz zum Empfangen eines Ausführungsstatus des Graph-Knotens angibt.
    34. Maschinenlesbares Medium nach Anspruch 31, wobei die API eine Erfolgsangabe zurückgibt.
    35. Maschinenlesbares Medium nach Anspruch 31, wobei der Satz von Anweisungen darüber hinaus Anweisungen aufweist, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, einen Graph-Knoten des Graph-Codes zu aktivieren.
    36. Maschinenlesbares Medium nach Anspruch 31, wobei der Satz von Anweisungen darüber hinaus Anweisungen aufweist, die, wenn sie von dem einen oder den mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, einen Graph-Knoten des Graph-Codes zu deaktivieren.
    37. Maschinenlesbares Medium nach Anspruch 31, wobei der Graph-Code eine Instanziierung eines Graph-Templates ist.
    38. Maschinenlesbares Medium nach Anspruch 31, wobei der Graph-Code durch ein Superset-Ausführungsgraph-Template definiert ist.
    39. Anwendungsprogrammierschnittstelle, API, umfassend: einen oder mehrere Parameter, um anzugeben, welcher von einem oder mehreren Abschnitten eines Graph-Codes auszuführen ist.
    40. API nach Anspruch 39, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der den Graph-Code angibt.
    41. API nach Anspruch 39, wobei der eine oder die mehreren Parameter mindestens einen Parameter aufweisen, der einen Graph-Knoten des Graph-Codes angibt.
    42. API nach Anspruch 39, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der angibt, dass ein Graph-Knoten des Graph-Codes aktiviert ist.
    43. API nach Anspruch 39, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der angibt, dass ein Graph-Knoten des Graph-Codes deaktiviert ist.
    44. API nach Anspruch 39, wobei der eine oder die mehreren Parameter zumindest einen Parameter aufweisen, der einen Speicherplatz angibt, um einen Ausführungsstatus eines Graph-Knotens des Graph-Codes zu empfangen.
    45. API nach Anspruch 39, wobei die API eine Erfolgsangabe zurückgibt.
    46. API nach Anspruch 39, wobei die API eine Fehlerangabe zurückgibt.
    47. API nach Anspruch 39, wobei die API einen Fehlerstatus zurückgibt.
    DE112023000204.5T 2022-01-10 2023-01-10 Anwendungsprogrammierschnittstelle zur Angabe der Ausführung von Graph-Knoten Pending DE112023000204T5 (de)

    Applications Claiming Priority (5)

    Application Number Priority Date Filing Date Title
    US17/572,385 2022-01-10
    US17/572,385 US20230222019A1 (en) 2022-01-10 2022-01-10 Application programming interface to control execution of graph nodes
    US17/572,391 US20230222010A1 (en) 2022-01-10 2022-01-10 Application programming interface to indicate execution of graph nodes
    US17/572,391 2022-01-10
    PCT/US2023/060377 WO2023133585A1 (en) 2022-01-10 2023-01-10 Application programming interface to indicate execution of graph nodes

    Publications (1)

    Publication Number Publication Date
    DE112023000204T5 true DE112023000204T5 (de) 2024-06-06

    Family

    ID=85222131

    Family Applications (2)

    Application Number Title Priority Date Filing Date
    DE112023000212.6T Pending DE112023000212T5 (de) 2022-01-10 2023-01-10 Anwendungsprogrammierschnittstelle zum Steuern der Ausführung von Graph-Knoten
    DE112023000204.5T Pending DE112023000204T5 (de) 2022-01-10 2023-01-10 Anwendungsprogrammierschnittstelle zur Angabe der Ausführung von Graph-Knoten

    Family Applications Before (1)

    Application Number Title Priority Date Filing Date
    DE112023000212.6T Pending DE112023000212T5 (de) 2022-01-10 2023-01-10 Anwendungsprogrammierschnittstelle zum Steuern der Ausführung von Graph-Knoten

    Country Status (2)

    Country Link
    DE (2) DE112023000212T5 (de)
    WO (2) WO2023133583A1 (de)

    Also Published As

    Publication number Publication date
    DE112023000212T5 (de) 2024-08-01
    WO2023133583A1 (en) 2023-07-13
    WO2023133585A1 (en) 2023-07-13

    Similar Documents

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

    Legal Events

    Date Code Title Description
    R012 Request for examination validly filed