DE112020007631T5 - Echtzeit-kaustiken-abbildung - Google Patents

Echtzeit-kaustiken-abbildung Download PDF

Info

Publication number
DE112020007631T5
DE112020007631T5 DE112020007631.8T DE112020007631T DE112020007631T5 DE 112020007631 T5 DE112020007631 T5 DE 112020007631T5 DE 112020007631 T DE112020007631 T DE 112020007631T DE 112020007631 T5 DE112020007631 T5 DE 112020007631T5
Authority
DE
Germany
Prior art keywords
buffer
information
cuda
photon
memory
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.)
Withdrawn
Application number
DE112020007631.8T
Other languages
English (en)
Inventor
Yaobin Ouyang
Nan Lin
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nvidia Corp
Original Assignee
Nvidia Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nvidia Corp filed Critical Nvidia Corp
Publication of DE112020007631T5 publication Critical patent/DE112020007631T5/de
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/06Ray-tracing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/04Texture mapping

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Graphics (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Image Generation (AREA)

Abstract

Geräte, Systeme und Techniken zur Strahlverfolgung von Kaustiken in einer Szene unter Verwendung von Rückkopplung von Photoneninformationen zwischen Einzelbildern. In mindestens einer Ausführungsform bestimmt die Photonenverfolgung (104, 202, 504) Photonenfußabdrücke (406) in einem einzelnen Einzelbild als ein Ergebnis der Interaktion einzelner Photonen mit einem oder mehreren kaustikwerfenden Objekten in diesem Einzelbild und verwendet diese Photonenfußabdrücke (406), um die Photonenverfolgung (104, 202, 504) in nachfolgenden Einzelbildern zu erleichtern.

Description

  • GEBIET
  • Mindestens eine Ausführungsform betrifft Verarbeitungsressourcen, die verwendet werden, um Strahlverfolgungs-Kaustikeffekte in einer Szene unter Verwendung von Rückkopplung von Photoneninformationen zwischen Einzelbildern zu generieren. Mindestens eine Ausführungsform betrifft beispielsweise Prozessoren oder Computersysteme, die verwendet werden, um Photonenmuster in einer Szene als ein Ergebnis einzelner Photonen zu bestimmen, die mit einem oder mehreren Objekten interagieren, die den Photonenpfad reflektieren oder ändern, und diese Informationen für das anschließende Einzelbild-Rendering zu verwenden.
  • STAND DER TECHNIK
  • Kaustiken sind sowohl im wirklichen Leben als auch in gerenderten Szenen, die Wasser, metallische Substanzen oder transparente Oberflächen enthalten, ein häufig anzutreffendes Phänomen. Kaustiken treten auf, wenn Photonen, die von einer Lichtquelle emittiert werden, mit kaustikwerfenden Objekten interagieren, wie undurchsichtigen Objekten, durch die Licht nicht durchgehen kann, sondern stattdessen reflektiert, einschließlich metallischer Substanzen, oder transparenter/semitransparenter Oberflächen, durch die Licht durchgehen kann, einschließlich Wasser und Glas. Diese Wechselwirkung (typischerweise durch Reflexion oder Brechung) bewirkt, dass Photonen in einem Lichtstrahl gestreut werden, wobei die resultierende Streuung manchmal fokussiert wird oder eine veränderte Flugbahn aufweist. Aufgrund der Komplexität der Berechnung von Photonendaten im Zusammenhang mit Kaustiken, ignorieren viele Renderer Kaustiken entweder oder behandeln sie grob, indem sie Techniken wie statische Abziehbildtexturen verwenden. Die erhöhte Verfügbarkeit von Strahlverfolgung, die von Grafikverarbeitungseinheiten durchgeführt wird, hat jedoch die Durchführbarkeit der Berechnung von Photonendaten in Bezug auf Kaustiken in Echtzeit verbessert.
  • Figurenliste
    • 1 ist ein Blockdiagramm, das eine verbesserte Technik zur Photonenstreuung veranschaulicht, um verbesserte Kaustikinformationen aus Strahl-/Photonenverfolgung, die mit einer Szene assoziiert sind, gemäß mindestens einer Ausführungsform zu bestimmen;
    • 2 ist ein Blockdiagramm, das den Datenfluss zwischen Datenspeicherpuffern veranschaulicht, um das Bestimmen verbesserter Kaustikinformationen aus der Photonenverfolgung zu erleichtern, gemäß mindestens einer Ausführungsform;
    • 3 ist ein Blockdiagramm, das eine Photonenverfolgung, wie beispielsweise eine Photonenabbildung, veranschaulicht, um Kaustikinformationen zu bestimmen, gemäß mindestens einer Ausführungsform;
    • 4 ist ein Blockdiagramm, das Strahlenfußabdrücke veranschaulicht, die aus Daten in einem Photonenpuffer durch Photonenstreuung bestimmt werden, gemäß mindestens einer Ausführungsform;
    • 5 ist ein Blockdiagramm, das eine Rückkopplungsschleife zum Verbessern von Kaustikinformationen veranschaulicht, die durch Photonenverfolgung unter Verwendung von Daten aus einem Aufgabenpuffer gemäß mindestens einer Ausführungsform bestimmt werden;
    • 6A ist ein Blockdiagramm, das die Bestimmung von gestörten Soft-Kaustik-Informationen gemäß mindestens einer Ausführungsform veranschaulicht;
    • 6B ist ein Blockdiagramm, das eine verbesserte Bestimmung von gestörten Soft-Kaustik-Informationen unter Verwendung von Positions- und Richtungsinformationen, die mit Photonen assoziiert sind, die von einem Flächenlicht emittiert werden, gemäß mindestens einer Ausführungsform veranschaulicht;
    • 7 veranschaulicht einen Prozess zum Durchführen einer verbesserten Technik für Photonenstreuung, um verbesserte Kaustikinformationen in einer Szene zu bestimmen, gemäß mindestens einer Ausführungsform;
    • 8 veranschaulicht ein beispielhaftes Datenzentrum gemäß mindestens einer Ausführungsform;
    • 9 veranschaulicht ein Verarbeitungssystem gemäß mindestens einer Ausführungsform;
    • 10 veranschaulicht ein Computersystem gemäß mindestens einer Ausführungsform;
    • 11 veranschaulicht ein System gemäß mindestens einer Ausführungsform;
    • 12 veranschaulicht eine beispielhafte integrierte Schaltung gemäß mindestens einer Ausführungsform;
    • 13 veranschaulicht ein Rechensystem gemäß mindestens einer Ausführungsform;
    • 14 veranschaulicht eine APU gemäß mindestens einer Ausführungsform;
    • 15 veranschaulicht eine CPU gemäß mindestens einer Ausführungsform;
    • 16 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice gemäß mindestens einer Ausführungsform;
    • 17A und 17B veranschaulichen beispielhafte Grafikprozessoren gemäß mindestens einer Ausführungsform;
    • 18A veranschaulicht einen Grafikkern gemäß mindestens einer Ausführungsform;
    • 18B veranschaulicht eine GPGPU gemäß mindestens einer Ausführungsform;
    • 19A veranschaulicht einen Parallelprozessor gemäß mindestens einer Ausführungsform;
    • 19B veranschaulicht einen Verarbeitungscluster gemäß mindestens einer Ausführungsform;
    • 19C veranschaulicht einen Grafikmultiprozessor gemäß mindestens einer Ausführungsform;
    • 20 veranschaulicht einen Grafikprozessor gemäß mindestens einer Ausführungsform;
    • 21 veranschaulicht einen Prozessor gemäß mindestens einer Ausführungsform;
    • 22 veranschaulicht einen Prozessor gemäß mindestens einer Ausführungsform;
    • 23 veranschaulicht einen Grafikprozessorkern gemäß mindestens einer Ausführungsform;
    • 24 veranschaulicht eine PPU gemäß mindestens einer Ausführungsform;
    • 25 veranschaulicht eine GPC gemäß mindestens einer Ausführungsform;
    • 26 veranschaulicht einen Streaming-Multiprozessor gemäß mindestens einer Ausführungsform;
    • 27 veranschaulicht einen Softwarestapel einer Programmierplattform gemäß mindestens einer Ausführungsform;
    • 28 veranschaulicht eine CUDA-Implementierung eines Softwarestapels der 27 gemäß mindestens einer Ausführungsform;
    • 29 veranschaulicht eine ROCm-lmplementierung eines Softwarestapels der 27 gemäß mindestens einer Ausführungsform;
    • 30 veranschaulicht eine OpenCL-Implementierung eines Softwarestapels der 27 gemäß mindestens einer Ausführungsform;
    • 31 veranschaulicht Software, die von einer Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform;
    • 32 veranschaulicht das Kompilieren von Code zum Ausführen auf Programmierplattformen der 27-30 gemäß mindestens einer Ausführungsform.
    • 33 veranschaulicht ausführlicher das Kompilieren von Code zum Ausführen auf Programmierplattformen der 27-30 gemäß mindestens einer Ausführungsform;
    • 34 veranschaulicht das Übersetzen des Quellcodes vor dem Kompilieren des Quellcodes gemäß mindestens einer Ausführungsform;
    • 35A veranschaulicht ein System, das dazu konfiguriert ist, CUDA-Quellcode unter Verwendung unterschiedlicher Arten von Verarbeitungseinheiten zu kompilieren und auszuführen, gemäß mindestens einer Ausführungsform;
    • 35B veranschaulicht ein System, das dazu konfiguriert ist, den CUDA-Quellcode der 35A unter Verwendung einer CPU und einer CUDA-fähigen GPU zu kompilieren und auszuführen, gemäß mindestens einer Ausführungsform;
    • 35C veranschaulicht ein System, das dazu konfiguriert ist, den CUDA-Quellcode der 35A unter Verwendung einer CPU und einer nicht-CUDA-fähigen GPU zu kompilieren und auszuführen, gemäß mindestens einer Ausführungsform;
    • 36 veranschaulicht einen beispielhaften Kernel, der von dem CUDA-zu-HIP-Übersetzungswerkzeug der 35C übersetzt wurde, gemäß mindestens einer Ausführungsform;
    • 37 veranschaulicht die nicht-CUDA-fähige GPU der 35C ausführlicher Detail gemäß mindestens einer Ausführungsform;
    • 38 veranschaulicht, wie Threads eines beispielhaften CUDA-Gitters auf unterschiedliche Recheneinheiten der 37 abgebildet werden, gemäß mindestens einer Ausführungsform; und
    • 39 veranschaulicht die Migration von bestehendem CUDA-Code zu Data-Parallel C++-Code gemäß mindestens einer Ausführungsform.
  • AUSFÜHRLICHE BESCHREIBUNG
  • In der vorstehenden und der folgenden Beschreibung werden verschiedene Techniken beschrieben. Zu Erklärungszwecken werden spezifische Ausgestaltungen und Details dargelegt, um ein umfassendes Verständnis der möglichen Implementierungsweisen der Verfahren zu vermitteln. Es wird jedoch auch deutlich, dass die im Folgenden beschriebenen Verfahren in unterschiedlichen Konfigurationen ohne die spezifischen Details ausgeführt werden können. Außerdem können bekannte Merkmale weggelassen oder vereinfacht werden, um die beschriebenen Techniken nicht zu verschleiern.
  • 1 ist ein Blockdiagramm, das eine verbesserte Technik zur Photonenstreuung darstellt, um verbesserte Kaustikinformationen aus Strahlverfolgung zu bestimmen, die auch als Photonenverfolgung 104 und im Folgenden als Photonenverfolgung bezeichnet wird und mit einer Szene während der Grafikverarbeitung durch eine Grafikverarbeitungseinheit assoziiert ist (GPU), gemäß mindestens einer Ausführungsform. Eine verbesserte Technik zur Photonenstreuung umfasst einen Algorithmus zum Implementieren adaptiver anisotroper Photonenstreuung 102. Die adaptive anisotrope Photonenstreuung 102 kann als Hardwareoperationen und/oder Software-Anweisungen implementiert werden, die, wenn sie ausgeführt werden, Photonenverfolgung oder Photonenabbildung 104 durch eine Szene durchführen und Kaustiken für alle Lichtteilchen bestimmen, die mit einem Kaustikstreuer, wie etwa einem undurchsichtigen oder transparenten Objekt, in einer Szene während der Photonenverfolgung interagieren. Ein Kaustikstreuer ist in einer Ausführungsform eine undurchsichtige Oberfläche, wie etwa eine reflektierende Oberfläche, die Licht in verschiedene Richtungen reflektiert, oder eine transparente Oberfläche, die den Pfad von Photonen, durch die sie durchgehen, verändert. Kaustiken sind in einer Ausführungsform Konzentrationen von Photonen, die während der Grafikverarbeitung von einem Prozessor, wie (ohne Einschränkung) einer GPU, durch eine Szene projiziert werden, die mit einem Kaustikstreuer, wie einem undurchsichtigen oder transparenten Objekt, interagiert haben, wodurch die Flugbahn der Photonen verändert wird. Das Bestimmen von Kaustiken in einer Szene wird gewöhnlich von einem Photonenabbildungsalgorithmus durchgeführt, der das Verfolgen von Photonen durch eine Szene durch Photonenverfolgung oder Photonenabbildung und dann das Durchführen einer Dichteschätzung umfasst. Herkömmliche Algorithmen arbeiten jedoch nur mit festen Dimensionen und erzeugen entweder unscharfe oder verrauschte Ergebnisse.
  • Adaptive anisotrope Photonenstreuung 102 verbessert herkömmliche Photonenabbildungsalgorithmen durch Durchführen von Schritten zum adaptiven Verfeinern von Photoneninformationen zwischen Einzelbildern. Um dies zu erreichen, umfasst die adaptive anisotrope Photonenstreuung in einer Ausführungsform vier Puffer, um Photonendaten zu speichern, wie unten in Verbindung mit 2 veranschaulicht. Erstens umfasst die adaptive anisotrope Photonenstreuung 102 in einer Ausführungsform die Verwendung eines Aufgabenpuffers, der (beispielsweise und ohne Einschränkung) als strukturierter Puffer implementiert wird, der Daten über Photonen oder Lichtstrahlen, die in dem aktuell gezeichneten Einzelbild verfolgt werden sollen, umfasst. Zweitens umfasst die adaptive anisotrope Photonenstreuung 102 in einer Ausführungsform die Verwendung eines Photonenpuffers, um Photonendaten aufzuzeichnen, die Photonen oder Lichtstrahlen, die in dem aktuellen Einzelbild verfolgt werden, betreffen. Diese Photonen- oder Lichtstrahldaten umfassen eine Position, an der ein Photonen- oder Lichtstrahl ein Objekt oder eine Oberfläche in dem aktuellen Einzelbild trifft, in Verbindung mit dem Fußabdruck und der Intensität des Photonen- oder Lichtstrahls, wie unten in Verbindung mit 4 beschrieben. Drittens umfasst die adaptive anisotrope Photonenstreuung 102 in einer Ausführungsform die Verwendung eines Kaustikpuffers, der Renderziele für Photonen angibt, die im Bildschirmraum gerendert werden sollen, der einem Einzelbild entspricht, wie unten in Verbindung mit 2 beschrieben. Schließlich umfasst die adaptive anisotrope Photonenstreuung 102 die Verwendung eines oder mehrerer Rückkopplungspuffer, wie nachstehend in Verbindung mit den 2 und 5 beschrieben. Der eine oder die mehreren Rückkopplungspuffer umfassen Informationen, einschließlich Lichtstrahl- oder Photonen-Fußabdrücken, Intensitätsvarianz für einzelne Photonen oder Lichtstrahlen, und Strahldichte, die mit einem oder mehreren projizierten oder verfolgten Photonen oder Lichtstrahlen assoziiert ist. In einer Ausführungsform werden in einem Rückkopplungspuffer gespeicherte Informationen mit Informationen in einem anderen Rückkopplungspuffer kombiniert, um einen Aufgabenpuffer mit neuen Photonen- oder Lichtstrahlinformationen zu aktualisieren, wie unten in Verbindung mit 5 beschrieben.
  • Unter Verwendung dieser Datenpuffer führt die adaptive anisotrope Photonenstreuung 102 in einer Ausführungsform die Photonenverfolgung 104 durch. Die Photonenverfolgung 104 besteht in einer Ausführungsform aus Hardwareoperationen und/oder Softwareanweisungen, die, wenn sie ausgeführt werden, Strahlen, die Beleuchtungsinformationen (Photonen) von einer Lichtquelle tragen, durch eine Szene verfolgen, die Strahlen aufgrund eines Kaustikstreuers, wie einer undurchsichtigen oder transparenten Oberfläche, reflektiert oder bricht, und Informationen aufzeichnen, wenn er eine undurchsichtige, unverspiegelte (raue) Oberfläche trifft. Wenn Photonen mit einer festen Auflösung emittiert werden, ist in einer Ausführungsform kein Aufgabenpuffer erforderlich, und es wird keine adaptive anisotrope Photonenstreuung 102 durchgeführt. Wenn eine dynamische (nicht feste) Auflösung verwendet wird, verwendet die adaptive anisotrope Photonenstreuung 102 einen adaptiven Ansatz, um Photonen gemäß einem Aufgabenpuffer in unterschiedlichen Flächen einer Szene zu emittieren und diese Photonen durch die Szene zu verfolgen, wie unten in Verbindung mit den 2 und 3 beschrieben. Wenn während der Photonenverfolgung 104 ein Photon auf einen Kaustikstreuer trifft, wie etwa eine undurchsichtige oder transparente Oberfläche, legt die adaptive anisotrope Photonenstreuung 102 eine Aufzeichnung in einem Photonenpuffer an und fügt Fußabdruckinformationen zu einem Rückkopplungspuffer hinzu, wie unten in Verbindung mit den 2 und 3 beschrieben.
  • Nach der Photonenverfolgung 104 führt in einer Ausführungsform die adaptive anisotrope Photonenstreuung 102 die Photonenstreuung 106 durch. Bei der Photonenstreuung 106 handelt es sich in einer Ausführungsform um Hardwareoperationen und/oder Softwareanweisungen, die, wenn sie ausgeführt werden, jedes in dem Photonenpuffer angegebene Photon oder jeden Lichtstrahl als Datenwerte zeichnen, die zum Anzeigen eines elliptischen Fußabdrucks verwendbar sind, und diese elliptischen Fußabdruckinformationen in einem Kaustikpuffer für jedes in dem Photonenpuffer angegebene Pixel speichern, wie nachstehend weiter in Verbindung mit den 2 und 4 beschrieben. In mindestens einer Ausführungsform kann ein elliptischer Fußabdruck oder Fußabdruck mit irgendeiner anderen Form Datenwerte umfassen, die ein oder mehrere Pixel, auf denen ein Photon oder Lichtstrahl auftrifft oder landet, angeben. In einer Ausführungsform wird ein Fußabdruck mindestens zum Teil basierend auf Pixelposition oder -ort kombiniert mit Intensität bestimmt. Während der Photonenstreuung 106 werden Photonen auf ein Bildschirmraumbild „gezeichnet“, das als Kaustikpuffer bezeichnet wird, wo die Pixelpositionen für jedes Photon berechnet werden und die entsprechenden Pixel in dem Kaustikpuffer beleuchtet werden. Die Form und Intensität für jeden Photonenfußabdruck an jedem Pixel werden von Photonendifferenzen aus der Wechselwirkung mit Kaustikstreuern, wie etwa undurchsichtigen oder transparenten Objekten, während der Photonenverfolgung 104 eingestellt.
  • Während der zusammengesetzten Kaustiken 108, wendet die adaptive anisotrope Photonenstreuung 102 Daten, die in einem Kaustikpuffer gespeichert sind, auf die aktuelle Szene an. Die zusammengesetzten Kaustiken 108 sind in einer Ausführungsform Hardwareoperationen und/oder Softwareanweisungen, die, wenn sie ausgeführt werden, Kaustikmuster für Photonen, die während der Photonenverfolgung 104 verfolgt werden, auf den Bildschirmraum anwenden, um für das aktuelle Einzelbild gerendert zu werden. Da die Kaustikmuster während der Photonenstreuung 106 erzeugt und in einem Kaustikpuffer aufgezeichnet werden, setzt die zusammengesetzte Kaustiken 108 keine Photoneninformationen ein.
  • Die adaptive anisotrope Photonenstreuung 102 verbessert das kaustische Rendern durch Anwenden der Rückkopplung 110. Das Anwenden von Rückkopplung 110 umfasst in einer Ausführungsform Hardwareoperationen und/oder Softwareanweisungen, die, wenn sie ausgeführt werden, einen oder mehrere Rückkopplungspuffer, die mit zuvor gerenderten Einzelbildern assoziiert sind, und den für das aktuelle Einzelbild generierten Rückkopplungspuffer kombinieren, um einen Aufgabenpuffer für das nächste Einzelbild, das geändert werden soll, zu generieren, wie weiter unten in Verbindung mit den 2 und 5 beschrieben ist. Während der Rückkopplung 110 werden ein oder mehrere Datenwerte in einem Aufgabenpuffer durch Kombinieren von Photonen- oder Lichtstrahldichtedaten für jedes Pixel in dem aktuellen Einzelbild, die während der Photonenverfolgung 104 bestimmt wurden, mit Photonen- oder Lichtstrahldichtedaten für jedes aktualisierte Pixel in einem vorherigen Einzelbild aktualisiert. Die aktuellen und vorherigen Photonen- oder Lichtstrahldichtedaten werden unter Verwendung von weiter unten in Verbindung mit 5 beschriebenen Techniken kombiniert.
  • 2 ist ein Blockdiagramm, das den Datenfluss zwischen Datenspeicherpuffern veranschaulicht, um das Bestimmen verbesserter Kaustikinformationen aus der Photonenverfolgung zu erleichtern, gemäß mindestens einer Ausführungsform. Ein Aufgabenpuffer 204 ist in einer Ausführungsform ein Datenpuffer, der Informationen über Photonen 208 oder Lichtstrahlen umfasst, die von einer Lichtquelle 206 in einer Szene emittiert werden sollen, die eine Oberfläche 212 umfasst, auf der die Photonen 208 oder Lichtstrahlen verfolgt werden sollen, und ein oder mehr Kaustikstreuer 230, mit denen die Photonen 208 oder Lichtstrahlen interagieren können. Ein Aufgabenpuffer 204 wird während der Photonenverfolgung 202, wie oben in Verbindung mit 1 beschrieben, verwendet. Während der Photonenverfolgung 202 werden Photonen 208, die von einer Lichtquelle 206 in einer zu rendernden Szene 224 emittiert 210 werden, gemäß einem Strahldichtewert für jedes Pixel, das in dem Aufgabenpuffer 204 angegeben ist, emittiert 210. Der Strahldichtewert in dem Aufgabenpuffer 204 gibt an, wie viele Photonen 208 von jedem Pixel, das einer Lichtquelle 206 entspricht, emittiert 210 oder verfolgt werden sollen.
  • Eine Lichtquelle 206 ist in einer Ausführungsform ein oder mehrere Datenwerte, wie etwa Pixel in einer Szene, die einen oder mehrere Orte angeben, von denen ein oder mehrere Photonen 208 während der Photonenverfolgung 202 verfolgt werden sollen. Photonen 208 sind in einer Ausführungsform Datenwerte, die Positions- und Richtungsinformationen, wie unten beschrieben, umfassen. Photonen 208 werden während der Photonenverfolgung 202 von einer Lichtquelle 206 zu einer Oberfläche 212 emittiert 210 oder verfolgt. Eine Oberfläche 212 besteht in einer Ausführungsform aus Datenwerten, die ein Objekt angeben, das Photonen 208, die von einer Lichtquelle 206 emittiert 210 werden oder verfolgt werden, nicht durchgehen lässt oder reflektiert. Photonen 208, die von einer Lichtquelle 206 emittiert werden 210 oder verfolgt werden, die auf eine Oberfläche 212 treffen oder anderweitig mit ihr interagieren, sind Photonentreffer 214. Photonentreffer 214 sind in einer Ausführungsform Datenwerte, die in einem Photonenpuffer 218 gespeichert werden sollen, die von einer Lichtquelle 206 emittierte Photonen 208 angeben, die während der Photonenverfolgung auf einer Oberfläche 212 landen, diese treffen oder anderweitig mit ihr interagieren. Photonentreffer 214 umfassen in einer Ausführungsform nur Photonen 208, die von einer Lichtquelle 206 emittiert 210 oder verfolgt werden, die mit einem oder mehreren Kaustikstreuern 230 interagieren. Ein Kaustikstreuer 230 besteht in einer Ausführungsform aus Datenwerten, die ein Objekt, wie etwa eine dreidimensionale Form (3D-Form) in einer Szene angeben, durch die ein oder mehrere Photonen 208 während der Photonenverfolgung 202 hindurchgehen, oder von denen ein oder mehrere Photonen 208 während der Photonenverfolgung 202 reflektiert werden. Ein Kaustikstreuer 230 besteht in einer Ausführungsform aus Datenwerten, die eine feste 3D-Form angeben, durch die Licht nicht hindurchgehen kann, wie etwa ein metallisches Objekt. Ein Kaustikstreuer 230 besteht in einer anderen Ausführungsform aus Datenwerten, die ein transparentes Objekt, durch das Licht hindurch gehen kann, angeben. Ein Kaustikstreuer 230 beeinflusst den Fußabdruck eines Photons 208, wie in einem Photonenpuffer 218 und einem oder mehreren Rückkopplungspuffern 228 angegeben.
  • Die Photonendichte gibt die Anzahl von Photonen an, die in der Nähe spezifischer u-, v-Koordinaten im Lichtraum emittiert werden sollen. Bei Punktlichtern und Spotlights ist die Photonendichte die Anzahl von Photonen, die in der Nähe einer gegebenen Richtung emittiert werden. Bei gerichtetem Licht gibt die Photonendichte die Anzahl von Photonen an, die in der Nähe eines gegebenen Punktes emittiert werden. Emittierte Photonen, die bei 214 auf eine raue undurchsichtige Oberfläche 212 getroffen sind, werden in einem Photonenpuffer 218 gespeichert. Während der Photonenverfolgung 202 weist ein Photon 208 oder Lichtstrahl, der von einer Lichtquelle 206 emittiert wird, zwei Positionsparameter auf: p = p ( u ,   v )
    Figure DE112020007631T5_0001
    für gerichtetes Licht von einer Lichtquelle 206, oder zwei Richtungsparameter: d = d ( u , v )
    Figure DE112020007631T5_0002
    für Punktlicht, das von einer Lichtquelle 206 emittiert wird 210. Die Position p' des Photons 208 auf einer Oberfläche 212 nach der Photonenverfolgung 202 für ein Photon 208, das von einer Lichtquelle 206 emittiert 210 oder verfolgt wird, wird basierend auf allen Parametern u, v derart bestimmt, dass: p ' = p ' ( u , v )
    Figure DE112020007631T5_0003
  • Wenn ein Photon 208 oder ein Lichtstrahl während der Photonenverfolgung 202 gestört wird, beispielsweise wenn es durch einen Kaustikstreuer 230 durchgeht, wird eine Störung der Photonenposition Δp' des Photons 208 wie folgt bestimmt: Δ p ' = δ p ' δ u Δ u + δ p ' δ v Δ v
    Figure DE112020007631T5_0004
    wobei δ p ' δ u  und  δ p ' δ v
    Figure DE112020007631T5_0005
    Strahlendifferenziale des Schnittpunkts sind, an dem ein Photon 208 mit einem Kaustikstreuer 230 interagiert.
  • Während der Photonenverfolgung 202 wird ein Strahlengenerierungs-Shader entsandt, um Photonen 208 oder Lichtstrahlen gemäß einer Strahldichte, die in einem Aufgabenpuffer 204 angegebenen ist, zu schießen oder zu verfolgen 210. Jeder Rechen-Thread in einem Strahlengenerierungs-Shader verfolgt nur ein Photon 208 entlang einem oder mehreren Strahlen 210, wobei mehrere Strahlen verwendet werden, wenn ein Photon reflektiert oder gebrochen wird, und ein neuer Strahl geschaffen und verfolgt wird. Falls mehrere Lichtquellen 206 während der Photonenverfolgung 202 verfolgt werden sollen, wird jedem Licht ein spezifischer Bereich in einer Photonendichtetextur zugeordnet. Jeder Lichtquelle 206 ist ein Bezeichner zugewiesen. Jeder Rechen-Thread in einem Strahlengenerierungs-Shader verwendet dann u-,v-Koordinaten, um zu bestimmen, welche Lichtquelle einem Photon 208 oder einem Lichtstrahl entspricht, das/der emittiert 210 oder während der Photonenverfolgung 202 verfolgt werden soll.
  • Daten, die Photonen 208 entsprechen, die mit einem Kaustikstreuer 230 interagiert haben und bei 214 eine Oberfläche 212 getroffen haben, werden in einem Photonenpuffer 218 gespeichert. Ein Photonenpuffer 218 ist in einer Ausführungsform ein Satz von Datenwerten, die Informationen über Photonen 208 oder Lichtstrahlen umfassen, die von einer Lichtquelle 206 in einer Szene während der Photonenverfolgung 202 emittiert 210 werden und mit einem Kaustikstreuer 230 interagieren oder sich anderweitig mit ihm schneiden. Ein Photonenpuffer 218 speichert in einer Ausführungsform Ergebnisse eines Satzes von Photonen, die auf einen oder mehrere Kaustikstreuer 230 treffen. Während der Photonenstreuung 216 werden Strahlfußabdruckinformationen für jedes Pixel in dem Photonenpuffer 218 verwendet, um Photonen auf eine Textur zu zeichnen, wie beispielsweise ein Bild, das in dem Kaustikpuffer 220 gespeichert ist, wie unten in Verbindung mit 4 beschrieben. Ein Strahlenfußabdruck wird aus der Strahldichte für jedes Pixel in einer Strahldichtetextur berechnet, indem der Bereich eines Pixels in dem Photonenpuffer dividiert durch eine Anzahl von Abtastungen bestimmt wird, die eine Anzahl von Photonen angibt, die, wie von Strahldichte angegeben, auf dem Pixel in einer Szene landen. Eine Strahlen- oder Photonendichtetextur oder ein Puffer zeichnet Strahldichteinformationen im Lichtraum auf. Strahldichteinformationen sind Daten, die für jedes Pixel eine Zählung oder Anzahl angeben, die angibt, wie viele Photonen 208, die von einer Lichtquelle 206 während der Photonenverfolgung 202 emittiert 210 werden, durch andere durchgehen, die anderweitig mit einem Kaustikstreuer 230 interagiert haben, bevor sie auf eine Oberfläche 212 treffen. Strahldichteinformationen unterscheiden nicht zwischen verworfenen Photonen und überlebenden Photonen und geben in einer Ausführungsform nur an, wie viele Photonen emittiert werden sollten, um Photonen 208 darzustellen, die bei 214 auf eine Oberfläche 212 treffen, nachdem sie mit einem Kaustikstreuer 230 interagiert haben. Strahldichteinformationen befinden sich im Lichtraum, und ein Pixel in Strahldichteinformationen deckt einen kleinen u-, v-Koordinatenbereich eines Pixels im Bildschirmraum ab oder wird tatsächlich auf einem Bildschirm gezeigt.
  • Ein Kaustikpuffer 220 besteht in einer Ausführungsform aus Daten, die eine normale Textur umfassen, die eine auf einem Bildschirm zu zeigende Szene darstellt, wobei die Textur Kaustikmuster umfasst, die Photonen 208 entsprechen, die von einer Lichtquelle 206 während der Photonenverfolgung 202 emittiert 210 werden. Unter Verwendung einer in einem Kaustikpuffer 220 gespeicherten Textur werden Kaustiken, die Photonenfußabdrücke angeben, während der Kaustikanwendung auf den Bildschirmraum angewendet und an die Hardware- und/oder Softwareoperationen, die für das Rendern einer Szene 224 zuständig sind, übertragen.
  • Um das Kaustik-Rendering zu verbessern, erleichtern ein oder mehrere Rückkopplungspuffer 228 während der Rückkopplung 226 das Integrieren von Kaustikinformationen, die während vorhergehender Einzelbilder und dem aktuellen Einzelbild bestimmt wurden, in das nächste Einzelbild. Ein Rückkopplungspuffer 228 ist in einer Ausführungsform ein Datenpuffer, der eine projizierte Fläche umfasst, die die durchschnittliche Bildschirmraumfläche von Photonen 208 angibt, die während der Photonenverfolgung 202 emittiert werden, und die durchschnittliche Luminanz jedes Bildschirmpixels in einem Kaustikpuffer 220. Während der Photonenverfolgung 202 für jedes Einzelbild wird der Fußabdruck jedes Photons 208 in den Bildschirmraum projiziert, und die projizierte Fläche wird in Verbindung mit der zeitlichen Intensitätsvarianz von Pixeln, die von jedem Photon 208 getroffen werden, in einem Rückkopplungspuffer kumuliert. Während der Rückkopplung 226 werden die projizierte Fläche und die in dem Rückkopplungspuffer für das aktuelle Einzelbild gespeicherte Intensitätsvarianz kombiniert, um die Strahldichte zu berechnen, die mit der in einem Rückkopplungspuffer 228 für ein vorheriges Einzelbild gespeicherten Strahldichtetextur gemischt und zum Treiben von Photonenemission verwendet wird, die in dem Aufgabenpuffer 204 für das nächste Einzelbild angegeben ist, wie unten in Verbindung mit 5 beschrieben.
  • 3 ist ein Blockdiagramm, das eine Photonenverfolgung, wie eine Photonenabbildung, darstellt, um Kaustikinformationen zu bestimmen, gemäß mindestens einer Ausführungsform. Ein Aufgabenpuffer 302, der oben in Verbindung mit den 1 und 2 beschrieben ist, umfasst Daten, die verwendet werden, um das Verfolgen eines oder mehrerer Photonen oder Lichtstrahlen 306, 314, 318 über eine Szene in einem Einzelbild zu erleichtern. Photonen oder Lichtstrahlen 306, 314, 318, die von einer Lichtquelle 304 emittiert werden, wie oben in Verbindung mit 2 beschrieben, werden auf eine Oberfläche 310 projiziert.
  • Photonen oder Lichtstrahlen 306, 314, 318, die von einer Lichtquelle 304 emittiert werden, interagieren mit einem Kaustikstreuer, wie einem undurchsichtigen/transparenten Objekt 316, wie oben in Verbindung mit 2 beschrieben. Falls ein oder mehrere Lichtstrahlen 314, 318 durch einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 316 durchgehen, werden Photonen, die dem einen oder den mehreren Lichtstrahlen 314, 318 entsprechen, gestört, bevor sie sich mit einer Oberfläche 310 schneiden oder darauf landen. Photonen oder Lichtstrahlen 306, 314, 318, die einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 316 schneiden oder anderweitig damit interagieren, weisen gestörte Bahnen auf, und ihre Position und Dichte werden in einem Photonenpuffer 322 aufgezeichnet, wie oben in Verbindung mit den 1 und 2 beschrieben. Die projizierte Fläche und die Luminanzvarianz von Pixeln, die mit einer Oberfläche 310 assoziiert sind, auf der Photonen gelandet sind, werden in einem oder mehreren Rückkopplungspuffern 322, wie oben in Verbindung mit 2 beschrieben, gespeichert.
  • Ein oder mehrere Lichtstrahlen 306, 314, 318 oder Photonen, die durch einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 316 durchgehen, sind Photonentreffer 320, und Daten, die mit diesen Lichtstrahlen 306, 314, 318 oder Photonen assoziiert sind, werden aufgezeichnet oder anderweitig in Photonen- und/oder Rückkopplungspuffern 322 angegeben. Ein oder mehrere Lichtstrahlen 306, 314, 318 oder Photonen, die nicht durch einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 316 durchgehen, werden verworfen 312 und tragen nicht zu Kaustiken in diesem Einzelbild bei.
  • 4 ist ein Blockdiagramm, das Photonenfußabdrücke 406 veranschaulicht, die aus Strahl-Fußabdruckdaten in einem Photonenpuffer 406 durch Übersetzung 404 gemäß mindestens einer Ausführungsform bestimmt werden. Photonenfußabdrücke 406 sind in einer Ausführungsform ein oder mehrere Datenwerte, die Pixeln in einer Lichtraum-Strahldichtetextur entsprechen, die Informationen über ein oder mehrere auf jedes Pixel projizierte Photonen umfassen. Wie oben in Verbindung mit den 1-3 beschrieben, umfasst ein Photonenpuffer 402 Strahldichte- oder Fußabdruckinformationen für jedes Pixel in einem Einzelbild. Während der adaptiven anisotropen Photonenstreuung, wie oben in Verbindung mit 1 beschrieben, wird eine Übersetzungsoperation 404 durchgeführt. Eine Übersetzungsoperation 404 zeichnet jedes Photon, das von Informationen in einem Photonenpuffer angegeben ist, als einen elliptischen Fußabdruck 410 für jedes Pixel 408 in einem Einzelbild.
  • Informationen, die in einem Photonenpuffer 402 gespeichert sind, geben eine Anzahl von Photonen oder Lichtstrahlen an, die mit einem Kaustikstreuer interagieren, wie oben beschrieben, und auf einem Pixel landen (sich damit schneiden), das einer undurchsichtigen rauen Oberfläche in einer Szene entspricht. In einem Photonenpuffer 402 gespeicherte Informationen umfassen Ganzzahl- oder Gleitkommawerte, die eine Anzahl von Photonen oder Lichtstrahlen angeben, die mit einem Kaustikstreuer interagieren und auf jedem Pixel landen (sich damit schneiden), das einer undurchsichtigen rauen Oberfläche in einer Szene entspricht. Für ein Element in einem Photonenpuffer 402, das einem einzelnen Pixel entspricht, werden ein oder mehrere Photonenfußabdrücke 410 berechnet. Die Anzahl der berechneten oder übersetzten Photonenfußabdrücke 404 ist die nächste Quadratzahl kleiner als die Strahldichte in einem Strahldichtepuffer, die für jedes Pixel in dem Photonenpuffer 402 bestimmt wird.
  • Während der Übersetzung 404 berechnet der adaptive anisotrope Photonenstreualgorithmus Photonenfußabdrücke 406 für jedes Lichtraumpixel 408 in einer Szene. Jedes Pixel 408 umfasst einen oder mehrere Fußabdrücke 410, die einem oder mehreren Photonen oder Lichtstrahlen entsprechen, die während der Photonenverfolgung emittiert oder verfolgt werden, die in jedem Pixel 408 gelandet sind. Photonenfußabdrücke 410 werden unter Verwendung von Photonen- oder Strahlendifferenzinformationen δ p ' δ u  und  δ p ' δ v
    Figure DE112020007631T5_0006
    berechnet, die oben in Verbindung mit 2 beschrieben sind. Photonenfußabdrücke 406 werden in einem Photonenpuffer 402 gespeichert und dann der Photonenstreuung 412 bereitgestellt, um auf eine Textur in einem Kaustikpuffer angewendet zu werden.
  • 5 ist ein Blockdiagramm, das eine Rückkopplungsschleife zum Verbessern von Kaustikinformationen veranschaulicht, die durch Photonenverfolgung 504 unter Verwendung von Daten aus einem Aufgabenpuffer 502 gemäß mindestens einer Ausführungsform bestimmt werden. Wie oben in Verbindung mit den 1-3 beschrieben, umfasst ein Aufgabenpuffer 502 Photoneninformationen, die während der Photonenverfolgung 504 verwendbar sind, um den Pfad eines Photons zu verfolgen oder anderweitig zu bestimmen, das möglicherweise mit einem oder mehreren Kaustikstreuern, wie undurchsichtigen oder transparenten Objekten, interagiert. Informationen über Photonen, die mit einem oder mehreren Kaustikstreuern, wie undurchsichtigen oder transparenten Objekten, interagieren, werden in einem Rückkopplungspuffer für ein spezifisches Bild oder eine spezifische Szene aufgezeichnet.
  • Ein Rückkopplungspuffer für ein spezifisches Einzelbild oder eine spezifische Szene umfasst eine Textur einer projizierten Fläche 506 und eine Textur einer Luminanzvarianz 508. Eine Textur einer projizierten Fläche 506 ist in einer Ausführungsform ein Satz von Datenwerten, die Pixel angeben, die einer Textur oder einem Bild für eine Szene entsprechen, die die durchschnittliche Bildschirmraumfläche von Photonen umfassen, die während der Photonenverfolgung 504 emittiert oder verfolgt werden. Eine Textur der Luminanzvarianz 508 ist in einer Ausführungsform ein Satz von Datenwerten, die Pixel angeben, die einer Textur oder einem Bild für eine Szene entsprechen, die die durchschnittliche Luminanzvarianz von Pixeln in einem Einzelbild oder einer Szene umfassen, die während der Photonenverfolgung 504 von Photonen getroffen werden.
  • Während der Photonenverfolgung 504 wird der Fußabdruck jedes Photons, wie er in einem Aufgabenpuffer 502 gespeichert oder anderweitig davon angegeben wird, für ein Einzelbild in den Bildschirmraum projiziert. Die Fläche ausgedrückt in Pixeln jedes verfolgten Photons wird in einer Textur der projizierten Fläche 506 gespeichert. Auch während der Photonenverfolgung 504 wird die zeitliche Intensitätsvarianz zwischen Pixeln, auf denen Photonen verfolgt werden, in einer Textur der Luminanzvarianz 508 gespeichert.
  • Eine vorgeschlagene Strahldichte d'512 für jedes Pixel in dem aktuellen Einzelbild wird durch Kombinieren 510 der Textur der projizierten Fläche 506 mit der Textur der Luminanzvarianz 508 für jedes Pixel bestimmt. Eine Textur einer projizierten Fläche 506 und eine Textur einer Luminanzvarianz 508 in dem aktuellen Rückkopplungspuffer werden kombiniert 510 als: d ' = d a a t + v g
    Figure DE112020007631T5_0007
    wobei d' die vorgeschlagene Strahldichte 512 ist, d eine vorherige Strahldichte 516 ist, die in einem Rückkopplungspuffer für das vorherige Einzelbild 518 gespeichert ist, a die durchschnittliche projizierte Bildschirmraumgröße aus der projizierten Fläche ist, at die projizierte Zielgröße ist, v die Luminanzvarianz für Photonen ist, die während der Photonenverfolgung 504 emittiert werden, und g die Luminanzverstärkung ist. Die vorgeschlagene Strahldichte d' 512 wird in einem Rückkopplungspuffer für das aktuelle Einzelbild 514 gespeichert.
  • Um die Genauigkeit der vorgeschlagenen Strahldichte d' 512 zu verbessern, wird die vorgeschlagene Photonen- oder Lichtstrahldichte für jedes Pixel 520 aktualisiert oder zwischen benachbarten Pixeln in der vorgeschlagenen Strahldichte d' 512 gemischt. Die Gleichung zum Aktualisieren 520 einer vorgeschlagenen Strahldichte d' 512 lautet in einer Ausführungsform: d n e u = w t d ' + ( 1 w t ) i w i d i i w i
    Figure DE112020007631T5_0008
  • wobei dneu die neue Strahldichte ist, die in einer Strahldichtetextur gespeichert und aktualisiert werden soll, d' die vorgeschlagene Strahldichte 512 ist, wt ein zeitlicher Mischfaktor ist, wi ein räumlicher Mischfaktor ist und di Strahldichten in dem aktuellen Pixel und seinen Nachbarn ist. Sowohl wt als auch wi sind in einer Ausführungsform Gleitkommawerte zwischen 0 und 1. In einer Ausführungsform ermöglicht ein höherer Wert von wt eine schnellere Aktualisierung von dneu, aber mit verschlechterter Genauigkeit. Die von einer Strahldichtetextur angegebene Strahldichte wird in einer Ausführungsform in Strahlaufgaben übersetzt und in einem Aufgabenpuffer 502 gespeichert.
  • In einer Ausführungsform wird ein Aufgabenpuffer 502 mit einer neuen Strahldichte dneu aktualisiert. In einer anderen Ausführungsform wird ein Aufgabenpuffer 502 mit Strahl-Fußabdruckdaten aktualisiert, die mindestens zum Teil auf der neuen Strahldichte dneu basierend berechnet werden.
  • 6A ist ein Blockdiagramm, das die Bestimmung von gestörten Soft-Kaustikinformationen gemäß mindestens einer Ausführungsform veranschaulicht. Soft-Kaustiken sind in einer Ausführungsform Fußabdrücke, die durch Photonen oder Lichtstrahlen 604, 608 generiert werden, die von einem Flächenlicht 602 emittiert werden und durch einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 606, während der Photonenverfolgung, wie oben in Verbindung mit den 2 und 3 beschrieben, durchgehen. Das Flächenlicht 602 ist in einer Ausführungsform eine Lichtquelle und generiert einen Photonenfußabdruck 612 auf einer Oberfläche 610.
  • Ein oder mehrere Photonen- oder Lichtstrahlen 604, 608, die von einem Flächenlicht 602 emittiert werden, das durch einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 606 durchgehen, werden in einer Ausführungsform gestört 614. Gemäß Ausführungsformen kann die Störung 614 einen Datenwert oder eine andere Rechenmetrik umfassen, die Ableitungen angibt, die als Photonendifferenziale bezeichnet werden, die unter Verwendung einer Kettenregel berechnet werden, die eine oder mehrere Wechselwirkungen zwischen einem oder mehreren Photonen oder Lichtstrahlen 604, 608 und einem Objekt oder einer Kraft angibt, die in der Lage sind, dieses eine oder die mehreren Photonen oder Lichtstrahlen 604, 608 zu verändern. Eine Störung 614 ist in einer Ausführungsform ein Satz von Daten, die Photonenpositionsableitungen in Bezug auf Strahlposition und -richtung angeben. Eine Störung 614 ist in einer Ausführungsform für ein Photon. Die Berechnung einer Störung 614 für ein Photon erfordert in einer Ausführungsform keine Informationen von anderen Photonen. Die adaptive anisotrope Photonenstreuung zeichnet eine Photonenstörung 614 von einer Lichtquelle, wie etwa einem Flächenlicht 602, auf und aktualisiert diese Störung unter Verwendung einer Kettenregel, wenn ein Photon mit einem Kaustikstreuer, wie einem undurchsichtigen/transparenten Objekt 606 interagiert, in einer Ausführungsform.
  • Eine Störung 614 führt zu Änderungen an einem Photonenfußabdruck 612. Ein Photonenfußabdruck 612 wird in einer Ausführungsform unter Verwendung von Photonen-Differenzialtechniken berechnet, die oben in Verbindung mit den 2 und 3 beschrieben sind. Da jedoch ein Photonen- oder Lichtstrahl von einem Flächenlicht 602 Positions- und Richtungsinformationen umfasst, die unabhängig variieren können, sind Techniken, die oben in Verbindung mit den 2 und 3 für direktes Licht beschrieben sind, für Flächenlicht 602 ungenau. Punktlichter, Spotlights, Richtungslichter und andere Lichter weisen ebenfalls Störungen auf, und der Einfluss der Störung wird unter Verwendung von Techniken berechnet, die oben in Verbindung mit den 2 und 3 beschrieben sind.
  • 6B ist ein Blockdiagramm, das eine verbesserte Bestimmung des gestörten 632, 640 Soft-Kaustikphotoenenfußabdrucks 648 unter Verwendung von Positions- und Richtungsinformationen, die mit Photonen assoziiert sind, die von einem Flächenlicht 620 emittiert werden, gemäß mindestens einer Ausführungsform veranschaulicht. Flächenlichter 620 emittieren während der Photonenverfolgung Photonen oder Lichtstrahlen 634, 636, 642, 644, die durch Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 624, durchgehen oder anderweitig damit interagieren, was zu einem Fußabdruck 648 auf einer Oberfläche 628 führt, wie oben in Verbindung mit den 2 und 3 beschrieben. Photonen oder Lichtstrahlen 634, 636, 642, 644, die von einem Flächenlicht 620 emittiert werden, können in einer Ausführungsform gestört werden 632, 640, was in Fußabdrücken mit einer gestörten Position 638 und gestörten Richtung 646 auf einer Oberfläche 628 führt.
  • Da ein Photon oder Lichtstrahl 634, 636, 642, 644 unabhängige Richtungs- und Positionsinformationen umfasst, können sowohl eine Positionsstörung 632 als auch eine Richtungsstörung 632 während der Photonenverfolgung unabhängig auf das Photon oder den Lichtstrahl 634, 636, 642, 644 angewendet werden. Falls eine Positionsstörung 632 angewendet wird, geht ein resultierendes positionsgestörtes Photon oder ein Lichtstrahl 634 durch einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 624, durch, das seinen Pfad 636 verhindert und in einem gestörten Positionsfußabdruck 638 resultiert, der sich von dem ungestörten Photon-Fußabdruck unterscheidet. Falls eine Richtungsstörung 640 angewendet wird, geht ein resultierendes richtungsgestörtes Photon oder ein richtungsgestörter Lichtstrahl 642 durch einen Kaustikstreuer, wie ein undurchsichtiges/transparentes Objekt 624, durch, was seinen Pfad 644 ändert und zu einem gestörten Richtungsfußabdruck 646 führt, der sich von dem ungestörten Photonenfußabdruck unterscheidet und sich von dem gestörten Positionsfußabdruck 638 des Photons oder Lichtstrahls 634, 636, 642, 644 unterscheidet.
  • Um Soft-Kaustiken, wie in den 6A und 6B veranschaulicht, genau zu rendern oder anderweitig zu bestimmen, berechnet die adaptive anisotrope Photonenstreuung Photonen- oder Lichtstrahlfußabdrücke 648 des Photons oder Lichtstrahls 634, 636, 642, 644 basierend auf unabhängigen Variationen in Position und Richtung, die mit jedem Photon oder Lichtstrahl 634, 636, 642, 644 während der Photonenverfolgung assoziiert sind. Wie oben in Verbindung mit 2 beschrieben, weisen ein Photon oder ein Lichtstrahl, das/der aus einem direkten Licht während Photonverfolgung emittiert wird, Positionsparameter p = p(u, v) oder Richtungsparameter d = d(u, v) auf. Im Gegensatz dazu weist ein Photon oder Lichtstrahl 634, 636, 642, 644, das/der von einem Flächenlicht 620 während der Photonenverfolgung emittiert wird oder verfolgt wird, zwei Positionsparameter p = p(u, v) und zwei unterschiedliche Richtungsparameter d = d(p, q) auf. Die resultierende Photonenposition p' 648 wird basierend auf allen Parametern p' = p'(u, v, p, q) bestimmt.
  • Adaptive anisotrope Photonenstreuung betrachtet Störungen 632, 640 von Photonen- oder Lichtstrahlparametern Δu, Δv, Δp, Δq als unabhängige Zufallsvariablen, die der Standardnormalverteilung gehorchen. Ein Photonenfußabdruck 648 nach diesen Störungen umfasst den signifikanten Bereich der resultierenden Wahrscheinlichkeitsverteilung. Die resultierenden Änderungen der Photonenposition als ein Ergebnis der Störungen 632, 640 sind: Δ p ' = Δ p ' p + Δ p ' d
    Figure DE112020007631T5_0009
    wobei Δ p ' p = δ p ' δ u Δ u + δ p ' δ v Δ v
    Figure DE112020007631T5_0010
    Δ p ' d = δ p ' δ u Δ p + δ p ' δ v Δ q
    Figure DE112020007631T5_0011
  • Sowohl Δp'p als auch Δp'd sind zweidimensionale Photonenstörungsvektoren in einem lokalen xy-Koordinatenrahmen eines Photons, die von Störungen in Position 632 bzw. Richtung 640 verursacht werden.
  • Sowohl Δp'p als auch Δp'd gehorchen der Normalverteilung: Δ p ' p N ( 0, p )
    Figure DE112020007631T5_0012
    Δ p ' d N ( 0, d )
    Figure DE112020007631T5_0013
    wobei p = ( δ p ' δ u δ p ' δ v ) ( δ p ' δ u δ p ' δ v ) T
    Figure DE112020007631T5_0014
    d = ( δ p ' δ p δ p ' δ q ) ( δ p ' δ p δ p ' δ q ) T
    Figure DE112020007631T5_0015
  • Da Δp'p und Δp'd unabhängig sind, wird die Wahrscheinlichkeitsverteilung von Δp' in einer Ausführungsform berechnet, indem eine Faltungsoperation an Δp'p und Δp'd durchgeführt wird. Da eine Faltung zweier Normalverteilungen eine Normalverteilung jeweils mit Mittelwert und Kovarianz jeweils die Summe aus beiden ergibt, gilt dann: Δ p ' N ( 0, )
    Figure DE112020007631T5_0016
    wobei = p + d
    Figure DE112020007631T5_0017
  • Zum Berechnen der Photonendifferenziale von Σ findet man zwei Vektoren Δp1 und Δp2, so dass: = ( Δ p 1   Δ p 2 ) ( Δ p 1   Δ p 2 ) T
    Figure DE112020007631T5_0018
    indem Δp1 entlang der x-Achse eines lokalen Koordinatenrahmens angenommen und entsprechend nach Δp2 aufgelöst wird.
  • Adaptive anisotrope Photonenstreuung, wie oben in Verbindung mit den 1 und 2 beschrieben, berechnet in einer Ausführungsform Photonendifferenziale, wie oben beschrieben, als Reaktion auf sowohl Positionsstörungen 632 als auch Richtungsstörungen 640 von Photonen oder Lichtstrahlen, die von einem oder mehreren Flächenlichtern 620 während der Photonenverfolgung emittiert werden. Dann konstruiert in einer Ausführungsform adaptive anisotrope Photonenstreuung Kovarianzmatrizen Σp und Σd und addiert beide Matrizen, um eine Kovarianzmatrix Σ für den zusammengesetzten Fußabdruck zu erhalten. Die adaptive anisotrope Photonenstreuung berechnet dann die Photonendifferenziale Δp1 und Δpz aus Σ und speichert sie in einem Aufgabenpuffer, der ein Photon betrifft, wie oben in Verbindung mit den 1-3 beschrieben.
  • 7 veranschaulicht einen Prozess 700 zum Durchführen einer verbesserten Technik für Photonenstreuung, um verbesserte Kaustikinformationen in einer Szene zu bestimmen, gemäß mindestens einer Ausführungsform; Der Prozess 700 führt eine adaptive anisotrope Photonenstreuung, die oben in Verbindung mit den 1-6 beschrieben ist, durch Photonenverfolgung durch, wobei ein oder mehrere Photonen oder Lichtstrahlen von einem Raytracer basierend auf Daten in einem Aufgabenpuffer 702, wie oben in Verbindung mit den 1-3 beschrieben, emittiert 702 werden. Der Raytracer verfolgt dann die Photonen oder Lichtstrahlen 704 durch eine Szene für ein einzelnes Einzelbild, wie oben in Verbindung mit den 2 und 3 beschrieben.
  • Wenn ein Photon oder Lichtstrahl durchgeht oder auf andere Weise mit einem Kaustikstreuer, wie einer undurchsichtigen/transparenten Oberfläche 706, interagiert, werden Daten über das Photon oder den Lichtstrahl in einem Photonenpuffer, wie oben in Verbindung mit den 2-4 beschrieben, aufgezeichnet. Falls ein Photon oder Lichtstrahl nicht durch einen Kaustikstreuer, wie ein undurchsichtiges Objekt 706 durchgeht oder anderweitig mit ihm interagiert, werden Daten über das Photon oder den Lichtstrahl 708, wie oben in Verbindung mit 3 beschrieben, verworfen.
  • In Verbindung mit Photonendaten, die während der Photonenverfolgung in einem Photonenpuffer 710 aufgezeichnet werden, werden Informationen oder Daten in Bezug auf einen oder mehrere Photonenfußabdrücke in einem Rückkopplungspuffer gespeichert, um die Generierung oder Aktualisierung eines Aufgabenpuffers für das nächste Einzelbild 720 zu erleichtern, wie oben in Verbindung mit 5 beschrieben. Nachdem die Photonenverfolgung die Verfolgung von Photonen 704 oder Strahlen durch eine Szene in einem Einzelbild beendet ist, legt Hardware oder Software, die adaptive anisotrope Photonenstreuung anwendet, die von dem Prozess der 7 veranschaulicht ist, Fußabdruckdaten 714 aus Strahldichteinformationen an, die in dem Photonenpuffer gespeichert sind, wie oben in Verbindung mit den 1 und 4 beschrieben.
  • Fußabdruckdaten, die aus dem Photonenpuffer 714 berechnet oder angelegt werden, werden geschrieben 716 oder in eine Textur, wie beispielsweise ein Bild, angewendet (bespritzt) und in einem Kaustikpuffer 716 gespeichert, und die Textur, wie beispielsweise ein Bild, wird auf eine Szene für das aktuelle Einzelbild 718 unter Verwendung eines Renderers oder anderer Hardware- oder Softwarevorrichtungen zum Anwenden von Grafikdaten auf eine Szene 718, die auf einem Bildschirm gerendert werden soll, angewendet. Nachdem Kaustikdaten aus einem Kaustikpuffer von Hardware oder Software, die adaptive anisotrope Photonenstreuung implementiert, auf eine Szene 718 angewendet wurden, wird ein Aufgabenpuffer von der Hardware oder Software basierend auf Daten, die in einem Rückkopplungspuffer gespeichert sind, aktualisiert 720, wie oben in Verbindung mit den 2 und 5 beschrieben. Der aktualisierte Aufgabenpuffer verwendet Kaustikinformationen, die für das aktuelle Einzelbild generiert werden, um die Photonenemission 702 und die Verfolgung 704 in dem nächsten Einzelbild zu erleichtern.
  • In der folgenden Beschreibung sind zahlreiche spezifische Details aufgeführt, um ein umfassenderes Verständnis mindestens einer Ausführungsform bereitzustellen. Für den Fachmann liegt dabei jedoch auf der Hand, dass die erfinderischen Konzepte ohne eines oder mehrere dieser spezifischen Details umgesetzt werden können.
  • Rechenzentrum
  • 8 veranschaulicht ein beispielhaftes Rechenzentrum 800 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Rechenzentrum 800 ohne Einschränkung eine Rechenzentrum-Infrastrukturschicht 810, eine Framework-Schicht 820, eine Software-Schicht 830 und eine Anwendungsschicht 840.
  • In mindestens einer Ausführungsform kann, wie in 8 gezeigt, die Rechenzentrum-Infrastrukturschicht 810 einen Ressourcenorchestrator 812, gruppierte Rechenressourcen 814 und Knotenrechenressourcen („node computing recources“ - „Knoten-CRs“) 816(1)-816(N) beinhalten, wobei „N“ eine beliebige positive Ganzzahl ist. In mindestens einer Ausführungsform können die Knoten-CRs 816(1)-816(N) eine beliebige Anzahl von Zentralverarbeitungseinheiten („CPUs“) oder andere Prozessoren (einschließlich Beschleunigern, feldprogrammierbaren Gate-Arrays („FPGAs“), Grafikprozessoren usw.), Arbeitsspeichervorrichtungen (z. B. dynamischer Nur-Lese-Speicher), Datenspeichervorrichtungen (z. B. Festkörper- oder Festplattenlaufwerke), Netzwerk-Ein-/Ausgabe-Vorrichtungen („NW-E/A“-Vorrichtungen), Netzwerk-Switches, virtuelle Maschinen („VMs“), Leistungsmodule und Kühlmodule usw. beinhalten, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform können eine oder mehrere Knoten-CRs von den Knoten-CRs 816(1)-816(N) ein Server sein, der eine oder mehrere der vorstehend erwähnten Computerressourcen aufweist.
  • In mindestens einer Ausführungsform können die gruppierten Rechenressourcen 814 getrennte Gruppierungen von Knoten-CRs, die in einem oder mehreren Racks (nicht gezeigt) untergebracht sind, oder viele Racks, die in Rechenzentren an verschiedenen geografischen Orten (ebenfalls nicht gezeigt) untergebracht sind, beinhalten. Getrennte Gruppierungen von Knoten-CRs innerhalb von gruppierten Rechenressourcen 814 können gruppierte Rechen-, Netzwerk-, Speicher- oder Speicherungsressourcen beinhalten, die konfiguriert oder zugeteilt werden können, um eine oder mehrere Arbeitsbelastungen zu unterstützen. In mindestens einer Ausführungsform können mehrere Knoten-CRs, die CPUs oder Prozessoren beinhalten, innerhalb eines oder mehrerer Racks gruppiert sein, um Rechenressourcen bereitzustellen, um eine oder mehrere Arbeitsbelastungen zu unterstützen. In mindestens einer Ausführungsform können ein oder mehrere Racks auch eine beliebige Anzahl von Leistungsmodulen, Kühlmodulen und Netzwerk-Switches in einer beliebigen Kombination beinhalten.
  • In mindestens einer Ausführungsform kann der Ressourcenorchestrator 812 eine oder mehrere Knoten-CRs 816(1)-816(N) und/oder gruppierte Rechenressourcen 814 konfigurieren oder anderweitig steuern. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 812 eine Verwaltungseinheit einer Software-Design-Infrastruktur („SDI“) für das Rechenzentrum 800 beinhalten. In mindestens einer Ausführungsform kann der Ressourcenorchestrator 812 Hardware, Software oder eine Kombination davon beinhalten.
  • In mindestens einer Ausführungsform beinhaltet die Framework-Schicht 820, wie in 8 gezeigt, ohne Einschränkung einen Aufgaben-Scheduler 832, einen Konfigurationsverwalter 834, einen Ressourcenverwalter 836 und ein verteiltes Dateisystem 838. In mindestens einer Ausführungsform kann die Framework-Schicht 820 ein Framework beinhalten, um Software 852 der Software-Schicht 830 und/oder eine oder mehrere Anwendungen 842 der Anwendungsschicht 840 zu unterstützen. In mindestens einer Ausführungsform können die Software 852 oder die Anwendung(en) 842 jeweils Web-basierte Dienst-Software oder Anwendungen beinhalten, wie etwa solche, die von Amazon Web Services, Google Cloud und Microsoft Azure bereitgestellt werden. In mindestens einer Ausführungsform kann die Framework-Schicht 820 ohne Einschränkung eine Art von Web-Anwendungs-Framework für kostenlose und Open-Source-Software sein, wie etwa Apache SparkTM (nachstehend „Spark“), welches das verteilte Dateisystem 838 für groß angelegte Datenverarbeitung (z. B. „Big Data“) einsetzen kann. In mindestens einer Ausführungsform kann der Aufgaben-Scheduler 832 einen Spark-Treiber beinhalten, um das Einplanen von Arbeitsbelastungen, die von unterschiedlichen Schichten des Rechenzentrums 800 unterstützt werden, zu erleichtern. In mindestens einer Ausführungsform kann der Konfigurationsverwalter 834 in der Lage sein, unterschiedliche Schichten, wie etwa die Software-Schicht 830 und die Framework-Schicht 820, einschließlich Spark und des verteilten Dateisystems 838, zu konfigurieren, um eine groß angelegte Datenverarbeitung zu unterstützen. In mindestens einer Ausführungsform kann der Ressourcenverwalter 836 dazu in der Lage sein, geclusterte oder gruppierte Rechenressourcen zu verwalten, die zur Unterstützung des verteilten Dateisystems 838 und des Aufgaben-Schedulers 832 abgebildet oder zugewiesen werden. In mindestens einer Ausführungsform können die geclusterten oder gruppierten Rechenressourcen eine gruppierte Rechenressource 814 auf der Rechenzentrum-Infrastrukturschicht 810 beinhalten. In mindestens einer Ausführungsform kann der Ressourcenverwalter 836 mit dem Ressourcenkoordinator 812 koordinieren, um diese abgebildeten oder zugeordneten Rechenressourcen zu verwalten.
  • In mindestens einer Ausführungsform kann Software 852, die in der Software-Schicht 830 beinhaltet ist, Software beinhalten, die mindestens von Teilen von Knoten-CRs 816(1)-816(N), gruppierten Rechenressourcen 814 und/oder dem verteilten Dateisystem 838 der Framework-Schicht 820 verwendet wird. Eine oder mehrere Arten von Software können Software zum Durchsuchen von Internet-Webseiten, Software zum Scannen von E-Mails auf Viren, Datenbanksoftware und Software zum Streaming von Videoinhalten beinhalten, ohne darauf beschränkt zu sein.
  • In mindestens einer Ausführungsform kann/können die Anwendung(en) 842, die in der Anwendungsschicht 840 beinhaltet ist/sind, eine oder mehrere Arten von Anwendungen beinhalten, die mindestens von Teilen von Knoten-CRs 816(1)-816(N), gruppierten Rechenressourcen 814 und/oder dem verteilten Dateisystem 838 der Framework-Schicht 820 verwendet werden. Mindestens eine oder mehrere Arten von Anwendungen können, ohne Einschränkung, CUDA-Anwendungen beinhalten.
  • In mindestens einer Ausführungsform kann einer von dem Konfigurationsverwalter 834, dem Ressourcenverwalter 836 und dem Ressourcenorchestrator 812 eine beliebige Anzahl und Art von selbständernden Aktionen basierend auf einer beliebigen Menge und einer beliebigen Art von Daten, die auf beliebige technisch machbare Art und Weise erfasst werden, implementieren. In mindestens einer Ausführungsform können es die selbständernden Aktionen einem Rechenzentrumsbediener des Rechenzentrums 800 ersparen, möglicherweise schlechte Konfigurationsentscheidungen zu treffen, und möglicherweise unterbenutzte und/oder schlecht funktionierende Teile eines Rechenzentrums zu vermeiden.
  • Computerbasierte Systeme
  • Die folgenden Figuren legen ohne Einschränkung beispielhafte computerbasierte Systeme dar, die verwendet werden können, um mindestens eine Ausführungsform zu implementieren.
  • 9 veranschaulicht ein Verarbeitungssystem 900 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Verarbeitungssystem 900 einen oder mehrere Prozessoren 902 und einen oder mehrere Grafikprozessoren 908, und kann ein Einzelprozessor-Desktopsystem, ein Multiprozessor-Arbeitsstationssystem oder ein Serversystem sein, das eine große Anzahl von Prozessoren 902 oder Prozessorkernen 907 aufweist. In mindestens einer Ausführungsform ist das Verarbeitungssystem 900 eine Verarbeitungsplattform, die in eine integrierte Schaltung als Ein-Chip-System (System-on-a-Chip - „SoC“) zur Verwendung in mobilen, tragbaren oder eingebetteten Vorrichtungen integriert ist.
  • In mindestens einer Ausführungsform kann das Verarbeitungssystem 900 eine serverbasierte Spielplattform, eine Spielkonsole, eine Medienkonsole, eine mobile Spielkonsole, eine Handheld-Spielkonsole oder eine Online-Spielkonsole beinhalten oder darin integriert sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 900 ein Mobiltelefon, ein Smartphone, eine Tablet-Rechenvorrichtung oder eine mobile Internet-Vorrichtung. In mindestens einer Ausführungsform kann das Verarbeitungssystem 900 auch eine tragbare Vorrichtung, wie etwa eine tragbare Smart-Watch-Vorrichtung, eine Smart-Eyeware-Vorrichtung, eine Augmented-Reality-Vorrichtung oder eine Virtual-Reality-Vorrichtung beinhalten, mit dieser gekoppelt oder in diese integriert sein. In mindestens einer Ausführungsform ist das Verarbeitungssystem 900 eine Fernseh- oder Set-Top-Box-Vorrichtung, die einen oder mehrere Prozessoren 902 und eine grafische Schnittstelle, die von einem oder mehreren Grafikprozessoren 908 generiert wird, aufweist.
  • In mindestens einer Ausführungsform beinhalten ein oder mehrere Prozessoren 902 jeweils einen oder mehrere Prozessorkerne 907, um Anweisungen zu verarbeiten, die, wenn sie ausgeführt werden, Operationen für System- und Benutzersoftware durchführen. In mindestens einer Ausführungsform ist jeder von einem oder mehreren Prozessorkernen 907 dazu konfiguriert, einen konkreten Anweisungssatz 909 zu verarbeiten. In mindestens einer Ausführungsform kann der Anweisungssatz 909 Complex Instruction Set Computing („CISC“), Reduced Instruction Set Computing („RISC“) oder Rechnen über Very Long Instruction Word („VLIW“) unterstützen. In mindestens einer Ausführungsform können die Prozessorkerne 907 jeweils einen unterschiedlichen Anweisungssatz 909 verarbeiten, der Anweisungen beinhalten kann, um die Emulation anderer Anweisungssätze zu erleichtern. In mindestens einer Ausführungsform kann der Prozessorkern 907 auch andere Verarbeitungsvorrichtungen beinhalten, wie etwa einen digitalen Signalprozessor („DSP“).
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 902 einen Cache-Speicher („Cache“) 904. In mindestens einer Ausführungsform kann der Prozessor 902 einen einzigen internen Cache oder mehrere Levels von internem Cache aufweisen. In mindestens einer Ausführungsform wird der Cache-Speicher von diversen Komponenten des Prozessors 902 gemeinsam genutzt. In mindestens einer Ausführungsform verwendet der Prozessor 902 auch einen externen Cache (z. B. einen Level-3-Cache („L3“)-Cache oder Last Level Cache („LLC“)) (nicht gezeigt), der unter Verwendung bekannter Cache-Kohärenztechniken von den Prozessorkernen 907 gemeinsam genutzt werden kann. In mindestens einer Ausführungsform ist die Registerdatei 906 zusätzlich in dem Prozessor 902 beinhaltet, der unterschiedliche Arten von Registern zum Speichern unterschiedlicher Arten von Daten (z. B. Ganzzahlregister, Gleitkommaregister, Statusregister und ein Anweisungsverweisregister) beinhalten kann. In mindestens einer Ausführungsform kann die Registerdatei 906 universelle Register oder andere Register beinhalten.
  • In mindestens einer Ausführungsform ist/sind ein oder mehrere Prozessor(en) 902 mit einem oder mehreren Schnittstellenbus(sen) 910 gekoppelt, um Kommunikationssignale, wie Adress-, Daten- oder Steuersignale, zwischen dem Prozessor 902 und anderen Komponenten in dem Verarbeitungssystem 900 zu übertragen. In mindestens einer Ausführungsform kann der Schnittstellenbus 910 in einer Ausführungsform ein Prozessorbus sein, wie etwa eine Version eines Direct-Media-lnterface(„DMI“)-Busses. In mindestens einer Ausführungsform ist der Schnittstellenbus 910 nicht auf einen DMI-Bus beschränkt und kann einen oder mehrere Peripheral-Component-Zusammenschaltungsbusse (z. B. „PCI“, PCI Express („PCIe“)), Speicherbusse oder andere Arten von Schnittstellenbussen beinhalten. In mindestens einer Ausführungsform Beinhalten der Prozessor / die Prozessoren 902 eine integrierte Speichersteuerung 916 und einen Plattformsteuerungs-Hub 930 auf. In mindestens einer Ausführungsform unterstützt die Speichersteuerung 916 die Kommunikation zwischen einer Speichervorrichtung und anderen Komponenten des Verarbeitungssystems 900, während der Plattformsteuerungs-Hub (Platform Controller Hub - „PCH“) 930 Verbindungen zu Eingabe-/Ausgabe-Vorrichtungen („E/A“-Vorrichtungen) über einen lokalen E/A-Bus bereitstellt.
  • In mindestens einer Ausführungsform kann die Speichervorrichtung 920 ein dynamischer Direktzugriffsspeicher („DRAM“), ein statischer Direktzugriffsspeicher („SRAM“), ein Flash-Speicher, ein Phasenwechselspeicher oder eine andere Speichervorrichtung mit geeigneter Leistung sein, um als Prozessorspeicher zu dienen. In mindestens einer Ausführungsform kann die Speichervorrichtung 920 als Systemspeicher für das Verarbeitungssystem 900 arbeiten, um Daten 922 und Anweisungen 921 zur Verwendung zu speichern, wenn ein oder mehrere Prozessoren 902 eine Anwendung oder einen Prozess ausführen. In mindestens einer Ausführungsform ist die Speichersteuerung 916 auch mit einem optionalen externen Grafikprozessor 912 gekoppelt, der mit einem oder mehreren Grafikprozessoren 908 in den Prozessoren 902 kommunizieren kann, um Grafik- und Medienoperationen durchzuführen. In mindestens einer Ausführungsform kann eine Anzeigevorrichtung 911 an den (die) Prozessor(en) 902 angeschlossen sein. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 911 eine oder mehrere von einer internen Anzeigevorrichtung, wie etwa in einer mobilen elektronischen Vorrichtung oder einer Laptop-Vorrichtung, oder einer externen Anzeigevorrichtung, die über eine Anzeigeschnittstelle (z. B. DisplayPort usw.) angebunden ist, beinhalten. In mindestens einer Ausführungsform kann die Anzeigevorrichtung 911 eine am Kopf befestigte Anzeige (Head Mounted Display - „HMD“) beinhalten, wie etwa eine stereoskopische Anzeigevorrichtung zur Verwendung bei Virtual-Reality-Anwendungen („VR“-Anwendungen) oder Augmented-Reality-Anwendungen („AR“-Anwendungen).
  • In mindestens einer Ausführungsform ermöglicht der Plattformsteuerungs-Hub 930 den Anschluss von Peripheriegeräten an die Speichervorrichtung 920 und dem Prozessor 902 über einen Hochgeschwindigkeits-E/A-Bus. In mindestens einer Ausführungsform beinhalten die E/A-Peripheriegeräte unter anderem eine Audio-Steuerung 946, eine Netzwerksteuerung 934, eine Firmware-Schnittstelle 928, einen drahtlosen Transceiver 926, Berührungssensoren 925, eine Datenspeichervorrichtung 924 (z. B. Festplattenlaufwerk, Flash-Speicher usw.). In mindestens einer Ausführungsform kann sich die Datenspeichervorrichtung 924 über eine Speicherschnittstelle (z. B. SATA) oder über einen Peripheriebus, wie etwa PCI oder PCIe, verbinden. In mindestens einer Ausführungsform können die Berührungssensoren 925 Berührungsbildschirmsensoren, Drucksensoren oder Fingerabdrucksensoren beinhalten. In mindestens einer Ausführungsform kann der drahtlose Transceiver 926 ein Wi-Fi-Transceiver, ein Bluetooth-Transceiver oder ein Mobilfunk-Transceiver, wie ein 3G-, 4G- oder Long Term Evolution („LTE“)-Transceiver, sein. In mindestens einer Ausführungsform ermöglicht die Firmware-Schnittstelle 928 die Kommunikation mit der System-Firmware und kann zum Beispiel eine einheitliche erweiterbare Firmware-Schnittstelle („UEFI“) sein. In mindestens einer Ausführungsform kann die Netzwerksteuerung 934 eine Netzwerkverbindung mit einem drahtgebundenen Netzwerk ermöglichen. In mindestens einer Ausführungsform ist eine Hochleistungs-Netzwerksteuerung (nicht gezeigt) mit dem Schnittstellenbus 910 gekoppelt. In mindestens einer Ausführungsform ist die Audiosteuerung 946 eine Mehrkanal-Hochdefinitions-Audio-Steuerung. In mindestens einer Ausführungsform beinhaltet das System 900 eine optionale alte E/A-Steuerung 940 zum Koppeln alter Vorrichtungen (z. B. Personal System 2 („PS/2“)) an das Verarbeitungssystem 900. In mindestens einer Ausführungsform kann der Plattformsteuerungs-Hub 930 auch an eine oder mehrere Universal-Serial-Bus-Steuerungen („USB“-Steuerungen) 942 angeschlossen sein, die Eingabevorrichtung an Eingabevorrichtungen, wie Tastatur- und Mauskombinationen 943, eine Kamera 944 oder andere USB-Eingabevorrichtungen anschließen.
  • In mindestens einer Ausführungsform kann eine Instanz der Speichersteuerung 916 und des Plattformsteuerungs-Hubs 930 in einen diskreten externen Grafikprozessor, wie den externen Grafikprozessor 912, integriert sein. In mindestens einer Ausführungsform kann der Plattformsteuerungs-Hub 930 und/oder die Speichersteuerung 916 extern bezüglich eines oder mehrerer Prozessor(en) 902 sein. Beispielsweise kann das Verarbeitungssystem 900 in mindestens einer Ausführungsform eine externe Speichersteuerung 916 und einen Plattformsteuerungs-Hub 930 beinhalten, der als Speichersteuerungs-Hub und Peripheriesteuerungs-Hub innerhalb eines System-Chipsatzes konfiguriert sein kann, der mit dem/den Prozessor(en) 902 kommuniziert.
  • 10 veranschaulicht ein Computersystem 1000 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann das Computersystem 1000 ein System mit zusammengeschalteten Vorrichtungen und Komponenten, ein SOC oder eine Kombination davon sein. In mindestens einer Ausführungsform ist das Computersystem 1000 mit einem Prozessor 1002 ausgestattet, der Ausführungseinheiten zum Ausführen einer Anweisung beinhalten kann. In mindestens einer Ausführungsform kann das Computersystem 1000 ohne Einschränkung eine Komponente, wie den Prozessor 1002 beinhalten, um Ausführungseinheiten einzusetzen, die Logik zur Durchführung von Algorithmen zur Verarbeitung von Daten beinhalten. In mindestens einer Ausführungsform kann das Computersystem 1000 Prozessoren beinhalten, wie etwa die PENTIUM®-Prozessorfamilie, Mikroprozessoren von XeonTM, Itanium®, XScaleTM und/oder StrongARMTM, Intel® Core™ oder Intel® Nervana™, die von der Intel Corporation of Santa Clara, Kalifornien, erhältlich sind, obwohl auch andere Systeme (die PCs mit anderen Mikroprozessoren, Engineering-Workstations, Set-Top-Boxen und dergleichen beinhalten) verwendet werden können. In mindestens einer Ausführungsform kann das Computersystem 1000 eine Version des Betriebssystems WINDOWS ausführen, das bei Microsoft Corporation aus Redmond, Wash., erhältlich ist, obwohl andere Betriebssysteme (beispielsweise UNIX und Linux), eingebettete Software und/oder grafische Benutzeroberflächen ebenfalls verwendet werden können.
  • In mindestens einer Ausführungsform kann das Computersystem 1000 in anderen Vorrichtungen, wie etwa Handheld-Vorrichtungen und eingebetteten Anwendungen, verwendet werden. Einige Beispiele für tragbare Vorrichtungen beinhalten Mobiltelefone, Internetprotokollvorrichtungen, 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, Switches eines Weitverkehrsnetzwerks („WAN“) oder ein beliebiges anderes System, das eine oder mehrere Anweisungen durchführen kann, beinhalten.
  • In mindestens einer Ausführungsform kann das Computersystem 1000 ohne Einschränkung einen Prozessor 1002 beinhalten, der ohne Einschränkung eine oder mehrere Ausführungseinheiten 1008 beinhalten kann, die dazu konfiguriert sein können, ein Compute Unified Device Architecture („CUDA“)-Programm (CUDA® wird von der NVIDIA Corporation in Santa Clara, Kalifornien, entwickelt) auszuführen. In mindestens einer Ausführungsform ist ein CUDA-Programm mindestens ein Abschnitt einer Softwareanwendung, der in einer CUDA-Programmiersprache geschrieben ist. In mindestens einer Ausführungsform ist das Computersystem 1000 ein Desktop- oder Serversystem mit einem einzigen Prozessor. In mindestens einer Ausführungsform kann das Computersystem 1000 ein Mehrprozessorsystem sein. In mindestens einer Ausführungsform kann der Prozessor 1002 ohne Einschränkung einen CISC-Mikroprozessor, einen RISC-Mikroprozessor, einen VLIW-Mikroprozessor, einen Prozessor, der eine Kombination von Anweisungssätzen implementiert, oder eine beliebige andere Prozessoreinheit, wie einen digitalen Signalprozessor, beinhalten. In mindestens einer Ausführungsform kann der Prozessor 1002 an einen Prozessorbus 1010 gekoppelt sein, der Datensignale zwischen dem Prozessor 1002 und anderen Komponenten in dem Computersystem 1000 übertragen kann.
  • In mindestens einer Ausführungsform kann der Prozessor 1002 ohne Einschränkung einen internen Level-1-(„L1“-)Cache-Speicher („Cache“) 1004 beinhalten. In mindestens einer Ausführungsform kann der Prozessor 1002 einen einzigen internen Cache oder mehrere Levels von internem Cache aufweisen. In mindestens einer Ausführungsform kann sich der Cache-Speicher außerhalb des Prozessors 1002 befinden. In mindestens einer Ausführungsform kann der Prozessor 1002 auch eine Kombination von sowohl internen als auch externen Caches beinhalten. In mindestens einer Ausführungsform kann eine Registerbank 1006 unterschiedliche Arten von Daten in verschiedenen Registern speichern, einschließlich ohne Einschränkung Ganzzahlregistern, Gleitkommaregistern, Statusregistern und eines Anweisungszeigerregisters.
  • In mindestens einer Ausführungsform befindet sich die Ausführungseinheit 1008, einschließlich ohne Einschränkung der Logik zum Durchführen von Integer- und Gleitkommaoperationen, ebenfalls in dem Prozessor 1002. Der Prozessor 1002 kann auch Festwertspeicher (Read Only Memory - „ROM“) für Mikrocode („ucode“) beinhalten, der Mikrocode für bestimmte Makroanweisungen speichert. In mindestens einer Ausführungsform kann die Ausführungseinheit 1008 Logik zum Handhaben eines gepackten Anweisungssatzes 1009 beinhalten. In mindestens einer Ausführungsform können durch die Aufnahme des gepackten Anweisungssatzes 1009 in einen Anweisungssatz eines Mehrzweckprozessors 1002 zusammen mit der assoziierten Schaltungsanordnung zum Ausführen von Anweisungen Operationen, die von vielen Multimedia-Anwendungen verwendet werden, unter Verwendung gepackter Daten in einem Mehrzweckprozessor 1002 durchgeführt werden. In mindestens einer Ausführungsform können viele Multimediaanwendungen beschleunigt und effizienter durch das Verwenden der vollen Breite des Datenbusses eines Prozessors zum Durchführen von Operationen an gepackten Daten ausgeführt werden, wodurch die Notwendigkeit beseitigt werden kann, kleinere Dateneinheiten über den Datenbus des Prozessors zu übertragen, um eine oder mehrere Operationen an einem Datenelement nach dem anderen durchzuführen.
  • In mindestens einer Ausführungsform kann die Ausführungseinheit 1008 auch in Mikrocontrollern, eingebetteten Prozessoren, Grafikvorrichtungen, DSPs und andersartigen logischen Schaltungen verwendet werden. In mindestens einer Ausführungsform kann das Computersystem 1000 ohne Einschränkung einen Speicher 1020 beinhalten. In mindestens einer Ausführungsform kann der Speicher 1020 als eine DRAM-Vorrichtung, eine SRAM-Vorrichtung, Flash-Speichervorrichtung oder andere Speichervorrichtung implementiert sein. Der Speicher 1020 kann Anweisungen 1019 und/oder Daten 1021 speichern, die von Datensignalen dargestellt werden, die von dem Prozessor 1002 ausgeführt werden können.
  • In mindestens einer Ausführungsform kann ein Systemlogikchip an den Prozessorbus 1010 und den Speicher 1020 gekoppelt sein. In mindestens einer Ausführungsform kann der Systemlogikchip ohne Einschränkung einen Speichersteuerungs-Hub („MCH“) 1016 beinhalten, und der Prozessor 1002 kann über den Prozessorbus 1010 mit dem MCH 1016 kommunizieren. In mindestens einer Ausführungsform kann der MCH 1016 dem Speicher 1020 einen Speicherpfad 1018 mit hoher Bandbreite für die Anweisungs- und Datenspeicherung sowie für die Speicherung von Grafikbefehlen, Daten und Texturen bereitstellen. In mindestens einer Ausführungsform kann der MCH 1016 Datensignale zwischen dem Prozessor 1002, dem Speicher 1020 und anderen Komponenten in dem Computersystem 1000 leiten und Datensignale zwischen dem Prozessorbus 1010, dem Speicher 1020 und einem System-E/A 1022 überbrücken. In mindestens einer Ausführungsform kann der Systemlogik-Chip einen Grafikanschluss zum Koppeln mit einer Grafiksteuerung bereitstellen. In mindestens einer Ausführungsform kann der MCH 1016 über den Speicherpfad 1018 mit hoher Bandbreite mit dem Speicher 1020 verbunden sein, und die Grafik-/Videokarte 1012 kann über eine AGP-Zusammenschaltung (Accelerated Graphics Port) 1014 mit dem MCH 1016 gekoppelt sein.
  • In mindestens einer Ausführungsform kann das Computersystem 1000 den System-E/A 1022 verwenden, der ein proprietärer Hub-Schnittstellenbus ist, um den MCH 1016 mit dem E/A-Steuerungs-Hub (I/O Controller Hub - „ICH“) 1030 zu koppeln. In mindestens einer Ausführungsform kann der ICH 1030 direkte Verbindungen zu einigen E/A-Vorrichtungen über einen lokalen E/A-Bus bereitstellen. In mindestens einer Ausführungsform kann der lokale E/A-Bus ohne Einschränkung einen Hochgeschwindigkeits-E/A-Bus zum Verbinden von Peripheriegeräten mit dem Speicher 1020, einen Chipsatz und den Prozessor 1002 beinhalten. Beispiele können ohne Einschränkung eine Audiosteuerung 1029, einen Firmware-Hub („Flash-BIOS“) 1028, einen drahtloser Transceiver 1026, einen Datenspeicher 1024, eine alte E/A-Steuerung 1023 mit einer Benutzereingabeschnittstelle 1025 und einer Tastaturschnittstelle, einen seriellen Erweiterungsport 1027, wie USB, und ein Netzwerksteuerung 1034 beinhalten. Der Datenspeicher 1024 kann ein Festplattenlaufwerk, ein Diskettenlaufwerk, eine CD-ROM-Vorrichtung, eine Flash-Speichervorrichtung oder eine andere Massenspeichervorrichtung umfassen.
  • In mindestens einer Ausführungsform veranschaulicht 10 ein System, das zusammengeschaltete Hardware-Vorrichtungen oder „Chips“ beinhaltet. In mindestens einer Ausführungsform kann 10 ein beispielhaftes SoC veranschaulichen. In mindestens einer Ausführungsform können die in 10 veranschaulichten Vorrichtungen mit proprietärer Zusammenschaltung, standardisierter Zusammenschaltung (z. B. PCIe) oder einer Kombination davon zusammengeschaltet sein. In mindestens einer Ausführungsform sind eine oder mehrere Komponenten des Systems 1000 unter Verwendung von Compute-Express-Link-Verbindungen („CXL“-Verbindungen) miteinander verbunden.
  • 11 veranschaulicht ein System 1100 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist das System 1100 eine elektronische Vorrichtung, die einen Prozessor 1110 einsetzt. In mindestens einer Ausführungsform kann das System 1100 beispielsweise und ohne Einschränkung ein Notebook, ein Tower-Server, ein Rack-Server, ein Blade-Server, ein Laptop, ein Desktop, ein Tablet, eine mobile Vorrichtung, ein Telefon, ein eingebetteter Computer oder eine andere geeignete elektronische Vorrichtung sein.
  • In mindestens einer Ausführungsform kann das System 1100 ohne Einschränkung den Prozessor 1110 beinhalten, der mit einer beliebigen Anzahl oder einer beliebigen Art von Komponenten, Peripheriegeräten, Modulen oder Vorrichtungen kommunikativ gekoppelt ist. In mindestens einer Ausführungsform ist der Prozessor 1110 über einen Bus oder eine Schnittstelle gekoppelt, wie etwa einen I2C-Bus, einen System-Management-Bus („SMBus“), einen Low-Pin-Count-Bus („LPC“), eine serielle Peripherieschnittstelle („SPI“), einen High-Definition-Audio-Bus („HDA“), einen Serial-Advance-Technology-Attachment-Bus („SATA“), einen USB-Bus (Versionen 1, 2, 3) oder einen Universal-Asynchronous-Receiver/Transmitter-Bus („UART“). In mindestens einer Ausführungsform veranschaulicht 11 ein System, das zusammengeschaltete Hardware-Vorrichtungen oder „Chips“ beinhaltet. In mindestens einer Ausführungsform kann 11 ein beispielhaftes SoC veranschaulichen. In mindestens einer Ausführungsform können die in 11 veranschaulichten Vorrichtungen mit proprietären Zusammenschaltungen, standardisierten Zusammenschaltungen (z. B. PCIe) oder einer Kombination davon zusammengeschaltet sein. In mindestens einer Ausführungsform sind eine oder mehrere Komponenten der 11 unter Verwendung von CXL-Zwischenverbindungen zusammengeschaltet.
  • In mindestens einer Ausführungsform kann 11 eine Anzeige 1124, einen Touchscreen 1125, ein Touchpad 1130, eine Near Field Communications-Einheit („NFC“) 1145, einen Sensor-Hub 1140, einen Wärmesensor 1146, einen Express-Chipsatz („EC“) 1135, ein Trusted Platform Module („TPM“) 1138, BIOS/Firmware/Flash-Speicher („BIOS, FW Flash“) 1122, ein DSP 1160, eine Solid State Disk („SSD“) oder Festplatte („HDD“) 1120, eine Wireless Local Area Network-Einheit („WLAN“) 1150, eine Bluetooth-Einheit 1152, eine Wireless Wide Area Network-Einheit („WWAN“) 1156, ein Global Positioning System („GPS“) 1155, eine Kamera („USB 3.0-Kamera“) 1154, wie eine USB 3.0-Kamera, oder eine Low Power Double Data Rate-Speichereinheit („LPDDR“)-Speichereinheit („LPDDR3“) 1115, die zum Beispiel in dem LPDDR3-Standard implementiert ist, beinhalten. Diese Komponenten können jeweils auf geeignete Art und Weise implementiert werden.
  • In mindestens einer Ausführungsform können andere Komponenten mit dem Prozessor 1110 über zuvor besprochene Komponenten kommunikativ gekoppelt sein. In mindestens einer Ausführungsform können ein Beschleunigungsmesser 1141, ein Umgebungslichtsensor (Ambient Light Sensor - „ALS“) 1142, ein Kompass 1143 und ein Gyroskop 1144 kommunikativ an den Sensor-Hub 1140 gekoppelt sein. In mindestens einer Ausführungsform können ein Wärmesensor 1139, ein Lüfter 1137, eine Tastatur 1136 und ein Touchpad 1130 kommunikativ mit dem EC 1135 verbunden sein. In mindestens einer Ausführungsform können ein Lautsprecher 1163, ein Kopfhörer 1164 und ein Mikrofon („mic“) 1165 kommunikativ mit einer Audioeinheit („Audio Codec and Class d Amp“) 1162 verbunden sein, die ihrerseits kommunikativ mit dem DSP 1160 gekoppelt sein kann. In mindestens einer Ausführungsform kann die Audioeinheit 1162 beispielsweise und ohne Einschränkung einen Audiocodierer/- decoder („Codec“) und einen Verstärker der Klasse D beinhalten. In mindestens einer Ausführungsform kann eine SIM-Karte („SIM“) 1157 kommunikativ an die WWAN-Einheit 1156 gekoppelt sein. In mindestens einer Ausführungsform können Komponenten, wie etwa die WLAN-Einheit 1150 und die Bluetooth-Einheit 1152, sowie die WWAN-Einheit 1156 in einem Formfaktor der nächsten Generation (Next Generation Form Factor - „NGFF“) implementiert sein.
  • 12 veranschaulicht eine beispielhafte integrierte Schaltung 1200 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die beispielhafte integrierte Schaltung 1200 ein SoC, das unter Verwendung eines oder mehrerer IP-Kerne hergestellt werden kann. In mindestens einer Ausführungsform beinhaltet die integrierte Schaltung 1200 einen oder mehrere Anwendungsprozessor(en) 1205 (z. B. CPUs), mindestens einen Grafikprozessor 1210 und sie kann zusätzlich einen Bildprozessor 1215 und/oder einen Videoprozessor 1220 beinhalten, von denen jeder beliebige ein modularer IP-Kern sein kann. In mindestens einer Ausführungsform beinhaltet die integrierte Schaltung 1200 eine Peripherie- oder Buslogik, einschließlich einer USB-Steuerung 1225, einer UART-Steuerung 1230, einer SPI/SDIO-Steuerung 1235 und einer I2S/I2C-Steuerung 1240. In mindestens einer Ausführungsform kann die integrierte Schaltung 1200 eine Anzeigevorrichtung 1245 beinhalten, die an eine oder mehrere von einer High-Definition-Multimedia-lnterface-(„HDMI“-)Steuerung 1250 und einer Mobile-Industry-Processor-Interface-Anzeigeschnittstelle („MIPI“-Anzeigeschnittstelle) 1255 gekoppelt ist. In mindestens einer Ausführungsform kann die Speicherung durch ein Flash-Speicherteilsystem 1260 bereitgestellt sein, das Flash-Speicher und eine Flash-Speichersteuerung beinhaltet. In mindestens einer Ausführungsform kann eine Speicherschnittstelle über eine Speichersteuerung 1265 für den Zugriff auf SDRAM- oder SRAM-Speichervorrichtungen bereitgestellt sein. In mindestens einer Ausführungsform beinhalten einige integrierte Schaltungen zusätzlich eine eingebettete Sicherheits-Maschine 1270.
  • 13 veranschaulicht ein Rechensystem 1300 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das Rechensystem 1300 ein Verarbeitungsteilsystem 1301 mit einem oder mehreren Prozessor(en) 1302 und einem Systemspeicher 1304, der über einen Zusammenschaltungspfad kommuniziert, der einen Speicher-Hub 1305 beinhalten kann. In mindestens einer Ausführungsform kann der Speicher-Hub 1305 eine getrennte Komponente innerhalb einer Chipsatzkomponente sein oder kann in einen oder mehrere Prozessoren 1302 integriert sein. In mindestens einer Ausführungsform ist der Speicher-Hub 1305 über eine Kommunikationsverbindung 1306 mit einem E/A-Teilsystem 1311 gekoppelt. In mindestens einer Ausführungsform beinhaltet das E/A-Teilsystem 1311 einen E/A-Hub 1307, der es dem Rechensystem 1300 ermöglichen kann, Eingaben von einer oder mehreren Eingabevorrichtung(en) 1308 zu empfangen. In mindestens einer Ausführungsform kann es der E/A-Hub 1307 einer Anzeigesteuerung, die in einem oder mehreren Prozessoren 1302 beinhaltet sein kann, ermöglichen, einer oder mehreren Anzeigevorrichtungen 1310A Ausgaben bereitzustellen. In mindestens einer Ausführungsform können ein oder mehrere Anzeigevorrichtungen 1310A, die mit dem E/A-Hub 1307 gekoppelt sind, eine lokale, interne oder eingebettete Anzeigevorrichtung beinhalten.
  • In mindestens einer Ausführungsform beinhaltet das Verarbeitungsteilsystem 1301 einen oder mehrere Parallelprozessoren 1312, die über einen Bus oder eine andere Kommunikationsverbindung 1313 mit dem Speicher-Hub 1305 gekoppelt sind. In mindestens einer Ausführungsform kann die Kommunikationsverbindung 1313 eine von einer beliebigen Anzahl von auf Standards basierenden Kommunikationsverbindungstechnologien oder -protokollen sein, wie etwa PCIe, aber nicht beschränkt darauf, oder kann eine herstellerspezifische Kommunikationsschnittstelle oder Kommunikationsstruktur sein. In mindestens einer Ausführungsform bilden ein oder mehrere Parallelprozessor(en) 1312 ein rechenfokussiertes Parallel- oder Vektorverarbeitungssystem, das eine große Anzahl von Verarbeitungskernen und/oder Verarbeitungsclustern beinhalten kann, wie etwa einen Prozessor mit vielen integrierten Kernen. In mindestens einer Ausführungsform bilden ein oder mehrere parallele(r) Prozessor(en) 1312 ein Grafikverarbeitungs-Teilsystem, das Pixel an eine oder mehrere über den E/A-Hub 1307 gekoppelte Anzeigevorrichtung(en) 1310A ausgeben kann. In mindestens einer Ausführungsform kann/können ein oder mehrere Parallelprozessor(en) 1312 auch eine Anzeigesteuerung und eine Anzeigeschnittstelle (nicht dargestellt) beinhalten, um eine direkte Verbindung mit einer oder mehreren Anzeigevorrichtung(en) 1310B zu ermöglichen.
  • In mindestens einer Ausführungsform kann eine Systemspeichereinheit 1314 mit dem E/A-Hub 1307 verbunden sein, um einen Speichermechanismus für das Rechensystem 1300 bereitzustellen. In mindestens einer Ausführungsform kann ein E/A-Switch 1316 verwendet werden, um einen Schnittstellenmechanismus bereitzustellen, der Verbindungen zwischen dem E/A-Hub 1307 und anderen Komponenten ermöglicht, wie etwa einem Netzadapter 1318 und/oder einem drahtlosen Netzadapter 1319, die in eine Plattform integriert werden können, sowie verschiedenen anderen Vorrichtungen, die über eine oder mehrere Erweiterungsvorrichtung(en) 1320 hinzugefügt werden können. In mindestens einer Ausführungsform kann der Netzwerkadapter 1318 ein Ethernet-Adapter oder ein anderer kabelgebundener Netzwerkadapter sein. In mindestens einer Ausführungsform kann der drahtlose Netzwerkadapter 1319 eine oder mehrere von einer Wi-Fi-, Bluetooth-, NFC- oder anderen Netzwerkvorrichtung beinhalten, die ein oder mehrere drahtlose Funkvorrichtungen beinhaltet.
  • In mindestens einer Ausführungsform kann das Computersystem 1300 weitere, nicht explizit dargestellte Komponenten beinhalten, einschließlich USB- oder andere Anschlussverbindungen, optische Speicherlaufwerke, Videoaufnahmevorrichtungen und dergleichen, die ebenfalls an den E/A-Hub 1307 angeschlossen werden können. In mindestens einer Ausführungsform können Kommunikationspfade, die verschiedene Komponenten in 13 zusammenschalten, unter Verwendung beliebiger geeigneter Protokolle implementiert sein, wie etwa auf PCI basierte Protokolle (z. B. PCIe) oder andere Bus- oder Punkt-zu-Punkt-Kommunikationsschnittstellen und/oder -protokoll(e), wie etwa NVLink-Hochgeschwindigkeitszusammenschaltung, oder Zusammenschaltungsprotokolle.
  • In mindestens einer Ausführungsform beinhalten ein oder mehrere Parallelprozessoren 1312 Schaltungsanordnungen, die für die Grafik- und Videoverarbeitung optimiert sind, zum Beispiel Videoausgangsschaltungsanordnungen, und bilden eine Grafikverarbeitungseinheit („GPU“). In mindestens einer Ausführungsform beinhalten ein oder mehrere Parallelprozessor(en) 1312 Schaltungsanordnungen, die für eine Allzweckverarbeitung optimiert sind. In mindestens einer Ausführungsform können Komponenten des Rechensystems 1300 mit einem oder mehreren anderen Systemelementen auf einer einzigen integrierten Schaltung integriert sein. Zum Beispiel können in mindestens einer Ausführungsform ein oder mehrere parallele(r) Prozessor(en) 1312, Speicher-Hub 1305, Prozessor(en) 1302 und E/A-Hub 1307 in eine integrierte SoC-Schaltung integriert werden. In mindestens einer Ausführungsform können die Komponenten des Rechensystems 1300 in ein einziges Gehäuse integriert sein, um eine Konfiguration mit einem System in einem Gehäuse (system in package - „SIP“) zu bilden. In mindestens einer Ausführungsform kann mindestens ein Teil der Komponenten des Rechensystems 1300 in ein Multi-Chip-Modul („MCM“) integriert werden, das mit anderen Multi-Chip-Modulen zu einem modularen Rechensystem zusammengeschaltet werden kann. In mindestens einer Ausführungsform werden das E/A-Teilsystem 1311 und die Anzeigevorrichtungen 1310B aus dem Rechensystem 1300 weggelassen.
  • Verarbeitungssysteme
  • Die folgenden Figuren legen ohne Einschränkung beispielhafte Verarbeitungssysteme dar, die verwendet werden können, um mindestens eine Ausführungsform zu implementieren.
  • 14 veranschaulicht eine beschleunigte Verarbeitungseinheit (Accelerated Processing Unit - „APU“) 1400 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird die APU 1400 von der AMD Corporation, Santa Clara, Kalifornien, entwickelt. In mindestens einer Ausführungsform kann die APU 1400 dazu konfiguriert werden, ein Anwendungsprogramm, wie ein CUDA-Programm, ausführt. In mindestens einer Ausführungsform beinhaltet die APU 1400 ohne Einschränkung einen Kernkomplex 1410, einen Grafikkomplex 1440, eine Struktur 1460, E/A-Schnittstellen 1470, Speichersteuerungen 1480, eine Anzeigesteuerung 1492 und eine Multimedia-Engine 1494. In mindestens einer Ausführungsform kann die APU 1400 ohne Einschränkung eine beliebige Anzahl von Kernkomplexen 1410, eine beliebige Anzahl von Grafikkomplexen 1450, eine beliebige Anzahl von Anzeigesteuerungen 1492 und eine beliebige Anzahl von Multimedia-Engines 1494 in einer beliebigen Kombination beinhalten. Zu Erklärungszwecken werden hier mehrere Instanzen gleicher Objekte mit Referenznummern bezeichnet, die das Objekt identifizieren, und mit Klammerzahlen, die die Instanz identifizieren, wo dies erforderlich ist.
  • In mindestens einer Ausführungsform ist der Kernkomplex 1410 eine CPU, ist der Grafikkomplex 1440 eine GPU und ist die APU 1400 eine Verarbeitungseinheit, die ohne Einschränkung 1410 und 1440 auf einem einzigen Chip integriert. In mindestens einer Ausführungsform können dem Kernkomplex 1410 einige Aufgaben zugewiesen werden und können dem Grafikkomplex 1440 andere Aufgaben zugewiesen werden. In mindestens einer Ausführungsform ist der Kernkomplex 1410 konfiguriert, um mit der APU 1400 assoziierte Hauptsteuersoftware, wie etwa ein Betriebssystem, auszuführen. In mindestens einer Ausführungsform ist der Kernkomplex 1410 der Hauptprozessor der APU 1400, der die Operationen der anderen Prozessoren steuert und koordiniert. In mindestens einer Ausführungsform gibt der Kernkomplex 1410 Befehle aus, die den Betrieb des Grafikkomplexes 1440 steuern. In mindestens einer Ausführungsform kann der Kernkomplex 1410 konfiguriert sein, um von dem Host ausführbaren Code, der von dem CUDA-Quellcode abgeleitet ist, auszuführen, und der Grafikkomplex 1440 kann konfiguriert sein, um von der Vorrichtung ausführbaren Code, der von dem CUDA-Quellcode abgeleitet ist, auszuführen.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 1410 ohne Einschränkung die Kerne 1420(1)-1420(4) und einen L3-Cache 1430. In mindestens einer Ausführungsform kann der Kernkomplex 1410 ohne Einschränkung eine beliebige Anzahl von Kernen 1420 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination beinhalten. In mindestens einer Ausführungsform sind die Kerne 1420 konfiguriert, um Anweisungen einer konkreten Anweisungssatzarchitektur (Instruction Set Architecture - „ISA“) auszuführen. In mindestens einer Ausführungsform ist jeder Kern 1420 ein CPU-Kern.
  • In mindestens einer Ausführungsform beinhaltet jeder Kern 1420 ohne Einschränkung eine Abruf-/Decodiereinheit 1422, eine Ganzzahl-Ausführungs-Engine 1424, eine Gleitkomma-Ausführungs-Engine 1426 und einen L2-Cache 1428. In mindestens einer Ausführungsform ruft die Abruf-/Decodiereinheit 1422 Anweisungen ab, decodiert solche Anweisungen, generiert Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahl-Ausführungs-Engine 1424 und die Gleitkomma-Ausführungs-Engine 1426 ab. In mindestens einer Ausführungsform kann die Abruf-/Decodiereinheit 1422 gleichzeitig eine Mikroanweisung an die Ganzzahl-Ausführungs-Engine 1424 und eine weitere Mikroanweisung an die Gleitkomma-Ausführungs-Engine 1426 absenden. In mindestens einer Ausführungsform führt die Ganzzahl-Ausführungs-Engine 1424 ohne Einschränkung Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkomma-Engine 1426 ohne Einschränkung Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abruf-/Decodiereinheit 1422 Mikroanweisungen an eine einzige Ausführungs-Engine aus, die sowohl die Ganzzahl-Ausführungs-Engine 1424 als auch die Gleitkomma-Ausführungs-Engine 1426 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 1420(i), wobei i eine Ganzzahl ist, die eine konkrete Instanz des Kerns 1420 darstellt, auf den im Kern 1420(i) beinhalteten L2-Cache 1428(i) zugreifen. In mindestens einer Ausführungsform ist jeder im Kernkomplex 1420, der in dem Kernkomplex 1410(j) beinhaltet ist, wobei j eine Ganzzahl ist, die eine konkrete Instanz des Kernkomplexes 1410 darstellt, mit anderen Kernen 1420, die in dem Kernkomplex 1410(j) beinhaltet sind, über den L3-Cache 1430(j), der in dem Kernkomplex 1410(j) beinhaltet ist, verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 1410(j) beinhalteten Kerne 1420, wobei j eine Ganzzahl ist, die eine konkrete Instanz des Kernkomplexes 1410 darstellt, auf den gesamten L3-Cache 1430(j), der in dem Kernkomplex 1410(j) beinhaltet ist, zugreifen. In mindestens einer Ausführungsform kann der L3-Cache 1430 ohne Einschränkung eine beliebige Anzahl von Slices beinhalten.
  • In mindestens einer Ausführungsform kann der Grafikkomplex 1440 so konfiguriert werden, dass er Rechenoperationen hochgradig parallel ausführt. In mindestens einer Ausführungsform ist der Grafikkomplex 1440 konfiguriert, um Grafikpipelineoperationen auszuführen, wie beispielsweise Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen, die mit dem Rendern eines Bildes auf einer Anzeige assoziiert sind. In mindestens einer Ausführungsform ist der Grafikkomplex 1440 konfiguriert, um Operationen auszuführen, die sich nicht auf Grafiken beziehen. In mindestens einer Ausführungsform ist der Grafikkomplex 1440 konfiguriert, um sowohl Operationen, die sich auf Grafiken beziehen, als auch Operationen, die sich nicht auf Grafiken beziehen, auszuführen.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1440 ohne Einschränkung eine beliebige Anzahl von Recheneinheiten 1450 und einen L2-Cache 1442. In mindestens einer Ausführungsform nutzen die Recheneinheiten 1450 den L2-Cache 1442 gemeinsam. In mindestens einer Ausführungsform ist der L2-Cache 1442 partitioniert. In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1440 ohne Einschränkung eine beliebige Anzahl von Recheneinheiten 1450 und eine beliebige Anzahl (einschließlich null) und Art von Caches. In mindestens einer Ausführungsform beinhaltet der Grafikkomplex 1440 ohne Einschränkung eine beliebige Menge an dedizierter Grafikhardware.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 1450 ohne Einschränkung eine beliebige Anzahl von SIMD-Einheiten 1452 und einen gemeinsam genutzten Speicher 1454. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 1452 eine SIMD-Architektur und ist konfiguriert, um Operationen parallel durchzuführen. In mindestens einer Ausführungsform kann jede Recheneinheit 1450 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 1450 ausgeführt. In mindestens einer Ausführungsform beinhaltet ein Thread-Block ohne Einschränkung eine beliebige Anzahl von Ausführungs-Threads. In mindestens einer Ausführungsform ist eine Arbeitsgruppe ein Thread-Block. In mindestens einer Ausführungsform führt jede SIMD-Einheit 1452 einen unterschiedlichen 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 einzigen Thread-Block gehört und so konfiguriert ist, dass er einen unterschiedlichen Datensatz auf der Grundlage eines einzigen 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 ein Pfad ein Thread. In mindestens einer Ausführungsform ist ein Arbeitselement ein Thread. In mindestens einer Ausführungsform ist eine Wellenfront ein Warp. In mindestens einer Ausführungsform können sich unterschiedliche Wellenfronten in einem Thread-Block miteinander synchronisieren und über den gemeinsam genutzten Speicher 1454 kommunizieren.
  • In mindestens einer Ausführungsform ist die Struktur 1460 eine Systemverschaltung, die Daten- und Steuerübertragungen über den Kernkomplex 1410, den Grafikkomplex 1440, die E/A-Schnittstellen 1470, die Speichersteuerungen 1480, die Anzeigesteuerung 1492 und die Multimedia-Engine 1494 unterstützt. In mindestens einer Ausführungsform kann die APU 1400 ohne Einschränkung eine beliebige Menge und Art von Systemzusammenschaltung zusätzlich zu oder an Stelle der Struktur 1460 beinhalten, die Daten- und Steuerübertragungen über eine beliebige Anzahl und Art von direkt oder indirekt verbundenen Komponenten ermöglicht, die sich innerhalb oder außerhalb der APU 1400 befinden können. In mindestens einer Ausführungsform repräsentieren die E/A-Schnittstellen 1470 eine beliebige Anzahl und Art von E/A-Schnittstellen (z. B. PCI, PCI-Extended („PCI-X“), PCIe, Gigabit-Ethernet („GBE“), USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit E/A-Schnittstellen 1470 gekoppelt. In mindestens einer Ausführungsform können Peripheriegeräte, die mit den E/A-Schnittstellen 1470 gekoppelt sind, ohne Einschränkung Tastaturen, Mäuse, Drucker, Scanner, Joysticks oder andere Arten von Spielesteuerungen, Medienaufzeichnungsvorrichtungen, externen Speichervorrichtungen, Netzwerkkarten usw. beinhalten.
  • In mindestens einer Ausführungsform zeigt die Anzeigesteuerung AMD92 Bilder auf einer oder mehreren Anzeigevorrichtung(en) an, wie etwa auf einer Flüssigkristallanzeige (Liquid Crystal Display - „LCD“). In mindestens einer Ausführungsform beinhaltet die Multimedia-Engine 240 ohne Einschränkung eine beliebige Menge und Art von Schaltungsanordnungen, die Multimedia betreffen, wie etwa einen Video-Decoder, einen Video-Codierer, einen Bildsignalprozessor usw. In mindestens einer Ausführungsform ermöglichen die Speichersteuerungen 1480 Datenübertragungen zwischen der APU 1400 und einem vereinheitlichten Systemspeicher 1490. In mindestens einer Ausführungsform nutzen der Kernkomplex 1410 und der Grafikkomplex 1440 den vereinheitlichten Systemspeicher 1490 gemeinsam.
  • In mindestens einer Ausführungsform implementiert die APU 1400 ein Speicher-Teilsystem, das ohne Einschränkung eine beliebige Anzahl und einen beliebigen Typ von Speichersteuerungen 1480 und Speichervorrichtungen (z. B. gemeinsamer Speicher 1454) beinhaltet, die einer Komponente gewidmet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die APU 1400 ein Cache-Teilsystem, das ohne Einschränkung einen oder mehrere Cache-Speicher (z. B. L2-Caches 1528, L3-Cache 1430 und L2-Cache 1442) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten reserviert sein können oder von diesen gemeinsam genutzt werden können (z. B. Kerne 1420, Kernkomplex 1410, SIMD-Einheiten 1452, Recheneinheiten 1450 und Grafikkomplex 1440).
  • 15 veranschaulicht eine CPU 1500 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird die CPU 1500 von der AMD Corporation, Santa Clara, Kalifornien, entwickelt. In mindestens einer Ausführungsform kann die CPU 1500 konfiguriert sein, um ein Anwendungsprogramm auszuführen. In mindestens einer Ausführungsform ist die CPU 1500 konfiguriert, um eine Hauptsteuersoftware, wie etwa ein Betriebssystem, auszuführen. In mindestens einer Ausführungsform gibt die CPU 1500 Befehle aus, die den Betrieb einer externen GPU (nicht gezeigt) steuern. In mindestens einer Ausführungsform kann die CPU 1500 konfiguriert sein, um von dem Host ausführbaren Code, der von dem CUDA-Quellcode abgeleitet ist, auszuführen, und kann ein externe GPU konfiguriert sein, um von der Vorrichtung ausführbaren Code, der von dem CUDA-Quellcode abgeleitet ist, auszuführen. In mindestens einer Ausführungsform beinhaltet die CPU 1500 ohne Einschränkung eine beliebige Anzahl von Kernkomplexen 1510, eine Struktur 1560, E/A-Schnittstellen 1570 und Speichersteuerungen 1580.
  • In mindestens einer Ausführungsform beinhaltet der Kernkomplex 1510 ohne Einschränkung die Kerne 1520(1)-1520(4) und einen L3-Cache 1530. In mindestens einer Ausführungsform kann der Kernkomplex 1510 ohne Einschränkung eine beliebige Anzahl von Kernen 1520 und eine beliebige Anzahl und Art von Caches in beliebiger Kombination beinhalten. In mindestens einer Ausführungsform sind die Kerne 1520 konfiguriert, um Anweisungen einer konkreten ISA auszuführen. In mindestens einer Ausführungsform ist jeder Kern 1520 ein CPU-Kern.
  • In mindestens einer Ausführungsform beinhaltet jeder Kern 1520 ohne Einschränkung eine Abruf-/Decodiereinheit 1522, eine Ganzzahl-Ausführungs-Engine 1524, eine Gleitkomma-Ausführungs-Engine 1526 und einen L2-Cache 1528. In mindestens einer Ausführungsform ruft die Abruf-/Decodiereinheit 1522 Anweisungen ab, decodiert solche Anweisungen, generiert Mikrooperationen und sendet separate Mikroanweisungen an die Ganzzahl-Ausführungs-Engine 1524 und die Gleitkomma-Ausführungs-Engine 1526 ab. In mindestens einer Ausführungsform kann die Abruf-/Decodiereinheit 1522 gleichzeitig eine Mikroanweisung an die Ganzzahl-Ausführungs-Engine 1524 und eine weitere Mikroanweisung die Gleitkomma-Ausführungs-Engine 1526 absenden. In mindestens einer Ausführungsform führt die Ganzzahl-Ausführungs-Engine 1524 ohne Einschränkung Ganzzahl- und Speicheroperationen aus. In mindestens einer Ausführungsform führt die Gleitkomma-Engine 1526 ohne Einschränkung Gleitkomma- und Vektoroperationen aus. In mindestens einer Ausführungsform sendet die Abruf-/Decodiereinheit 1522 Mikroanweisungen an eine einzige Ausführungs-Engine aus, die sowohl die Ganzzahl-Ausführungs-Engine 1524 als auch die Gleitkomma-Ausführungs-Engine 1526 ersetzt.
  • In mindestens einer Ausführungsform kann jeder Kern 1520(i), wobei i eine Ganzzahl ist, die eine konkrete Instanz des Kerns 1520 darstellt, auf den im Kern 1520(i) beinhalteten L2-Cache 1528(i) zugreifen. In mindestens einer Ausführungsform ist jeder in dem Kernkomplex 1510(j) beinhaltete Kern 1520, wobei j eine Ganzzahl ist, die eine konkrete Instanz des Kernkomplexes 1510 darstellt, mit anderen Kernen 1520 in dem Kernkomplex 1510(j) über den L3-Cache 1530(j), der in dem Kernkomplex 1510(j) beinhaltet ist, verbunden. In mindestens einer Ausführungsform können die in dem Kernkomplex 1510(j) beinhalteten Kerne 1520, wobei j eine Ganzzahl ist, die eine konkrete Instanz des Kernkomplexes 1510 darstellt, auf den gesamten L3-Cache 1530(j), der in dem Kernkomplex 1510(j) beinhaltet ist, zugreifen. In mindestens einer Ausführungsform kann der L3-Cache 1530 ohne Einschränkung eine beliebige Anzahl von Slices beinhalten.
  • In mindestens einer Ausführungsform ist die Struktur 1560 eine Systemzusammenschaltung, die Daten- und Steuerungsübertragungen über die Kernkomplexe 1510(1)-1510(N) (wobei N eine Ganzzahl größer als null ist), E/A-Schnittstellen 1570 und Speichersteuerungen 1580 unterstützt. In mindestens einer Ausführungsform kann die CPU 1500 ohne Einschränkung eine beliebige Menge und Art von Systemzusammenschaltungen zusätzlich zu oder an Stelle der Struktur 1560 beinhalten, die Daten- und Steuerübertragungen über eine beliebige Anzahl und Art von direkt oder indirekt verbundenen Komponenten unterstützt, die sich innerhalb oder außerhalb der CPU 1500 befinden können. In mindestens einer Ausführungsform stellen die E/A-Schnittstellen 1570 eine beliebige Anzahl und Art von E/A-Schnittstellen dar (z. B. PCI, PCI-X, PCIe, GBE, USB usw.). In mindestens einer Ausführungsform sind verschiedene Arten von Peripheriegeräten mit E/A-Schnittstellen 1570 gekoppelt. In mindestens einer Ausführungsform können Peripheriegeräte, die mit den E/A-Schnittstellen 1570 gekoppelt sind, ohne Einschränkung Anzeigen, Tastaturen, Mäuse, Drucker, Scanner, Joysticks oder andere Arten von Spielesteuerungen, Medienaufzeichnungsvorrichtungen, externe Speichervorrichtungen, Netzwerkkarten usw. beinhalten.
  • In mindestens einer Ausführungsform unterstützen die Speichersteuerungen 1580 Datenübertragungen zwischen der CPU 1500 und einem Systemspeicher 1590. In mindestens einer Ausführungsform nutzen der Kernkomplex 1510 und der Grafikkomplex 1540 den Systemspeicher 1590 gemeinsam. In mindestens einer Ausführungsform implementiert die CPU 1500 ein Speicherteilsystem, das ohne Einschränkung eine beliebige Menge und Art von Speichersteuerungen 1580 und Speichervorrichtungen beinhaltet, die einer Komponente gewidmet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die CPU 1500 ein Cache-Teilsystem, das ohne Einschränkung einen oder mehrere Cache-Speicher (z. B. L2-Caches 1528 und L3-Caches 1530) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten reserviert sein können oder von diesen gemeinsam genutzt werden können (z. B. Kerne 1520 und Kernkomplexe 1510).
  • 16 veranschaulicht ein beispielhaftes Beschleunigerintegrations-Slice 1690 gemäß mindestens einer Ausführungsform. Im hierin verwendeten Sinne umfasst ein „Slice“ einen spezifizierten Abschnitt von Verarbeitungsressourcen der Beschleunigerintegrationsschaltung. In mindestens einer Ausführungsform stellt die Beschleunigerintegrationsschaltung Cache-Verwaltung, Speicherzugriff, Kontextverwaltung und Interrupt-Verwaltungsdienste für mehrere in einem Grafikbeschleunigungsmodul beinhaltene Grafikprozessoren bereit. Die Grafikverarbeitungseinheiten können jeweils eine separate GPU umfassen. Alternativ können die Grafikverarbeitungsmodule unterschiedliche Arten von Grafikverarbeitungsmodulen innerhalb einer GPU umfassen, wie etwa Grafikausführungseinheiten, Medienverarbeitungsmodule (z. B. Video-Encoder/- Decoder), Sampler und Blit-Engines. In mindestens einer Ausführungsform kann das Grafikbeschleunigungsmodul eine GPU mit mehreren Grafikverarbeitungseinheiten sein. In mindestens einer Ausführungsform kann es sich bei den Grafikverarbeitungs-Engines um einzelne GPUs handeln, die in ein gemeinsames Gehäuse, eine Linecard oder einen Chip integriert sind.
  • Ein effektiver Anwendungsadressraum 1682 der Anwendung innerhalb des Systemspeichers 1614 speichert Prozesselemente 1683. In einer Ausführungsform werden Prozesselemente 1683 als Reaktion auf GPU-Aufrufe 1681 von Anwendungen 1680, die auf dem Prozessor 1607 ausgeführt werden, gespeichert. Ein Prozesselement 1683 enthält den Prozesszustand für die entsprechende Anwendung 1680. Ein Arbeitsdeskriptor (Work Descriptor „WD“) 1684, der in dem Prozesselement 1683 enthalten ist, kann eine einzige Aufgabe sein, die von einer Anwendung angefordert wird, oder kann einen Zeiger auf eine Warteschlange von Aufgaben enthalten. In mindestens einer Ausführungsform ist der WD 1684 ein Zeiger auf eine Aufgabenanforderungswarteschlange in effektivem Anwendungsadressraum 1682.
  • Das Grafikbeschleunigungsmodul 1646 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 des Prozesszustands und zum Senden des WD 1684 an das Grafikbeschleunigungsmodul 1646 zum Starten einer Aufgabe in einer virtualisierten Umgebung beinhaltet sein.
  • In mindestens einer Ausführungsform ist ein Programmiermodell für dedizierte Prozesse implementierungsspezifisch. In diesem Modell besitzt ein einziger Prozess das Grafikbeschleunigungsmodul 1646 oder eine einzelne Grafikverarbeitungs-Engine. Da das Grafikbeschleunigungsmodul 1646 einem einzigen Prozess gehört, initialisiert ein Hypervisor die Beschleunigerintegrationsschaltung für eine besitzende Partition, und ein Betriebssystem initialisiert die Beschleunigerintegrationsschaltung für einen besitzenden Prozess, wenn das Grafikbeschleunigungsmodul 1646 zugewiesen ist.
  • Im Betrieb ruft eine WD-Abrufeinheit 1691 in der Beschleunigerintegrations-Slice 1690 den nächsten WD 1684 ab, der eine Angabe der Arbeit beinhaltet, die durch eine oder mehrere Grafikverarbeitungs-Engines des Grafikbeschleunigungsmoduls 1646 durchgeführt werden soll. Daten von dem WD 1684 können in Registern 1645 gespeichert und von der Speichermanagementeinheit („MMU“) 1639, der Unterbrechungsverwaltungsschaltung 1647 und/oder der Kontextverwaltungsschaltung 1648 verwendet werden, wie veranschaulicht. Eine Ausführungsform der MMU 1639 beinhaltet beispielsweise eine Segment-/Seitenlaufschaltungsanordnungen für den Zugriff auf Segment-/Seitentabellen 1686 innerhalb des virtuellen Adressraums 1685 des OS. Die Interruptverwaltungsschaltung 1647 kann von dem Grafikbeschleunigungsmodul 1646 empfangene Interruptereignisse („INT“) 1692 verarbeiten. Beim Durchführen von Grafikoperationen wird eine effektive Adresse 1693, die von einer Grafikverarbeitungs-Engine generiert wird, von der MMU 1639 in eine reale Adresse übersetzt.
  • In einer Ausführungsform wird ein gleicher Satz von Registern 1645 für jede Grafikverarbeitungs-Engine und/oder jedes Grafikbeschleunigungsmodul 1646 dupliziert und kann von einem Hypervisor oder einem Betriebssystem initialisiert werden. Jedes dieser duplizierten Register kann in dem Beschleunigerintegrations-Slice 1690 beinhaltet sein. Beispielhafte Register, die von einem Hypervisor initialisiert werden können, sind in Tabelle 1 aufgeführt. Tabelle 1 - Vom Hypervisor initialisierte Register
    1 Slice-Steuerregister
    2 Real Adresse-(RA-)-Bereichszeiger für geplante Prozesse
    3 Autoritätsmasken-Überschreibungsregister
    4 Interruptvektor-Tabelleneintragsversatz
    5 Interruptvektor-Tabelleneintragslimit
    6 Zustandsregister
    7 Logische Partitions-ID
    8 Reale Adresse-(RA)-Hypervisor-Beschleuniger-Nutzungsdatensatzzeiger
    9 Speicherbeschreibungsregister
  • Beispielhafte Register, die von einem Betriebssystem initialisiert werden können, sind in Tabelle 2 gezeigt. Tabelle 2- Vom Betriebssystem initialisierte Register
    1 Prozess- und Thread-Identifikation
    2 Kontext-Speicher/Wiederherstellungzeiger der effektiven Adresse (EA)
    3 Virtuelle Adresse-(VA-)Beschleuniger-Nutzungsdatensatzzeiger
    4 Speichersegmenttabellenzeiger mit virtueller Adresse (VA)
    5 Autoritätsmaske
    6 Arbeitsdeskriptor
  • In einer Ausführungsform ist jeder WD 1684 für ein konkretes Grafikbeschleunigungsmodul 1646 und/oder eine konkrete Grafikverarbeitungs-Engine spezifisch. Er enthält alle Informationen, die von einer Grafikverarbeitungs-Engine benötigt werden, um Arbeit zu erledigen, oder er kann ein Zeiger auf einen Speicherort sein, an dem eine Anwendung eine Befehlswarteschlange mit zu erledigender Arbeit eingerichtet hat.
  • Die 17A-17B veranschaulichen beispielhafte Grafikprozessoren gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform können beliebige der beispielhaften Grafikprozessoren unter Verwendung eines oder mehrerer IP-Kerne hergestellt sein. Zusätzlich zu dem, was veranschaulicht 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 dienen die beispielhaften Grafikprozessoren zur Verwendung in einem SoC.
  • 17A veranschaulicht einen beispielhaften Grafikprozessor 1710 einer integrierten Schaltung eines SoC, die unter Verwendung eines oder mehrerer IP-Kerne gemäß mindestens einer Ausführungsform hergestellt sein kann. 17B veranschaulicht einen zusätzlichen beispielhaften Grafikprozessor 1740 einer integrierten Schaltung eines SoC, die unter Verwendung eines oder mehrerer IP-Kerne gemäß mindestens einer Ausführungsform hergestellt sein kann. In mindestens einer Ausführungsform ist der Grafikprozessor 1710 der 17A ein Grafikprozessorkern mit niedriger Leistung. In mindestens einer Ausführungsform ist der Grafikprozessor 1740 der 17B ein Grafikprozessorkern mit höherer Rechenleistung. In mindestens einer Ausführungsform kann jeder der Grafikprozessoren 1710, 1740 eine Variante des Grafikprozessors 1210 der 12 sein.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1710 einen Vertexprozessor 1705 und einen oder mehrere Fragmentprozessor(en) 1715A-1715N (z. B. 1715A, 1715B, 1715C, 1715D bis 1715N-1 und 1715N). In mindestens einer Ausführungsform kann der Grafikprozessor 1710 unterschiedliche Shader-Programme über separate Logik ausführen, sodass der Vertexprozessor 1705 zum Ausführen von Operationen für Vertex-Shader-Programme optimiert ist, während ein oder mehrere Fragmentprozessor(en) 1715A-1715N Shading-Operationen für Fragmente (z. B. Pixel) für Fragment- oder Pixel-Shader-Programme ausführen. In mindestens einer Ausführungsform führt der Vertexprozessor 1705 eine Vertexverarbeitungsstufe einer 3D-Grafik-Pipeline durch und generiert Primitive und Vertexdaten. In mindestens einer Ausführungsform verwenden die Fragmentprozessor(en) 1715A-1715N Primitiv- und Vertexdaten, die durch den Vertexprozessor 1705 generiert wurden, um einen Bildspeicher zu produzieren, der auf einer Anzeigevorrichtung angezeigt wird. In mindestens einer Ausführungsform sind die Fragmentprozessor(en) 1715A-1715N zum Ausführen von Fragment-Shader-Programmen optimiert, wie sie in einer OpenGL-API bereitgestellt sind, die zum Durchführen ähnlicher Operationen wie ein Pixel-Shader-Programm verwendet werden können, wie es in einer Direct-3D-API bereitgestellt ist.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1710 zusätzlich eine(n) oder mehrere MMUs 1720A-1720B, Cache(s) 1725A-1725B und Schaltungszusammenschaltung(en) 1730A-1730B. In mindestens einer Ausführungsform stellen eine oder mehrere MMU(s) 1720A-1720B die Abbildung von virtuellen auf physische Adressen für den Grafikprozessor 1710 bereit, einschließlich für den Vertexprozessor 1705 und/oder die Fragmentprozessor(en) 1715A-1715N, der/die auf in Speicher gespeicherte Vertex- oder Bild-/Texturdaten verweisen kann/können, zusätzlich zu den in einem oder mehreren Cache(s) 1725A-1725B gespeicherten Vertex- oder Bild-/Texturdaten. In mindestens einer Ausführungsform können eine oder mehrere MMU(s) 1720A-1720B mit anderen MMUs innerhalb eines Systems synchronisiert werden, einschließlich einer oder mehrerer MMUs, die mit einem oder mehreren Anwendungsprozessor(en) 1205, Bildprozessoren 1215 und/oder Videoprozessoren 1220 der 12 assoziiert sind, sodass jeder Prozessor 1205-1220 an einem gemeinsam genutzten oder einheitlichen virtuellen Speichersystem teilnehmen kann. In mindestens einer Ausführungsform ermöglichen es eine oder mehrere Schaltungszusammenschaltung(en) 1730A-1730B dem Grafikprozessor 1710, entweder über einen internen Bus des SoC oder über eine direkte Verbindung Schnittstellen mit anderen IP-Kernen innerhalb des SoC zu bilden.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1740 eine(n) oder mehrere MMU(s) 1720A-1720B, Caches 1725A-1725B und Schaltungszusammenschaltung(en) 1730A-1730B des Grafikprozessors 1710 der 17A. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1740 einen oder mehrere Shader-Kern(e) 1755A-1755N (z. B. 1755A, 1755B, 1755C, 1755D, 1755E, 1755F bis 1755N-1 und 1755N), was eine vereinheitlichte Shader-Kernarchitektur bereitstellt, bei der ein einziger Kern oder eine einzige Art von 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 der Shader-Kerne variieren. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 1740 einen Zwischenkern-Aufgabenverwalter 1745, der als Thread-Zuteiler fungiert, um Ausführungs-Threads einem oder mehreren Shader-Kernen 1755A-1755N zuzuteilen, sowie eine Kachelungseinheit 1758 zum Beschleunigen von Kachelungsoperationen für das kachelbasierte Rendering, bei dem Rendering-Operationen für eine Szene in dem Bildraum unterteilt werden, um zum Beispiel die lokale räumliche Kohärenz innerhalb einer Szene auszunutzen oder die Verwendung interner Caches zu optimieren.
  • 18A veranschaulicht einen Grafikkern 1800 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Grafikkern 1800 in dem Grafikprozessor 1210 der 12 beinhaltet sein. In mindestens einer Ausführungsform kann der Grafikkern 1800 ein vereinheitlichter Shader-Kern 1755A-1755N wie in 17B sein. In mindestens einer Ausführungsform beinhaltet der Grafikkern 1800 einen gemeinsam genutzten Anweisungszwischenspeicher 1802, eine Textureinheit 1818 und einen Zwischenspeicher/gemeinsam genutzten Speicher 1820, die Ausführungsressourcen innerhalb des Grafikkerns 1800 gemeinsam sind. In mindestens einer Ausführungsform kann der Grafikkern 1800 mehrere Slices 1801A-1801 N oder eine Partition für jeden Kern beinhalten und ein Grafikprozessor kann mehrere Instanzen des Grafikkerns 1800 beinhalten. Die Slices 1801A-1801N können eine Unterstützungslogik beinhalten, die einen lokalen Anweisungs-Cache 1804A-1804N, einen Thread-Planer 1806A-1806N, einen Thread-Zuteiler 1808A-1808N und einen Satz von Registern 1810A-1810N beinhaltet. In mindestens einer Ausführungsform können die Slices 1801A-1801N einen Satz zusätzlicher Funktionseinheiten (Additional Function Units - „AFUs“ 1812A-1812N), Gleitkommaeinheiten (floating-point units - „FPUs“ 1814A-1814N), arithmetischlogischer Einheiten für Integer („ALUs“ 1816A-1816N), Adressberechnungseinheiten (Address Computational Units - „ACUs“ 1813A-1813N), Gleitkommaeinheiten mit doppelter Genauigkeit (Double-Precision Floating-Point Units - „DPFPUs“ 1815A-1815N) und Matrixverarbeitungseinheiten (Matrix Processing Units - „MPUs“ 1817A-1817N) beinhalten.
  • In mindestens einer Ausführungsform können die FPUs 1814A-1814N Gleitkommaoperationen mit einfacher Genauigkeit (32 Bit) und mit halber Genauigkeit (16 Bit) ausführen, während die DPFPUs 1815A-1815N Gleitkommaoperationen mit doppelter Genauigkeit (64 Bit) ausführen. In mindestens einer Ausführungsform können die ALUs 1816A-1816N ganzzahlige Operationen mit variabler Präzision mit einer Genauigkeit von 8-Bit, 16-Bit und 32-Bit ausführen und können für Operationen mit gemischter Präzision konfiguriert sein. In mindestens einer Ausführungsform können die MPUs 1817A-1817N auch für Matrixoperationen mit gemischter Genauigkeit konfiguriert sein, die Gleitkomma- und 8-Bit-Ganzzahloperationen mit halber Genauigkeit beinhalten. In mindestens einer Ausführungsform können die MPUs 1817-1817N eine Reihe von Matrixoperationen durchführen, um CUDA-Programme zu beschleunigen, was die Ermöglichung von Unterstützung für beschleunigte allgemeine Matrix-zu-Matrix-Multiplikation (general matrix to matrix multiplication -„GEMM“) beinhaltet. In mindestens einer Ausführungsform können die AFUs 1812A-1812N zusätzliche logische Operationen ausführen, die nicht durch Gleitkomma- oder Ganzzahleinheiten unterstützt werden, einschließlich trigonometrischer Operationen (z. B. Sinus, Cosinus usw.).
  • 18B veranschaulicht eine Allzweck-Grafikverarbeitungseinheit (General-Purpose Graphics Processing Unit - „GPGPU“) 1830 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die GPGPU 1830 hochparallel und für den Einsatz auf einem Mehrchipmodul geeignet. In mindestens einer Ausführungsform kann die GPGPU 1830 konfiguriert sein, um die Durchführung hochparalleler Rechenoperationen durch ein Array von GPU zu ermöglichen. In mindestens einer Ausführungsform kann die GPGPU 1830 direkt mit anderen Instanzen der GPGPU 1830 verbunden sein, um einen Mehr-GPU-Cluster zu schaffen, um die Ausführungszeit für CUDA-Programme zu verbessern. In mindestens einer Ausführungsform beinhaltet die GPGPU 1830 eine Hostschnittstelle 1832, um eine Verbindung mit einem Hostprozessor zu ermöglichen. In mindestens einer Ausführungsform ist die Host-Schnittstelle 1832 eine PCIe-Schnittstelle. In mindestens einer Ausführungsform kann die Host-Schnittstelle 1832 eine herstellerspezifische Kommunikationsschnittstelle oder Kommunikationsstruktur sein. In mindestens einer Ausführungsform empfängt die GPGPU 1830 Befehle von einem Hostprozessor und verwendet einen globalen Scheduler 1834, um Ausführungsthreads, die diesen Befehlen zugeordnet sind, an einen Satz von Rechenclustern 1836A-1836H zu verteilen. In mindestens einer Ausführungsform teilen sich die Rechencluster 1836A-1836H einen schnellen Pufferspeicher 1838. In mindestens einer Ausführungsform kann der schnelle Pufferspeicher 1838 als ein Zwischenspeicher höherer Ebene für schnelle Pufferspeicher innerhalb der Rechencluster 1836A-1836H dienen.
  • In mindestens einer Ausführungsform beinhaltet die GPGPU 1830 einen Speicher 1844A-1844B, der über einen Satz von Speichersteuerungen 1842A-1842B mit Rechenclustern 1836A-1836H gekoppelt ist. In mindestens einer Ausführungsform kann der Speicher 1844A-1844B verschiedene Arten von Speichervorrichtungen beinhalten, die DRAM oder Grafik-Direktzugriffsspeicher, wie etwa synchronen Grafik-Direktzugriffsspeicher („SGRAM“) beinhalten, der Speicher mit Grafik-Doppeldatenraten („GDDR“) beinhaltet.
  • In mindestens einer Ausführungsform beinhalten die Rechencluster 1836A-1836H jeweils einen Satz von Grafikkernen, wie etwa den Grafikkern 1800 der 18A, der mehrere Arten von Ganzzahl- und Gleitkomma-Logikeinheiten beinhalten kann, die Berechnungsoperationen mit einer Reihe von Genauigkeiten durchführen können, die für Berechnungen in Verbindung mit CUDA-Programmen geeignete beinhalten. Zum Beispiel kann in mindestens einer Ausführungsform mindestens eine Teilmenge von Gleitkommaeinheiten in jedem der Rechencluster 1836A-1836H dazu konfiguriert sein, 16-Bit- oder 32-Bit-Gleitkommaoperationen auszuführen, während eine unterschiedliche Teilmenge von Gleitkommaeinheiten dazu konfiguriert sein können, 64-Bit-Gleitkommaoperationen auszuführen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der GPGPU 1830 so konfiguriert sein, dass sie als Rechencluster arbeiten. Die Rechencluster 1836A -1836H können alle technisch möglichen Kommunikationstechniken für die Synchronisierung und den Datenaustausch einsetzen. In mindestens einer Ausführungsform kommunizieren mehrere Instanzen der GPGPU 1830 über die Hostschnittstelle 1832. In mindestens einer Ausführungsform beinhaltet die GPGPU 1830 einen E/A-Hub 1839, der die GPGPU 1830 mit einer GPU-Verbindung 1840 koppelt, der eine direkte Verbindung zu anderen Instanzen der GPGPU 1830 ermöglicht. In mindestens einer Ausführungsform ist die GPU-Verbindung 1840 an eine dedizierte GPU-zu-GPU-Brücke gekoppelt, welche die Kommunikation und Synchronisation zwischen mehreren Instanzen der GPGPU 1830 ermöglicht. In mindestens einer Ausführungsform ist die GPU-Verbindung 1840 mit einer Hochgeschwindigkeitszusammenschaltung gekoppelt, um Daten an andere GPGPUs 1830 oder Parallelprozessoren zu übertragen und davon zu empfangen. In mindestens einer Ausführungsform befinden sich mehrere Instanzen der GPGPU 1830 in getrennten Datenverarbeitungssystemen und kommunizieren über eine Netzwerkvorrichtung, auf die über die Hostschnittstelle 1832 zugegriffen werden kann. In mindestens einer Ausführungsform kann die GPU-Verbindung 1840 dazu konfiguriert sein, eine Verbindung zu einem Host-Prozessor zusätzlich zu oder alternativ zu der Host-Schnittstelle 1832 zu ermöglichen. In mindestens einer Ausführungsform kann die GPGPU 1830 konfiguriert sein, um ein CUDA-Programm auszuführen.
  • 19A veranschaulicht einen Parallelprozessor 1900 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform können verschiedene Komponenten des Parallelprozessors 1900 unter Verwendung einer oder mehrerer integrierten Schaltungsvorrichtungen implementiert sein, wie etwa programmierbare Prozessoren, anwendungsspezifische integrierte Schaltungen („ASICs“) oder FPGAs.
  • In mindestens einer Ausführungsform beinhaltet der Parallelprozessor 1900 eine Parallelverarbeitungseinheit 1902. In mindestens einer Ausführungsform beinhaltet die Parallelverarbeitungseinheit 1902 eine E/A-Einheit 1904, die die Kommunikation mit anderen Vorrichtungen ermöglicht, einschließlich anderer Instanzen einer Parallelverarbeitungseinheit 1902. In mindestens einer Ausführungsform kann die E/A-Einheit 1904 direkt mit anderen Vorrichtungen verbunden sein. In mindestens einer Ausführungsform ist die E/A-Einheit 1904 über die Verwendung einer Hub- oder Switch-Schnittstelle, wie etwa des Speicher-Hubs 1905, mit anderen Vorrichtungen verbunden. In mindestens einer Ausführungsform bilden Verbindungen zwischen dem Speicher-Hub 1905 und der E/A-Einheit 1904 eine Kommunikationsverbindung. In mindestens einer Ausführungsform ist die E/A-Einheit 1904 mit einer Host-Schnittstelle 1906 und einem Speicher-Koppelfeld 1916 verbunden, wobei die Host-Schnittstelle 1906 Befehle zur Durchführung von Verarbeitungsoperationen und das Speicher-Koppelfeld 1916 Befehle zur Durchführung von Speicheroperationen empfängt.
  • In mindestens einer Ausführungsform kann die Hostschnittstelle 1906, wenn die Hostschnittstelle 1906 einen Befehlspuffer über die E/A-Einheit 1904 empfängt, Arbeitsoperationen anweisen, um diese Befehle an einem Frontend 1908 auszuführen. In mindestens einer Ausführungsform ist das Frontend 1908 mit einem Scheduler 1910 gekoppelt, der so konfiguriert ist, dass er Befehle oder andere Arbeitselemente an ein Verarbeitungsarray 1912 verteilt. In mindestens einer Ausführungsform stellt der Scheduler 1910 sicher, dass das Verarbeitungsarray 1912 richtig konfiguriert ist und sich in einem gültigen Status befindet, bevor Aufgaben an das Verarbeitungsarray 1912 verteilt werden. In mindestens einer Ausführungsform ist der Scheduler 1910 über Firmware-Logik implementiert, die auf einem Mikrocontroller ausgeführt wird. In mindestens einer Ausführungsform ist der Mikrocontroller-implementierte Scheduler 1910 dazu konfigurierbar, komplexe Ablaufsteuerungs- und Arbeitsverteilungsoperationen mit grober und feiner Granularität durchzuführen, was eine schnelle Unterbrechung und Kontextumschaltung von Threads ermöglicht, die auf der Verarbeitungsanordnung 1912 ausgeführt werden. In mindestens einer Ausführungsform kann die Host-Software Arbeitslasten für die Planung auf dem Verarbeitungsarray 1912 über eine von mehreren Grafikverarbeitungs-Doorbells prüfen. In mindestens einer Ausführungsform können die Arbeitslasten dann automatisch durch die Logik des Schedulers 1910 innerhalb eines Mikrocontrollers, der einen Scheduler 1910 beinhaltet, auf das Verarbeitungs-Array 1912 verteilt werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungsarray 1912 bis zu „N“ Cluster beinhalten (z. B. Cluster 1914A, Cluster 1914B bis Cluster 1914N). In mindestens einer Ausführungsform kann jeder Cluster 1914A-1914N des Verarbeitungsarrays 1912 eine große Anzahl gleichzeitiger Threads ausführen. In mindestens einer Ausführungsform kann der Scheduler 1910 den Clustern 1914A - 1914N des Verarbeitungs-Arrays 1912 Arbeit zuweisen, indem er verschiedene Scheduling- und/oder Arbeitsverteilungsalgorithmen verwendet, die je nach der für jeden Programm- oder Berechnungstyp entstehenden Arbeitslast variieren können. In mindestens einer Ausführungsform kann die Planung dynamisch durch den Scheduler 1910 gehandhabt werden oder kann zum Teil durch die Compilerlogik während der Kompilierung der Programmlogik unterstützt werden, die für die Ausführung durch das Verarbeitungsarray 1912 konfiguriert ist. In mindestens einer Ausführungsform können unterschiedliche Cluster 1914A-1914N des Verarbeitungsarrays 1912 zum Verarbeiten unterschiedlicher Arten von Programmen oder zum Durchführen unterschiedlicher Arten von Berechnungen zugeordnet werden.
  • In mindestens einer Ausführungsform kann das Verarbeitungs-Array 1912 so konfiguriert werden, dass es verschiedene Arten von parallelen Verarbeitungsvorgängen durchführt. In mindestens einer Ausführungsform ist das Verarbeitungsarray 1912 konfiguriert, um Allzweck-Parallelrechenoperationen durchzuführen. In mindestens einer Ausführungsform kann das Verarbeitungs-Array 1912 beispielsweise Logik zur Ausführung von Verarbeitungsaufgaben beinhalten, einschließlich Filterung von Video- und/oder Audiodaten, Durchführung von Modellierungsoperationen, einschließlich physische Operationen, und Durchführung von Datentransformationen.
  • In mindestens einer Ausführungsform ist das Verarbeitungs-Array 1912 so konfiguriert, dass es parallele Grafikverarbeitungsoperationen durchführt. In mindestens einer Ausführungsform kann das Verarbeitungsarray 1912 zusätzliche Logik beinhalten, um die Ausführung derartiger Grafikverarbeitungsoperationen zu unterstützen, was Texturabtastlogik, um Texturoperationen durchzuführen, sowie Tessellationslogik und andere Vertex-Verarbeitungslogik beinhaltet, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform kann das Verarbeitungsarray 1912 konfiguriert sein, um grafikverarbeitungsbezogene Shader-Programme auszuführen, wie etwa Vertex-Shader, Tessellation-Shader, Geometrie-Shader und Pixel-Shader, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform kann die Parallelverarbeitungseinheit 1902 Daten aus dem Systemspeicher über die E/A-Einheit 1904 zur Verarbeitung übertragen. In mindestens einer Ausführungsform können während der Verarbeitung übertragene Daten während der Verarbeitung in dem chipinternen Speicher (z. B. Parallelprozessorspeicher 1922) gespeichert und dann in den Systemspeicher zurückgeschrieben werden.
  • In mindestens einer Ausführungsform kann, wenn die Parallelverarbeitungseinheit 1902 verwendet wird, um eine Grafikverarbeitung durchzuführen, der Scheduler 1910 dazu konfiguriert sein, eine Verarbeitungsarbeitslast in ungefähr gleich große Aufgaben aufzuteilen, um bessere eine Verteilung von Grafikverarbeitungsoperationen auf mehrere Cluster 1914A-1914N des Verarbeitungsclusterarrays 1912 zu ermöglichen. In mindestens einer Ausführungsform können Teile des Verarbeitungsarrays 1912 konfiguriert sein, um unterschiedliche Verarbeitungsarten durchzuführen. Zum Beispiel kann in mindestens einer Ausführungsform ein erster Abschnitt dazu konfiguriert sein, Vertex-Shading und Topologiegenerierung durchzuführen, ein zweiter Abschnitt kann dazu konfiguriert sein, Tesselations- und Geometrie-Shading durchzuführen, und ein dritter Abschnitt kann dazu konfiguriert sein, dass er Pixel-Shading oder andere Screenspace-Operationen durchzuführen, 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 1914A-1914N erzeugt wurden, in Puffern gespeichert werden, damit Zwischendaten zwischen den Clustern 1914A-1914N zur weiteren Verarbeitung übertragen werden können.
  • In mindestens einer Ausführungsform kann das Verarbeitungsarray 1912 auszuführende Verarbeitungsaufgaben über den Scheduler 1910 empfangen, der Verarbeitungsaufgaben definierende Befehle von dem Frontend 1908 empfängt. In mindestens einer Ausführungsform können die Verarbeitungsaufgaben Indizes der zu verarbeitenden Daten beinhalten, 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 ausgeführt werden soll). In mindestens einer Ausführungsform kann der Scheduler 1910 dazu konfiguriert sein, den Aufgaben entsprechende Indizes abzurufen oder Indizes von dem Frontend 1908 zu empfangen. In mindestens einer Ausführungsform kann das Frontend 1908 konfiguriert sein, um sicherzustellen, dass das Verarbeitungsarray 1912 in einen gültigen Zustand konfiguriert ist, bevor eine durch eingehende Befehlspuffer (z. B. Stapelpuffer, Push-Puffer usw.) spezifizierte Arbeitslast initiiert wird.
  • In mindestens einer Ausführungsform kann jede von einer oder mehreren Instanzen der Parallelverarbeitungseinheit 1902 mit dem Parallelprozessorspeicher 1922 gekoppelt sein. In mindestens einer Ausführungsform kann auf den Parallelprozessorspeicher 1922 über die Speicherkreuzschiene 1916 zugegriffen werden, die Speicheranforderungen von dem Verarbeitungsarray 1912 sowie von der E/A-Einheit 1904 empfangen kann. In mindestens einer Ausführungsform kann das Speicher-Koppelfeld 1916 über eine Speicherschnittstelle 1918 auf den parallelen Prozessorspeicher 1922 zugreifen. In mindestens einer Ausführungsform kann die Speicherschnittstelle 1918 mehrere Partitionseinheiten beinhalten (z. B. Partitionseinheit 1920A, Partitionseinheit 1920B bis Partitionseinheit 1920N), die jeweils mit einem Abschnitt (z. B. Speichereinheit) des Parallelprozessorspeichers 1922 verbunden sein können. In mindestens einer Ausführungsform ist eine Anzahl von Partitionseinheiten 1920A-1920N dazu konfiguriert, gleich einer Anzahl von Speichereinheiten zu sein, so dass eine erste Partitionseinheit 1920A eine entsprechende erste Speichereinheit 1924A aufweist, eine zweite Partitionseinheit 1920B eine entsprechende Speichereinheit 1924B aufweist und eine N-te Partitionseinheit 1920N eine entsprechende N-te Speichereinheit 1924N aufweist. In mindestens einer Ausführungsform kann die Anzahl der Partitionseinheiten 1920A-1920N nicht gleich der Anzahl der Speichervorrichtungen sein.
  • In mindestens einer Ausführungsform können die Speichereinheiten 1924A-1924N verschiedene Arten von Speichervorrichtungen beinhalten, die DRAM oder Grafik-Direktzugriffsspeicher, wie etwa SGRAM beinhalten, der GDDR-Speicher beinhaltet. In mindestens einer Ausführungsform können die Speichereinheiten 1924A-1924N auch einen übereinander angeordneten 3D-Speicher beinhalten, einschließlich, aber nicht beschränkt auf einen Speicher mit hoher Bandbreite (High Bandwidth Memory („HBM“)). In mindestens einer Ausführungsform können Rendering-Ziele, wie etwa Bildpuffer oder Texturabbildungen, über die Speichereinheiten 1924A-1924N hinweg gespeichert sein, so dass die Partitionseinheiten 1920A-1920N Abschnitte jedes Rendering-Ziels parallel schreiben können, um die verfügbare Bandbreite des Parallelprozessorspeichers 1922 effizient zu nutzen. In mindestens einer Ausführungsform kann eine lokale Instanz des Parallelprozessorspeichers 1922 zugunsten eines vereinheitlichten Speicherentwurfs ausgeschlossen werden, der den Systemspeicher in Verbindung mit dem lokalen Cache-Speicher nutzt.
  • In mindestens einer Ausführungsform kann jeder der Cluster 1914A-1914N des Verarbeitungsclusterarrays 1912 Daten verarbeiten, die in eine der Speichereinheiten 1924A-1924N innerhalb des Parallelprozessorspeichers 1922 geschrieben werden. In mindestens einer Ausführungsform kann das Speicher-Koppelfeld 1916 dazu konfiguriert sein, eine Ausgabe jedes Clusters 1914A-1914N an eine beliebige Partitionseinheit 1920A-1920N oder an einen anderen Cluster 1914A-1914N zu übertragen, der zusätzliche Verarbeitungsoperationen an einer Ausgabe durchführen kann. In mindestens einer Ausführungsform kann jeder Cluster 1914A-1914N mit der Speicherschnittstelle 1918 über das Speicherkoppelfeld 1916 kommunizieren, um von verschiedenen externen Speichervorrichtungen zu lesen oder in diese zu schreiben. In mindestens einer Ausführungsform weist die Speicherkreuzschiene 1916 eine Verbindung mit der Speicherschnittstelle 1918 auf, um mit der E/A-Einheit 1904 zu kommunizieren, sowie eine Verbindung mit einer lokalen Instanz des Parallelprozessorspeichers 1922, was es den Verarbeitungseinheiten innerhalb der unterschiedlichen Cluster 1914A-1914N ermöglicht, mit Systemspeicher oder anderem Speicher zu kommunizieren, der nicht lokal zu der Parallelverarbeitungseinheit 1902 ist. In mindestens einer Ausführungsform kann das Speicher-Koppelfeld 1916 virtuelle Kanäle verwenden, um Verkehrsströme zwischen Clustern 1914A-1914N und Partitionseinheiten 1920A-1920N zu trennen.
  • In mindestens einer Ausführungsform können mehrere Instanzen der Parallelverarbeitungseinheit 1902 auf einer einzigen Add-in-Karte bereitgestellt sein, oder mehrere Add-in-Karten können miteinander zusammengeschaltet sein. In mindestens einer Ausführungsform können unterschiedliche Instanzen der Parallelverarbeitungseinheit 1902 so konfiguriert sein, dass sie zusammenarbeiten, auch wenn die unterschiedlichen Instanzen unterschiedliche Anzahlen von Verarbeitungskernen, unterschiedliche Mengen von lokalem Parallelprozessorspeicher und/oder andere Konfigurationsunterschiede aufweisen. Zum Beispiel können in mindestens einer Ausführungsform einige Instanzen der Parallelverarbeitungseinheit 1902 im Vergleich zu anderen Ausführungen Gleitkommaeinheiten mit höherer Präzision beinhalten. In mindestens einer Ausführungsform können Systeme, die eine oder mehrere Instanzen der Parallelverarbeitungseinheit 1902 oder des Parallelprozessors 1900 enthalten, in einer Vielzahl von Ausführungsformen und Formfaktoren implementiert sein, einschließlich, aber nicht beschränkt auf Desktop-, Laptop- oder Handheld-Personalcomputer, Server, Workstations, Spielkonsolen und/oder eingebettete Systeme.
  • 19B veranschaulicht einen Verarbeitungscluster 1994 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Verarbeitungscluster 1994 in einer Parallelverarbeitungseinheit beinhaltet. In mindestens einer Ausführungsform ist der Verarbeitungscluster 1994 einer der Verarbeitungscluster 1914A-1914N der 19. In mindestens einer Ausführungsform kann der Verarbeitungscluster 1994 so konfiguriert sein, dass er viele Threads parallel ausführt, wobei sich der Begriff „Thread“ eine Instanz eines konkreten Programms betrifft, die an einem konkreten Satz von Eingabedaten ausgeführt wird. In mindestens einer Ausführungsform werden Ausgabetechniken für Single-lnstruction-Multiple-Data(„SIMD“)-Anweisungen 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 Single-lnstruction-Multiple-Thread(„SIMT“)-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 Anweisungen an einen Satz von Verarbeitungs-Engines innerhalb jedes Verarbeitungsclusters 1994 ausgibt.
  • In mindestens einer Ausführungsform kann der Betrieb des Verarbeitungsclusters 1994 über einen Pipelineverwalter 1932 gesteuert werden, der Verarbeitungsaufgaben an SIMT-Parallelprozessoren verteilt. In mindestens einer Ausführungsform empfängt der Pipelineverwalter 1932 Anweisungen von dem Scheduler 1910 der 19 und verwaltet die Ausführung dieser Anweisungen über einen Grafik-Multiprozessor 1934 und/oder eine Textureinheit 1936. In mindestens einer Ausführungsform ist der Grafikmultiprozessor 1934 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 1994 beinhaltet sein. In mindestens einer Ausführungsform können eine oder mehrere Instanzen des Grafikmultiprozessors 1934 innerhalb des Verarbeitungsclusters 1994 beinhaltet sein. In mindestens einer Ausführungsform kann der Grafikmultiprozessor 1934 Daten verarbeiten und eine Datenkreuzschiene 1940 kann verwendet werden, um verarbeitete Daten an eines von mehreren möglichen Zielen zu verteilen, was andere Shader-Einheiten beinhaltet. In mindestens einer Ausführungsform kann der Pipelineverwalter 1932 die Verteilung von verarbeiteten Daten unterstützen, indem er Ziele für zu verteilende verarbeitete Daten über die Datenkreuzschiene 1940 vorgibt.
  • In mindestens einer Ausführungsform kann jeder Grafikmultiprozessor 1934 innerhalb des Verarbeitungsclusters 1994 einen identischen Satz funktioneller Ausführungslogik beinhalten (z. B. arithmetische Logikeinheiten, Lade-/Speichereinheiten („LSUs“) usw.). In mindestens einer Ausführungsform kann die funktionale Ausführungslogik in einer Pipeline dazu konfiguriert sein, neue Anweisungen ausgegeben zu können, bevor vorherige Anweisungen abgeschlossen sind. In mindestens einer Ausführungsform unterstützt die funktionale 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 Funktionseinheiten genutzt werden, um unterschiedliche Operationen auszuführen, und es kann eine beliebige Kombination von Funktionseinheiten vorhanden sein.
  • In mindestens einer Ausführungsform bilden die an den Verarbeitungscluster 1994 ü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 an unterschiedlichen Eingabedaten aus. In mindestens einer Ausführungsform kann jeder Thread innerhalb einer Thread-Gruppe einer unterschiedlichen Verarbeitungs-Engine innerhalb des Grafikmultiprozessors 1934 zugewiesen sein. In mindestens einer Ausführungsform kann eine Thread-Gruppe weniger Threads beinhalten als eine Anzahl von Verarbeitungs-Engines innerhalb des Grafikmultiprozessors 1934. Wenn eine Thread-Gruppe weniger Threads beinhaltet als eine Anzahl von Verarbeitungs-Engines, können in mindestens einer Ausführungsform 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 beinhalten als eine Anzahl von Verarbeitungs-Engines innerhalb des GrafikMultiprozessors 1934. Wenn eine Thread-Gruppe mehr Threads beinhaltet als die Anzahl der Verarbeitungs-Engines in dem Grafik-Multiprozessor 1934, kann die Verarbeitung in mindestens einer Ausführungsform über aufeinanderfolgende Taktzyklen hinweg erfolgen. In mindestens einer Ausführungsform können mehrere Thread-Gruppen nebenläufig auf einem Grafikmultiprozessor 1934 ausgeführt werden.
  • In mindestens einer Ausführungsform beinhaltet der Grafik-Multiprozessor 1934 einen internen Cache-Speicher, um Lade- und Speicheroperationen durchzuführen. In mindestens einer Ausführungsform kann der Grafikmultiprozessor 1934 auf einen internen Zwischenspeicher verzichten und einen schnellen Pufferspeicher (z. B. L1-Zwischenspeicher 1948) innerhalb des Verarbeitungsclusters 1994 verwenden. In mindestens einer Ausführungsform hat jeder Grafik-Multiprozessor 1934 auch Zugriff auf Ebene-2-Caches („L2“-Caches) innerhalb von Partitionseinheiten (z. B. Partitionseinheiten 1920A-1920N der 19A), die von allen Verarbeitungsclustern 1994 gemeinsam genutzt werden und zum Übermitteln von Daten zwischen Threads verwendet werden können. In mindestens einer Ausführungsform kann der Grafik-Multiprozessor 1934 auch auf den globalen Speicher außerhalb des Chips zugreifen, der einen oder mehrere lokale Parallelprozessorspeicher und/oder Systemspeicher beinhalten kann. In mindestens einer Ausführungsform kann jeder Speicher außerhalb der Parallelverarbeitungseinheit 1902 als globaler Speicher verwendet werden. In mindestens einer Ausführungsform beinhaltet der Verarbeitungscluster 1994 mehrere Instanzen des Grafikmultiprozessors 1934, die gemeinsame Anweisungen und Daten gemeinsam nutzen können, die in dem L1-Cache 1948 gespeichert sein können.
  • In mindestens einer Ausführungsform kann jeder Verarbeitungscluster 1994 eine MMU 1945 beinhalten, 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 1945 innerhalb der Speicherschnittstelle 1918 der 19 befinden. In mindestens einer Ausführungsform beinhaltet die MMU 1945 einen Satz von Seitentabelleneinträgen (Page Table Entries - „PTE“), der verwendet wird, um eine virtuelle Adresse zu einer physischen Adresse einer Kachel und optional einem Cache-Zeilenindex abzubilden. In mindestens einer Ausführungsform kann die MMU 1945 Adressübersetzungspuffer (Translation Lookaside Buffers - „TLBs“) oder Caches beinhalten, die sich innerhalb des Grafikmultiprozessors 1934 oder des L1-Caches 1948 oder des Verarbeitungsclusters 1994 befinden können. In mindestens einer Ausführungsform wird eine physische Adresse verarbeitet, um die Oberflächendaten-Zugriffslokalität zu verteilen, um eine effiziente Anforderungsverschachtelung zwischen den Partitionseinheiten zu ermöglichen. In mindestens einer Ausführungsform kann ein Cache-Zeilen-Index verwendet werden, um zu bestimmen, ob eine Anforderung für eine Cache-Zeile ein Treffer (Hit) oder Fehlzugriff (Miss) ist.
  • In mindestens einer Ausführungsform kann der Verarbeitungscluster 1994 so konfiguriert sein, dass jeder Grafikmultiprozessor 1934 mit einer Textureinheit 1936 gekoppelt ist, um Texturabbildungsoperationen durchzuführen, z. B. Bestimmen von Texturmusterpositionen, Lesen von Texturdaten und Filtern von Texturdaten. In mindestens einer Ausführungsform werden die Texturdaten aus einem internen Textur-L1-Cache (nicht gezeigt) oder aus einem L1-Cache innerhalb des Grafikmultiprozessors 1934 gelesen und je nach Bedarf aus einem L2-Cache, dem lokalen Parallelprozessorspeicher oder dem Systemspeicher abgerufen. In mindestens einer Ausführungsform gibt jeder Grafikmultiprozessor 1934 eine verarbeitete Aufgabe an die Datenkreuzschiene 1940 aus, um die verarbeitete Aufgabe einem anderen Verarbeitungscluster 1994 zur weiteren Verarbeitung bereitzustellen oder um die verarbeitete Aufgabe in einem L2-Cache, einem lokalen Parallelprozessorspeicher oder einem Systemspeicher über die Speicherkreuzschiene 1916 zu speichern. In mindestens einer Ausführungsform ist eine Vorab-Rasteroperationseinheit (Pre-Raster Operations Unit - „PreROP“) 1942 so konfiguriert, dass sie Daten von dem Grafik-Multiprozessor 1934 empfängt und die Daten an ROP-Einheiten leitet, die sich in den hierin beschriebenen Partitionseinheiten befinden können (z. B. Partitionseinheiten 1920A-1920N der 19). In mindestens einer Ausführungsform kann PreROP 1942 Optimierungen für die Farbmischung durchführen, Pixelfarbdaten organisieren und Adressübersetzungen durchführen.
  • 19C veranschaulicht einen Grafikmultiprozessor 1996 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist der Grafikmultiprozessor 1996 der Grafikmultiprozessor 1934 der 19B. In mindestens einer Ausführungsform ist der Grafik-Multiprozessor 1996 mit dem Pipelineverwalter 1932 des Verarbeitungsclusters 1994 gekoppelt. In mindestens einer Ausführungsform weist der Grafikmultiprozessor 1996 eine Ausführungspipeline auf, die einen Anweisungs-Cache 1952, eine Anweisungseinheit 1954, eine Adressabbildungseinheit 1956, eine Registerbank 1958, einen oder mehrere GPGPU-Kerne 1962 und eine oder mehrere LSUs 1966 beinhaltet, ohne darauf beschränkt zu sein. Die GPGPU-Kerne 1962 und die LSUs 1966 sind über eine Speicher- und Cache-Zusammenschaltung 1968 mit dem Cache-Speicher 1972 und dem gemeinsam genutzten Speicher 1970 gekoppelt.
  • In mindestens einer Ausführungsform empfängt der Anweisungszwischenspeicher 1952 einen Strom von Anweisungen zur Ausführung von dem Pipelineverwalter 1932. In mindestens einer Ausführungsform werden die Anweisungen in dem Anweisungscache 1952 zwischengespeichert und von der Anweisungseinheit 1954 zur Ausführung weitergeleitet. In mindestens einer Ausführungsform kann die Anweisungseinheit 1954 Anweisungen als Thread-Gruppen (z. B. Warps) versenden, wobei jeder Thread der Thread-Gruppe einer unterschiedlichen Ausführungseinheit innerhalb der GPGPU-Kerne 1962 zugewiesen ist. In mindestens einer Ausführungsform kann eine Anweisung auf einen lokalen, gemeinsam genutzten oder globalen Adressraum zugreifen, indem sie eine Adresse innerhalb eines einheitlichen Adressraums angibt. In mindestens einer Ausführungsform kann die Adressabbildungseinheit 1956 verwendet werden, um Adressen in einem vereinheitlichten Adressraum in eine eindeutige Speicheradresse zu übersetzen, auf die von den LSUs 1966 zugegriffen werden kann.
  • In mindestens einer Ausführungsform stellt die Registerbank 1958 einen Satz von Registern für funktionelle Einheiten des Grafikmultiprozessors 1996 bereit. In mindestens einer Ausführungsform stellt die Registerbank 1958 einen temporären Datenspeicher für Operanden bereit, die mit Datenpfaden von funktionellen Einheiten (z. B. GPGPU-Kernen 1962, LSUs 1966) des Grafikmultiprozessors 1996 verbunden sind. In mindestens einer Ausführungsform ist die Registerdatei 1958 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein eigener Abschnitt der Registerdatei 1958 zugewiesen wird. In mindestens einer Ausführungsform ist die Registerbank 1958 auf unterschiedliche Thread-Gruppen aufgeteilt, die durch den Grafikmultiprozessor 1996 ausgeführt werden.
  • In mindestens einer Ausführungsform können die GPGPU-Kerne 1962 jeweils FPUs und/oder ganzzahlige ALUs beinhalten, die zur Ausführung von Anweisungen des Grafikmultiprozessors 1996 verwendet werden. Die GPGPU-Kerne 1962 können eine ähnliche Architektur aufweisen oder sich bezüglich der Architektur unterscheiden. In mindestens einer Ausführungsform beinhaltet ein erster Abschnitt der GPGPU-Kerne 1962 eine FPU mit einfacher Genauigkeit und eine Ganzzahl-ALU, während ein zweiter Abschnitt der GPGPU-Kerne 1962 eine FPU mit doppelter Genauigkeit beinhaltet. In mindestens einer Ausführungsform können FPUs den Standard IEEE 754-2008 für Fließkommaarithmetik implementieren oder Fließkommaarithmetik mit variabler Genauigkeit ermöglichen. In mindestens einer Ausführungsform kann der Grafikmultiprozessor 1996 zusätzlich eine oder mehrere Festfunktions- oder Spezialfunktionseinheiten beinhalten, um spezifische Funktionen, wie etwa Operationen zum Kopieren von Rechtecken oder zur Pixelmischung, durchzuführen. In mindestens einer Ausführungsform können einer oder mehrere der GPGPU-Kerne 1962 auch Fest- oder Spezialfunktionslogik beinhalten.
  • In mindestens einer Ausführungsform beinhalten die GPGPU-Kerne 1962 eine SIMD-Logik, die in der Lage ist, eine einzige Anweisung für mehrere Datensätze auszuführen. In mindestens einer Ausführungsform können GPGPU-Kerne 1962 physisch SIMD4-, SIMD8- und SIMD16-Anweisungen und logisch SIMD1-, SIMD2- und SIMD32-Anweisungen ausführen. In mindestens einer Ausführungsform können SIMD-Anweisungen für GPGPU-Kerne 1962 zur Kompilierzeit durch einen 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 Programms, das für ein SIMT-Ausführungsmodell konfiguriert ist, über eine einzige SIMD-Anweisung ausgeführt werden. Beispielsweise können in mindestens einer Ausführungsform acht SIMT-Threads, die dieselben oder ähnliche Operationen durchführen, parallel über eine einzige SIMD8-Logikeinheit ausgeführt werden.
  • In mindestens einer Ausführungsform ist die Speicher- und Zwischenspeicher-Zusammenschaltung 1968 ein Zusammenschaltungsnetzwerk, das jede funktionelle Einheit des Grafikmultiprozessors 1996 mit der Registerdatei 1958 und mit dem gemeinsam genutzten Speicher 1970 verbindet. In mindestens einer Ausführungsform ist die Speicher- und Cache-Zusammenschaltung 1968 eine Kreuzschienen-Zusammenschaltung, die es der LSU 1966 ermöglicht, Lade- und Speicheroperationen zwischen dem gemeinsam genutzten Speicher 1970 und der Registerbank 1958 zu implementieren. In mindestens einer Ausführungsform kann die Registerdatei 1958 mit der gleichen Frequenz wie die GPGPU-Kerne 1962 arbeiten, so dass die Datenübertragung zwischen den GPGPU-Kernen 1962 und der Registerdatei 1958 eine sehr geringe Latenzzeit aufweist. In mindestens einer Ausführungsform kann der gemeinsam genutzte Speicher 1970 verwendet werden, um die Kommunikation zwischen Threads zu ermöglichen, die auf funktionellen Einheiten innerhalb des Grafikmultiprozessors 1996 ausgeführt werden. In mindestens einer Ausführungsform kann der Cache-Speicher 1972 zum Beispiel als Daten-Cache verwendet werden, um Texturdaten, die zwischen Funktionseinheiten und der Textureinheit 1936 übertragen werden, zwischenzuspeichern. In mindestens einer Ausführungsform kann der gemeinsam genutzte Speicher 1970 auch als programmverwalteter Cache verwendet werden. In mindestens einer Ausführungsform können Threads, die auf GPGPU-Kernen 1962 ausgeführt werden, zusätzlich zu den automatisch zwischengespeicherten Daten, die in dem Cache-Speicher 1972 gespeichert sind, programmatisch Daten in dem gemeinsamen Speicher speichern.
  • In mindestens einer Ausführungsform ist ein Parallelprozessor oder eine GPGPU, wie es hier beschrieben ist, kommunikativ mit Host-/Prozessorkernen gekoppelt, um Grafikoperationen, Operationen des maschinellen Lernens, Musteranalyseoperationen und verschiedene allgemeine GPU (GPGPU)-Funktionen zu beschleunigen. In mindestens einer Ausführungsform kann eine GPU über einen Bus oder eine andere Verbindung (z. B. eine Hochgeschwindigkeitszusammenschaltung, wie PCIe oder NVLink) mit dem Host-Prozessor/den Kernen kommunikativ verbunden sein. In mindestens einer Ausführungsform kann eine GPU in dasselbe Gehäuse oder denselben Chip wie die Kerne integriert sein und mit den Kernen über einen Prozessorbus bzw. eine Verbindung innerhalb des Gehäuses oder des Chips kommunikativ verbunden sein. In mindestens einer Ausführungsform können die Prozessorkerne unabhängig von der Art des Anschlusses eines GPU dem GPU Arbeit in Form von Befehlsfolgen/Anweisungen zuweisen, die in einem WD beinhalten sind. In mindestens einer Ausführungsform verwendet die GPU dann eine spezielle Schaltungsanordnung/Logik zur effizienten Verarbeitung dieser Befehle/Anweisungen.
  • 20 veranschaulicht einen Grafikprozessor 2000 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2000 eine Ringzusammenschaltung 2002, ein Pipeline-Frontend 2004, eine Medien-Engine 2037 und Grafikkerne 2080A-2080N. In mindestens einer Ausführungsform koppelt die Ringzusammenschaltung 2002 den Grafikprozessor 2000 an andere Verarbeitungseinheiten, einschließlich anderer Grafikprozessoren oder eines oder mehrerer Universalprozessorkerne. In mindestens einer Ausführungsform ist der Grafikprozessor 2000 einer von vielen Prozessoren, die in ein Mehrkern-Verarbeitungssystem integriert sind.
  • In mindestens einer Ausführungsform empfängt der Grafikprozessor 2000 Batches von Befehlen über die Ringzusammenschaltung 2002. In mindestens einer Ausführungsform werden eingehende Befehle von einem Befehls-Streamer 2003 in dem Pipeline-Frontend 2004 interpretiert. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2000 skalierbare Ausführungslogik zum Durchführen von 3D-Geometrieverarbeitung und Medienverarbeitung über die Grafikkern(e) 2080A-2080N. In mindestens einer Ausführungsform führt der Befehls-Streamer 2003 der Geometriepipeline 2036 Befehle für 3D-Geometrieverarbeitungsbefehle zu. In mindestens einer Ausführungsform liefert der Command-Streamer 2003 für mindestens einige Medienverarbeitungsbefehle Befehle an ein Video-Frontend 2034, das mit einer Medien-Engine 2037 gekoppelt ist. In mindestens einer Ausführungsform beinhaltet die Medien-Engine 2037 eine Video Quality Engine („VQE“) 2030 für die Video- und Bildnachbearbeitung und eine Multi-Format-Codier-/Decodier-Engine („MFX“) 2033 für die hardwarebeschleunigte Codierung und Decodierung von Mediendaten. In mindestens einer Ausführungsform generieren die Geometrie-Pipeline 2036 und die Medien-Engine 2037 jeweils Ausführungsthreads für Thread-Ausführungsressourcen, die von mindestens einem Grafikkern 2080A bereitgestellt werden.
  • In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2000 skalierbare Thread-Ausführungsressourcen, die modulare Grafikkerne 2080A -2080N (manchmal auch als Core-Slices bezeichnet) aufweisen, von denen jeder mehrere Teilkerne 2050A-550N, 2060A-2060N (manchmal auch Kernteil-Slices bezeichnet) hat. In mindestens einer Ausführungsform kann der Grafikprozessor 2000 eine beliebige Anzahl von Grafikkernen 2080A bis 2080N aufweisen. In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2000 einen Grafikkern 2080A, der mindestens einen ersten Teilkern 2050A und einen zweiten Teilkern 2060A aufweist. In mindestens einer Ausführungsform ist der Grafikprozessor 2000 ein Niedrigleistungsprozessor mit einem einzigen Teilkern (z. B. Teilkern 2050A). In mindestens einer Ausführungsform beinhaltet der Grafikprozessor 2000 mehrere Grafikkerne 2080A-2080N, von denen jeder einen Satz von ersten Teilkernen 2050A-2050N und einen Satz von zweiten Teilkernen 2060A-2060N beinhaltet. In mindestens einer Ausführungsform beinhaltet jeder Teilkern in den ersten Teilkernen 2050A-2050N mindestens einen ersten Satz von Ausführungseinheiten („EUs“) 2052A -2052N und Medien-/Textur- Sampler 2054A-2054N. In mindestens einer Ausführungsform beinhaltet jeder Teilkern in den zweiten Teilkernen 2060A-2060N mindestens einen zweiten Satz von Ausführungseinheiten 2062A-2062N und Samplern 2064A-2064N. In mindestens einer Ausführungsform nutzen die Teilkerne 2050A-2050N, 2060A-2060N jeweils einen Satz von gemeinsam genutzten Ressourcen 2070A-2070N gemeinsam. In mindestens einer Ausführungsform beinhalten die gemeinsamen Ressourcen 2070 einen gemeinsam genutzten Cache-Speicher und eine Pixeloperationslogik.
  • 21 veranschaulicht einen Parallelprozessor 2100 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform kann der Prozessor 2100 ohne Einschränkung Logikschaltungen zum Durchführen von Anweisungen beinhalten. In mindestens einer Ausführungsform kann der Prozessor 2100 Anweisungen ausführen, darunter x86- Anweisungen, ARM- Anweisungen, spezielle Anweisungen für ASICs usw. In mindestens einer Ausführungsform kann der Prozessor 2110 Register zur Speicherung gepackter Daten beinhalten, wie etwa 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-Erweiterungsanweisungen („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 enthalten. In mindestens einer Ausführungsform können die Prozessoren 2110 Anweisungen zur Beschleunigung von CUDA-Programmen ausführen.
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 2100 ein inorder-Frontend („Front-end“) 2101 zum Abrufen von auszuführenden Anweisungen und zur Vorbereitung von Anweisungen, die später in der Prozessor-Pipeline verwendet werden sollen. In mindestens einer Ausführungsform kann das Frontend 2101 mehrere Einheiten beinhalten. In mindestens einer Ausführungsform ruft ein Anweisungsvorababrufer 2126 Anweisungen aus dem Speicher ab und speist die Anweisungen in einen Anweisungsdecoder 2128 ein, der die Anweisungen wiederum decodiert oder interpretiert. In mindestens einer Ausführungsform dekodiert der Anweisungsdecoder 2128 beispielsweise eine empfangene Anweisung in eine oder mehrere Operationen, die als „Mikroanweisungen“ oder „Mikrooperationen“ (auch „Mikro-ops“ oder „uops“ genannt) bezeichnet werden, und führt sie aus. In mindestens einer Ausführungsform zerlegt der Anweisungsdecoder 2128 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 Ablaufverfolgungscache 2130 decodierte µops in programmgeordnete Sequenzen oder Abläufe in einer µop-Warteschlange 2134 zur Ausführung zusammenstellen. Wenn der Ablaufverfolgungscache 2130 auf eine komplexe Anweisung stößt, stellt in mindestens einer Ausführungsform ein Mikrocode-ROM 2132 die für den Abschluss einer Operation notwendigen µops bereit.
  • 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 Betrieb vollständig abzuschließen. In mindestens einer Ausführungsform kann der Anweisungsdecoder 2128 auf den Mikrocode-ROM 2132 zugreifen, um die Anweisung auszuführen, wenn zur Ausführung der Anweisung mehr als vier Mikro-Ops erforderlich sind. In mindestens einer Ausführungsform kann eine Anweisung in eine kleine Anzahl von Mikro-Ops zur Verarbeitung in dem Anweisungsdecoder 2128 decodiert werden. In mindestens einer Ausführungsform kann eine Anweisung in dem Mikrocode-ROM 2132 gespeichert werden, wenn zur Ausführung des Vorgangs eine Anzahl von Mikrooperationen erforderlich ist. In mindestens einer Ausführungsform betrifft der Trace-Cache 2130 auf ein programmierbares Logik-Array („PLA“) als Einstiegspunkt, um einen korrekten Mikroanweisungszeiger für das Lesen von Mikrocode-Sequenzen zur Vervollständigung eines oder mehrerer Anweisungen aus dem Mikrocode-ROM 2132 zu bestimmen. In mindestens einer Ausführungsform kann das Frontend 2101 der Maschine, nachdem das Mikrocode-ROM 2132 die Sequenzierung von Mikrooperationen für eine Anweisung beendet hat, den Abruf von Mikrooperationen aus dem Trace-Cache 2130 wieder aufnehmen.
  • In mindestens einer Ausführungsform kann die Out-of-Order-Ausführungs-Maschine („Out-of-Order-Engine“) 2103 Anweisungen für die Ausführung vorbereiten. In mindestens einer Ausführungsform verfügt die Ausführungs-Engine für nicht ordnungsgemäße Ausführung über eine Reihe von Puffern, um den Fluss der 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 Ausführungs-Engine 2103 beinhaltet unter anderem einen Allokator/Register-Renamer 2140, eine Speicher-uop-Warteschlange 2142, eine Ganzzahl/Gleitkommauop-Warteschlange 2144, einen Speicher-Scheduler 2146, einen schnellen Scheduler 2102, einen langsamen/allgemeinen Gleitkomma-Scheduler („slow/general FP scheduler“) 2104 und einen einfachen Gleitkomma-Scheduler („simple FP scheduler“) 2106. In mindestens einer Ausführungsform werden der schnelle Scheduler 2102, der langsame/allgemeine Gleitkomma-Scheduler 2104 und der einfache Gleitkomma-Scheduler 2106 hierin auch zusammen als „µop-Scheduler 2102, 2104, 2106“ bezeichnet. Der Allokator/Register-Renamer 2140 ordnet Maschinenpuffer und Ressourcen zu, die jeder uop für seine Ausführung benötigt. In mindestens einer Ausführungsform benennt der Allokator/Register-Renamer 2140 logische Register auf Einträge in einer Registerdatei um. In mindestens einer Ausführungsform ordnet der Zuweiser/Registerumbenenner 2140 auch einen Eintrag für jede µop in einer von zwei µop-Warteschlangen zu, und zwar in der Speicher-µop-Warteschlange 2142 für Speicheroperationen und der Integer-/Gleitkomma-pop-Warteschlange 2144 für Nicht-Speicheroperationen, vor dem Speicher-Scheduler 2146 und den µop-Schedulern 2102, 2104, 2106. In mindestens einer Ausführungsform bestimmen die µop-Scheduler 2102, 2104, 2106 auf Grundlage der Bereitschaft ihrer abhängigen Eingaberegister-Operandenquellen und der Verfügbarkeit der Ausführungsressourcen, die µops benötigen, um ihre Operation abzuschließen, wann eine µop zur Ausführung bereit ist. In mindestens einer Ausführungsform kann der schnelle Scheduler 2102 in jeder Hälfte des Haupttaktzyklus einen Zeitplan erstellen, während der langsame/allgemeine Gleitkomma-Scheduler 2104 und der einfache Gleitkomma-Scheduler 2106 einen Zeitplan pro Hauptprozessor-Taktzyklus erstellen können. In mindestens einer Ausführungsform vermitteln die µop-Scheduler 2102, 2104, 2106 Zuteilungsports, um µops zur Ausführung einzuplanen.
  • In mindestens einer Ausführungsform beinhaltet der Ausführungsblock 2111 ohne Einschränkung eine Ganzzahlregisterdatei/ein Bypass-Netzwerk 2108, eine Gleitkommaregisterdatei/ein Bypass-Netzwerk („FP-Registerdatei/ein Bypass-Netzwerk“) 2110, Adressgenerierungseinheiten („AGUs“) 2112 und 2114, schnelle ALUs 2116 und 2118, eine langsame ALU 2120, eine Gleitkomma-ALU („FP“) 2122 und eine Gleitkomma-Bewegungseinheit („FP-Move“) 2124. In mindestens einer Ausführungsform werden die Integerregisterbank/das Umgehungsnetz 2108 und die Gleitkommaregisterbank/das Umgehungsnetz 2110 hierin auch als „Registerbänke 2108, 2110“ bezeichnet. In mindestens einer Ausführungsform werden die AGUSs 2112 und 2114, die schnellen ALUs 2116 und 2118, die langsame ALU 2120, die Gleitkomma-ALU 2122 und die Gleitkomma-Bewegungseinheit 2124 hierin auch als „Ausführungseinheiten 2112, 2114, 2116, 2118, 2120, 2122 und 2124“ bezeichnet. In mindestens einer Ausführungsform kann ein Ausführungsblock ohne Einschränkung eine beliebige Anzahl (einschließlich Null) und Art von Registerdateien, Bypass-Netzwerken, Adressgenerierungseinheiten und Ausführungseinheiten in beliebiger Kombination beinhalten.
  • In mindestens einer Ausführungsform können die Registerdateien 2108, 2110 zwischen den uop-Schedulern 2102, 2104, 2106 und den Ausführungseinheiten 2112, 2114, 2116, 2118, 2120, 2122 und 2124 angeordnet sein. In mindestens einer Ausführungsform führt das Integer-Registerdatei/Umgehungs-Netzwerk 2108 IntegerOperationen durch. In mindestens einer Ausführungsform führt das Gleitkommaregisterdatei/Umgehungs-Netzwerk 2110 Gleitkommaoperationen durch. In mindestens einer Ausführungsform kann jede der Registerdateien 2108, 2110 ohne Einschränkung 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 2108, 2110 Daten miteinander austauschen. In mindestens einer Ausführungsform kann die Integer-Registerdatei/das Bypass-Netzwerk 2108 ohne Einschränkung zwei getrennte Registerdateien beinhalten, eine Registerdatei für Daten niedriger Ordnung mit zweiunddreißig Bit und eine zweite Registerdatei für Daten hoher Ordnung mit zweiunddreißig Bit. In mindestens einer Ausführungsform kann das Gleitkomma-Registerdatei/Umgehungs-Netzwerk 2110 ohne Einschränkung 128 Bit breite Einträge beinhalten, da Gleitkomma-Anweisungen typischerweise Operanden mit einer Breite von 64 bis 128 Bit aufweisen.
  • In mindestens einer Ausführungsform können die Ausführungseinheiten 2112, 2114, 2116, 2118, 2120, 2122, 2124 Anweisungen ausführen. In mindestens einer Ausführungsform speichern die Registerdateien 2108, 2110 Ganzzahl- und Gleitkommadaten-Operandenwerte, die Mikroanweisungen zur Ausführung benötigen. In mindestens einer Ausführungsform kann der Prozessor 2100 ohne Einschränkung eine beliebige Anzahl und Kombination von Ausführungseinheiten 2112, 2114, 2116, 2118, 2120, 2122, 2124 beinhalten. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2122 und die Gleitkomma-Bewegungseinheit 2124 Gleitkomma-, MMX-, SIMD-, AVX- und SSE- oder andere Operationen ausführen. In mindestens einer Ausführungsform kann die Gleitkomma-ALU 2122 ohne Einschränkung einen 64 Bit Mal 64 Bit großen Gleitkommadividierer zum Ausführen von Divisions-, Quadratwurzel- und Rest-Mikro-Ops beinhalten. 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 2116, 2118 übergeben werden. In mindestens einer Ausführungsform können die schnellen ALUS 2116, 2118 schnelle Operationen mit einer effektiven Latenz von einem halben Taktzyklus ausführen. In mindestens einer Ausführungsform gehen die meisten komplexen Integeroperationen an die langsame ALU 2120, da die langsame ALU 2120 ohne Einschränkung Integerausführungs-Hardware für Operationen von dem Typ mit langer Latenz beinhalten kann, wie etwa einen Multiplikator, Verschiebungen, Flag-Logik und Verzweigungsverarbeitung. In mindestens einer Ausführungsform können die Lade-/Speicheroperationen eines Speichers durch die AGUs 2112, 2114 ausgeführt werden. In mindestens einer Ausführungsform können die schnelle ALU 2116, die schnelle ALU 2118 und die langsame ALU 2120 Integeroperationen an 64-Bit-Datenoperanden durchführen. In mindestens einer Ausführungsform können die schnelle ALU 2116, die schnelle ALU 2118 und die langsame ALU 2120 so implementiert werden, dass sie eine Vielzahl von Datenbitgrößen unterstützen, darunter sechzehn, zweiunddreißig, 128, 256, usw. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2122 und die Gleitkomma-Bewegungseinheit 2124 so implementiert werden, dass sie eine Reihe von Operanden mit Bits unterschiedlicher Breite unterstützen. In mindestens einer Ausführungsform können die Gleitkomma-ALU 2122 und die Gleitkomma-Bewegungseinheit 2124 mit 128-Bit breiten gepackten Datenoperanden in Verbindung mit SIMD- und Multimedia-Anweisungen arbeiten.
  • In mindestens einer Ausführungsform leiten die uop-Scheduler 2102, 2104, 2106 abhängige Operationen ein, bevor die Ausführung der übergeordneten Last beendet ist. In mindestens einer Ausführungsform kann der Prozessor 2100, da µops in dem Prozessor 2100 spekulativ geplant und ausgeführt werden können, auch Logik zum Handhaben von Speicherfehlern beinhalten. In mindestens einer Ausführungsform kann es, wenn eine Datenladung in einem Datencache fehlschlägt, abhängige Operationen in der Pipeline geben, die einen Scheduler mit vorübergehend falschen Daten zurückgelassen 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 abgeschlossen werden können. In mindestens einer Ausführungsform können Scheduler und Wiedergabemechanismen mindestens einer Ausführungsform eines Prozessors auch so ausgelegt sein, dass sie Anweisungssequenzen 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 zur Identifizierung von Operanden verwendet werden können. In mindestens einer Ausführungsform können Register solche sein, die von außerhalb eines Prozessors (aus der Sicht eines Programmierers) verwendet werden können. In mindestens einer Ausführungsform können die Register nicht auf einen bestimmten Schaltungstyp beschränkt sein. Vielmehr kann ein Register in mindestens einer Ausführungsform Daten speichern, Daten bereitstellen und hier beschriebene Funktionen ausführen. In mindestens einer Ausführungsform können die hier beschriebenen Register durch Schaltungsanordnungen innerhalb eines Prozessors unter Verwendung einer beliebigen Anzahl unterschiedlicher Techniken implementiert sein, wie etwa 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 werden in Ganzzahlregistern 32-Bit-Ganzzahldaten gespeichert. In mindestens einer Ausführungsform enthält eine Registerdatei auch acht Multimedia-SIMD-Register für gepackte Daten.
  • 22 veranschaulicht einen Parallelprozessor 2200 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet der Prozessor 2200, ohne Einschränkung, einen oder mehrere Prozessorkerne („Kerne“) 2202A -2202N, eine integrierte Speichersteuerung 2214 und einen integrierten Grafikprozessor 2208. In mindestens einer Ausführungsform kann der Prozessor 2200 zusätzliche Kerne beinhalten, bis hin zu und einschließlich des zusätzlichen Prozessorkerns 2202N, der durch gestrichelte Kästchen dargestellt ist. In mindestens einer Ausführungsform beinhaltet jeder der Prozessorkerne 2202A-2202N eine oder mehrere interne Cache-Einheiten 2204A-2204N. In mindestens einer Ausführungsform hat jeder Prozessorkern auch Zugriff auf eine oder mehrere gemeinsam genutzte zwischengespeicherte Einheiten 2206.
  • In mindestens einer Ausführungsform stellen die internen Cache-Einheiten 2204A-2204N und die gemeinsam genutzten Cache-Einheiten 2206 eine Cache-Speicherhierarchie innerhalb des Prozessors 2200 dar. In mindestens einer Ausführungsform können die Cache-Speichereinheiten 2204A -2204N mindestens eine Ebene von Anweisungs- und Datencache in jedem Prozessorkern und eine oder mehrere Ebenen von gemeinsam genutztem Mid-Level-Cache, wie L2, L3, Ebene-4-(„L4“) oder andere Cache-Ebenen, beinhalten, wobei die höchste Cache-Ebene vor dem externen Speicher als LLC klassifiziert ist. In mindestens einer Ausführungsform bewahrt eine Cache-Kohärenzlogik die Kohärenz zwischen den diversen Cache-Einheiten 2206 und 2204A-2204N.
  • In mindestens einer Ausführungsform kann der Prozessor 2200 auch eine Menge von einer oder mehreren Bus-Controller-Einheiten 2216 und einen Systemagentenkern 2210 beinhalten. In mindestens einer Ausführungsform verwalten eine oder mehrere Bus-Steuerungseinheiten 2216 eine Reihe von Peripherie-Bussen, wie einen oder mehrere PCI- oder PCI-Express-Busse. In mindestens einer Ausführungsform stellt der Systemagentenkern 2210 eine Verwaltungsfunktion für diverse Prozessorkomponenten bereit. In mindestens einer Ausführungsform beinhaltet der Systemagentenkern 2210 eine oder mehrere integrierte Speichersteuerungen 2214, um den Zugriff auf diverse externe Speichervorrichtungen (nicht gezeigt) zu verwalten.
  • In mindestens einer Ausführungsform beinhalten einer oder mehrere der Prozessorkerne 2202A-2202N eine Unterstützung für gleichzeitiges Multithreading. In mindestens einer Ausführungsform beinhaltet der Systemagenten-Kern 2210 Komponenten zur Koordinierung und zum Betrieb der Prozessorkerne 2202A -2202N während der Multi-Thread-Verarbeitung. In mindestens einer Ausführungsform kann der Systemagentenkern 2210 zusätzlich eine Leistungssteuereinheit (power control unit - „PCU“) beinhalten, die Logik und Komponenten beinhaltet, um einen oder mehrere Leistungszustände der Prozessorkerne 2202A-2202N und des Grafikprozessors 2208 zu regulieren.
  • In mindestens einer Ausführungsform beinhaltet der Prozessor 2200 zusätzlich einen Grafikprozessor 2208, um Grafikverarbeitungsoperationen durchzuführen. In mindestens einer Ausführungsform ist der Grafikprozessor 2208 mit gemeinsam genutzten Cache-Einheiten 2206 und dem Systemagentenkern 2210 gekoppelt, der eine oder mehrere integrierte Speichersteuerung 2214 beinhaltet. In mindestens einer Ausführungsform beinhaltet der Systemagentenkern 2210 zudem eine Anzeigesteuerung 2211, um die Grafikprozessorausgabe an eine oder mehrere gekoppelte Anzeigen anzusteuern. In mindestens einer Ausführungsform kann die Anzeigesteuerung 2211 auch ein separates Modul sein, das mit dem Grafikprozessor 2208 über mindestens eine Zusammenschaltung gekoppelt ist, oder kann innerhalb des Grafikprozessors 2208 integriert sein.
  • In mindestens einer Ausführungsform wird eine ringbasierte Zusammenschaltungseinheit 2212 verwendet, um interne Komponenten des Prozessors 2200 zu koppeln. In mindestens einer Ausführungsform können eine alternative Zusammenschaltungseinheit, wie etwa eine Punkt-zu-Punkt-Zusammenschaltung, eine geschaltete Zusammenschaltung oder andere Techniken verwendet werden. In mindestens einer Ausführungsform ist der Grafikprozessor 2208 mit der Ringzusammenschaltung 2212 über eine E/A-Verbindung 2213 gekoppelt.
  • In mindestens einer Ausführungsform stellt die E/A-Verbindung 2213 mindestens eine von mehreren Versionen von E/A-Zusammenschaltungen dar, einschließlich einer gehäuseinternen E/A-Zusammenschaltung, welche die Kommunikation zwischen verschiedenen Prozessorkomponenten und einem eingebetteten Hochleistungs-Speichermodul 2218, wie etwa einem eDRAM-Modul, ermöglicht. In mindestens einer Ausführungsform verwenden jeder der Prozessorkerne 2202A-2202N und der Grafikprozessor 2208 eingebettete Speichermodule 2218 als gemeinsame LLC.
  • In mindestens einer Ausführungsform sind die Prozessorkerne 2202A-2202N homogene Kerne, die eine gemeinsame Anweisungssatzarchitektur ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2202A-2202N in Bezug auf die ISA heterogen, wobei ein oder mehrere Prozessorkerne 2202A-2202N einen gemeinsamen Anweisungssatz ausführen, während ein oder mehrere andere Kerne der Prozessorkerne 2202A-22-02N eine Teilmenge eines gemeinsamen Anweisungssatzes oder einen unterschiedlichen Anweisungssatz ausführen. In mindestens einer Ausführungsform sind die Prozessorkerne 2202A-2202N in Bezug auf die Mikroarchitektur heterogen, wobei ein oder mehrere Kerne mit einem relativ höheren Stromverbrauch mit einem oder mehreren Kernen mit einem niedrigeren Stromverbrauch gekoppelt sind. In mindestens einer Ausführungsform kann der Prozessor 2200 auf einem oder mehreren Chips oder als integrierte SoC-Schaltung implementiert sein.
  • 23 veranschaulicht einen Grafikprozessorkern 2300 gemäß mindestens einer der beschriebenen Ausführungsformen. In mindestens einer Ausführungsform ist der Grafikprozessorkern 2300 in einer Grafikkernanordnung vorhanden. In mindestens einer Ausführungsform kann der Grafikprozessorkern 2300, der manchmal auch als Kern-Slice bezeichnet wird, ein oder mehrere Grafikkerne innerhalb eines modularen Grafikprozessors sein. In mindestens einer Ausführungsform ist der Grafikprozessorkern 2300 ein Beispiel für einen Grafikkern-Slice, und ein Grafikprozessor, wie er hier beschrieben ist, kann mehrere Grafikkern-Slices beinhalten, die auf den angestrebten Energie- und Leistungshüllkurven basieren. In mindestens einer Ausführungsform kann jeder Grafikkern 2300 einen festen Funktionsblock 2330 beinhalten, der mit mehreren Teilkernen 2301A-2301F gekoppelt ist, die auch als Unter- bzw. Teil-Slices bezeichnet werden und modulare Blöcke mit Allzweck- und fester Funktionslogik beinhalten.
  • In mindestens einer Ausführungsform beinhaltet der Festfunktionsblock 2330 eine Geometrie-/Festfunktionspipeline 2336, die von allen Teilkernen in dem Grafikprozessor 2300 gemeinsam genutzt werden kann, zum Beispiel in Implementierungen mit Grafikprozessoren mit niedrigerer Rechenleistung und/oder niedrigerer Leistung. In mindestens einer Ausführungsform beinhaltet die Geometrie-/Festfunktionspipeline 2336 eine 3D-Festfunktionspipeline, eine Video-Frontend-Einheit, einen Thread-Spawner und Thread-Dispatcher sowie einen Unified-Return-Puffer-Verwalter, der Unified-Return-Puffer verwaltet.
  • In mindestens einer Ausführungsform beinhaltet der feste Funktionsblock 2330 auch eine Grafik-SoC-Schnittstelle 2337, einen Grafik-Mikrocontroller 2338 und eine Medienpipeline 2339. Die Grafik-SoC-Schnittstelle 2337 stellt eine Schnittstelle zwischen dem Grafikkern 2300 und anderen Prozessorkernen innerhalb einer integrierten SoC-Schaltung bereit. In mindestens einer Ausführungsform ist der Grafik-Mikrocontroller 2338 ein programmierbarer Unterprozessor, der dazu konfiguriert werden kann, verschiedene Funktionen des Grafikprozessors 2300 zu verwalten, einschließlich Thread-Versand, Zeitplanung und Preemption. In mindestens einer Ausführungsform beinhaltet die Medienpipeline 2339 eine Logik zur Erleichterung der Decodierung, Codierung, Vorverarbeitung und/oder Nachverarbeitung von Multimediadaten, einschließlich Bild- und Videodaten. In mindestens einer Ausführungsform implementiert die Medien-Pipeline 2339 Medienoperationen über Anforderungen an die Rechen- oder Abtastlogik innerhalb der Teilkerne 2301-2301 F.
  • In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2337 dem Grafikkern 2300 die Kommunikation mit allgemeinen Anwendungsprozessorkernen (z. B. CPUs) und/oder anderen Komponenten innerhalb eines SoC, einschließlich Elemente der Speicherhierarchie 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 2337 auch die Kommunikation mit Vorrichtungen mit fester Funktion innerhalb eines SoCs ermöglichen, wie etwa Kamera-Bildgebungspipelines, und sie ermöglicht die Nutzung und/oder Implementierung globaler Speicher-Atome, die von Grafikkern 2300 und CPUs innerhalb eines SoCs gemeinsam genutzt werden können. In mindestens einer Ausführungsform kann die SoC-Schnittstelle 2337 auch Energieverwaltungssteuerungen für den Grafikkern 2300 implementieren und eine Schnittstelle zwischen einer Taktdomäne des Grafikkerns 2300 und anderen Taktdomänen innerhalb eines SoCs ermöglichen. In mindestens einer Ausführungsform ermöglicht die SoC-Schnittstelle 2337 den Empfang von Befehlspuffern von einem Befehlsstreamer und einem globalen Thread-Dispatcher, die dazu konfiguriert sind, Befehle und Anweisungen für jeden von einem oder mehreren Grafikkernen innerhalb eines Grafikprozessors bereitzustellen. In mindestens einer Ausführungsform können Befehle und Anweisungen an die Medien-Pipeline 2339 gesendet werden, wenn Medienoperationen durchgeführt werden sollen, oder an eine Geometrie- und Festfunktionspipeline (z. B. die Geometrie- und Festfunktionspipeline 2336, die Geometrie- und Festfunktions-Pipeline 2314), wenn Grafikverarbeitungsoperationen durchgeführt werden sollen.
  • In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2338 dazu konfiguriert sein, verschiedene Planungs- und Verwaltungsaufgaben für den Grafikkern 2300 auszuführen. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2338 die Planung von Grafik- und/oder Rechenaufgaben auf verschiedenen parallelen Grafik-Maschinen innerhalb von Anordnungen 2302A-2302F, 2304A-2304F von Ausführungseinheiten (EU) innerhalb der Teilkerne 2301A-2301 F durchführen. In mindestens einer Ausführungsform kann Host-Software, die auf einem CPU-Kern eines SoC mit Grafikkern 2300 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 beinhalten die Planungsvorgänge die Bestimmung der als Nächstes auszuführenden Arbeitslast, die Übermittlung einer Arbeitslast an einen Befehlsstreamer, das Vorziehen bestehender Arbeitslasten, die auf einer Maschine ausgeführt werden, die Überwachung des Fortschritts einer Arbeitslast und die Benachrichtigung der Host-Software nach Abschluss einer Arbeitslast. In mindestens einer Ausführungsform kann der Grafik-Mikrocontroller 2338 auch stromsparende Zustände oder Leerlaufzustände für den Grafikkern 2300 erleichtern, indem er dem Grafikkern 2300 die Möglichkeit bietet, Register innerhalb des Grafikkerns 2300 über stromsparende Zustandsübergänge unabhängig von einem Betriebssystem und/oder einer Grafiktreibersoftware auf einem System zu speichern und wiederherzustellen.
  • In mindestens einer Ausführungsform kann der Grafikkern 2300 mehr oder weniger als die veranschaulichten Teilkerne 2301A-2301F aufweisen, bis zu N modulare Teilkerne. In mindestens einer Ausführungsform kann der Grafikkern 2300 für jeden Satz von N Teilkernen auch eine gemeinsam genutzte Funktionslogik 2310, einen gemeinsam genutzten Speicher und/oder einen Cache-Speicher 2312, eine Geometrie-/Festfunktionspipeline 2314 sowie eine zusätzliche Festfunktionslogik 2316 beinhalten, um verschiedene Grafik- und Rechenverarbeitungsvorgänge zu beschleunigen. In mindestens einer Ausführungsform kann die gemeinsam genutzte Funktionslogik 2310 logische Einheiten beinhalten (z. B. Sampler, Mathematik und/oder Inter-Thread-Kommunikationslogik), die von jedem der N Teilkerne innerhalb des Grafikkerns 2300 gemeinsam genutzt werden können. Gemeinsamer und/oder Cache-Speicher 2312 kann ein LLC für N Teilkerne 2301A-2301F innerhalb des Grafikkerns 2300 sein und kann auch als gemeinsamer Speicher dienen, auf den mehrere Teilkerne zugreifen können. In mindestens einer Ausführungsform kann die Geometrie-/Festfunktionspipeline 2314 an Stelle der Geometrie-/Festfunktionspipeline 2336 innerhalb des Festfunktionsblocks 2330 vorhanden sein und kann gleiche oder ähnliche Logikeinheiten beinhalten.
  • In mindestens einer Ausführungsform beinhaltet der Grafikkern 2300 eine zusätzliche Festfunktionslogik 2316, die verschiedene Festfunktions-Beschleunigungslogiken zur Verwendung durch den Grafikkern 2300 beinhalten kann. In mindestens einer Ausführungsform beinhaltet die zusätzliche Festfunktionslogik 2316 eine zusätzliche Geometrie-Pipeline für die Verwendung bei der reinen Positionsschattierung. In dem positionsabhängigen Shading gibt es mindestens zwei Geometrie-Pipelines, nämlich eine vollständige Geometrie-Pipeline innerhalb der Geometrie-/Festfunktionspipeline 2316, 2336, und eine Cull-Pipeline, die eine zusätzliche Geometrie-Pipeline ist und in der zusätzlichen Festfunktionslogik 2316 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 eigenen Kontext hat. In mindestens einer Ausführungsform kann das positionsgebundene Shading lange Cull-Läufe von verworfenen Dreiecken verbergen, so dass das Shading bei einigen Ausführungsformen früher abgeschlossen werden kann. Zum Beispiel kann in mindestens einer Ausführungsform die Cull-Pipeline-Logik innerhalb der zusätzlichen Festfunktionslogik 2316 Positions-Shader parallel zu einer Hauptanwendung ausführen und generiert im Allgemeinen kritische Ergebnisse schneller als eine vollständige Pipeline, da eine Cull-Pipeline die Positionsattribute von Scheitelpunkten abruft und schattiert, ohne eine Rasterung und ein Rendering von Pixeln in einen Frame-Buffer durchzuführen. In mindestens einer Ausführungsform kann die Cull-Pipeline die generierten kritischen Ergebnisse verwenden, um die Sichtbarkeitsinformationen für alle Dreiecke zu berechnen, ohne Rücksicht darauf, ob diese Dreiecke aussortiert sind. In mindestens einer Ausführungsform kann die vollständige Pipeline (die in diesem Fall als Wiederholungspipeline bezeichnet werden kann) Sichtbarkeitsinformationen verwenden, um aussortierte 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 2316 auch eine allgemeine Verarbeitungsbeschleunigungslogik, wie etwa eine feste Funktionslogik für die Matrixmultiplikation, zur Beschleunigung von CUDA-Programmen beinhalten.
  • In mindestens einer Ausführungsform beinhaltet jeder Grafikteilkern 2301A-2301F einen Satz von Ausführungsressourcen, die zur Durchführung von Grafik-, Medien- und Rechenoperationen als Reaktion auf Anforderungen von Grafikpipeline-, Medienpipeline- oder Shader-Programmen verwendet werden können. In mindestens einer Ausführungsform beinhaltet die Grafik-Teilkerne 2301A-2301F mehrere EU-Arrays 2302A-2302F, 2304A-2304F, eine Thread-Dispatch- und Inter-Thread-Kommunikationslogik („TD/IC“) 2303A-2303F, einen 3D-Sampler (z. B. Textur) 2305A-2305F, einen Media-Sampler 2306A-2306F, einen Shader-Prozessor 2307A-2307F und einen gemeinsamen lokalen Speicher (SLM) 2308A-2308F. Die EU-Arrays 2302A-2302F, 2304A-2304F beinhalten jeweils mehrere Ausführungseinheiten, bei denen es sich um GPGPUs handelt, die in der Lage sind, Gleitkomma- und Ganzzahl-/Festkomma-Logikoperationen im Dienste einer Grafik-, Medien- oder Rechenoperation durchzuführen, einschließlich Grafik-, Medien- oder Rechenshader-Programmen. In mindestens einer Ausführungsform führt die TD/IC-Logik 2303A-2303F lokale Thread-Versand- und Thread-Steuerungsoperationen für Ausführungseinheiten innerhalb eines Teilkerns durch und erleichtert die Kommunikation zwischen Threads, die auf Ausführungseinheiten eines Teilkerns ausgeführt werden. In mindestens einer Ausführungsform kann der 3D-Abtaster 2305A-2305F Textur- oder andere 3D-Grafikdaten in den Speicher einlesen. In mindestens einer Ausführungsform kann der 3D-Sampler Texturdaten auf der Grundlage eines konfigurierten Abtaststatus und eines mit einer gegebenen Textur verbundenen Texturformats unterschiedlich lesen. In mindestens einer Ausführungsform kann der Media-Abtaster 2306A-2306F ähnliche Lesevorgänge auf der Grundlage eines Typs und Formats durchführen, die mit den Mediendaten verbunden sind. In mindestens einer Ausführungsform kann jeder Grafik-Teilkern 2301A-2301 F abwechselnd einen vereinheitlichten 3D- und Medien-Sampler beinhalten. In mindestens einer Ausführungsform können Threads, die auf Ausführungseinheiten innerhalb jedes der Teilkerne 2301 A-2301 F ausgeführt werden, den gemeinsamen lokalen Speicher 2308A-2308F innerhalb jedes Teilkerns nutzen, um Threads, die innerhalb einer Thread-Gruppe ausgeführt werden, die Ausführung unter Verwendung eines gemeinsamen Pools von On-Chip-Speicher zu ermöglichen.
  • 24 veranschaulicht eine Parallelverarbeitungseinheit („PPU“) 2400 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist die PPU 2400 mit maschinenlesbarem Code konfiguriert, der, wenn er von der PPU 2400 ausgeführt wird, die PPU 2400 veranlasst, einige oder alle der hierin beschriebenen Prozesse und Techniken durchzuführen. In mindestens einer Ausführungsform ist die PPU 2400 ein Multi-Thread-Prozessor, der auf einer oder mehreren integrierten Schaltungsvorrichtungen implementiert ist und der Multithreading als eine Technik zum Verbergen von Latenzzeiten verwendet, die dazu dient, computerlesbare Anweisungen (auch als maschinenlesbare Anweisungen oder einfach Anweisungen bezeichnet) auf mehreren Threads parallel zu verarbeiten. In mindestens einer Ausführungsform betrifft ein Thread einen Ausführungsstrang und ist eine Instanziierung eines Satzes von Anweisungen, die zur Ausführung durch die PPU 2400 konfiguriert sind. In mindestens einer Ausführungsform ist die PPU 2400 eine GPU, die so konfiguriert ist, dass sie eine Grafik-Rendering-Pipeline zur Verarbeitung dreidimensionaler („3D“) Grafikdaten implementiert, um zweidimensionale („2D“) Bilddaten für die Anzeige auf einer Anzeigevorrichtung wie einer LCD-Vorrichtung zu generieren. In mindestens einer Ausführungsform wird die PPU 2400 verwendet, um Berechnungen wie lineare Algebra-Operationen und Operationen des maschinellen Lernens durchzuführen. 24 veranschaulicht ein Beispiel für einen Parallelprozessor, der nur der Veranschaulichung dient und als nicht begrenztes Beispiel für eine Prozessorarchitektur zu verstehen ist, die in mindestens einer Ausführungsform implementiert sein kann.
  • In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2400 dazu konfiguriert, Anwendungen für High Performance Computing („HPC“), Rechenzentren und maschinelles Lernen zu beschleunigen. In mindestens einer Ausführungsform sind eine oder mehrere PPUs 2400 für die Beschleunigung von CUDA-Programmen konfiguriert. In mindestens einer Ausführungsform beinhaltet die PPU 2400 ohne Einschränkung eine Eingabe/Ausgabe-(„E/A“-)Einheit 2406, eine Frontend-Einheit 2410, eine Scheduler-Einheit 2412, eine Arbeitsverteilungseinheit 2414, einen Hub 2416, eine Kreuzschiene (Crossbar - „Xbar“) 2420, einen oder mehrere Universalverarbeitungscluster („GPCs“) 2418 und eine oder mehrere Partitionseinheiten („Speicherpartitionseinheiten“) 2422. In mindestens einer Ausführungsform ist die PPU 2400 mit einem Host-Prozessor oder anderen PPUs 2400 über eine oder mehrere Hochgeschwindigkeits-GPU-Zusammenschaltungen („GPU-Zusammenschaltungen“) 2408 verbunden. In mindestens einer Ausführungsform ist die PPU 2400 über einen Systembus oder eine Verbindung 2402 mit einem Host-Prozessor oder anderen Peripheriegeräten verbunden. In mindestens einer Ausführungsform ist die PPU 2400 mit einem lokalen Speicher verbunden, der eine oder mehrere Speichervorrichtungen („Speicher“) 2404 umfasst. In mindestens einer Ausführungsform beinhalten die Speichervorrichtungen 2404 ohne Einschränkung eine oder mehrere DRAM-Vorrichtungen (Dynamic Random Access Speicher). In mindestens einer Ausführungsform sind eine oder mehrere DRAM-Vorrichtungen als Teilsysteme mit Speicher mit hoher Bandbreite („HBM“) konfiguriert und/oder konfigurierbar, wobei in jeder Vorrichtung mehrere DRAM-Dies gestapelt sind.
  • In mindestens einer Ausführungsform kann sich die Hochgeschwindigkeits-GPU-Zusammenschaltung 2408 auf eine drahtgebundene Mehrspur-Kommunikationsverbindung beziehen, die von Systemen verwendet wird, die skalierbar sind und eine oder mehrere PPUs 2400 in Kombination mit einer oder mehreren CPUs beinhalten, die Cache-Kohärenz zwischen PPUs 2400 und CPUs sowie CPU-Mastering unterstützen. In mindestens einer Ausführungsform werden Daten und/oder Befehle durch die Hochgeschwindigkeits-GPU-Zusammenschaltung 2408 über den Hub 2416 zu/von anderen Einheiten der PPU 2400 übertragen, wie etwa einer/einem oder mehreren Kopier-Engines, Videocodern, Videodecodern, Leistungsverwaltungseinheiten und anderen Komponenten, die in 24 möglicherweise nicht explizit veranschaulicht sind.
  • In mindestens einer Ausführungsform ist die E/A-Einheit 2406 so konfiguriert, dass sie Kommunikation (z. B. Befehle, Daten) von einem Host-Prozessor (in 24 nicht veranschaulicht) über den Systembus 2402 überträgt und empfängt. In mindestens einer Ausführungsform kommuniziert die E/A-Einheit 2406 mit dem Host-Prozessor direkt über den Systembus 2402 oder durch eine oder mehrere Zwischenvorrichtungen wie etwa eine Speicherbrücke. In mindestens einer Ausführungsform kann die E/A-Einheit 2406 über den Systembus 2402 mit einem oder mehreren anderen Prozessoren kommunizieren, wie etwa einer oder mehreren der PPUs 2400. In mindestens einer Ausführungsform implementiert die E/A-Einheit 2406 eine PCIe-Schnittstelle für die Kommunikation über einen PCle-Bus. In mindestens einer Ausführungsform implementiert die E/A-Einheit 2406 Schnittstellen für die Kommunikation mit externen Vorrichtungen.
  • In mindestens einer Ausführungsform decodiert die E/A-Einheit 2406 über den Systembus 2402 empfangene Pakete. In mindestens einer Ausführungsform stellen mindestens einige Pakete Befehle dar, die dazu konfiguriert sind, die PPU 2400 zu veranlassen, verschiedene Operationen durchzuführen. In mindestens einer Ausführungsform überträgt die E/A-Einheit 2406 decodierte Befehle an verschiedene andere Einheiten der PPU 2400, wie durch Befehle vorgegeben. In mindestens einer Ausführungsform werden Befehle an die Frontend-Einheit 2410 übertragen und/oder an den Hub 2416 oder andere Einheiten der PPU 2400 übertragen, wie etwa eine oder mehrere Kopier-Engines, einen Videocodierer, einen Videodecoder, eine Leistungsverwaltungseinheit usw. (in 24 nicht explizit veranschaulicht). In mindestens einer Ausführungsform ist die E/A-Einheit 2406 so konfiguriert, dass sie Kommunikation zwischen und unter verschiedenen logischen Einheiten der PPU 2400 routet.
  • In mindestens einer Ausführungsform codiert ein von dem Host-Prozessor ausgeführtes Programm einen Befehlsstrom in einem Puffer, der der PPU 2400 Arbeitslasten zur Verarbeitung bereitstellt. In mindestens einer Ausführungsform umfasst eine Arbeitslast Befehle und Daten, die von diesen Befehlen verarbeitet werden sollen. In mindestens einer Ausführungsform ist der Puffer ein Bereich in einem Speicher, auf den sowohl der Host-Prozessor als auch die PPU 2400 zugreifen können (z. B. Lesen/Schreiben) - eine Host-Schnittstelleneinheit kann dazu konfiguriert sein, auf den Puffer in einem Systemspeicher zuzugreifen, der mit dem Systembus 2402 verbunden ist, und zwar über Speicheranforderungen, die über den Systembus 2402 von der E/A-Einheit 2406 übertragen werden. In mindestens einer Ausführungsform schreibt ein Host-Prozessor einen Befehlsstrom in einen Puffer und überträgt dann einen Zeiger auf den Anfang des Befehlsstroms an die PPU 2400, sodass die Frontend-Einheit 2410 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 2400 weiterleitet.
  • In mindestens einer Ausführungsform ist die Frontend-Einheit 2410 an die Scheduler-Einheit 2412 gekoppelt, die verschiedene GPCs 2418 zum Verarbeiten von Aufgaben konfiguriert, die durch einen oder mehrere Befehlsströme definiert sind. In mindestens einer Ausführungsform ist die Scheduler-Einheit 2412 so konfiguriert, dass sie Zustandsinformationen in Bezug auf verschiedene durch die Scheduler-Einheit 2412 verwaltete Aufgaben verfolgt, wobei die Zustandsinformationen angeben können, welchem der GPCs 2418 eine Aufgabe zugewiesen ist, ob die Aufgabe aktiv oder inaktiv ist, welcher Prioritätslevel mit der Aufgabe assoziiert ist, und so weiter. In mindestens einer Ausführungsform verwaltet die Scheduler-Einheit 2412 die Ausführung einer Vielzahl von Aufgaben auf einem oder mehreren GPCs 2418.
  • In mindestens einer Ausführungsform ist die Scheduler-Einheit 2412 an die Arbeitsverteilungseinheit 2414 gekoppelt, die so konfiguriert ist, dass sie Aufgaben zur Ausführung auf den GPCs 2418 zuteilt. In mindestens einer Ausführungsform verfolgt die Arbeitsverteilungseinheit 2414 eine Anzahl geplanter Aufgaben nach, die von der Scheduler-Einheit 2412 empfangen wurde, und die Arbeitsverteilungseinheit 2414 verwaltet einen Pool ausstehender Aufgaben und einen Pool aktiver Aufgaben für jeden der GPCs 2418. In mindestens einer Ausführungsform umfasst der Pool für anstehende Aufgaben eine Anzahl von Slots (z. B. 32 Slots), die Aufgaben enthalten, die zur Verarbeitung durch einen bestimmten GPC 2418 zugewiesen sind; der Pool für aktive Aufgabe kann eine Anzahl von Slots (z. B. 4 Slots) für Aufgaben umfassen, die aktiv von den GPCs 2418 verarbeitet werden, so dass, wenn einer der GPCs 2418 die Ausführung einer Aufgabe abschließt, diese Aufgabe aus dem Pool für aktive Aufgaben für den GPC 2418 entfernt wird und eine der anderen Aufgaben aus dem Pool für anstehende Aufgaben ausgewählt und zur Ausführung auf dem GPC 2418 eingeplant wird. In mindestens einer Ausführungsform wird eine aktive Aufgabe, die sich auf dem GPC 2418 im Leerlauf befindet, etwa, während sie darauf wartet, dass eine Datenabhängigkeit aufgelöst wird, aus dem GPC 2418 entfernt und in den Pool für anstehende Aufgaben zurückgeführt, während eine andere Aufgabe aus dem Pool für anstehende Aufgaben ausgewählt und für die Ausführung auf dem GPC 2418 eingeplant wird.
  • In mindestens einer Ausführungsform kommuniziert die Arbeitsverteilungseinheit 2414 mit einem oder mehreren GPCs 2418 über die XBar 2420. In mindestens einer Ausführungsform ist die XBar 2420 ein Zusammenschaltungsnetz, das viele Einheiten der PPU 2400 an andere Einheiten der PPU 2400 koppelt und dazu konfiguriert sein kann, die Arbeitsverteilungseinheit 2414 an einen konkreten GPC 2418 zu koppeln. In mindestens einer Ausführungsform können auch eine oder mehrere andere Einheiten der PPU 2400 über den Hub 2416 mit der XBar 2420 verbunden sein.
  • In mindestens einer Ausführungsform werden Aufgaben von der Scheduler-Einheit 2412 verwaltet und von der Arbeitsverteilungseinheit 2414 einem der GPCs 2418 zugeteilt. Der GPC 2418 ist so konfiguriert, dass er die Aufgabe verarbeitet und Ergebnisse generiert. In mindestens einer Ausführungsform können die Ergebnisse durch andere Aufgaben innerhalb des GPC 2418 verbraucht, über die XBar 2420 an einen unterschiedlichen GPC 2418 geroutet oder in dem Speicher 2404 gespeichert werden. In mindestens einer Ausführungsform können die Ergebnisse über die Partitionseinheiten 2422, die eine Speicherschnittstelle zum Lesen und Schreiben von Daten in den/aus dem Speicher 2404 implementieren, in den Speicher 2404 geschrieben werden. In mindestens einer Ausführungsform können die Ergebnisse über die Hochgeschwindigkeits-GPU-Zusammenschaltung 2408 an eine andere PPU 2404 oder CPU übertragen werden. In mindestens einer Ausführungsform beinhaltet die PPU 2400 ohne Einschränkung eine Anzahl U von Partitionseinheiten 2422, die der Anzahl der separaten und unterschiedlichen Speichervorrichtungen 2404 entspricht, die mit der PPU 2400 verbunden sind.
  • In mindestens einer Ausführungsform führt ein Host-Prozessor einen Treiberkern aus, der eine Anwendungsprogrammierschnittstelle („API“) implementiert, die es einer oder mehreren auf dem Host-Prozessor ausgeführten Anwendungen ermöglicht, Operationen zur Ausführung auf der PPU 2400 zu planen. In mindestens einer Ausführungsform werden mehrere Rechenanwendungen simultan durch die PPU 2400 ausgeführt und die PPU 2400 stellt Isolierung, Dienstgüte (quality of service - „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 Treiberkernel veranlassen, eine oder mehrere Aufgaben zur Ausführung durch die PPU 2400 zu generieren, und der Treiberkernel gibt Aufgaben an einen oder mehrere Streams aus, die von der PPU 2400 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 zusammenhängender 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 Ausführung einer Aufgabe beinhalten und Daten über einen gemeinsamen Speicher austauschen.
  • 25 veranschaulicht einen GPC 2500 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform handelt es sich bei dem GPC 2500 um den GPC 2418 der 24. In mindestens einer Ausführungsform beinhaltet jeder GPC 2500 ohne Einschränkung eine Reihe von Hardware-Einheiten zur Verarbeitung von Aufgaben, und jeder GPC 2500 beinhaltet ohne Einschränkung einen Pipelineverwalter 2502, eine -Pre-Raster Operations Unit („PROP“) 2504, eine Raster-Engine 2508, eine Arbeitsverteilungs-Kreuzschiene („WDX“) 2516, eine MMU 2518, einen oder mehrere Data Processing Clusters („DPCs“) 2506 und eine beliebige Kombination von Teilen.
  • In mindestens einer Ausführungsform wird der Betrieb des GPC 2500 durch den Pipelineverwalter 2502 gesteuert. In mindestens einer Ausführungsform verwaltet der Pipelineverwalter 2502 die Konfiguration eines oder mehrerer DPCs 2506 für die Verarbeitung von Aufgaben, die dem GPC 2500 zugewiesen sind. In mindestens einer Ausführungsform konfiguriert der Pipelineverwalter 2502 mindestens einen von einem oder mehreren DPCs 2506 dazu, mindestens einen Abschnitt einer Grafik-Rendering-Pipeline zu implementieren. In mindestens einer Ausführungsform ist der DPC 2506 dazu konfiguriert, ein Vertex-Shader-Programm auf einem programmierbaren Streaming-Multiprozessor (streaming multi-processor - „SM“) 2514 auszuführen. In mindestens einer Ausführungsform ist der Pipelineverwalter 2502 so konfiguriert, dass er die von einer Arbeitsverteilungseinheit empfangenen Pakete an zweckmäßige logische Einheiten innerhalb des GPC 2500 routet, und in mindestens einer Ausführungsform können einige Pakete an Festfunktions-Hardwareeinheiten in dem PROP 2504 und/oder der Raster-Engine 2508 geroutet werden, während andere Pakete zum Verarbeiten durch eine Primitiv-Engine 2512 oder den SM 2514 an die DPCs 2506 geroutet werden können. In mindestens einer Ausführungsform konfiguriert der Pipelineverwalter 2502 mindestens einen der DPCs 2506 zur Implementierung einer Rechenpipeline. In mindestens einer Ausführungsform konfiguriert der Pipelineverwalter 2502 mindestens eine der DPCs 2506, um mindestens einen Teil eines CUDA-Programms auszuführen.
  • In mindestens einer Ausführungsform ist die PROP-Einheit 2504 so konfiguriert, dass sie die von der Raster-Engine 2508 und den DPCs 2506 generierten Daten an eine Raster-Operations-Einheit („ROP“) in einer Partitionseinheit weiterleitet, wie etwa an die Speicherpartitionseinheit 2422, die oben in Verbindung mit 24 näher beschrieben ist. In mindestens einer Ausführungsform ist die PROP-Einheit 2504 so konfiguriert, dass sie Optimierungen für die Farbmischung durchführt, Pixeldaten organisiert, Adressübersetzungen vornimmt und vieles mehr. In mindestens einer Ausführungsform beinhaltet die Rastermaschine 2508 ohne Einschränkung 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 Rastermaschine 2508 ohne Einschränkung eine Setup-Maschine, eine Grobraster-Maschine, eine Culling-Maschine, eine Clipping-Maschine, eine Feinraster-Maschine, eine Kachel-Koaleszenz-Maschine und jede geeignete Kombination davon. In mindestens einer Ausführungsform empfängt eine Setup-Engine transformierte Scheitelpunkte und generiert Ebenengleichungen, die mit einem durch Scheitelpunkte 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; die Ausgabe der Grobraster-Engine wird 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 Sichtkegelstumpfes liegen, abgeschnitten werden. In mindestens einer Ausführungsform werden die Fragmente, die das Clipping und Culling überstehen, an eine Feinraster-Maschine weitergeleitet, um Attribute für Pixelfragmente auf der Grundlage der von der Setup-Maschine erstellten Ebenengleichungen zu generieren. In mindestens einer Ausführungsform umfasst die Ausgabe der Raster-Engine 2508 Fragmente, die von einer geeigneten Einheit wie einem in DPC 2506 implementierten Fragment-Shader verarbeitet werden.
  • In mindestens einer Ausführungsform umfasst jeder DPC 2506, der in dem GPC 2500 beinhaltet ist, ohne Einschränkung eine M-Pipe-Steuerung (M-Pipe Controller - „MPC“) 2510; die Primitiv-Engine 2512; einen oder mehrere SMs 2514 und eine beliebige geeignete Kombination davon. In mindestens einer Ausführungsform steuert die MPC 2510 den Betrieb des DPC 2506 und routet von dem Pipelineverwalter 2502 empfangene Pakete an die entsprechenden Einheiten in dem DPC 2506. In mindestens einer Ausführungsform werden Pakete, die mit einem Vertex assoziiert sind, an die Primitiv-Engine 2512 geroutet, die so konfiguriert ist, dass sie Vertexattribute, die mit einem Vertex assoziiert sind, aus dem Speicher abruft; im Gegensatz dazu können Pakete, die mit einem Shader-Programm assoziiert sind, an den SM 2514 übertragen werden.
  • In mindestens einer Ausführungsform umfasst der SM 2514 ohne Einschränkung einen programmierbaren Streaming-Prozessor, der dazu konfiguriert ist, Aufgaben zu verarbeiten, die durch eine Anzahl von Threads dargestellt werden. In mindestens einer Ausführungsform ist der SM 2514 mit mehreren- Threads ausgestattet und so konfiguriert, dass er eine Vielzahl von 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 unterschiedlichen Datensatz auf der Grundlage desselben Anweisungssatzes verarbeitet. In mindestens einer Ausführungsform führen alle Threads in einer Gruppe von Threads dieselben Anweisungen aus. In mindestens einer Ausführungsform implementiert SM 2514 eine SIMT-Architektur, bei der jeder Thread in einer Gruppe von Threads so konfiguriert ist, dass er einen unterschiedlichen Datensatz auf der Grundlage desselben Anweisungssatzes 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 die Gleichzeitigkeit zwischen Warps und die 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, was gleiche Gleichzeitigkeit zwischen allen Threads innerhalb und zwischen Warps ermöglicht. In mindestens einer Ausführungsform wird ein Ausführungsstatus für jeden einzelnen Thread beibehalten, und Threads, die dieselben Anweisungen ausführen, können zur Verbesserung der Effizienz zusammengeführt und parallel ausgeführt werden. Mindestens eine Ausführungsform von SM 2514 wird in Verbindung mit 26 ausführlicher beschrieben.
  • In mindestens einer Ausführungsform stellt die MMU 2518 eine Schnittstelle zwischen dem GPC 2500 und einer Speicherpartitionseinheit (z. B. der Partitionseinheit 2422 der 24) bereit und stellt die MMU 2518 Übersetzung virtueller Adressen in physische Adressen, Speicherschutz und Vermittlung von Speicheranforderungen bereit. In mindestens einer Ausführungsform bietet die MMU 2518 einen oder mehrere Übersetzungs-Lookaside-Puffer (TLBs) für die Übersetzung virtueller Adressen in physische Adressen im Speicher.
  • 26 veranschaulicht einen Streaming-Multiprozessor („SM“) 2600 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform handelt es sich bei dem SM 2600 um den SM 2514 der 25. In mindestens einer Ausführungsform beinhaltet der SM 2600 ohne Einschränkung einen Anweisungs-Cache 2602; eine oder mehrere Scheduler-Einheiten 2604; eine Registerdatei 2608; einen oder mehrere Verarbeitungskerne („Kerne“) 2610; eine oder mehrere Spezialfunktionseinheiten („SFUs“) 2612; eine oder mehrere LSUs 2614; ein Zusammenschaltungsnetzwerk 2616; einen gemeinsamen Speicher/L1-Cache 2618; und jede geeignete Kombination davon. In mindestens einer Ausführungsform verteilt eine Arbeitsverteilungseinheit Aufgaben zur Ausführung auf GPCs von Parallelverarbeitungseinheiten (PPUs), und jede Aufgabe wird einem bestimmten Datenverarbeitungscluster (DPC) innerhalb eines GPCs zugewiesen, und wenn eine Aufgabe einem Shader-Programm zugeordnet ist, wird die Aufgabe einem der SMs 2600 zugewiesen. In mindestens einer Ausführungsform empfängt die Scheduler-Einheit 2604 Aufgaben von einer Arbeitsverteilungseinheit und verwaltet die Anweisungsplanung für einen oder mehrere Thread-Blöcke, die dem SM 2600 zugewiesen sind. In mindestens einer Ausführungsform plant die Scheduler-Einheit 2604 Thread-Blöcke für die 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 Scheduler-Einheit 2604 eine Vielzahl unterschiedlicher Thread-Blöcke, indem sie verschiedenen Thread-Blöcken Warps zuweist und dann während jedes Taktzyklus Anweisungen von einer Vielzahl unterschiedlicher kooperativer Gruppen an unterschiedliche Funktionseinheiten (z. B. Verarbeitungskerne 2610, SFUs 2612 und LSUs 2614) verteilt.
  • In mindestens einer Ausführungsform können sich „kooperative Gruppen“ auf ein Programmiermodell für die Organisation von Gruppen kommunizierender Threads beziehen, das es Entwicklern ermöglicht, die Granularität, mit der Threads kommunizieren, auszudrücken, wodurch eine reichhaltigere, effizientere parallele Zerlegung ermöglicht wird. In mindestens einer Ausführungsform unterstützen kooperative Start-APIs die Synchronisierung zwischen Thread-Blöcken zur Ausführung paralleler Algorithmen. In mindestens einer Ausführungsform bieten APIs herkömmlicher Programmiermodelle ein einziges, einfaches Konstrukt für die Synchronisierung kooperierender Threads: eine Barriere für 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 der definierten Gruppen synchronisieren, um eine 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 mit Teilblock- und Multiblock-Granularität zu definieren und kollektive Operationen wie die Synchronisierung von Threads in einer kooperativen Gruppe durchzuführen. In mindestens einer Ausführungsform ist eine Teilblock-Granularität so klein wie ein einziger Thread. In mindestens einer Ausführungsform unterstützt ein Programmiermodell eine saubere Komposition über Software-Grenzen hinweg, sodass Bibliotheken und Dienstprogramme innerhalb ihres lokalen Kontexts sicher synchronisieren können, ohne Annahmen über die Konvergenz treffen zu müssen. In mindestens einer Ausführungsform ermöglichen kooperative Gruppenprimitive neue Muster kooperativer Parallelität, einschließlich, ohne Einschränkung, Produzenten-Konsumenten-Parallelität, opportunistische Parallelität und globale Synchronisierung über ein ganzes Netz von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist eine Dispatch-Einheit 2606 so konfiguriert, dass sie Anweisungen an eine oder mehrere Funktionseinheiten überträgt, und die Scheduler-Einheit 2604 beinhaltet ohne Einschränkung zwei Dispatch-Einheiten 2606, die es ermöglichen, dass in jedem Taktzyklus zwei unterschiedliche Anweisungen aus derselben Warp versendet werden. In mindestens einer Ausführungsform beinhaltet jede Scheduler-Einheit 2604 eine einzige Verteilereinheit 2606 oder zusätzliche Verteilereinheiten 2606.
  • In mindestens einer Ausführungsform beinhaltet jeder SM 2600 in mindestens einer Ausführungsform ohne Einschränkung die Registerdatei 2608, die einen Satz von Registern für funktionelle Einheiten des SM 2600 bereitstellt. In mindestens einer Ausführungsform ist die Registerdatei 2608 zwischen den einzelnen Funktionseinheiten aufgeteilt, so dass jeder Funktionseinheit ein eigener Abschnitt der Registerdatei 2608 zugewiesen ist. In mindestens einer Ausführungsform ist die Registerdatei 2608 auf unterschiedliche Warps aufgeteilt, die von dem SM 2600 ausgeführt werden, und die Registerdatei 2608 stellt einen temporären Datenspeicher für Operanden bereit, die mit Datenpfaden von funktionellen Einheiten verbunden sind. In mindestens einer Ausführungsform umfasst jeder SM 2600, ohne Einschränkung, eine Vielzahl von L-Verarbeitungskernen 2610. In mindestens einer Ausführungsform beinhaltet der SM 2600 ohne Einschränkung eine große Anzahl (z. B. 128 oder mehr) von unterschiedlichen Verarbeitungskernen 2610. In mindestens einer Ausführungsform beinhaltet jeder Verarbeitungskern 2610 ohne Einschränkung eine Vollpipelineverarbeitungseinheit mit einfacher Genauigkeit, doppelter Genauigkeit und/oder gemischter Genauigkeit, die ohne Einschränkung eine arithmetisch-logische Einheit für Gleitkommazahlen und eine arithmetisch-logische Einheit für Integer beinhaltet. In mindestens einer Ausführungsform implementieren die arithmetischen Gleitkomma-Logikeinheiten den Standard IEEE 754-2008 für Gleitkomma-Arithmetik. In mindestens einer Ausführungsform beinhalten die Verarbeitungskerne 2610 ohne Einschränkung 64 Gleitkomma-Kerne mit einfacher Genauigkeit (32 Bit), 64 Ganzzahl-Kerne, 32 Gleitkomma-Kerne mit doppelter
  • Genauigkeit (64 Bit) und 8 Tensor-Kerne.
  • In mindestens einer Ausführungsform sind die Tensorkerne so konfiguriert, dass sie Matrixoperationen durchführen. In mindestens einer Ausführungsform sind ein oder mehrere Tensorkerne in den Verarbeitungskernen 2610 beinhalten. In mindestens einer Ausführungsform sind Tensorkerne dazu konfiguriert, Deep-Learning-Matrixarithmetik durchzuführen, wie etwa Faltungsoperationen für das Training und Inferenzierung von neuronalen Netzen. In mindestens einer Ausführungsform arbeitet jeder Tensor-Kern mit 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 die Akkumulationsmatrizen C und D sind 16-Bit-Gleitkomma- oder 32-Bit-Gleitkommamatrizen. In mindestens einer Ausführungsform arbeiten die Tensorkerne mit 16-Bit-Gleitkomma-Eingangsdaten und 32-Bit-Gleitkomma-Akkumulation. In mindestens einer Ausführungsform werden für die 16-Bit-Gleitkommamultiplikation 64 Operationen verwendet, was zu einem Produkt mit voller Genauigkeit führt, das dann unter Verwendung einer 32-Bit-Gleitkomma-Addition mit anderen Zwischenprodukten zu einer 4x4x4-Matrixmultiplikation akkumuliert wird. In mindestens einer Ausführungsform werden Tensor-Kerne 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 etwa eine CUDA -C++ API, spezialisierte Operationen zum Laden, Multiplizieren und Akkumulieren von Matrizen sowie zum Speichern von Matrizen bereit, um Tensorkerne von einem CUDA -C++ Programm aus effizient zu verwenden. In mindestens einer Ausführungsform geht eine Schnittstelle auf Warp-Ebene auf CUDA-Ebene von Matrizen der Größe 16x16 aus, die alle 32 Threads eines Warps umfassen.
  • In mindestens einer Ausführungsform umfasst jeder SM 2600 ohne Einschränkung M SFUs 2612, die Spezialfunktionen ausführen (z. B. Attributauswertung, reziproke Quadratwurzel und dergleichen). In mindestens einer Ausführungsform beinhalten die SFUs 2612 ohne Einschränkung eine Baum-Traversierungseinheit, die dazu konfiguriert ist, eine hierarchische Baumdatenstruktur zu traversieren. In mindestens einer Ausführungsform beinhaltet die SFUs 2612 ohne Einschränkung eine Textureinheit, die so konfiguriert ist, dass sie Filteroperationen für die Texturabbildung durchführt. In mindestens einer Ausführungsform sind die Textureinheiten dazu konfiguriert, Texturabbildungen (z. B. eine 2D-Anordnung von Texeln) aus dem Speicher zu laden und Texturabbildungen abzutasten, um abgetastete Texturwerte zur Verwendung in von dem SM 2600 ausgeführten Shader-Programmen zu erzeugen. In mindestens einer Ausführungsform werden die Texturabbildungen in dem gemeinsam genutzten Speicher/L1-Cache 2618 gespeichert. In mindestens einer Ausführungsform implementieren Textureinheiten Texturoperationen wie Filteroperationen unter Verwendung von Mip-Abbildungen (z. B. Texturabbildungen mit unterschiedlichen Detailstufen). In mindestens einer Ausführungsform beinhaltet jeder SM 2600, ohne Einschränkung, zwei Textureinheiten.
  • In mindestens einer Ausführungsform umfasst jeder SM 2600 ohne Einschränkung N LSUs 2614, die Lade- und Speicheroperationen zwischen dem gemeinsamen Speicher/L1-Cache 2618 und der Registerdatei 2608 durchführen. In mindestens einer Ausführungsform beinhaltet jeder SM 2600 ohne Einschränkung ein Zusammenschaltungsnetzwerk 2616, das jede der Funktionseinheiten mit der Registerdatei 2608 und die LSU 2614 mit der Registerdatei 2608 und dem gemeinsamen Speicher/L1-Cache 2618 verbindet. In mindestens einer Ausführungsform ist das Zusammenschaltungsnetzwerk 2616 eine Kreuzschiene, die so konfiguriert werden kann, dass sie jede der Funktionseinheiten mit jedem der Register in der Registerdatei 2608 verbindet und LSUs 2614 mit der Registerdatei 2608 und Speicherplätzen in dem gemeinsamen Speicher/L1-Cache 2618 verbindet.
  • In mindestens einer Ausführungsform ist der gemeinsame Speicher/L1-Cache 2618 ein Array von On-Chip-Speicher, der die Datenspeicherung und Kommunikation zwischen dem SM 2600 und einer primitiven Engine sowie zwischen Threads in dem SM 2600 ermöglicht. In mindestens einer Ausführungsform umfasst der gemeinsame Speicher/L1-Cache 2618 ohne Einschränkung eine Speicherkapazität von 128 KB und befindet sich in einem Pfad von dem SM 2600 zu einer Partitionseinheit. In mindestens einer Ausführungsform wird der gemeinsame Speicher/L1-Cache 2618 zum Cachen von Lese- und Schreibvorgängen verwendet. In mindestens einer Ausführungsform sind einer oder mehrere von dem gemeinsam genutzten Speicher/L1-Cache 2618, L2-Cache und Speicher Ergänzungsspeicher.
  • In mindestens einer Ausführungsform bietet die Kombination von Daten-Cache und gemeinsamem Speicher in einem einzigen Speicherblock eine verbesserte Leistung für beide Arten von Speicherzugriffen. In mindestens einer Ausführungsform wird die Kapazität von Programmen, die den gemeinsamen Speicher nicht nutzen, als Cache genutzt oder kann als dieser genutzt werden, wenn etwa der gemeinsame Speicher so konfiguriert ist, dass er die Hälfte der Kapazität nutzt, können Textur- und Lade-/Speicheroperationen die verbleibende Kapazität nutzen. In mindestens einer Ausführungsform ermöglicht die Integration in den gemeinsamen Speicher/L1-Cache 2618, dass der gemeinsam genutzte Speicher/L1-Cache 2618 als eine Leitung mit hohem Durchsatz für Streaming-Daten fungiert und gleichzeitig einen Zugriff auf häufig wiederverwendete Daten mit hoher Bandbreite und geringer Latenz ermöglicht. In mindestens einer Ausführungsform kann, wenn sie für allgemeine parallele Berechnungen konfiguriert ist, eine einfachere Konfiguration im Vergleich zur 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 mit allgemeinem Zweck 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 generiert, wobei der SM 2600 zur Ausführung eines Programms und zur Durchführung von Berechnungen, gemeinsamer Speicher/L1-Cache 2618 zur Kommunikation zwischen Threads und LSU 2614 zum Lesen und Schreiben des globalen Speichers über gemeinsamen Speicher/L1-Cache 2618 und eine Speicherpartitionseinheit verwendet werden. In mindestens einer Ausführungsform schreibt, bei der Konfiguration für Universalparallelberechnungen, der SM 2600 Befehle, welche die Scheduler-Einheit 2604 verwenden kann, um neue Arbeit in den 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. einer drahtlosen, tragbaren Vorrichtung), einem PDA, einer Digitalkamera, einem Fahrzeug, einem Head Mounted Anzeige, einer tragbaren elektronischen Vorrichtung usw. beinhaltet oder damit verbunden. In mindestens einer Ausführungsform ist die PPU auf einem einzigen Halbleitersubstrat untergebracht. 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 beinhalten.
  • In mindestens einer Ausführungsform kann die PPU in einer Grafikkarte beinhaltet sein, die eine oder mehrere Speichervorrichtungen beinhaltet. In mindestens einer Ausführungsform kann eine Grafikkarte so konfiguriert sein, dass sie mit einem PCIe-Steckplatz auf einem Motherboard eines Desktop-Computers verbunden werden kann. In mindestens einer Ausführungsform kann die PPU eine integrierte GPU („iGPU“) sein, die in dem Chipsatz der Hauptplatine beinhaltet ist.
  • Software-Konstruktionen für allgemeine Berechnungen
  • Die folgenden Figuren legen ohne Einschränkung beispielhafte Softwarekonstrukte zur Implementierung mindestens einer Ausführungsform dar.
  • 27 veranschaulicht einen Softwarestapel einer Programmierplattform gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform eine Plattform zum Einsetzen von Hardware auf einem Computersystem, um Berechnungsaufgaben zu beschleunigen. In mindestens einer Ausführungsform kann eine Programmierplattform für Softwareentwickler durch 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, ohne darauf beschränkt zu sein.
  • In mindestens einer Ausführungsform stellt ein Softwarestapel 2700 einer Programmierplattform eine Ausführungsumgebung für eine Anwendung 2701 bereit. In mindestens einer Ausführungsform kann die Anwendung 2701 eine beliebige Computersoftware beinhalten, die auf dem Softwarestapel 2700 gestartet werden kann. In mindestens einer Ausführungsform kann die Anwendung 2701 eine Anwendung der künstlichen Intelligenz („KI“)/des maschinellen Lernens („ML“), eine Anwendung des Hochleistungsrechnens („HPC“), eine virtuelle Desktop-Infrastruktur („VDI“) oder eine Arbeitslast in dem Datenzentrum beinhalten, ist aber nicht darauf beschränkt.
  • In mindestens einer Ausführungsform laufen die Anwendung 2701 und der Softwarestapel 2700 auf Hardware 2707. Die Hardware 2707 kann in mindestens einer Ausführungsform eine oder mehrere GPUs, CPUs, FPGAs, Kl-Engines und/oder andere Arten von Rechenvorrichtungen beinhalten, die eine Programmierplattform unterstützen. In mindestens einer Ausführungsform, wie etwa bei CUDA, kann der Softwarestapel 2700 herstellerspezifisch und nur mit Vorrichtungen von (einem) konkreten Hersteller(n) kompatibel sein. In mindestens einer Ausführungsform, wie etwa bei OpenCL, kann der Softwarestapel 2700 mit Vorrichtungen von unterschiedlichen Herstellern verwendet werden. In mindestens einer Ausführungsform beinhaltet die Hardware 2707 einen Host, der mit einem oder mehreren Vorrichtungen verbunden ist, auf die zugegriffen werden kann, um Berechnungsaufgaben über Aufrufe einer Anwendungsprogrammierschnittstelle (application programming interface - „API“) auszuführen. Eine Vorrichtung innerhalb der Hardware 2707 kann, ohne darauf beschränkt zu sein, eine GPU, ein FPGA, eine Kl-Engine oder eine andere Rechenvorrichtung und ihren Speicher beinhalten (kann aber auch eine CPU beinhalten), im Gegensatz zu einem Host innerhalb der Hardware 2707, der in mindestens einer Ausführungsform eine CPU und ihren Speicher beinhalten kann (aber auch eine Rechenvorrichtung beinhalten kann), ohne darauf beschränkt zu sein.
  • In mindestens einer Ausführungsform beinhaltet der Softwarestapel 2700 einer Programmierplattform ohne Einschränkung eine Anzahl von Bibliotheken 2703, eine Laufzeit 2705 und einen Vorrichtungskerneltreiber 2706. Jede der Bibliotheken 2703 kann in mindestens einer Ausführungsform Daten und Programmiercode beinhalten, die durch Computerprogramme verwendet und während der Softwareentwicklung eingesetzt werden können. In mindestens einer Ausführungsform können die Bibliotheken 2703 vorgefertigten Code und Teilroutinen, Klassen, Werte, Typspezifikationen, Konfigurationsdaten, Dokumentation, Hilfedaten und/oder Nachrichtenvorlagen beinhalten, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform beinhalten die Bibliotheken 2703 Funktionen, die für die Ausführung auf einer oder mehreren Arten von Vorrichtungen optimiert sind. In mindestens einer Ausführungsform können die Bibliotheken 2703 Funktionen zum Durchführen von mathematischen Operationen, tiefem Lernen und/oder anderen Arten von Operationen auf Vorrichtungen beinhalten, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform sind Bibliotheken 2703 mit entsprechenden APIs 2702 assoziiert, die eine oder mehrere APIs beinhalten können, die in Bibliotheken 2703 implementierte Funktionen offenlegen.
  • In mindestens einer Ausführungsform ist die Anwendung 2701 als Quellcode geschrieben, der in ausführbaren Code kompiliert wird, wie nachstehend in Verbindung mit den 32 - 34 ausführlicher erörtert wird. In mindestens einer Ausführungsform kann der ausführbare Code der Anwendung 2701 mindestens zum Teil auf einer Ausführungsumgebung laufen, die von dem Softwarestapel 2700 bereitgestellt wird. In mindestens einer Ausführungsform kann während der Ausführung der Anwendung 2701 Code erreicht werden, der auf einer Vorrichtung im Gegensatz zu einem Host laufen muss. In einem derartigen Fall kann in mindestens einer Ausführungsform die Laufzeitumgebung 2705 aufgerufen werden, um den erforderlichen Code auf die Vorrichtung zu laden und zu starten. In mindestens einer Ausführungsform kann die Laufzeit 2705 ein beliebiges technisch machbares Laufzeitsystem beinhalten, das die Ausführung der Anwendung S01 unterstützen kann.
  • In mindestens einer Ausführungsform ist die Laufzeit 2705 als eine oder mehrere Laufzeitbibliotheken implementiert, die entsprechenden APIs zugeordnet sind, die als API(s) 2704 dargestellt sind. Eine oder mehrere solcher Laufzeitbibliotheken können in mindestens einer Ausführungsform ohne Einschränkung unter anderem Funktionen für die Speicherverwaltung, die Ausführungssteuerung, die Vorrichtungsverwaltung, die Fehlerhandhabung und/oder die Synchronisation beinhalten. In mindestens einer Ausführungsform können die Speicherverwaltungsfunktionen Funktionen zum Zuweisen, Freigeben und Kopieren von Vorrichtungsspeicher sowie zum Übertragen von Daten zwischen Host-Speicher und Vorrichtungsspeicher beinhalten, ohne darauf beschränkt zu sein. In mindestens einer Ausführungsform können die Ausführungssteuerfunktionen Funktionen zum Starten einer Funktion (manchmal als „Kernel“ bezeichnet, wenn eine Funktion eine von einem Host aufrufbare globale Funktion ist) auf einer Vorrichtung beinhalten und Attributwerte in einem Puffer setzen, der von einer Laufzeitbibliothek für eine gegebene Funktion gepflegt wird, die auf einer Vorrichtung ausgeführt werden soll, ohne darauf beschränkt zu sein.
  • Laufzeitbibliotheken und entsprechende API(s) 2704 können in mindestens einer Ausführungsform auf eine beliebige technisch machbare Weise implementiert sein. In mindestens einer Ausführungsform kann eine (oder eine beliebige Anzahl von) API einen Satz von Funktionen einer niedrigen Ebene für eine feingranulare Steuerung einer Vorrichtung bereitstellen, während eine andere (oder eine beliebige Anzahl von) API einen Satz solcher Funktionen einer höheren Ebene offenlegen kann. In mindestens einer Ausführungsform kann eine Laufzeit-API einer hohen Ebene auf einer API einer niedrigen Ebene aufgebaut sein. In mindestens einer Ausführungsform können eine oder mehrere Laufzeit-APIs sprachspezifische APIs sein, die auf einer sprachunabhängigen Laufzeit-API aufgesetzt sind.
  • In mindestens einer Ausführungsform ist der Vorrichtungskerntreiber 2706 so konfiguriert, dass er die Kommunikation mit einer zugrunde liegenden Vorrichtung ermöglicht. In mindestens einer Ausführungsform kann der Vorrichtungskerneltreiber 2706 Funktionalitäten einer niedrigen Ebene bereitstellen, auf die APIs, wie etwa die API(s) 2704 und/oder andere Software, zurückgreifen. In mindestens einer Ausführungsform kann der Vorrichtungskerneltreiber 2706 konfiguriert sein, um Zwischendarstellungs(Intermediate Representation - „IR“)-Code zur Laufzeit in Binärcode zu kompilieren. Für CUDA kann der Vorrichtungskerneltreiber 2706 in mindestens einer Ausführungsform IR-Code zur parallelen Thread-Ausführung (Parallel Thread Execution - „PTX“), der nicht hardwarespezifisch ist, zur Laufzeit in Binärcode für eine bestimmtes Zielvorrichtung kompilieren (mit Zwischenspeichern des kompilierten Binärcodes), was manchmal auch als „Finalisieren“ von Code bezeichnet wird. Dies kann in mindestens einer Ausführungsform zulassen, dass finalisierter Code auf einer Zielvorrichtung läuft, der möglicherweise nicht existiert hat, als der Quellcode ursprünglich in PTX-Code kompiliert wurde. Alternativ kann in mindestens einer Ausführungsform der Vorrichtungsquellcode offline in Binärcode kompiliert werden, ohne dass es erforderlich ist, dass der Vorrichtungskerneltreiber 2706 den IR-Code während der Laufzeit kompiliert.
  • 28 veranschaulicht eine CUDA-Implementierung des Softwarestapels 2700 der 27 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet ein CUDA-Softwarestapel 2800, auf dem eine Anwendung 2801 gestartet werden kann, CUDA-Bibliotheken 2803, eine CUDA-Laufzeit 2805, einen CUDA-Treiber 2807 und einen Vorrichtungskerneltreiber 2808. In mindestens einer Ausführungsform wird der CUDA-Softwarestapel 2800 auf Hardware 2809 ausgeführt, die eine GPU beinhalten kann, die CUDA unterstützt und von NVIDIA Corporation, Santa Clara, Kalifornien entwickelt wird.
  • In mindestens einer Ausführungsform können die Anwendung 2801, die CUDA-Laufzeit 2805 und der Vorrichtungskerneltreiber 2808 ähnliche Funktionalitäten wie die Anwendung 2701, die Laufzeit 2705 bzw. der Vorrichtungskerneltreiber 2706 durchführen, die vorstehend in Verbindung mit 27 beschrieben wurden. In mindestens einer Ausführungsform beinhaltet der CUDA-Treiber 2807 eine Bibliothek (libcuda.so), die eine CUDA-Treiber-API 2806 implementiert. Ähnlich einer CUDA-Laufzeit-API 2804, die durch eine CUDA-Laufzeitbibliothek (cudart) implementiert wird, kann die CUDA-Treiber-API 2806 in mindestens einer Ausführungsform ohne Einschränkung unter anderem Funktionen für Speicherverwaltung, Ausführungssteuerung, Vorrichtungsverwaltung, Fehlerbehandlung, Synchronisation und/oder Grafikinteroperabilität offenlegen. In mindestens einer Ausführungsform unterscheidet sich die CUDA-Treiber-API 2806 von der CUDA-Laufzeit-API 2804 darin, dass die CUDA-Laufzeit-API 2804 die Vorrichtungscodeverwaltung vereinfacht, indem sie implizite Initialisierung, Kontextverwaltung (analog zu einem Prozess) und Modulverwaltung (analog zu dynamisch geladenen Bibliotheken) bereitstellt. Im Gegensatz zur CUDA-Laufzeit-API 2804 auf hoher Ebene ist die CUDA-Treiber-API 2806 eine API auf niedriger Ebene, die eine feinkörnigere Steuerung der Vorrichtung 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 2806 Funktionen für die Kontextverwaltung offenlegen, die nicht durch die CUDA-Laufzeit-API 2804 offengelegt werden. In mindestens einer Ausführungsform ist die CUDA-Treiber-API 2806 auch sprachunabhängig und unterstützt z. B. OpenCL zusätzlich zur CUDA-Laufzeit-API 2804. Ferner können in mindestens einer Ausführungsform Entwicklungsbibliotheken, einschließlich der CUDA-Laufzeit 2805, als von Treiberkomponenten separat betrachtet werden, einschließlich des Benutzermodus-CUDA-Treibers 2807 und des Kernelmodus-Vorrichtungstreibers 2808 (manchmal auch als „Anzeige“-Treiber bezeichnet).
  • In mindestens einer Ausführungsform können CUDA-Bibliotheken 2803 unter anderem mathematische Bibliotheken, Deep-Learning-Bibliotheken, parallele Algorithmenbibliotheken und/oder Signal-/Bild-/Videoverarbeitungsbibliotheken beinhalten, die von parallelen Rechenanwendungen wie der Anwendung 2801 eingesetzt werden können. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 2803 mathematische Bibliotheken beinhalten, wie etwa unter anderem eine cuBLAS-Bibliothek, die eine Implementierung von Basic Linear Algebra Teilprograms („BLAS“) zum Durchführen linearer Algebra-Operationen ist, eine cuFFT-Bibliothek zum Berechnen schneller Fourier-Transformationen (fast Fourier transforms - „FFTs“) und eine cuRAND-Bibliothek zur Generierung von Zufallszahlen. In mindestens einer Ausführungsform können die CUDA-Bibliotheken 2803 Deep-Learning-Bibliotheken beinhalten, wie etwa unter anderem eine cuDNN-Bibliothek von Primitiven für tiefe neuronale Netze und eine TensorRT-Plattform für Hochleistungs-Deep-Learning-Inferenz.
  • 29 veranschaulicht eine ROCm-lmplementierung des Softwarestapels 2700 der 27 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet ein ROCm-Softwarestapel 2900, auf dem eine Anwendung 2901 gestartet werden kann, eine Sprachlaufzeit 2903, eine Systemlaufzeit 2905, einen Thunk 2907 und einen ROCm-Kerneltreiber 2908. In mindestens einer Ausführungsform wird der ROCm-Softwarestapel 2900 auf Hardware 2909 ausgeführt, die eine GPU beinhalten kann, die ROCm unterstützt und von AMD Corporation, Santa Clara, Kalifornien entwickelt wird.
  • In mindestens einer Ausführungsform kann die Anwendung 2901 ähnliche Funktionalitäten wie die Anwendung 2701 durchführen, die vorstehend in Verbindung mit 27 erörtert wurde. Außerdem können die Sprachlaufzeit 2903 und die Systemlaufzeit 2905 in mindestens einer Ausführungsform ähnliche Funktionalitäten wie die vorstehend in Verbindung mit 27 erörterte Laufzeit 2705 durchführen. In mindestens einer Ausführungsform unterscheiden sich die Sprachlaufzeit 2903 und die Systemlaufzeit 2905 darin, dass die Systemlaufzeit 2905 eine sprachunabhängige Laufzeit ist, die eine ROCr-Systemlaufzeit-API 2904 implementiert und eine Laufzeit-API mit heterogener Systemarchitektur (Heterogeneous System Architecture - „HSA“) verwendet. Bei der HSA-Laufzeit-API handelt es sich um eine schlanke API im Benutzermodus, die Schnittstellen für den Zugriff auf und die Interaktion mit einer AMD-GPU bereitstellt, beinhaltend Funktionen für die Speicherverwaltung, die Ausführungssteuerung über die architektonische Verteilung von Kerneln, die Fehlerbehandlung, System- und Agenteninformationen sowie die Laufzeitinitialisierung und das Herunterfahren, unter anderem in mindestens einer Ausführungsform. Im Gegensatz zur Systemlaufzeit 2905 ist die Sprachlaufzeit 2903 in mindestens einer Ausführungsform eine Implementierung einer sprachspezifischen Laufzeit-API 2902, die auf der ROCr-Systemlaufzeit-API 2904 geschichtet ist. In mindestens einer Ausführungsform kann die Sprachlaufzeit-API unter anderem eine Sprachlaufzeit-API für Heterogeneous Compute Interface for Portability („HIP“), eine Sprachlaufzeit-API für Heterogeneous Compute Compiler („HCC“) oder eine OpenCL-API beinhalten, ohne darauf beschränkt zu sein. Die HIP-Sprache ist insbesondere eine Erweiterung der Programmiersprache C++ mit funktional ähnlichen Versionen von CUDA-Mechanismen, und in mindestens einer Ausführungsform beinhaltet eine HIP-Sprachen-Laufzeit-API Funktionen, die denen der CUDA-Laufzeit-API 2804 ähneln, die vorstehend in Verbindung mit 28 erörtert wurde, wie etwa unter anderem Funktionen zur Speicherverwaltung, Ausführungssteuerung, Vorrichtungsverwaltung, Fehlerbehandlung und Synchronisation.
  • In mindestens einer Ausführungsform ist der Thunk (ROCt) 2907 eine Schnittstelle 2906, die verwendet werden kann, um mit dem zugrunde liegenden ROCm-Treiber 2908 zu interagieren. In mindestens einer Ausführungsform ist der ROCm-Treiber 2908 ein ROCk-Treiber, der eine Kombination aus einem AMDGPU-Treiber und einem HSA-Kernel-Treiber (amdkfd) ist. In mindestens einer Ausführungsform ist der AMDGPU-Treiber ein von AMD entwickelter Vorrichtungskerneltreiber für GPU, der ähnliche Funktionen wie der Vorrichtungskerneltreiber 2706 durchführt, der vorstehend in Verbindung mit 27 erörtert wurde. In mindestens einer Ausführungsform ist der HSA-Kerneltreiber ein Treiber, der es verschiedenen Arten 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-Softwarestapel 2900 oberhalb der Sprachlaufzeit 2903 beinhaltet sein und eine Ähnlichkeit der Funktionalität zu den CUDA-Bibliotheken 2803 bereitstellen, die vorstehend in Verbindung mit 28 erörtert wurden. In mindestens einer Ausführungsform können verschiedene Bibliotheken mathematische, Deep-Learning- und/oder andere Bibliotheken beinhalten, wie etwa unter anderem eine hipBLAS-Bibliothek, die Funktionen ähnlich denen von CUDA cuBLAS implementiert, eine rocFFT-Bibliothek zum Berechnen von FFT, die ähnlich CUDA cuFFT ist.
  • 30 veranschaulicht eine OpenCL-Implementierung des Softwarestapels 2700 der 27 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform umfasst ein OpenCL-Softwarestapel 3000, mit dem eine Anwendung 3001 gestartet werden kann, ein OpenCL-Framework 3010, eine OpenCL-Laufzeit 3006 und einen Treiber 3007. In mindestens einer Ausführungsform wird der OpenCL-Softwarestapel 3000 auf Hardware 2809 ausgeführt, die nicht herstellerspezifisch ist. Da OpenCL durch Vorrichtungen unterstützt wird, die von verschiedenen Herstellern entwickelt wurden, können in mindestens einer Ausführungsform spezifische OpenCL-Treiber erforderlich sein, um mit Hardware von solchen Herstellern zusammenzuwirken.
  • In mindestens einer Ausführungsform können die Anwendung 3001, die OpenCL-Laufzeit 3006, der Vorrichtungskerneltreiber 3007 und die Hardware 3008 ähnliche Funktionalitäten wie die Anwendung 2701, die Laufzeit 2705, der Vorrichtungskerneltreiber 2706 bzw. die Hardware 2707 durchführen, die vorstehend in Verbindung mit 27 beschrieben wurden. In mindestens einer Ausführungsform beinhaltet die Anwendung 3001 ferner einen OpenCL-Kernel 3002 mit Code, der auf einer Vorrichtung ausgeführt werden soll.
  • In mindestens einer Ausführungsform definiert OpenCL eine „Plattform“, die es einem Host ermöglicht, mit dem Host verbundene Vorrichtungen zu steuern. In mindestens einer Ausführungsform stellt ein OpenCL-Framework eine Plattformschicht-API und eine Laufzeit-API bereit, die als Plattform-API 3003 und Laufzeit-API 3005 gezeigt sind. In mindestens einer Ausführungsform verwendet die Laufzeit-API 3005 Kontexte, um die Ausführung von Kerneln auf Vorrichtungen zu verwalten. In mindestens einer Ausführungsform kann jede identifizierte Vorrichtung einem jeweiligen Kontext zugeordnet sein, den die Laufzeit-API 3005 verwenden kann, für diese Vorrichtung um unter anderem Befehlswarteschlangen, Programmobjekte und Kernelobjekte zu verwalten und Speicherobjekte gemeinsam zu nutzen. In mindestens einer Ausführungsform legt die Plattform-API 3003 Funktionen offen, die unter anderem die Verwendung von Vorrichtungskontexten zum Auswählen und Initialisieren von Vorrichtungen, zum Übermitteln von Arbeit an Vorrichtungen über Befehlswarteschlangen und zum Ermöglichen der Datenübertragung zu und von Vorrichtungen zulassen. Darüber hinaus stellt das OpenCL-Framework in mindestens einer Ausführungsform verschiedene integrierte Funktionen (nicht gezeigt) bereit, einschließlich unter anderem mathematischer Funktionen, relationaler Funktionen und Bildverarbeitungsfunktionen.
  • In mindestens einer Ausführungsform ist in dem OpenCL-Framework 3010 auch ein Compiler 3004 beinhalten. 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 3004 kompiliert werden, der beinhaltet ist, um repräsentativ für eine beliebige Anzahl von Compilern zu sein, die verwendet werden kann, um Quellcode und/oder IR-Code, wie etwa Portable Intermediate Representation („SPIR-V“)-Code, in Binärcode zu kompilieren. Alternativ können in mindestens einer Ausführungsform OpenCL-Anwendungen offline kompiliert werden, bevor solche Anwendungen ausgeführt werden.
  • 31 veranschaulicht Software, die durch eine Programmierplattform unterstützt wird, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist eine Programmierplattform 3104 konfiguriert, um verschiedene Programmiermodelle 3103, Middlewares und/oder Bibliotheken 3102 und Frameworks 3101 zu unterstützen, auf die eine Anwendung 3100 zurückgreifen kann. In mindestens einer Ausführungsform kann die Anwendung 3100 eine KI/ML-Anwendung sein, die beispielsweise unter Verwendung 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 eine beschleunigte Datenverarbeitung auf der zugrunde liegenden Hardware bereitzustellen.
  • In mindestens einer Ausführungsform kann die Programmierplattform 3104 eine der vorstehend in Verbindung mit 28, 29 bzw. 30 beschriebenen CUDA-, ROCm- oder OpenCL-Plattformen sein. In mindestens einer Ausführungsform unterstützt die Programmierplattform 3104 mehrere Programmiermodelle 3103, die Abstraktionen eines zugrunde liegenden Rechensystems sind, das Ausdrücke von Algorithmen und Datenstrukturen zulässt. Die Programmiermodelle 3103 können in mindestens einer Ausführungsform Merkmale der zugrunde liegenden Hardware offenlegen, um die Leistungsfähigkeit zu verbessern. In mindestens einer Ausführungsform können die Programmiermodelle 3103 CUDA, HIP, OpenCL, C++ Accelerated Massive Parallelism („C++AMP“), Open Multi-Processing („OpenMP“), Open Accelerators („OpenACC“) und/oder Vulcan Compute beinhalten, ohne darauf beschränkt zu sein.
  • In mindestens einer Ausführungsform stellen Bibliotheken und/oder Middlewares 3102 Implementierungen von Abstraktionen von Programmiermodellen 3104 bereit. In mindestens einer Ausführungsform können derartige Bibliotheken Daten und Programmiercode beinhalten, die durch Computerprogramme verwendet und während der Softwareentwicklung eingesetzt werden können. In mindestens einer Ausführungsform beinhalten solche Middlewares Software, die Dienste für Anwendungen bereitstellt, die über diejenigen hinausgehen, die von der Programmierplattform 3104 verfügbar sind. In mindestens einer Ausführungsform können die Bibliotheken und/oder Middlewares 3102 cuBLAS-, cuFFT-, cuRAND- und andere CUDA-Bibliotheken oder rocBLAS-, rocFFT-, rocRAND- und andere ROCm-Bibliotheken beinhalten, ohne darauf beschränkt zu sein. Darüber hinaus können die Bibliotheken und/oder Middlewares 3102 in mindestens einer Ausführungsform NCCL- und ROCm-Communication-Collectives-Library(„RCCL“)-Bibliotheken, die Kommunikationsroutinen für GPU bereitstellen, eine MlOpen-Bibliothek für Deep Learning-Beschleunigung und/oder eine Eigen-Bibliothek für lineare Algebra, Matrix- und Vektoroperationen, geometrische Transformationen, numerische Solver und verwandte Algorithmen beinhalten.
  • In mindestens einer Ausführungsform hängen die Anwendungs-Frameworks 3101 von den Bibliotheken und/oder Middlewares 3102 ab. In mindestens einer Ausführungsform ist jedes der Anwendungs-Frameworks 3101 ein Software-Framework, das verwendet wird, um eine Standardstruktur von Anwendungssoftware zu implementieren. Um auf das oben erörterte KI/ML-Beispiel zurückzukommen, kann eine KI/ML-Anwendung in mindestens einer Ausführungsform mit einem Framework wie Caffe, Caffe2, TensorFlow, Keras, PyTorch oder MxNet Deep Learning Frameworks implementiert werden.
  • 32 veranschaulicht das Kompilieren von Code zum Ausführen auf einer der Programmierplattformen der 27-30 gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform empfängt ein Compiler 3201 Quellcode 3200, der sowohl Host-Code als auch Vorrichtungscode beinhaltet. In mindestens einer Ausführungsform ist der Compiler 3201 konfiguriert, um den Quellcode 3200 in einen von dem Host ausführbaren Code 3202 zur Ausführung auf einem Host und in einen von der Vorrichtung ausführbaren Code 3203 zur Ausführung auf einer Vorrichtung umzuwandeln. Der Quellcode 3200 kann in mindestens einer Ausführungsform 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 3200 Code in einer beliebigen Programmiersprache beinhalten, die durch den Compiler 3201 unterstützt wird, wie etwa C++, C, Fortran usw. In mindestens einer Ausführungsform kann der Quellcode 3200 in einer Einzelquelldatei mit einer Mischung aus Host-Code und Vorrichtungscode beinhaltet sein, wobei darin Stellen des Vorrichtungscodes angegeben sind. In mindestens einer Ausführungsform kann eine Einzelquelldatei eine .cu-Datei, die CUDA-Code beinhaltet, oder eine .hip.cpp-Datei, die HIP-Code beinhaltet, sein. Alternativ kann der Quellcode 3200 in mindestens einer Ausführungsform Mehrfachquellen-Codedateien an Stelle einer Einzelquelldatei beinhalten, in die Host-Code und Vorrichtungscode getrennt sind.
  • In mindestens einer Ausführungsform ist der Compiler 3201 konfiguriert, um den Quellcode 3200 in den von dem Host ausführbaren Code 3202 zur Ausführung auf einem Host und in den von der Vorrichtung ausführbaren Code 3203 zur Ausführung auf einer Vorrichtung zu kompilieren. In mindestens einer Ausführungsform führt der Compiler 3201 Operationen durch, die das Parsen des Quellcodes 3200 in einen abstrakten Systembaum (abstract system tree - AST), das Durchführen von Optimierungen und das Generieren von ausführbarem Code beinhalten. In mindestens einer Ausführungsform, in welcher der Quellcode 3200 eine Einzelquelldatei beinhaltet, kann der Compiler 3201 den Vorrichtungscode von dem Host-Code in einer solchen Einzelquelldatei trennen, den Vorrichtungscode und den Host-Code in einen von der Vorrichtung ausführbaren Code 3203 bzw. einen von dem Host ausführbaren Code 3202 kompilieren und den von der Vorrichtung ausführbaren Code 3203 und den von dem Host ausführbaren Code 3202 miteinander in einer Einzeldatei verlinken, wie nachstehend in Bezug auf 33 ausführlicher erörtert wird.
  • In mindestens einer Ausführungsform können der von dem Host ausführbare Code 3202 und der von der Vorrichtung ausführbare Code 3203 in einem beliebigen geeigneten Format vorliegen, wie etwa als Binärcode und/oder IR-Code. Im Falle von CUDA kann der von dem Host ausführbare Host 3202 in mindestens einer Ausführungsform einen nativen Objektcode und der von der Vorrichtung ausführbare Code 3203 einen Code in PTX-Zwischendarstellung beinhalten. Im Falle von ROCm können sowohl der von dem Host ausführbare Code 3202 als auch der von der Vorrichtung ausführbare Code 3203 in mindestens einer Ausführungsform einen Ziel-Binärcode beinhalten.
  • 33 ist eine detailliertere Veranschaulichung der Kompilierung von Code zur Ausführung auf einer der Programmierplattformen der 27 - 30, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform ist ein Compiler 3301 so konfiguriert, dass er Quellcode 3300 empfängt, Quellcode 3300 kompiliert und eine ausführbare Datei 3310 ausgibt. In mindestens einer Ausführungsform ist der Quellcode 3300 eine Einzelquelldatei, wie etwa eine .cu-Datei, eine .hip.cpp-Datei oder eine Datei in einem anderen Format, die sowohl Hostals auch Vorrichtungscode enthält. In mindestens einer Ausführungsform kann der Compiler 3301 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 3301 ein Compiler-Frontend 3302, einen Host-Compiler 3305, einen Vorrichtungs-Compiler 3306 und einen Linker 3309. In mindestens einer Ausführungsform ist das Compiler-Frontend 3302 so konfiguriert, dass der Vorrichtungscode 3304 von dem Host-Code 3303 in dem Quellcode 3300 getrennt wird. Vorrichtungscode 3304 wird von Vorrichtungs-Compiler 3306 in von der Vorrichtung ausführbaren Code 3308 kompiliert, der, wie beschrieben, in mindestens einer Ausführungsform Binärcode oder IR-Code beinhalten kann. Getrennt davon wird der Host-Code 3303 in mindestens einer Ausführungsform von dem Host-Compiler 3305 in den von dem Host ausführbaren Code 3307 kompiliert. Für NVCC kann der Host-Compiler 3305 ein allgemeiner C/C++-Compiler sein, der nativen Objektcode ausgibt, während der Vorrichtungs-Compiler 3306 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, mindestens in einer Ausführungsform. Für HCC können sowohl der Host-Compiler 3305 als auch der Vorrichtungs-Compiler 3306 in mindestens einer Ausführungsform LLVM-basierte Compiler sein, die Ziel-Binärcode ausgeben, sind jedoch nicht darauf beschränkt.
  • Im Anschluss an die Kompilierung des Quellcodes 3300 in einen von dem Host ausführbaren Host 3307 und einen von der Vorrichtung ausführbaren Code 3308 verknüpft der Linker 3309 in mindestens einer Ausführungsform den ausführbaren Host- und Vorrichtungscode 3307 und 3308 in einer ausführbaren Datei 3310 miteinander. In mindestens einer Ausführungsform können nativer Objektcode für einen Host und PTX- oder Binärcode für eine Vorrichtung in einer Executable and Linkable Format („ELF“)-Datei miteinander verknüpft werden, die ein Containerformat zum Speichern von Objektcode ist.
  • 34 veranschaulicht die Übersetzung des Quellcodes vor der Kompilierung des Quellcodes gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform wird der Quellcode 3400 durch ein Übersetzungswerkzeug 3401 geleitet, das den Quellcode 3400 in übersetzten Quellcode 3402 übersetzt. In mindestens einer Ausführungsform wird ein Compiler 3403 verwendet, um den übersetzten Quellcode 3402 in einen ausführbaren Host-Code 3404 und einen ausführbaren Vorrichtungscode 3405 zu kompilieren, und zwar in einem Prozess, der der Kompilierung des Quellcodes 3200 durch den Compiler 3201 in einen ausführbaren Host-Code 3202 und einen ausführbaren Vorrichtungscode 3203 ähnelt, wie vorstehend in Verbindung mit 32 beschrieben.
  • In mindestens einer Ausführungsform wird eine von dem Übersetzungswerkzeug 3401 durchgeführte Übersetzung verwendet, um den Quellcode 3400 für die Ausführung in einer anderen Umgebung zu portieren als der, in der er ursprünglich ausgeführt werden sollte. In mindestens einer Ausführungsform kann das Übersetzungswerkzeug 3401 unter anderem einen HIP-Übersetzer beinhalten, der dazu dient, den für eine CUDA-Plattform bestimmten CUDA-Code in HIP-Code zu „hipifizieren“, der auf einer ROCm-Plattform kompiliert und ausgeführt werden kann. In mindestens einer Ausführungsform kann die Übersetzung des Quellcodes 3400 das Parsen des Quellcodes 3400 und das Konvertieren von Aufrufen zu API(s), die von einem Programmiermodell (z. B. CUDA) bereitgestellt werden, in entsprechende Aufrufe zu API(s), die von einem anderen Programmiermodell (z. B. HIP) bereitgestellt werden, beinhalten, wie nachstehend in Verbindung mit den 35A - 36 ausführlicher erläutert. 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 umgewandelt werden. In mindestens einer Ausführungsform können die von dem Übersetzungswerkzeug 3401 durchgeführten automatischen Übersetzungen manchmal unvollständig sein, sodass zusätzlicher manueller Aufwand erforderlich ist, um den Quellcode 3400 vollständig zu portieren.
  • Konfigurieren von GPUs für allgemeine Berechnungen
  • Die folgenden Figuren zeigen, ohne Einschränkung, beispielhafte Architekturen für die Kompilierung und Ausführung von Berechnungsquellcode, gemäß mindestens einer Ausführungsform.
  • 35A veranschaulicht ein System 35A00, das so konfiguriert ist, dass es CUDA-Quellcode 3510 unter Verwendung verschiedener Arten von Verarbeitungseinheiten gemäß mindestens einer Ausführungsform kompiliert und ausführt. In mindestens einer Ausführungsform beinhaltet das System 35A00 ohne Einschränkung den CUDA-Quellcode 3510, einen CUDA-Compiler 3550, den von dem Host ausführbaren Host 3570(1), den von dem Host ausführbaren Host 3570(2), den von der CUDA-Vorrichtung ausführbaren Code 3584, eine CPU 3590, eine CUDA-fähige GPU 3594, eine GPU 3592, ein CUDA-zu-HIP-Übersetzungswerkzeug 3520, den HIP-Quellcode 3530, einen HIP-Compilertreiber 3540, ein HCC 3560 und den von der HCC-Vorrichtung ausführbaren Code 3582.
  • In mindestens einer Ausführungsform ist der CUDA-Quellcode 3510 eine Sammlung von menschenlesbarem Code in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Code ein vom Menschen lesbarer Code 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 Vorrichtungscode und zur Unterscheidung zwischen Vorrichtungscode und Host-Code enthält. In mindestens einer Ausführungsform ist der Vorrichtungscode ein Quellcode, der nach der Kompilierung parallel auf einer Vorrichtung ausführbar ist. In mindestens einer Ausführungsform kann eine Vorrichtung ein Prozessor sein, der für die parallele Anweisungsverarbeitung optimiert ist, wie etwa eine CUDA-fähige GPU 3590, GPU 35192 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 sequentielle Anweisungsverarbeitung optimiert ist, wie etwa die CPU 3590.
  • In mindestens einer Ausführungsform beinhaltet der CUDA-Quellcode 3510 ohne Einschränkung eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3512, eine beliebige Anzahl (einschließlich Null) von Vorrichtungsfunktionen 3514, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3516 und eine beliebige Anzahl (einschließlich Null) von Host/Vorrichtungsfunktionen 3518. In mindestens einer Ausführungsform können globale Funktionen 3512, Vorrichtungsfunktionen 3514, Hostfunktionen 3516 und Host/Vorrichtungsfunktionen 3518 in dem CUDA-Quellcode 3510 gemischt werden. In mindestens einer Ausführungsform ist jede der globalen Funktionen 3512 auf einer Vorrichtung ausführbar und von einem Host aufrufbar. In mindestens einer Ausführungsform können daher eine oder mehrere der globalen Funktionen 3512 als Eingangspunkte zu einer Vorrichtung dienen. In mindestens einer Ausführungsform ist jede der globalen Funktionen 3512 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 3512 einen Kernel, der auf einer Vorrichtung ausführbar ist und von einer solchen Vorrichtung aus aufgerufen werden kann. In mindestens einer Ausführungsform wird ein Kernel N (wobei N eine beliebige positive Ganzzahl ist) Mal parallel von N verschiedenen Threads auf einer Vorrichtung während der Ausführung ausgeführt.
  • In mindestens einer Ausführungsform wird jede der Vorrichtungsfunktionen 3514 auf einer Vorrichtung ausgeführt und kann nur von einer solchen Vorrichtung aus aufgerufen werden. In mindestens einer Ausführungsform wird jede der Host-Funktionen 3516 auf einem Host ausgeführt und kann nur von einem solchen Host aus aufgerufen werden. In mindestens einer Ausführungsform definiert jede der Host/Vorrichtungsfunktionen 3516 sowohl eine Host-Version einer Funktion, die auf einem Host ausführbar und nur von einem solchen Host aufrufbar ist, als auch eine Vorrichtungsversion der Funktion, die auf einer Vorrichtung ausführbar und nur von einer solchen Vorrichtung aufrufbar ist.
  • In mindestens einer Ausführungsform kann der CUDA-Quellcode 3510 auch ohne Einschränkung eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen beinhalten, die über eine CUDA-Laufzeit-API 3502 definiert sind. In mindestens einer Ausführungsform kann die CUDA-Laufzeit-API 3502 ohne Einschränkung eine beliebige Anzahl von Funktionen beinhalten, die auf einem Host ausgeführt werden, um Vorrichtungsspeicher zuzuweisen und freizugeben, Daten zwischen Hostspeicher und Vorrichtungsspeicher zu übertragen, Systeme mit mehreren Vorrichtungen zu verwalten usw. In mindestens einer Ausführungsform kann der CUDA-Quellcode 3510 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen beinhalten, 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 beinhalten CUDA-APIs ohne Einschränkung die CUDA-Laufzeit-API 3502, eine CUDA-Treiber-API, APIs für eine beliebige Anzahl von CUDA-Bibliotheken usw. In mindestens einer Ausführungsform ist eine CUDA-Treiber-API im Vergleich zur CUDA-Laufzeit-API 3502 eine API auf niedrigerer Ebene, die jedoch eine feinkörnigere Steuerung einer Vorrichtung ermöglicht. In mindestens einer Ausführungsform beinhalten Beispiele für CUDA-Bibliotheken ohne Einschränkung cuBLAS, cuFFT, cuRAND, cuDNN, usw.
  • In mindestens einer Ausführungsform kompiliert der CUDA-Compiler 3550 den eingegebenen CUDA-Code (z. B. den CUDA-Quellcode 3510), um den ausführbaren Host-Code 3570(1) und den ausführbaren CUDA-Vorrichtungscode 3584 zu generieren. In mindestens einer Ausführungsform ist der CUDA-Compiler 3550 NVCC. In mindestens einer Ausführungsform ist der ausführbare Host-Code 3570(1) eine kompilierte Version des Host-Codes, der im Eingabe-Quellcode beinhaltet ist, der auf der CPU 3590 ausführbar ist. In mindestens einer Ausführungsform kann die CPU 3590 ein beliebiger Prozessor sein, der für die sequentielle Anweisungsverarbeitung optimiert ist.
  • In mindestens einer Ausführungsform ist der ausführbare CUDA-Vorrichtungscode 3584 eine kompilierte Version des Vorrichtungscodes, der im Eingabe-Quellcode beinhaltet ist, der auf der CUDA-fähigen GPU- 3594 ausführbar ist. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung Binärcode. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung IR-Code, wie PTX-Code, der zur Laufzeit von einem Vorrichtungstreiber in Binärcode für eine bestimmte Zielvorrichtung (z. B. CUDA-fähige GPU 3594) kompiliert wird. In mindestens einer Ausführungsform kann der CUDA-fähige GPU 3594 ein beliebiger Prozessor sein, der für die parallele Anweisungsverarbeitung optimiert ist und CUDA unterstützt. In mindestens einer Ausführungsform wird der CUDA-fähige GPU 3594 von der NVIDIA Corporation in Santa Clara, CA, entwickelt.
  • In mindestens einer Ausführungsform ist das CUDA-HIP-Übersetzungswerkzeug 3520 so konfiguriert, dass es den CUDA-Quellcode 3510 in einen funktionell ähnlichen HIP-Quellcode 3530 übersetzt. In mindestens einer Ausführungsform ist der HIP-Quellcode 3530 eine Sammlung von vom Menschen lesbarem Code in einer HIP-Programmiersprache. In mindestens einer Ausführungsform ist der HIP-Code ein menschenlesbarer Code in einer HIP-Programmiersprache. In mindestens einer Ausführungsform ist eine HIP-Programmiersprache eine Erweiterung der C++-Programmiersprache, die ohne Einschränkung funktionell ähnliche Versionen von CUDA-Mechanismen zur Definition von Vorrichtungscode und zur Unterscheidung zwischen Vorrichtungscode und Host-Code enthält. In mindestens einer Ausführungsform kann eine HIP-Programmiersprache eine Teilmenge der Funktionellität einer CUDA-Programmiersprache beinhalten. In mindestens einer Ausführungsform beinhaltet eine HIP-Programmiersprache beispielsweise ohne Einschränkung Mechanismen zur Definition globaler Funktionen 3512, aber einer solchen HIP-Programmiersprache kann die Unterstützung für dynamische Parallelität fehlen, sodass im HIP-Code definierte globale Funktionen 3512 nur von einem Host aus aufrufbar sein können.
  • In mindestens einer Ausführungsform beinhaltet der HIP-Quellcode 3530 ohne Einschränkung eine beliebige Anzahl (einschließlich Null) von globalen Funktionen 3512, eine beliebige Anzahl (einschließlich Null) von Vorrichtungsfunktionen 3514, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3516 und eine beliebige Anzahl (einschließlich Null) von Host/Vorrichtungsfunktionen 3518. In mindestens einer Ausführungsform kann der HIP-Quellcode 3530 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen beinhalten, die in einer HIP-Laufzeit-API 3532 angegeben sind. In mindestens einer Ausführungsform beinhaltet die HIP-Laufzeit-API 3532 ohne Einschränkung funktionell ähnliche Versionen einer Teilmenge von Funktionen, die in der CUDA-Laufzeit-API 3502 beinhalten sind. In mindestens einer Ausführungsform kann der HIP-Quellcode 3530 auch eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen beinhalten, die in einer beliebigen Anzahl von anderen HIP-APls 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 beinhalten HIP-APls ohne Einschränkung die HIP-Laufzeit-API 3532, 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 wandelt das CUDA-HIP-Übersetzungswerkzeug 3520 jeden Kernel-Aufruf im CUDA-Code von einer CUDA-Syntax in eine HIP-Syntax um und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe im 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 ein HIP-Aufruf ein Aufruf einer Funktion, die in einer HIP-API angegeben ist. In mindestens einer Ausführungsform wandelt das CUDA-HIP-Übersetzungswerkzeug 3520 eine beliebige Anzahl von Aufrufen von Funktionen, die in der CUDA-Laufzeit-API 3502 angegeben sind, in eine beliebige Anzahl von Aufrufen von Funktionen um, die in der HIP-Laufzeit-API 3532 angegeben sind.
  • In mindestens einer Ausführungsform ist das CUDA-zu-HIP-Übersetzungswerkzeug 3520 ein als hipify-perl bekanntes Werkzeug, das einen textbasierten Übersetzungsprozess ausführt. In mindestens einer Ausführungsform ist das CUDA-HIP-Übersetzungswerkzeug 3520 ein als hipify-clang bekanntes Werkzeug, das im Vergleich zu hipify-perl einen komplexeren und robusteren Übersetzungsprozess durchführt, der das Parsen von CUDA-Code mit clang (einem Compiler-Frontend) und die anschließende Übersetzung der resultierenden Symbole umfasst. In mindestens einer Ausführungsform kann die ordnungsgemäße Umwandlung von CUDA-Code in HIP-Code zusätzlich zu den von dem CUDA-zu-HIP-Übersetzungswerkzeug 3520 durchgeführten Modifikationen (z. B. manuelle Änderungen) erforderlich sein.
  • In mindestens einer Ausführungsform ist der HIP-Compilertreiber 3540 ein Frontend, das eine Zielvorrichtung 3546 bestimmt und dann einen Compiler konfiguriert, der mit der Zielvorrichtung 3546 kompatibel ist, um den HIP-Quellcode 3530 zu kompilieren. In mindestens einer Ausführungsform ist die Zielvorrichtung 3546 ein Prozessor, der für die parallele Anweisungsverarbeitung optimiert ist. In mindestens einer Ausführungsform kann der HIP-Compilertreiber 3540 die Zielvorrichtung 3546 auf jede technisch machbare Weise bestimmen.
  • In mindestens einer Ausführungsform, wenn die Zielvorrichtung 3546 mit CUDA kompatibel ist (z. B. CUDA-fähige GPU 3594), generiert der HIP-Compilertreiber 3540 einen HIP/NVCC-Kompilierungsbefehl 3542. In mindestens einer Ausführungsform und wie in Verbindung mit 35B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 3542 den CUDA-Compiler 3550 so, dass er den HIP-Quellcode 3530 kompiliert, wobei ohne Einschränkung ein HIP-zu-CUDA-Übersetzungsheader und eine CUDA-Laufzeitbibliothek verwendet werden. In mindestens einer Ausführungsform und als Reaktion auf den HIP/NVCC-Kompilierungsbefehl 3542 generiert der CUDA-Compiler 3550 einen ausführbaren Host-Code 3570(1) und einen ausführbaren CUDA-Vorrichtungscode 3584.
  • In mindestens einer Ausführungsform, wenn die Zielvorrichtung 3546 nicht mit CUDA kompatibel ist, generiert der HIP-Compilertreiber 3540 einen HIP/HCC-Kompilierungsbefehl 3544. In mindestens einer Ausführungsform und wie in Verbindung mit 35C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 3544 die HCC 3560 so, dass sie den HIP-Quellcode 3530 kompiliert, wobei sie ohne Einschränkung einen HCC-Header und eine HIP/HCC-Laufzeitbibliothek verwendet. In mindestens einer Ausführungsform und als Reaktion auf den HIP/HCC-Kompilierungsbefehl 3544 generiert HCC 3560 einen ausführbaren Host-Code 3570(2) und einen ausführbaren HCC-Vorrichtungscode 3582. In mindestens einer Ausführungsform ist der ausführbare HCC-Vorrichtungscode 3582 eine kompilierte Version des in dem HIP-Quellcode 3530 beinhaltenen Vorrichtungscodes, der auf der GPU 3592 ausführbar ist. In mindestens einer Ausführungsform kann die GPU 3592 ein beliebiger Prozessor sein, der für die parallele Anweisungsverarbeitung optimiert, nicht mit CUDA kompatibel und mit HCC kompatibel ist. In mindestens einer Ausführungsform wird die GPU 3592 von der AMD Corporation in Santa Clara, CA, entwickelt. In mindestens einer Ausführungsform ist die GPU 3592 eine nicht CUDA-fähige GPU 3592.
  • Zur Veranschaulichung sind in 35A drei verschiedene Abläufe abgebildet, die in mindestens einer Ausführungsform implementiert werden können, um CUDA-Quellcode 3510 zur Ausführung auf CPU 3590 und verschiedenen Vorrichtungen zu kompilieren. In mindestens einer Ausführungsform kompiliert ein direkter CUDA-Ablauf den CUDA-Quellcode 3510 für die Ausführung auf der CPU 3590 und der CUDA-fähigen GPU 3594, ohne den CUDA-Quellcode 3510 in den HIP-Quellcode 3530 zu übersetzen. In mindestens einer Ausführungsform übersetzt ein indirekter CUDA-Fluss den CUDA-Quellcode 3510 in den HIP-Quellcode 3530 und kompiliert dann den HIP-Quellcode 3530 für die Ausführung auf der CPU 3590 und der CUDA-fähigen GPU 3594. In mindestens einer Ausführungsform übersetzt ein CUDA/HCC-Fluss den CUDA-Quellcode 3510 in den HIP-Quellcode 3530 und kompiliert dann den HIP-Quellcode 3530 für die Ausführung auf der CPU 3590 und der GPU 3592.
  • Ein direkter CUDA-Ablauf, der in mindestens einer Ausführungsform implementiert werden kann, wird durch gestrichelte Linien und eine Reihe von Blasen mit der Bezeichnung A1-A3 abgebildet. In mindestens einer Ausführungsform und wie in der mit A1 bezeichneten Blase abgebildet, empfängt der CUDA-Compiler 3550 den CUDA-Quellcode 3510 und einen CUDA-Kompilierungsbefehl 3548, der den CUDA-Compiler 3550 für die Kompilierung des CUDA-Quellcodes 3510 konfiguriert. In mindestens einer Ausführungsform ist der CUDA-Quellcode 3510, der in einem direkten CUDA-Fluss verwendet wird, in einer CUDA-Programmiersprache geschrieben, die auf einer anderen Programmiersprache als C++ basiert (z. B. C, Fortran, Python, Java usw.). In mindestens einer Ausführungsform und als Reaktion auf den CUDA-Kompilierungsbefehl 3548 generiert der CUDA-Compiler 3550 einen ausführbaren Host-Code 3570(1) und einen ausführbaren CUDA-Vorrichtungscode 3584 (abgebildet mit der Blase A2). In mindestens einer Ausführungsform und wie in der mit A3 gekennzeichneten Blase abgebildet, können der ausführbare Host-Code 3570(1) und der ausführbare CUDA-Vorrichtungscode 3584 auf der CPU 3590 bzw. der CUDA-fähigen GPU 3594 ausgeführt werden. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung Binärcode. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung PTX-Code und wird zur Laufzeit ferner in Binärcode für eine bestimmte Zielvorrichtung kompiliert.
  • Ein indirekter CUDA-Fluss, der in mindestens einer Ausführungsform implementiert werden kann, wird durch gestrichelte Linien und eine Reihe von Blasen mit der Bezeichnung B1-B6 abgebildet. In mindestens einer Ausführungsform und wie in der mit B1 gekennzeichneten Blase abgebildet, empfängt das CUDA-HIP-Übersetzungswerkzeug 3520 den CUDA-Quellcode 3510. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung B2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 3520 den CUDA-Quellcode 3510 in den HIP-Quellcode 3530. In mindestens einer Ausführungsform und wie in der mit B3 gekennzeichneten Blase dargestellt, empfängt der HIP-Compilertreiber 3540 den HIP-Quellcode 3530 und stellt fest, dass die Zielvorrichtung 3546 CUDA-fähig ist.
  • In mindestens einer Ausführungsform und wie in der mit B4 bezeichneten Blase abgebildet, generiert der HIP-Compilertreiber 3540 den HIP/NVCC-Kompilierungsbefehl 3542 und überträgt sowohl den HIP/NVCC-Kompilierungsbefehl 3542 als auch den HIP-Quellcode 3530 an den CUDA-Compiler 3550. In mindestens einer Ausführungsform und wie in Verbindung mit 35B ausführlicher beschrieben, konfiguriert der HIP/NVCC-Kompilierungsbefehl 3542 den CUDA-Compiler 3550 so, dass er den HIP-Quellcode 3530 kompiliert, wobei ohne Einschränkung ein HIP-zu-CUDA-Übersetzungsheader und eine CUDA-Laufzeitbibliothek verwendet werden. In mindestens einer Ausführungsform und als Reaktion auf den HIP/NVCC-Kompilierungsbefehl 3542 generiert der CUDA-Compiler 3550 einen ausführbaren Host-Code 3570(1) und einen ausführbaren CUDA-Vorrichtungscode 3584 (abgebildet mit der Blase B5). In mindestens einer Ausführungsform und wie in Blase B6 abgebildet, können der ausführbare Host-Code 3570(1) und der ausführbare CUDA-Vorrichtungscode 3584 auf der CPU 3590 bzw. der CUDA-fähigen GPU 3594 ausgeführt werden. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung Binärcode. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung PTX-Code und wird zur Laufzeit ferner in Binärcode für eine bestimmte Zielvorrichtung kompiliert.
  • Ein CUDA/HCC-Ablauf, der in mindestens einer Ausführungsform implementiert werden kann, wird durch durchgezogene Linien und eine Reihe von Blasen mit der Bezeichnung C1-C6 abgebildet. In mindestens einer Ausführungsform und wie in der mit C1 gekennzeichneten Blase abgebildet, empfängt das CUDA-HIP-Übersetzungswerkzeug 3520 den CUDA-Quellcode 3510. In mindestens einer Ausführungsform und wie mit der Blase mit der Bezeichnung C2 dargestellt, übersetzt das CUDA-HIP-Übersetzungswerkzeug 3520 den CUDA-Quellcode 3510 in den HIP-Quellcode 3530. In mindestens einer Ausführungsform und wie in der Blase C3 abgebildet, empfängt der HIP-Compilertreiber 3540 den HIP-Quellcode 3530 und stellt fest, dass die Zielvorrichtung 3546 nicht CUDA-fähig ist.
  • In mindestens einer Ausführungsform generiert der HIP-Compilertreiber 3540 den HIP/HCC-Kompilierungsbefehl 3544 und überträgt sowohl den HIP/HCC-Kompilierungsbefehl 3544 als auch den HIP-Quellcode 3530 an den HCC 3560 (abgebildet mit der Blase mit der Bezeichnung C4). In mindestens einer Ausführungsform und wie in Verbindung mit 35C ausführlicher beschrieben, konfiguriert der HIP/HCC-Kompilierungsbefehl 3544 die HCC 3560 so, dass sie den HIP-Quellcode 3530 kompiliert, wobei sie ohne Einschränkung einen HCC-Header und eine HIP/HCC-Laufzeitbibliothek verwendet. In mindestens einer Ausführungsform und als Reaktion auf den HIP/HCC-Kompilierungsbefehl 3544 generiert HCC 3560 einen ausführbaren Host-Code 3570(2) und einen ausführbaren HCC-Vorrichtungscode 3582 (abgebildet mit einer mit C5 bezeichneten Blase). In mindestens einer Ausführungsform und wie in der mit C6 bezeichneten Blase abgebildet, können der ausführbare Host-Code 3570(2) und der ausführbare HCC-Vorrichtungscode 3582 auf der CPU 3590 bzw. der GPU 3592 ausgeführt werden.
  • In mindestens einer Ausführungsform kann, nachdem der CUDA-Quellcode 3510 in HIP-Quellcode 3530 übersetzt wurde, der HIP-Compilertreiber 3540 anschließend verwendet werden, um ausführbaren Code entweder für die CUDA-fähige GPU 3594 oder die GPU 3592 zu generieren, ohne das CUDA-HIP-Übersetzungswerkzeug 3520 erneut auszuführen. In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 3520 den CUDA-Quellcode 3510 in den HIP-Quellcode 3530, der dann im Speicher abgelegt wird. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3540 dann den HCC 3560, um auf der Grundlage des HIP-Quellcodes 3530 einen ausführbaren Host-Code 3570(2) und einen ausführbaren HCC-Vorrichtungscode 3582 zu generieren. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3540 anschließend den CUDA-Compiler 3550, um auf der Grundlage des gespeicherten HIP-Quellcodes 3530 ausführbaren Host-Code 3570(1) und ausführbaren CUDA-Vorrichtungscode 3584 zu generieren.
  • 35B veranschaulicht ein System 3504, das so konfiguriert ist, dass es den CUDA-Quellcode 3510 der 35A unter Verwendung einer CPU 3590 und einer CUDA-fähigen GPU 3594 gemäß mindestens einer Ausführungsform kompiliert und ausführt. In mindestens einer Ausführungsform beinhaltet das System 3504 ohne Einschränkung den CUDA-Quellcode 3510, das CUDA-HIP-Übersetzungswerkzeug 3520, den HIP-Quellcode 3530, den HIP-Compilertreiber 3540, den CUDA-Compiler 3550, den ausführbaren Host-Code 3570(1), den ausführbaren CUDA-Vorrichtungscode 3584, die CPU 3590 und die CUDA-fähige GPU 3594.
  • In mindestens einer Ausführungsform und wie zuvor in Verbindung mit 35A beschrieben, beinhaltet der CUDA-Quellcode 3510 ohne Einschränkung eine beliebige Anzahl (einschließlich Null) globaler Funktionen 3512, eine beliebige Anzahl (einschließlich Null) von Vorrichtungsfunktionen 3514, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3516 und eine beliebige Anzahl (einschließlich Null) von Host/Vorrichtungsfunktionen 3518. In mindestens einer Ausführungsform beinhaltet der CUDA-Quellcode 3510 auch, ohne Einschränkung, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen, die in einer beliebigen Anzahl von CUDA-APIs angegeben sind.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 3520 den CUDA-Quellcode 3510 in den HIP-Quellcode 3530. In mindestens einer Ausführungsform konvertiert das CUDA-HIP-Übersetzungswerkzeug 3520 jeden Kernel-Aufruf in dem CUDA-Quellcode 3510 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem CUDA-Quellcode 3510 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform stellt der HIP-Compilertreiber 3540 fest, dass die Zielvorrichtung 3546 CUDA-fähig ist, und generiert den HIP/NVCC-Kompilierungsbefehl 3542. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3540 dann den CUDA-Compiler 3550 über den HIP/NVCC-Kompilierungsbefehl 3542, um den HIP-Quellcode 3530 zu kompilieren. In mindestens einer Ausführungsform bietet der HIP-Compilertreiber 3540 als Teil der Konfiguration des CUDA-Compilers 3550 Zugriff auf einen HIP-CUDA-Übersetzungsheader 3552. In mindestens einer Ausführungsform übersetzt der HIP-CUDA-Übersetzungsheader 3552 eine beliebige Anzahl von Mechanismen (z. B. Funktionen), die in einer beliebigen Anzahl von HIP-APls angegeben sind, in eine beliebige Anzahl von Mechanismen, die in einer beliebigen Anzahl von CUDA-APIs angegeben sind. In mindestens einer Ausführungsform verwendet der CUDA-Compiler 3550 den HIP-CUDA-Übersetzungsheader 3552 in Verbindung mit einer CUDA-Laufzeitbibliothek 3554, die der CUDA-Laufzeit-API 3502 entspricht, um ausführbaren Host-Code 3570(1) und ausführbaren CUDA-Vorrichtungscode 3584 zu generieren. In mindestens einer Ausführungsform können der ausführbare Host-Code 3570(1) und der ausführbare CUDA-Vorrichtungscode 3584 dann auf der CPU 3590 bzw. der CUDA-fähigen GPU 3594 ausgeführt werden. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung Binärcode. In mindestens einer Ausführungsform beinhaltet der ausführbare CUDA-Vorrichtungscode 3584 ohne Einschränkung PTX-Code und wird zur Laufzeit ferner in Binärcode für eine bestimmte Zielvorrichtung kompiliert.
  • 35C veranschaulicht ein System 3506, das so konfiguriert ist, dass es den CUDA-Quellcode 3510 der 35A unter Verwendung einer CPU 3590 und einer nicht CUDA-fähigen GPU 3592 kompiliert und ausführt, gemäß mindestens einer Ausführungsform. In mindestens einer Ausführungsform beinhaltet das System 3506, ohne Einschränkung, den CUDA-Quellcode 3510, das CUDA-HIP-Übersetzungswerkzeug 3520, den HIP-Quellcode 3530, den HIP-Compilertreiber 3540, HCC 3560, den ausführbaren Host-Code 3570(2), den ausführbaren HCC-Vorrichtungscode 3582, die CPU 3590 und die GPU 3592.
  • In mindestens einer Ausführungsform und wie zuvor in Verbindung mit 35A beschrieben, beinhaltet der CUDA-Quellcode 3510 ohne Einschränkung eine beliebige Anzahl (einschließlich Null) globaler Funktionen 3512, eine beliebige Anzahl (einschließlich Null) von Vorrichtungsfunktionen 3514, eine beliebige Anzahl (einschließlich Null) von Host-Funktionen 3516 und eine beliebige Anzahl (einschließlich Null) von Host/Vorrichtungsfunktionen 3518. In mindestens einer Ausführungsform beinhaltet der CUDA-Quellcode 3510 auch, ohne Einschränkung, eine beliebige Anzahl von Aufrufen zu einer beliebigen Anzahl von Funktionen, die in einer beliebigen Anzahl von CUDA-APIs angegeben sind.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 3520 den CUDA-Quellcode 3510 in den HIP-Quellcode 3530. In mindestens einer Ausführungsform konvertiert das CUDA-HIP-Übersetzungswerkzeug 3520 jeden Kernel-Aufruf in dem CUDA-Quellcode 3510 von einer CUDA-Syntax in eine HIP-Syntax und konvertiert eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 3510 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe.
  • In mindestens einer Ausführungsform stellt der HIP-Compilertreiber 3540 anschließend fest, dass die Zielvorrichtung 3546 nicht CUDA-fähig ist, und generiert den HIP/HCC-Kompilierungsbefehl 3544. In mindestens einer Ausführungsform konfiguriert der HIP-Compilertreiber 3540 dann HCC 3560, um den HIP/HCC-Kompilierungsbefehl 3544 auszuführen, um den HIP-Quellcode 3530 zu kompilieren. In mindestens einer Ausführungsform konfiguriert der HIP/HCC-Kompilierungsbefehl 3544 den HCC 3560 so, dass er ohne Einschränkung eine HIP/HCC-Laufzeitbibliothek 3558 und einen HCC-Header 3556 verwendet, um einen ausführbaren Host-Code 3570(2) und einen ausführbaren HCC-Vorrichtungscode 3582 zu generieren. In mindestens einer Ausführungsform entspricht die HIP/HCC-Laufzeitbibliothek 3558 der HIP-Laufzeit-API 3532. In mindestens einer Ausführungsform beinhaltet der HCC-Header 3556 ohne Einschränkung 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 3570(2) und der ausführbare HCC-Vorrichtungscode 3582 auf der CPU 3590 bzw. der GPU 3592 ausgeführt werden.
  • 36 veranschaulicht einen beispielhaften Kernel, der durch das CUDA-HIP-Übersetzungswerkzeug 3520 der 35C gemäß mindestens einer Ausführungsform übersetzt wurde. In mindestens einer Ausführungsform unterteilt der CUDA-Quellcode 3510 ein Gesamtproblem, das ein gegebener Kernel lösen soll, in relativ grobe Teilprobleme, die unabhängig voneinander mit Thread-Blöcken gelöst werden können. In mindestens einer Ausführungsform beinhaltet jeder Thread-Block ohne Einschränkung eine beliebige Anzahl von Threads. In mindestens einer Ausführungsform wird jedes Teilproblem in relativ feine Teile aufgeteilt, die von Threads innerhalb eines Thread-Blocks gemeinsam und parallel gelöst werden können. In mindestens einer Ausführungsform können Threads innerhalb eines Thread-Blocks zusammenarbeiten, indem sie Daten über einen gemeinsamen Speicher gemeinsam nutzen und die Ausführung synchronisieren, um die Speicherzugriffe zu koordinieren.
  • In mindestens einer Ausführungsform organisiert der CUDA-Quellcode 3510 Thread-Blöcke, die einem gegebenen Kernel zugeordnet sind, in einem eindimensionalen, zweidimensionalen oder dreidimensionalen Gitter von Thread-Blöcken. In mindestens einer Ausführungsform beinhaltet jeder Thread-Block, ohne Einschränkung, eine beliebige Anzahl von Threads, und ein Gitter beinhaltet, ohne Einschränkung, eine beliebige Anzahl von Thread-Blöcken.
  • In mindestens einer Ausführungsform ist ein Kernel eine Funktion im Vorrichtungscode, die mit einer „_global_“-Deklarationsbezeichner definiert wird. In mindestens einer Ausführungsform werden die Dimension eines Gitters, das einen Kernel für einen gegebenen Kernel-Aufruf ausführt, und die zugehörigen Ströme mit einer CUDA-Kernel-Startsyntax 3610 angegeben. In mindestens einer Ausführungsform wird die CUDA-Kernel-Startsyntax 3610 als „KernelName<<GridSize, BlockSize, SharedMemorySize, Stream>>>(KernelArguments);“ angegeben. In mindestens einer Ausführungsform ist eine Ausführungskonfigurationssyntax ein „<<<...>>>“-Konstrukt, das zwischen einem Kernel-Namen („KernelName“) und einer in Klammern gesetzten Liste von Kernel-Argumenten („KernelArguments“) eingefügt wird. In mindestens einer Ausführungsform beinhaltet die CUDA-Kernel-Startsyntax 3610 ohne Einschränkung eine CUDA-Startfunktionssyntax an Stelle einer Ausführungskonfigurationssyntax.
  • In mindestens einer Ausführungsform ist „GridSize“ vom Typ dim3 und gibt die Dimension und Größe eines Gitters an. In mindestens einer Ausführungsform ist der Typ dim3 eine von CUDA definierte Struktur, die ohne Einschränkung die vorzeichenlosen Ganzzahlen x, y und z beinhaltet. In mindestens einer Ausführungsform ist z standardmäßig gleich eins, wenn z nicht angegeben ist. In mindestens einer Ausführungsform ist y standardmäßig gleich eins, wenn y nicht angegeben ist. In mindestens einer Ausführungsform ist die Anzahl der Thread-Blöcke in einem Gitter gleich dem Produkt aus GridSize.x, GridSize.y und GridSize.z. In mindestens einer Ausführungsform ist „BlockSize“ vom Typ dim3 und gibt die Dimension und 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-Startsyntax 3610 ist „SharedMemorySize“ ein optionales Argument, das eine Anzahl von Bytes in einem gemeinsam genutzten Speicher angibt, der pro Thread-Block für einen gegebenen Kernel-Aufruf zusätzlich zum statisch zugewiesenen Speicher dynamisch zugewiesen wird. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Startsyntax 3610 ist SharedMemorySize standardmäßig auf null eingestellt. In mindestens einer Ausführungsform und in Bezug auf die CUDA-Kernel-Startsyntax 3610 ist „Stream“ ein optionales Argument, das einen zugehörigen Stream angibt und standardmäßig auf null gesetzt wird, um einen Standardstream anzugeben. In mindestens einer Ausführungsform ist ein Stream eine Folge von Befehlen (die möglicherweise von verschiedenen Host-Threads ausgegeben werden), die der Reihe nach ausgeführt werden. In mindestens einer Ausführungsform können verschiedene Streams Befehle in unterschiedlicher Reihenfolge oder gleichzeitig ausführen.
  • In mindestens einer Ausführungsform beinhaltet der CUDA-Quellcode 3510 ohne Einschränkung eine Kerneldefinition für einen Beispiel-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 Einschränkung einen Kernel-Aufruf beinhaltet, der die Ausführung des Kernels „MatAdd“ auf einer Vorrichtung bewirkt. In mindestens einer Ausführungsform und wie gezeigt addiert Kernel MatAdd zwei Matrizen A und B der Größe NxN, wobei N eine positive Ganzzahl ist, und speichert das Ergebnis in einer Matrix C. In mindestens einer Ausführungsform definiert die Hauptfunktion eine ThreadPerBlock-Variable mit 16 mal 16 und eine numBlocks-Variable mit N/16 mal N/16. In mindestens einer Ausführungsform gibt die Hauptfunktion dann den Kernel-Aufruf „MatAdd«<numBlocks, threadsPerBlock»>(A, B, C);“ an. In mindestens einer Ausführungsform und gemäß der CUDA-Kernel-Startsyntax 3610 wird der Kernel MatAdd unter Verwendung eines Gitters von Thread-Blöcken mit einer Größe von N/16 mal N/16 ausgeführt, wobei jeder Thread-Block eine Größe von 16 mal 16 aufweist. In mindestens einer Ausführungsform beinhaltet jeder Thread-Block 256 Threads, es wird ein Gitter mit genügend Blöcken erstellt, um einen Thread pro Matrixelement zu haben, und jeder Thread in einem solchen Gitter führt Kernel MatAdd aus, um eine paarweise Addition durchzuführen.
  • In mindestens einer Ausführungsform übersetzt das CUDA-HIP-Übersetzungswerkzeug 3520 bei der Übersetzung des CUDA-Quellcodes 3510 in den HIP-Quellcode 3530 jeden Kernel-Aufruf in dem CUDA-Quellcode 3510 von der CUDA-Kernel-Startsyntax 3610 in eine HIP-Kernel-Startsyntax 3620 und wandelt eine beliebige Anzahl anderer CUDA-Aufrufe in dem Quellcode 3510 in eine beliebige Anzahl anderer funktionell ähnlicher HIP-Aufrufe um. In mindestens einer Ausführungsform wird die HIP-Kernel-Startsyntax 3620 als „hipLaunchKernelGGL(KernelName, GridSize, BlockSize, SharedMemorySize, Stream, KernelArguments);“ angegeben. In mindestens einer Ausführungsform haben KernelName, GridSize, BlockSize, ShareMemorySize, Stream und KernelArguments in der HIP-Kernel-Startsyntax 3620 die gleiche Bedeutung wie in der CUDA-Kernel-Startsyntax 3610 (hierin zuvor beschrieben). In mindestens einer Ausführungsform sind die Argumente SharedMemorySize und Stream in der HIP-Kernel-Startsyntax 3620 erforderlich und in der CUDA-Kernel-Startsyntax 3610 optional.
  • In mindestens einer Ausführungsform ist ein Teil des in 36 abgebildeten HIP-Quellcodes 3530 identisch mit einem Teil des in 36 abgebildeten CUDA-Quellcodes 3510, mit Ausnahme eines Kernel-Aufrufs, der die Ausführung von Kernel MatAdd auf einer Vorrichtung bewirkt. In mindestens einer Ausführungsform wird der Kernel MatAdd in dem HIP-Quellcode 3530 mit demselben „_global_“-Deklarationsbezeichner definiert, mit dem der Kernel MatAdd in dem CUDA-Quellcode 3510 definiert ist. In mindestens einer Ausführungsform lautet ein Kernel-Aufruf in dem HIP-Quellcode 3530 „hipLaunchKernelGGL(MatAdd, numBlocks, threadsPerBlock, 0, 0, A, B, C);“, während ein entsprechender Kernel-Aufruf in dem CUDA-Quellcode 3510 „MatAdd«<numBlocks, threadsPerBlock»>(A, B, C);“ lautet.
  • 37 veranschaulicht die nicht CUDA-fähige GPU 3592 der 35C gemäß mindestens einer Ausführungsform ausführlicher. In mindestens einer Ausführungsform wird die GPU 3592 von der AMD Corporation in Santa Clara entwickelt. In mindestens einer Ausführungsform kann die GPU 3592 so konfiguriert werden, dass sie Rechenoperationen hochgradig parallel ausführt. In mindestens einer Ausführungsform ist die GPU 3592 so konfiguriert, dass sie Grafikpipeline-Operationen wie Zeichenbefehle, Pixeloperationen, geometrische Berechnungen und andere Operationen im Zusammenhang mit dem Rendern eines Bildes auf einer Anzeige ausführt. In mindestens einer Ausführungsform ist die GPU 3592 so konfiguriert, dass sie Operationen ausführt, die nicht mit Grafik zusammenhängen. In mindestens einer Ausführungsform ist die GPU 3592 so konfiguriert, dass sie sowohl grafikbezogene als auch grafikfremde Operationen ausführt. In mindestens einer Ausführungsform kann die GPU 3592 so konfiguriert sein, dass sie den in dem HIP-Quellcode 3530 beinhaltenen Vorrichtungscode ausführt.
  • In mindestens einer Ausführungsform beinhaltet die GPU 3592 ohne Einschränkung eine beliebige Anzahl programmierbarer Verarbeitungseinheiten 3720, einen Befehlsprozessor 3710, einen L2-Cache 3722, Speichersteuerung 3770, DMA-Engines 3780(1), Systemspeichersteuerung 3782, DMA-Engines 3780(2) und GPU-Steuerung 3784. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 3720, ohne Einschränkung, einen Workload-Verwalter 3730 und eine beliebige Anzahl von Recheneinheiten 3740. In mindestens einer Ausführungsform liest der Befehlsprozessor 3710 Befehle aus einer oder mehreren Befehlswarteschlangen (nicht gezeigt) und verteilt die Befehle an die Workload-Verwalter 3730. In mindestens einer Ausführungsform verteilt der zugehörige Workload-Verwalter 3730 für jede programmierbare Verarbeitungseinheit 3720 die Arbeit an die in der programmierbaren Verarbeitungseinheit 3720 beinhaltenen Recheneinheiten 3740. In mindestens einer Ausführungsform kann jede Recheneinheit 3740 eine beliebige Anzahl von Thread-Blöcken ausführen, aber jeder Thread-Block wird auf einer einzigen Recheneinheit 3740 ausgeführt. In mindestens einer Ausführungsform ist eine Arbeitsgruppe ein Thread-Block.
  • In mindestens einer Ausführungsform beinhaltet jede Recheneinheit 3740, ohne Einschränkung, eine beliebige Anzahl von SIMD-Einheiten 3750 und einen gemeinsamen Speicher 3760. In mindestens einer Ausführungsform implementiert jede SIMD-Einheit 3750 eine SIMD-Architektur und ist konfiguriert, um Operationen parallel durchzuführen. In mindestens einer Ausführungsform beinhaltet jede SIMD-Einheit 3750, ohne Einschränkung, eine Vektor-ALU 3752 und eine Vektorregisterdatei 3754. In mindestens einer Ausführungsform führt jede SIMD-Einheit 3750 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 einzigen Thread-Block gehört und so konfiguriert ist, dass er einen unterschiedlichen Datensatz auf der Grundlage eines einzigen 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 ein Pfad ein Thread. In mindestens einer Ausführungsform ist ein Arbeitselement ein Thread. In mindestens einer Ausführungsform ist eine Wellenfront ein Warp. In mindestens einer Ausführungsform können sich unterschiedliche Wellenfronten in einem Thread-Block miteinander synchronisieren und über den gemeinsam genutzten Speicher 3760 kommunizieren.
  • In mindestens einer Ausführungsform werden die programmierbaren Verarbeitungseinheiten 3720 als „Shader-Engines“ bezeichnet. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 3720 ohne Einschränkung eine beliebige Menge an dedizierter Grafikhardware zusätzlich zu den Recheneinheiten 3740. In mindestens einer Ausführungsform beinhaltet jede programmierbare Verarbeitungseinheit 3720 ohne Einschränkung 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, Workload-Verwalter 3730 und eine beliebige Anzahl von Recheneinheiten 3740.
  • In mindestens einer Ausführungsform nutzen die Recheneinheiten 3740 den L2-Cache 3722 gemeinsam. In mindestens einer Ausführungsform ist der L2-Cache 3722 partitioniert. In mindestens einer Ausführungsform ist ein GPU-Speicher 3790 für alle Recheneinheiten 3740 in der GPU 3592 zugänglich. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 3770 und Systemspeichersteuerungen 3782 die Datenübertragung zwischen GPU 3592 und einem Host, und DMA-Engines 3780(1) ermöglichen asynchrone Speicherübertragungen zwischen GPU 3592 und einem solchen Host. In mindestens einer Ausführungsform erleichtern Speichersteuerungen 3770 und GPU-Steuerungen 3784 die Datenübertragung zwischen GPU 3592 und anderen GPUs 3592, und DMA-Engines 3780(2) ermöglichen asynchrone Speicherübertragungen zwischen GPU 3592 und anderen GPUs 3592.
  • In mindestens einer Ausführungsform beinhaltet die GPU 3592 ohne Einschränkung eine beliebige Anzahl und Art von Systemzusammenschaltungen, die Daten- und Steuerübertragungen über eine beliebige Anzahl und Art von direkt oder indirekt verbundenen Komponenten ermöglichen, die intern oder extern zur GPU 3592 sein können. In mindestens einer Ausführungsform beinhaltet die GPU 3592 ohne Einschränkung eine beliebige Anzahl und Art von E/A-Schnittstellen (z. B. PCIe), die mit einer beliebigen Anzahl und Art von Peripheriegeräten verbunden sind. In mindestens einer Ausführungsform kann die GPU 3592 ohne Einschränkung eine beliebige Anzahl (einschließlich Null) von Anzeige-Engines und eine beliebige Anzahl (einschließlich Null) von Multimedia-Engines beinhalten. In mindestens einer Ausführungsform implementiert die GPU 3592 ein Speicher-Teilsystem, das ohne Einschränkung eine beliebige Anzahl und einen beliebigen Typ von Speichersteuerungen (z. B. Speichersteuerung 3770 und Systemspeichersteuerung 3782) und Speichervorrichtungen (z. B. gemeinsam genutzte Speicher 3760) beinhaltet, die einer Komponente zugeordnet oder von mehreren Komponenten gemeinsam genutzt werden können. In mindestens einer Ausführungsform implementiert die GPU 3592 ein Cache-Teilsystem, das ohne Einschränkung einen oder mehrere Cache-Speicher (z. B. L2-Cache 3722) beinhaltet, die jeweils für eine beliebige Anzahl von Komponenten (z. B. SIMD-Einheiten 3750, Recheneinheiten 3740 und programmierbare Verarbeitungseinheiten 3720) reserviert oder von diesen gemeinsam genutzt werden können.
  • 38 veranschaulicht, wie Threads eines beispielhaften CUDA-Gitters 3820 gemäß mindestens einer Ausführungsform auf verschiedene Recheneinheiten 3740 der 37 abgebildet werden. In mindestens einer Ausführungsform und nur zu Erläuterungszwecken hat das Raster 3820 eine GridSize von BX mal BY mal 1 und eine BlockSize von TX mal TY mal 1. In mindestens einer Ausführungsform beinhaltet das Raster 3820 daher ohne Einschränkung (BX * BY) Thread-Blöcke 3830 und jeder Thread-Block 3830 beinhaltet ohne Einschränkung (TX * TY) Threads 3840. Die Threads 3840 sind in 38 als geschwungene Pfeile abgebildet.
  • In mindestens einer Ausführungsform wird das Raster 3820 auf die programmierbare Verarbeitungseinheit 3720(1) abgebildet, die ohne Einschränkung die Recheneinheiten 3740(1) -3740(C) beinhaltet. In mindestens einer Ausführungsform und wie gezeigt werden (BJ * BY) Thread-Blöcke 3830 auf die Recheneinheit 3740(1) abgebildet, und die restlichen Thread-Blöcke 3830 werden auf die Recheneinheit 3740(2) abgebildet. In mindestens einer Ausführungsform kann jeder Thread-Block 3830 ohne Einschränkung eine beliebige Anzahl von Warps beinhalten, und jeder Warp wird zu einer anderen SIMD-Einheit 3750 der 37 abgebildet.
  • In mindestens einer Ausführungsform können Warps in einem gegebenen Thread-Block 3830 zusammen synchronisieren und über den gemeinsamen Speicher 3760 in der zugehörigen Recheneinheit 3740 kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können die Warps in dem Thread-Block 3830(BJ,1) zusammen synchronisieren und über den gemeinsamen Speicher 3760(1) kommunizieren. Zum Beispiel und in mindestens einer Ausführungsform können Warps in dem Thread-Block 3830(BJ+1,1) zusammen synchronisieren und über den gemeinsamen Speicher 3760(2) kommunizieren.
  • 39 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 für eine einzige Architektur beziehen, die es Entwicklern ermöglicht, Code für verschiedene Hardware-Ziele (CPUs und Beschleuniger wie GPUs und FPGAs) wiederzuverwenden und auch benutzerdefinierte Einstellungen 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 betrifft 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 unter Verwendung von Standard-C++ zu schreiben. SYCL kann eine Single-Source-Entwicklung ermöglichen, bei der C++-Vorlagenfunktionen sowohl Host- als auch Vorrichtungscode 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 generieren, die auf verschiedenen Hardwarezielen eingesetzt werden können, und ein DPC++-Kompatibilitätswerkzeug kann verwendet werden, um CUDA-Anwendungen in ein Multiplattformprogramm in DPC++ zu migrieren. In mindestens einer Ausführungsform beinhaltet 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 Hardwarevorrichtungen laufen zu lassen, die eine Arbeitslast am besten beschleunigen. Ein Host kann verfügbar sein, um die Entwicklung und das Debugging von Vorrichtungscode zu vereinfachen, selbst auf Plattformen, die keinen Beschleuniger zur Verfügung haben.
  • In mindestens einer Ausführungsform wird der CUDA-Quellcode 3900 als Eingabe für ein DPC++-Kompatibilitätswerkzeug 3902 bereitgestellt, um menschenlesbares DPC++ 3904 zu generieren. In mindestens einer Ausführungsform beinhaltet der menschenlesbare DPC++ 3904 Inline-Kommentare, die von dem DPC++-Kompatibilitätstool 3902 generiert werden und einen Entwickler anleiten, wie und/oder wo er den DPC++-Code modifizieren muss, um die Codierung und Abstimmung auf die gewünschte Leistung 3906 abzuschließen und dadurch den DPC++-Quellcode 3908 zu generieren.
  • In mindestens einer Ausführungsform ist oder beinhaltet der CUDA-Quellcode 3900 eine Sammlung von menschenlesbarem Quellcode in einer CUDA-Programmiersprache. In mindestens einer Ausführungsform ist der CUDA-Quellcode 3900 ein menschenlesbarer 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 Vorrichtungscode und zur Unterscheidung zwischen Vorrichtungscode und Host-Code enthält. In mindestens einer Ausführungsform ist der Vorrichtungscode ein Quellcode, der nach der Kompilierung auf einer Vorrichtung (z. B. einer GPU oder einem FPGA) ausführbar ist und mehrere parallelisierbare Workflows beinhalten kann, die auf einem oder mehreren Prozessorkernen einer Vorrichtung ausgeführt werden können. In mindestens einer Ausführungsform kann eine Vorrichtung ein Prozessor sein, der für die parallele Anweisungsverarbeitung optimiert ist, wie etwa eine CUDA-fähige GPU, GPU 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 können ein Teil oder der gesamte Host-Code und Vorrichtungscode parallel auf einer CPU und einer GPU/FPGA ausgeführt werden. In mindestens einer Ausführungsform ist der Host ein Prozessor, der für die sequentielle Anweisungsverarbeitung optimiert ist, wie etwa eine CPU. Der in Verbindung mit 39 beschriebene CUDA-Quellcode 3900 kann mit den an anderer Stelle in diesem Dokument beschriebenen Quellcodes übereinstimmen.
  • In mindestens einer Ausführungsform betrifft das DPC++-Kompatibilitätswerkzeug 3902 ein ausführbares Werkzeug, ein Programm, eine Anwendung oder eine andere geeignete Art von Werkzeug, das verwendet wird, um die Migration von CUDA-Quellcode 3900 zu DPC++-Quellcode 3908 zu erleichtern. In mindestens einer Ausführungsform ist das DPC++-Kompatibilitätswerkzeug 3902 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 3902 einen Teil oder den gesamten Quellcode einer CUDA-Anwendung von CUDA nach DPC++ und generiert eine resultierende Datei, die mindestens teilweise in DPC++ geschrieben ist und als menschenlesbares DPC++ 3904 bezeichnet wird. In mindestens einer Ausführungsform beinhaltet das menschenlesbare DPC++ 3904 Kommentare, die von dem DPC++-Kompatibilitätswerkzeug 3902 generiert werden, um anzuzeigen, wo ein Benutzereingriff erforderlich sein könnte. In mindestens einer Ausführungsform ist ein Benutzereingriff erforderlich, wenn der CUDA-Quellcode 3900 eine CUDA-API aufruft, die keine analoge DPC++-API hat; andere Beispiele, bei denen ein Benutzereingriff erforderlich ist, werden später ausführlicher erörtert.
  • In mindestens einer Ausführungsform beinhaltet ein Arbeitsablauf zum Migrieren von CUDA-Quellcode 3900 (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 3902; das Abschließen der Migration und das Überprüfen der Korrektheit, wodurch DPC++-Quellcode 3908 generiert wird; und das Kompilieren von DPC++-Quellcode 3908 mit einem DPC++-Compiler, um eine DPC++-Anwendung zu generieren. 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 wird der Makefile-Befehl durch einen eingebauten Abfangbefehl in einen DPC-Kompatibilitätsbefehl umgewandelt.
  • In mindestens einer Ausführungsform ist Intercept-Build ein Hilfsskript, das einen Build-Prozess abfängt, um Kompilierungsoptionen, Makrodefinitionen zu erfassen und Pfade zu beinhalten, 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 3902 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 beinhaltet eine Migrationsdatenbank Befehle, Verzeichnisse und Dateien: Der Befehl kann die erforderlichen Kompilierungsflags beinhalten; das Verzeichnis kann Pfade zu Header-Dateien beinhalten; die Datei kann Pfade zu CUDA-Dateien beinhalten.
  • In mindestens einer Ausführungsform migriert das DPC++-Kompatibilitätswerkzeug 3902 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 3902 als Teil eines Toolkits erhältlich. In mindestens einer Ausführungsform beinhaltet 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-Build-Tool generierte Kompilierungsdatenbank von dem DPC++-Kompatibilitätswerkzeug 3902 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ätswerkzeug 3902 menschenlesbaren DPC++ 3904, bei dem es sich um DPC++-Code handeln kann, der in der von dem DPC++-Kompatibilitätswerkzeug 3902 generierten Form nicht von dem DPC++-Compiler kompiliert werden kann und zusätzliche Auslotung erfordert, um Teile des Codes, die nicht korrekt migriert wurden, zu überprüfen, und der manuelle Eingriffe, beispielsweise durch einen Entwickler, erfordern kann. In mindestens einer Ausführungsform bietet das DPC++-Kompatibilitätswerkzeug 3902 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 39002 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 generierten DPC++ Quellcodes erfolgen. In mindestens einer Ausführungsform generiert das DPC++-Kompatibilitätswerkzeug 3902 direkt DPC++-Quellcode 3908, der von einem DPC++-Compiler kompiliert wird, ohne dass ein menschliches Eingreifen erforderlich ist oder genutzt wird, um den von dem DPC++-Kompatibilitätswerkzeug 3902 generierten DPC++-Code zu modifizieren. In mindestens einer Ausführungsform generiert das DPC++ Kompatibilitätswerkzeug kompilierbaren -DPC++ Code, der optional von einem Entwickler auf Leistung, Lesbarkeit, Wartbarkeit, andere verschiedene Überlegungen oder eine Kombination davon abgestimmt werden kann.
  • In mindestens einer Ausführungsform werden eine oder mehrere CUDA-Quelldateien mindestens teilweise mit dem DPC++-Kompatibilitätswerkzeug 3902 in DPC++-Quelldateien migriert. In mindestens einer Ausführungsform beinhaltet der CUDA-Quellcode eine oder mehrere Header-Dateien, die auch CUDA-Header-Dateien beinhalten können. In mindestens einer Ausführungsform beinhaltet eine CUDA-Quelldatei eine <cuda.h>-Header-Datei und eine <stdio.h>-Header-Datei, die zum Drucken von Text verwendet werden können. In mindestens einer Ausführungsform kann ein Teil einer CUDA-Quelldatei für einen Vektoradditionskern als oder mit Bezug auf Folgendes geschrieben werden:
    Figure DE112020007631T5_0019
    Figure DE112020007631T5_0020
  • In mindestens einer Ausführungsform und in Verbindung mit der vorstehend vorgestellten CUDA-Quelldatei analysiert das DPC++-Kompatibilitätswerkzeug 3902 einen CUDA-Quellcode und ersetzt die Header-Dateien durch geeignete DPC++- und SYCL-Header-Dateien. In mindestens einer Ausführungsform beinhalten 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 vorstehend vorgestellten CUDA-Quelldatei gibt es zwei Vektoren A und B, die initialisiert werden, und ein Vektoradditionsergebnis wird als Teil von VectorAddKernel() in den Vektor C gestellt. In mindestens einer Ausführungsform konvertiert das DPC++-Kompatibilitätswerkzeug 3902 CUDA-Thread-IDs, die zur Indexierung von Arbeitselementen verwendet werden, in 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 von dem DPC++-Kompatibilitätswerkzeug 3902 generierte DPC++-Code optimiert werden, zum Beispiel 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 vorstehend 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 eine Vorrichtung und ein Kontext übergeben wird, wobei SYCL-Konzepte wie Plattform, Vorrichtung, Kontext und Warteschlange verwendet werden. In mindestens einer Ausführungsform kann eine SYCL-Plattform mehrere Vorrichtungen aufweisen (z. B. Host- und GPU-Vorrichtungen); eine Vorrichtung kann mehrere Warteschlangen aufweisen, an die Aufträge übermittelt werden können; jede Vorrichtung kann einen Kontext aufweisen; und ein Kontext kann mehrere Vorrichtungen aufweisen und gemeinsam genutzte Speicherobjekte verwalten.
  • In mindestens einer Ausführungsform und in Verbindung mit der vorstehend 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, parallel_for wird für eine Anzahl globaler Elemente und eine Anzahl von Arbeitselementen in dieser Arbeitsgruppe aufgerufen, in der VectorAddKernel() aufgerufen wird.
  • In mindestens einer Ausführungsform und in Verbindung mit der vorstehend vorgestellten CUDA-Quelldatei werden CUDA-Aufrufe zum Kopieren von Vorrichtungsspeicher 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 C++-Code (z. B. Standard-ISO-C++-Code zum Drucken eines Vektors von Gleitkommavariablen) unverändert migriert, ohne von dem DPC++-Kompatibilitätswerkzeug 3902 modifiziert zu werden. In mindestens einer Ausführungsform modifiziert das DPC++-Kompatibilitätswerkzeug 3902 die CUDA-APIs für die Speichervorrichtung und/oder Host-Aufrufe, um den Kernel auf der Beschleunigungsvorrichtung auszuführen. In mindestens einer Ausführungsform und in Verbindung mit der oben vorgestellten CUDA-Quelldatei wird ein entsprechendes, menschenlesbares DPC++ 3904 (das z. B. kompiliert werden kann) als oder mit Bezug auf Folgendes geschrieben:
      #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 verweist das menschenlesbare DPC++ 3904 auf die von dem DPC++-Kompatibilitätswerkzeug 3902 generierte Ausgabe und kann auf die eine oder andere Weise optimiert werden. In mindestens einer Ausführungsform kann das von dem DPC++-Kompatibilitätswerkzeug 3902 generierte, menschenlesbare DPC++ 3904 nach der Migration von einem Entwickler manuell bearbeitet werden, um es wartbarer zu machen, die Leistung zu verbessern oder andere Überlegungen anzustellen. In mindestens einer Ausführungsform kann der von dem DPC++ Kompatibilitätstool 39002 generierte DPC++ Code, wie etwa der offenbarte DPC++, optimiert werden, indem wiederholte Aufrufe von get_current_device() und/oder get_default_context() für jeden malloc_device() Aufruf entfernt werden. In mindestens einer Ausführungsform verwendet der vorstehend generierte 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 von dem DPC++-Kompatibilitätswerkzeug 3902 generierten DPC++-Code manuell bearbeiten und die Verwendung von gemeinsam genutztem Speicher durch Zugriffsberechtigte ersetzen. In mindestens einer Ausführungsform verfügt das DPC++-Kompatibilitätswerkzeug 3902 ü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 3902 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 beinhaltet ein Arbeitsablauf für die Migration von CUDA zu DPC++ folgende Schritte: Vorbereiten der Migration mit Hilfe eines Intercept-Build-Skripts; Durchführen der Migration von CUDA-Projekten zu DPC++ mit Hilfe des DPC++-Kompatibilitätswerkzeugs 3902; manuelles Überprüfen und Bearbeitung der migrierten Quelldateien auf Vollständigkeit und Korrektheit; und Kompilieren des endgültigen DPC++-Codes zur Generierung einer DPC++-Anwendung. In mindestens einer Ausführungsform kann eine manuelle Überprüfung des DPC++-Quellcodes in einem oder mehreren Szenarien erforderlich sein, beinhaltend, 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 beinhalten: 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.
  • Andere Variationen sind im Sinne der vorliegenden Offenbarung. Somit können zwar bezüglich der offenbarten Verfahren diverse Modifikationen und alternative Konstruktionen vorgenommen werden, bestimmte veranschaulichte Ausführungsformen davon werden jedoch in den Zeichnungen gezeigt und wurden vorangehend ausführlich beschrieben. Allerdings versteht es sich, dass nicht die Absicht verfolgt wird, die Offenbarung auf die spezifische(n) offenbarte(n) Form oder Formen einzuschränken, sondern die Absicht ganz im Gegenteil darin besteht, sämtliche Modifikationen, alternativen Konstruktionen und Äquivalente abzudecken, die in den Geist und Umfang der wie in den beigefügten Ansprüchen definierten Offenbarung fallen.
  • Die Verwendung der Ausdrücke „ein“ und „eine“ und „der/die/das“ und ähnlicher Referenten im Kontext des Beschreibens offenbarter Ausführungsformen (insbesondere im Kontext der folgenden Ansprüche) ist so auszulegen, dass sie sowohl den Singular als auch den Plural abdeckt, sofern hierin nichts anderes angegeben ist oder der Kontext dem eindeutig widerspricht, und nicht als Definition eines Ausdrucks. Die Begriffe „umfassend“, „aufweisend“, „beinhaltend“ und „enthaltend“ sollen als offene Begriffe ausgelegt sein (in der Bedeutung „beinhaltend, aber nicht darauf beschränkt“), sofern nichts anderes angegeben ist. Der Begriff „verbunden“ ist als teilweise oder vollständig ineinander enthalten, aneinander befestigt oder aneinander angefügt auszulegen, wenn er unmodifiziert vorliegt und physische Verbindungen betrifft, selbst, wenn ein Element dazwischen eingefügt ist. Die Erwähnung von Wertebereichen soll lediglich als Kurzform dienen, um jeden einzelnen Wert, der in den Bereich fällt, einzeln zu bezeichnen, sofern hier nicht anders angegeben, und jeder einzelne Wert wird in die Spezifikation aufgenommen, als ob er hier einzeln aufgeführt wäre. Die Verwendung des Begriffs „Menge“ (z. B. „eine Menge von Gegenständen“) oder „Teilmenge“ ist, sofern nicht anders angegeben oder durch den Kontext widerlegt, als eine nicht leere Sammlung zu verstehen, die ein oder mehrere Elemente umfasst. Sofern nicht anders vermerkt oder durch den 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.
  • Sofern nicht spezifisch etwas anderes angegeben ist oder der Kontext dem eindeutig widerspricht, sind verbindende Ausdrücke, wie etwa Formulierungen der Form „mindestens eines von A, B und C“ oder „mindestens eines von A, B und C“, andernfalls in dem Kontext zu verstehen, in dem sie allgemein verwendet werden, um darzustellen, dass ein Gegenstand, ein Ausdruck usw. entweder A oder B oder C oder eine beliebige nichtleere Teilmenge des Satzes aus A und B und C sein kann. Zum Beispiel beziehen sich in dem veranschaulichenden Beispiel für einen Satz, der drei Elemente aufweist, die verbindenden Formulierungen „mindestens eines von A, B und C“ und „mindestens eines von A, B und C“ auf einen beliebigen der folgenden Sätze: {A}, {B}, {C}, {A, B}, {A, C}, {B, C}, {A, B, C}. Derartige konjunktivische Formulierungen sind also nicht generell so zu verstehen, dass bei bestimmten Ausführungsformen jeweils mindestens eines von A, mindestens eines von B und mindestens eines von C vorhanden sein muss. Sofern nicht anders vermerkt oder durch den Kontext widerlegt, bezeichnet der Begriff „Vielzahl“ einen Zustand der Pluralität (z. B. „eine Vielzahl von Gegenständen“ bezeichnet mehrere Gegenstände). Die Anzahl der Gegenstände in einer Vielzahl beträgt mindestens zwei, kann aber auch mehr sein, wenn dies entweder ausdrücklich oder durch den Kontext angegeben wird. Sofern nicht anders angegeben oder aus dem Kontext klar hervorgeht, bedeutet der Ausdruck „basierend auf“ „mindestens zum Teil basierend auf“ und nicht „basierend ausschließlich auf“.
  • Hierin beschriebene Vorgänge von Prozessen können in einer beliebigen geeigneten Reihenfolge durchgeführt werden, sofern es hierin nicht anders angegeben ist oder der Kontext dem anderweitig eindeutig widerspricht. In mindestens einer Ausführungsform wird ein Prozess, wie etwa die hierin beschriebenen Prozesse (oder Variationen und/oder Kombinationen davon), unter der Steuerung von einem oder mehreren Computersystemen durchgeführt, die mit ausführbaren Anweisungen konfiguriert sind, und er ist als Code (z. B. ausführbare Anweisungen, ein oder mehrere Computerprogramme oder eine oder mehrere Anwendungen), der zusammen auf einem oder mehreren Prozessoren ausgeführt wird, durch Hardware oder Kombinationen davon implementiert. In mindestens einer Ausführungsform ist Code auf einem computerlesbaren Speichermedium gespeichert, zum Beispiel in Form eines Computerprogramms, das eine Vielzahl von Anweisungen umfasst, die durch einen oder mehrere 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 Datenspeicherschaltungsanordnungen (z. B. Puffer, Cache und Warteschlangen) innerhalb von Transceivern für transitorische Signale enthält. In mindestens einer Ausführungsform ist der Code (z. B. ausführbarer Code oder Quellcode) auf einem Satz von einem oder mehreren nichttransitorischen computerlesbaren Speichermedien gespeichert, auf denen ausführbare Anweisungen gespeichert sind (oder einem anderen Speicher zum Speichern ausführbarer Anweisungen), die bei Ausführung (in mindestens einer Ausführungsform als Ergebnis der Ausführung) durch einen oder mehrere Prozessoren eines Computersystems das Computersystem dazu veranlassen, hierin beschriebene Operationen durchzuführen. Ein Satz von nicht transitorischen computerlesbaren Speichermedien umfasst in mindestens einer Ausführungsform mehrere nicht transitorische computerlesbare Speichermedien und einem oder mehreren der einzelnen nicht transitorischen Speichermedien mehrerer nicht transitorischer computerlesbarer Speichermedien fehlt der gesamte Code, während mehrere nicht transitorische computerlesbare Speichermedien kollektiv den gesamten Code speichern. In mindestens einer Ausführungsform werden ausführbare Anweisungen so ausgeführt, dass unterschiedliche Anweisungen von verschiedenen Prozessoren ausgeführt werden - zum Beispiel speichert ein nicht transitorisches computerlesbares Speichermedium Anweisungen und eine Hauptzentraleinheit („CPU“) führt einige der Anweisungen aus, während eine Grafikverarbeitungseinheit („GPU“) andere Anweisungen ausführt. In mindestens einer Ausführungsform weisen unterschiedliche Komponenten eines Computersystems separate Prozessoren auf und führen unterschiedliche Prozessoren unterschiedliche Teilmengen von Anweisungen aus.
  • Dementsprechend sind in mindestens einer Ausführungsform Computersysteme so konfiguriert, dass sie einen oder mehrere Dienste implementieren, die einzeln oder zusammen Operationen der hierin beschriebenen Prozesse durchführen, und derartige Computersysteme sind mit geeigneter Hardware und/oder Software konfiguriert, die eine Durchführung der Operationen ermöglichen. Ferner ist ein Computersystem, das mindestens eine Ausführungsform der vorliegenden Offenbarung implementiert, eine einzige Vorrichtung und in einer anderen Ausführungsform ein verteiltes Computersystem, das mehrere Vorrichtungen umfasst, die unterschiedlich arbeiten, sodass das verteilte Computersystem die hierin beschriebenen Operationen durchführt und sodass eine einzige Vorrichtung nicht alle Operationen durchführt.
  • Die Verwendung von Beispielen oder beispielhafter Wortwahl (z. B. „wie etwa“), die hierin bereitgestellt ist, soll lediglich die Ausführungsformen der Offenbarung besser verdeutlichen und stellt keine Einschränkung des Umfangs der Offenbarung dar, es sei denn, es ist etwas anderes beansprucht. Keinerlei Wortwahl in der Beschreibung sollte so ausgelegt werden, dass sie ein beliebiges nicht beanspruchtes Element als für die Umsetzung der Offenbarung wesentlich angibt.
  • Jegliche Referenzen, einschließlich Veröffentlichungen, Patentanmeldungen und Patenten, die hierin erwähnt werden, sind hiermit durch Bezugnahme in demselben Maße aufgenommen, als wäre jede Referenz einzeln und spezifisch als durch Referenz eingeschlossen angegeben und in ihrer Gesamtheit hierin ausgeführt.
  • In der Beschreibung und den Ansprüchen können die Begriffe „gekoppelt“ und „verbunden“ zusammen mit ihren Ableitungen verwendet werden. Es versteht sich, dass diese Ausdrücke nicht als Synonyme füreinander beabsichtigt sein können. Vielmehr kann in konkreten Beispielen „verbunden“ oder „gekoppelt“ verwendet werden, um anzugeben, dass zwei oder mehr Elemente in direktem oder indirektem physischem oder elektrischem Kontakt miteinander stehen. Mit „gekoppelt“ kann auch gemeint sein, dass zwei oder mehr Elemente nicht in direktem Kontakt miteinander stehen, jedoch trotzdem miteinander zusammenwirken oder interagieren.
  • Sofern nicht ausdrücklich anders angegeben, versteht es sich, dass sich Begriffe wie „Verarbeitung“, „Berechnung“, „Berechnen“, „Bestimmen“ oder dergleichen in der gesamten Beschreibung auf Handlungen und/oder Prozesse eines Computers oder Rechensystems oder einer ähnlichen elektronischen Rechenvorrichtung, die Daten, die als physische, wie etwa elektronische, Größen in den Registern und/oder Speichern des Rechensystems dargestellt sind, manipulieren und/oder in andere Daten umwandeln, die auf ähnliche Weise als physische Größen in den Speichern, Registern oder anderen derartigen Informationsspeicher-, - übertragungs- oder -anzeigevorrichtungen des Rechensystems dargestellt sind.
  • Auf ähnliche Weise kann sich der Ausdruck „Prozessor“ auf eine beliebige Vorrichtung oder einen beliebigen Abschnitt einer Vorrichtung beziehen, die/der elektronische Daten aus Registern und/oder Speicher verarbeitet und diese elektronischen Daten in andere elektronische Daten umwandelt, die in Registern und/oder Speicher gespeichert werden können. Als nicht einschränkende Beispiele kann der „Prozessor“ eine CPU oder eine GPU sein. Eine „Rechenplattform“ kann einen oder mehrere Prozessoren umfassen. Wie hierin verwendet, können „Software“-Prozesse zum Beispiel Software- und/oder Hardware-Entitäten beinhalten, die im Verlauf der Zeit Arbeit verrichten, wie etwa Aufgaben, Threads und intelligente Agenten. Außerdem kann sich jedes Verfahren auf mehrere Verfahren zum Ausführen von Anweisungen nacheinander oder parallel, kontinuierlich oder intermittierend beziehen. Die Ausdrücke „System“ und „Verfahren“ werden in dieser Schrift insofern austauschbar verwendet, dass ein System ein oder mehrere Verfahren verkörpern kann und die Verfahren als System betrachtet werden können.
  • 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 von analogen und digitalen Daten kann auf verschiedene Weise erfolgen, wie etwa 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 von analogen oder digitalen Daten durch das Übermitteln von Daten über ein Computernetzwerk von der bereitstellenden Entität zu der erfassenden Entität erfolgen. Es kann auch auf das Bereitstellen, Ausgeben, Übermitteln, Senden oder Darstellen von analogen oder digitalen Daten Bezug genommen werden. In verschiedenen Beispielen kann der Prozess des Bereitstellens, Ausgebens, Übermittelns, Sendens oder Darstellens von analogen oder digitalen Daten durch das Übermitteln von Daten als Eingabe- oder Ausgabeparameter eines Funktionsaufrufs, eines Parameters einer Anwendungsprogrammierschnittstelle oder eines Interprozesskommunikationsmechanismus erfolgen.
  • Obwohl die vorstehende Erörterung beispielhafte Implementationen der beschriebenen Techniken darlegt, können auch andere Architekturen verwendet werden, um die beschriebene Funktionalität zu implementieren, und sie sollen im Umfang dieser Offenbarung liegen. Darüber hinaus könnten, obwohl spezifische Verteilungen von Zuständigkeiten zum Zwecke der Erörterung vorstehend definiert sind, verschiedene Funktionen und Zuständigkeiten in Abhängigkeit von den Umständen anders verteilt und aufgeteilt werden.
  • Obwohl der Gegenstand ferner in für Strukturmerkmale und/oder Verfahrenshandlungen spezifischer Sprache beschrieben wurde, versteht sich, dass der in den beigefügten Ansprüchen beanspruchte Gegenstand nicht unbedingt auf die beschriebenen spezifischen Merkmale oder Handlungen beschränkt ist. Vielmehr sind die konkreten Merkmale und Handlungen als beispielhafte Formen der Implementierung der Ansprüche offenbart.
  • Claims (20)

    1. Prozessor, umfassend: eine oder mehreren Schaltungen zum: Verfolgen eines Pfads für ein oder mehrere Teilchen in einer Szene für ein aktuelles Einzelbild mindestens zum Teil basierend auf Informationen, die in einem Aufgabenpuffer angegeben sind; Speichern von Positionsinformationen über das eine oder die mehreren Teilchen in einem Rückkopplungspuffer und einem Photonenpuffer; Bestimmen von Fußabdruckinformationen, die auf eine Textur, die in einem Kaustikpuffer gespeichert ist, anzuwenden sind, mindestens zum Teil basierend auf dem Photonenpuffer; Anwenden der Textur in dem Kaustikpuffer auf die Szene; und Aktualisieren der Informationen in dem Aufgabenpuffer mindestens zum Teil basierend auf den Positionsinformationen in dem Rückkopplungspuffer.
    2. Prozessor nach Anspruch 1, wobei die Positionsinformationen einen oder mehrere Positionswerte und einen oder mehrere Intensitätswerte umfassen, die mit jedem des einen oder der mehreren Teilchen, die in die Szene projiziert werden, assoziiert sind.
    3. Prozessor nach Anspruch 1, wobei die Fußabdruckinformationen, die auf die Textur in dem Kaustikpuffer angewendet werden, für jedes Datenelement einer Vielzahl von Datenelementen in dem Photonenpuffer bestimmt werden, indem die Positionsinformationen mit einem oder mehreren Intensitätswerten kombiniert werden, die durch Projizieren des einen oder der mehreren Teilchen in die Szene bestimmt werden.
    4. Prozessor nach Anspruch 1, wobei die Informationen in dem Aufgabenpuffer mit den Positionsinformationen des Rückkopplungspuffers aktualisiert werden, indem Positionsinformationen von einem zweiten Rückkopplungspuffer für ein zweites Einzelbild mit den Positionsinformationen des Rückkopplungspuffers für das Einzelbild kombiniert werden.
    5. System, umfassend: einen oder mehrere Prozessoren; Speicher, der computerausführbare Anweisungen speichert, die, falls sie ausgeführt werden, den einen oder die mehreren Prozessoren zu Folgendem veranlassen: Berechnen von Projektionsinformationen mindestens zum Teil basierend auf Teilcheninformationen in einem ersten Puffer; Speichern von Positionsinformationen in einem zweiten Puffer und einem dritten Puffer, die als ein Ergebnis der Projektionsinformationen berechnet werden, die mit einem oder mehreren Objekten in einer Szene interagieren; Speichern von Fußabdruckinformationen, die auf eine Textur angewendet werden, in einem vierten Puffer, wobei die Fußabdruckinformationen mindestens zum Teil basierend auf den Positionsinformationen des dritten Puffers berechnet werden; Anwenden der Textur, die in dem vierten Puffer gespeichert ist, auf die Szene; und Aktualisieren der Teilcheninformationen des ersten Puffers mindestens zum Teil basierend auf den Positionsinformationen des zweiten Puffers.
    6. System nach Anspruch 5, wobei die Projektionsinformationen Ort und Intensität angeben.
    7. System nach Anspruch 5, wobei die Positionsinformationen berechnet werden, indem für ein oder mehrere Pixel in der Szene ein oder mehrere Teilchen bestimmt werden, die mit dem einen oder den mehreren Objekten interagieren und jedes Pixel des einen oder der mehreren Pixel treffen.
    8. System nach Anspruch 5, wobei Fußabdruckinformationen, die auf die Textur angewendet werden, für jedes Element einer Vielzahl von Elementen in dem dritten Puffer unter Verwendung eines Positionswerts für das Element aus den Positionsinformationen und eines Intensitätswerts für das Element aus den Projektionsinformationen berechnet werden.
    9. System nach Anspruch 5, wobei die Teilcheninformationen des ersten Puffers aktualisiert werden, indem die Positionsinformationen des zweiten Puffers mit Positionsinformationen eines fünften Puffers kombiniert werden.
    10. Maschinenlesbares Medium, das einen darauf gespeicherten Satz von Anweisungen aufweist, die bei Durchführung durch einen oder mehrere Prozessoren den einen oder die mehreren Prozessoren mindestens zu Folgendem veranlassen: Bestimmen eines oder mehrerer Projektionspfade in einer Szene, die Teilcheninformationen entsprechen, die in einem ersten Puffer gespeichert sind; als ein Ergebnis der Interaktion des einen oder der mehreren Projektionspfade mit einem oder mehreren Objekten in der Szene, Berechnen von Positionsinformationen, die in einem zweiten Puffer und einem dritten Puffer gespeichert werden sollen; Berechnen von Fußabdruckinformationen, die auf eine Textur angewendet werden sollen, die in einem vierten Puffer gespeichert ist, mindestens zum Teil basierend auf den Positionsinformationen des dritten Puffers; und Aktualisieren der Teilcheninformationen des ersten Puffers mindestens zum Teil basierend auf den Positionsinformationen des zweiten Puffers.
    11. Computerlesbares Medium nach Anspruch 10, wobei die Anweisungen ferner Anweisungen umfassen, die als ein Ergebnis ihrer Ausführung durch den einen oder die mehreren Prozessoren bewirken, dass die Fußabdruckinformationen berechnet werden, indem die Positionsinformationen mit Intensitätsinformationen multipliziert werden, die als ein Ergebnis des einen oder der mehreren Projektionspfade bestimmt werden.
    12. Maschinenlesbares Medium nach Anspruch 10, wobei die Anweisungen, die den einen oder die mehreren Prozessoren veranlassen, die Teilcheninformationen des ersten Puffers zu aktualisieren, ferner Anweisungen beinhalten, die als ein Ergebnis ihrer Durchführung den einen oder die mehreren Prozessoren zu Folgendem veranlassen: Kombinieren der Positionsinformationen mit einer oder mehreren früheren Positionsinformationsdaten, um eine oder mehrere projizierte Positionsdaten zu berechnen und die Teilcheninformationen des ersten Puffers mit der einen oder den mehreren projizierten Positionsdaten zu aktualisieren.
    13. Computerlesbares Medium nach Anspruch 10, wobei die Anweisungen ferner Anweisungen umfassen, die als ein Ergebnis ihrer Durchführung durch den einen oder die mehreren Prozessoren bewirken, dass die Fußabdruckinformationen auf die Textur angewendet werden, die in dem vierten Puffer gespeichert ist, und bewirken, dass die Textur, die in dem vierten Puffer gespeichert ist, auf die Szene angewendet wird.
    14. Maschinenlesbares Medium nach Anspruch 10, wobei die Anweisungen, die den einen oder die mehreren Prozessoren veranlassen, Fußabdruckinformationen zu berechnen, ferner Anweisungen beinhalten, die als ein Ergebnis ihrer Durchführung den einen oder die mehreren Prozessoren zu Folgendem veranlassen: als ein Ergebnis des einen oder der mehreren Projektionspfade, die von einem Flächenlicht ausgehen, Anlegen von zwei oder mehr Kovarianzmatrizen, die Richtungsinformationen und Positionsinformationen aus den Teilcheninformationen entsprechen; und Berechnen der Fußabdruckinformationen mindestens zum Teil basierend auf einer Kombination der zwei oder mehr Kovarianzmatrizen.
    15. Verfahren, umfassend: Berechnen eines Projektionspfads für ein oder mehrere Lichtteilchen in einer Szene mindestens zum Teil basierend auf einer ersten Teilcheninformation; als ein Ergebnis des Interagierens des Projektionspfads mit einem oder mehreren Objekten in der Szene: Berechnen einer zweiten Teilcheninformation, die einen Fußabdruck für jedes des einen oder der mehreren Lichtteilchen angibt; und Aktualisieren der ersten Teilcheninformationen mindestens zum Teil basierend auf den zweiten Teilcheninformationen.
    16. Verfahren nach Anspruch 15, wobei die ersten Teilcheninformationen einen oder mehrere Datenwerte umfassen, die einer Position und einer Intensität für jedes des einen oder mehreren Lichtteilchen entsprechen.
    17. Verfahren nach Anspruch 15, wobei der Fußabdruck für jedes des einen oder der mehreren Lichtteilchen mindestens zum Teil basierend auf einem Positionswert, der mit jedem des einen oder der mehreren Lichtteilchen assoziiert ist, und einem Intensitätswert, der mit jedem des einen oder der mehreren Lichtteilchen assoziiert ist, dem Positionswert und dem Intensitätswert als ein Ergebnis der Interaktion des Projektionspfads mit dem einen oder den mehreren Objekten in der Szene berechnet wird.
    18. Verfahren nach Anspruch 15, wobei die ersten Teilcheninformationen mindestens zum Teil basierend auf einem aktuellen Positionswert aktualisiert werden, der als ein Ergebnis der Interaktion des Projektionspfads mit dem einen oder den mehreren Objekten und einem oder mehreren vorherigen Positionswerten bestimmt wird.
    19. Verfahren nach Anspruch 15, wobei die zweiten Teilcheninformationen auf eine Textur mindestens zum Teil basierend auf dem Fußabdruck für jedes des einen oder mehreren Lichtteilchen angewendet werden, und die Textur auf die Szene angewendet wird.
    20. Verfahren nach Anspruch 15, wobei als ein Ergebnis des einen oder der mehreren Lichtteilchen, die von einer Flächenlichtquelle ausgehen, die zweiten Teilcheninformationen berechnet werden durch: Anlegen von zwei oder mehr Kovarianzmatrizen, die Richtungsinformationen und Positionsinformationen aus den ersten Teilcheninformationen entsprechen; und Berechnen des Fußabdrucks mindestens zum Teil basierend auf einer Kombination der zwei oder mehr Kovarianzmatrizen.
    DE112020007631.8T 2020-09-24 2020-09-24 Echtzeit-kaustiken-abbildung Withdrawn DE112020007631T5 (de)

    Applications Claiming Priority (1)

    Application Number Priority Date Filing Date Title
    PCT/CN2020/117398 WO2022061644A1 (en) 2020-09-24 2020-09-24 Real-time caustics mapping

    Publications (1)

    Publication Number Publication Date
    DE112020007631T5 true DE112020007631T5 (de) 2023-07-20

    Family

    ID=80844740

    Family Applications (1)

    Application Number Title Priority Date Filing Date
    DE112020007631.8T Withdrawn DE112020007631T5 (de) 2020-09-24 2020-09-24 Echtzeit-kaustiken-abbildung

    Country Status (4)

    Country Link
    US (1) US20230162429A1 (de)
    CN (1) CN116324893A (de)
    DE (1) DE112020007631T5 (de)
    WO (1) WO2022061644A1 (de)

    Family Cites Families (5)

    * Cited by examiner, † Cited by third party
    Publication number Priority date Publication date Assignee Title
    EP1605408A1 (de) * 2004-06-11 2005-12-14 Saab Ab Image-based rendering (IBR)
    CN104157004B (zh) * 2014-04-30 2017-03-29 常州赞云软件科技有限公司 一种融合gpu与cpu计算辐射度光照的方法
    KR20170045809A (ko) * 2015-10-20 2017-04-28 삼성전자주식회사 커스틱을 표현하는 방법 및 장치
    CN107665501A (zh) * 2016-07-29 2018-02-06 北京大学 一种实时变焦光线追踪渲染引擎
    US10930022B2 (en) * 2018-08-09 2021-02-23 Nvidia Corporation Motion adaptive rendering using variable rate shading

    Also Published As

    Publication number Publication date
    CN116324893A (zh) 2023-06-23
    WO2022061644A1 (en) 2022-03-31
    US20230162429A1 (en) 2023-05-25

    Similar Documents

    Publication Publication Date Title
    DE102021106796A1 (de) Techniken zur speicherfehlerisolierung
    DE102021125626A1 (de) Licht-resampling mit flächenähnlichkeitsprüfung
    DE112021005433T5 (de) Verfahren zur leistungsbalancierung mehrerer chips
    DE112022003222T5 (de) Multi-architektur-ausführungsgraphen
    DE112022002140T5 (de) Licht-Resampling mit Strahlenverfolgung und Sichtbarkeit im Bildschirmraum
    DE102022101411A1 (de) Objektsimulation unter verwendung realer umgebungen
    DE102023101893A1 (de) Graphenbasierter speicher
    DE102022132013A1 (de) Anwendungsprogrammierschnittstellen für interoperabilität
    DE102022132008A1 (de) Asynchrone speicherdeallokation
    DE102022131530A1 (de) Verfahren zum modifizieren von graphencode
    DE102022131708A1 (de) Anwendungsprogrammierschnittstelle zum begrenzen von speicher
    DE112022003546T5 (de) Anwendungsprogrammierschnittstelle, die einen graph-code veranlasst, einen semaphor zu aktualisieren
    DE102022124362A1 (de) Benutzerkonfigurierbare speicherzuweisung
    DE112022001917T5 (de) Synchronisieren einer graphausführung
    DE112022002953T5 (de) Parallele verarbeitung von thread-gruppen
    DE102022107673A1 (de) Räumlich-zeitliches resampling mit entkoppeltem shading und wiederverwendung
    DE102022114509A1 (de) Speicherzuweisung unter verwendung von graphen
    DE102022104253A1 (de) Tonwertverwaltung unter Verwendung von Tonwertverstärkungsfunktionen für Bildgebungsanwendungen mit hohem Dynamikbereich
    DE112022000425T5 (de) Gleichzeitiges einführen von code
    DE102021122965A1 (de) Kontaktverfahren zur simulation
    DE112020007631T5 (de) Echtzeit-kaustiken-abbildung
    DE102022123627A1 (de) Anwendungsprogrammierschnittstelle zum einrichten von graphenressourcen
    DE102022132166A1 (de) Anwendungsprogrammierschnittstelle zum abrufen von teilen eines bilds
    DE102022132672A1 (de) Anwendungsprogrammierschnittstelle zum speichern von teilen eines bilds
    DE102022114663A1 (de) Synchronisatonsbarriere

    Legal Events

    Date Code Title Description
    R012 Request for examination validly filed
    R119 Application deemed withdrawn, or ip right lapsed, due to non-payment of renewal fee