DE112012000214T5 - Technik zur inter-prozeduralen Speicheradressenraumoptimierung in GPU-Rechencompiler - Google Patents

Technik zur inter-prozeduralen Speicheradressenraumoptimierung in GPU-Rechencompiler Download PDF

Info

Publication number
DE112012000214T5
DE112012000214T5 DE112012000214T DE112012000214T DE112012000214T5 DE 112012000214 T5 DE112012000214 T5 DE 112012000214T5 DE 112012000214 T DE112012000214 T DE 112012000214T DE 112012000214 T DE112012000214 T DE 112012000214T DE 112012000214 T5 DE112012000214 T5 DE 112012000214T5
Authority
DE
Germany
Prior art keywords
memory
memory space
memory access
pointer
program code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
DE112012000214T
Other languages
English (en)
Inventor
Xiangyun Kong
Jian-Zhong Wang
Yuan Lin
Vinod Grover
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 DE112012000214T5 publication Critical patent/DE112012000214T5/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5061Partitioning or combining of resources
    • G06F9/5066Algorithms for mapping a plurality of inter-dependent sub-tasks onto a plurality of physical CPUs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4442Reducing the number of cache misses; Data prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

Ein Geräte-Compiler-und-Linker ist konfiguriert zum Optimieren eines Programmcodes von einer Coprozessor-geeigneten Anwendung durch Auflösen generischer Speicherzugriffsoperationen innerhalb dieses Programmcodes, um auf spezifische Speicherräume abzuzielen. In Fällen, wo eine generische Speicherzugriffsoperation nicht aufgelöst werden kann und auf konstanten Speicher abzielen mag, werden konstante Variable, die mit diesen generischen Speicherzugriffsoperationen assoziiert sind, derart verlagert, dass sie in globalem Speicher residieren.

Description

  • QUERVERWEIS AUF VERWANDTE ANMELDUNGEN
  • Diese Anmeldung nimmt die Priorität der US-Provisional-Patentanmeldung mit dem Aktenzeichen 61/556,782, welche am 7. November 2011 eingereicht wurde, sowie die Priorität der US-Patentanmeldung mit dem Aktenzeichen 13/659,802, welche am 24. Oktober 2012 eingereicht wurde, in Anspruch. Jede dieser Anmeldungen wird hiermit durch Bezugnahme hierin aufgenommen.
  • HINTERGRUND DER ERFINDUNG
  • Gebiet der Erfindung
  • Die vorliegende Erfindung bezieht sich im Allgemeinen auf Grafikverarbeitungs-(GPU)-Rechencompiler (engl. „GPU computing compilers”) und spezifischer auf eine Technik zur inter-prozeduralen (engl. „inter-procedural”) Speicheradressenraumoptimierung (engl. „memory address space optimization”) in einem GPU-Rechencompiler.
  • Beschreibung des verwandten Standes der Technik
  • Graphikverarbeitungseinheiten (GPUs) sind mit der Zeit so entwickelt worden, dass sie zusätzlich zu graphikorientierten Operationen eine Vielzahl von Operationen unterstützen. Eine moderne GPU mag in der Tat dazu fähig sein, arbiträre Programmbefehle auszuführen. Eine solche GPU weist typischerweise einen Compiler auf, der Programmbefehle zur Ausführung auf einem oder mehreren Verarbeitungskernen kompiliert, die innerhalb der GPU enthalten sind. Jeder solche Kern mag einen bestimmten Ausführungsthread parallel zu anderen Verarbeitungskernen ausführen, die Ausführungsthreads ausführen.
  • Ein gegebener Kern innerhalb einer GPU mag an einen lokalen Speicherraum gekoppelt sein, welcher lokale Speicherraum für die GPU für Speicherzugriffsoperationen zur Verfügung steht, wenn sie einen Thread ausführt. Jeder Kern mag auch an einen gemeinsamen (engl. „shared”) Speicherraum gekoppelt sein, an welchen Speicherraum auch ein oder mehrere andere Kerne gekoppelt sein mögen. Mit dieser Konfiguration mögen mehrere Kerne Daten durch den gemeinsamen Speicherraum gemeinsam nutzen. Die Kerne innerhalb der GPU mögen auch an einen globalen Speicherraum gekoppelt sein, welcher für alle Verarbeitungskerne und gegebenenfalls für andere Verarbeitungseinheiten neben der GPU selbst zugriffbar ist.
  • Die oben beschriebene Konfiguration von mehreren verschidenen Speicherräumen wird in der Technik als eine „nicht uniforme Speicherarchitektur” bezeichnet. Eine nicht uniforme Speicherarchitektur weist im Allgemeinen mehrere verschiedene Speicherräume auf, in denen Daten residieren mögen. Ein Programm, das zum Ausführen auf einer GPU vorgesehen ist, mag auf Daten zugreifen, die in jeglichem oder allem der verschiedenen Speicherräumen in der nicht uniformen Speicherarchitektur residieren.
  • Verschiedene Speicherzugriffsoperationen mögen innerhalb eines solches Programms spezifiziert sein, wie zum Beispiel Lade/Speicher-Operationen (engl. „load/store operations”) oder elementare (engl. „atomic”) Operationen, wobei jede von diesen auf eine unterschiedliche Adresse abzielt. Eine gegebene Speicherzugriffsoperation, die auf eine gegebene Speicheradresse abzielt, mag aber keinen bestimmten Speicherraum spezifizieren. Bei konventionellen Lösungsansätzen liest die GPU, die das Programm ausführt, typischerweise während der Laufzeit (engl. „run time”) ein Tag (engl. „tag”), das mit der Adresse assoziiert ist und den bestimmten Speicherraum angibt, in welchem die Speicherzugriffsoperation ausgeführt werden soll. Ein Tag wird für jede Adresse benötigt, weil zwei verschiedene Variable zum Beispiel beide an der gleichen Adresse innerhalb unterschiedlicher Speicherräume residieren mögen. Ohne ein solches Tag wären die zwei Variable basierend auf den Adressen allein nicht zu unterscheiden sein.
  • Es ist aus zwei Gründen problematisch, sich auf dem oben beschriebenen Taggen-Ansatz (engl. „tagging approach”) zu verlassen. Erstens ist das Lesen eines Tags für jede Speicherzugriffsoperation eine teure Operation und verschwendet GPU-Ressourcen. Zweitens wird der GPU-Compiler daran gehindert, Programmcodeoptimierungen, einschließlich eines Neuordnens des Speicherzugriffs (engl. „memory access re-ordering”) oder einer Aliasanalyse, vor der Laufzeit durchzuführen, weil Variable, die die gleiche Adresse haben, bis zur Laufzeit nicht zu unterscheiden sind.
  • Folglich ist das, was in der Technik benötigt wird, eine effizientere Technik zum Kompilieren von GPU-Programmbefehlen.
  • ZUSAMMENFASSUNG DER ERFINDUNG
  • Eine Ausführungsform der vorliegenden Erfindung legt ein computerimplementiertes Verfahren zur Optimierung von Programmcode dar, der zur Ausführung auf einer Parallelverarbeitungseinheit (PPU), welche eine nicht uniforme Speicherarchitektur aufweist, kompiliert werden kann, das Verfahren aufweisend ein Identifizieren einer ersten Speicherzugriffsoperation, die mit einem ersten Zeiger assoziiert ist, wobei die erste Speicherzugriffsoperation auf einen generischen Speicherraum abzielt, ein Aszendieren (engl. „ascending”) einer Def-Use-Kette (engl. „use-definition chain”), die sich auf den ersten Zeiger bezieht, ein Hinzufügen des ersten Zeigers zu einem Vektor, nachdem es festgestellt wurde, dass der erste Zeiger von einem spezifischen Speicherraum in der nicht uniformen Speicherarchitektur abgeleitet (engl. „derived”) ist, und ein Bewirken, dass die erste Speicherzugriffsoperation auf den spezifischen Speicherraum abzielt, durch Modifizieren zumindest eines Abschnitts des Programmcodes.
  • Ein Vorteil der offenbarten Technik ist, dass eine Grafikverarbeitungseinheit nicht alle generischen Speicherzugriffsoperation während der Laufzeit auflösen (engl. „resolve”) muss, wodurch Ressourcen gespart werden und die Ausführung der Anwendung beschleunigt wird. Die Grafikverarbeitungseinheit ist des Weiteren dazu befähigt (engl. „enabled”), zusätzliche Programmcodeoptimierungen mit dem Programmcode der Anwendung durchzuführen, einschließlich eines Neuordnen des Speicherzugriffs und einer Aliasanalyse, was die Ausführung des Programmcodes weiter beschleunigt.
  • KURZE BESCHREIBUNG DER ZEICHNUNGEN
  • So dass die Art und Weise, in der die oben angeführten Merkmale der vorliegenden Erfindung im Detail verstanden werden kann, mag eine detailliertere Beschreibung der oben kurz zusammengefassten Erfindung durch Bezugnahme auf Ausführungsformen gehabt haben, von denen einige in der angehängten Zeichnungen dargestellt sind. Es muss aber bemerkt werden, dass die angehängten Zeichnungen nur typische Ausführungsformen der Erfindung illustrieren und somit nicht als den Umfang der Erfindung beschränkend angesehen werden dürfen, da die Erfindung andere gleich effektive Ausführungsformen zulassen mag.
  • 1 ist ein Blockdiagramm, das ein Computersystem darstellt, das zum Implementieren eines oder mehrerer Aspekte der vorliegenden Erfindung konfiguriert ist;
  • 2 ist ein Blockdiagramm von einem Parallelverarbeitungssubsystem für das Computersystem von 1, gemäß einer Ausführungsform der vorliegenden Erfindung;
  • 3 zeigt einen Erstellungsprozess (engl. „build process”), der zum Kompilieren einer Coprozessor-geeigneten Anwendung (engl. „co-processor enabled application”) verwendet wird, gemäß einer Ausführungsform der vorliegenden Erfindung;
  • 4 ist ein Flussdiagramm von Verfahrensschritten zur Optimierung von Speicherzugriffsoperationen, gemäß einer Ausführungsform der vorliegenden Erfindung;
  • 5 ist ein Flussdiagramm von Verfahrensschritten zur Verlagerung (engl. „transferring”) konstanter Variable nach einem globalen Speicherraum, gemäß einer Ausführungsform der vorliegenden Erfindung; und
  • 6 legt ein Beispiel eines Pseudocodes dar, um die Operation eines Geräte-Compiler-und-Linker (engl. „device compiler and linker”) zu illustrieren, gemäß einer Ausführungsform der vorliegenden Erfindung.
  • DETAILLIERTE BESCHREIBUNG
  • In der folgenden Beschreibung werden zahlreiche spezifische Details dargelegt, um ein eingehenderes Verständnis der vorliegenden Erfindung bereitzustellen. Es wird aber für einen Fachmann offenkundig sein, dass die vorliegende Erfindung auch ohne ein oder mehrere von diesen spezifischen Details ausgeübt werden kann.
  • Systemübersicht
  • 1 ist ein Blockdiagramm, das ein Computersystem 100 zeigt, das zum Implementieren eines oder mehrerer Aspekte der vorliegenden Erfindung konfiguriert ist. Das Computersystem 100 weist eine zentrale Verarbeitungseinheit (engl. „central processing unit”) (CPU) 102 und einen Systemspeicher 104 auf, die über einen Verbindungspfad (engl. „interconnection path”), der eine Speicherbrücke 105 aufweisen mag, miteinander in Verbindung stehen bzw. kommunizieren. Der Systemspeicher 104 enthält ein Abbild eines Operativsystems 130, einen Treiber 103 und eine Coprozessor-geeignete Anwendung 134. Das Operativsystem 130 stellt detaillierte Befehle zum Managen und Koordinieren der Operation des Computersystems 100 bereit. Der Treiber 103 stellt detaillierte Befehle zum Managen und Koordinieren der Operation vom Parallelverarbeitungssubsystem 112 und einem oder mehreren darin residierenden Parallelverarbeitungseinheiten (PPUs) bereit, wie es unten in Verbindung mit der 2 detaillierter beschrieben wird. Der Treiber 103 stellt auch Kompilierungsmittel zum Erzeugen von Maschinencode bereit, der für solche PPUs spezifisch optimiert ist, wie es unten in Verbindung mit den 36 detaillierter beschrieben wird. Die Coprozessor-geeignete Anwendung 134 enthält Befehle, die auf der CPU 102 und den PPUs ausgeführt werden können, wobei diese Befehle in einem abstrakten Format implementiert sind, wie zum Beispiel virtuellem Assembler (engl. „virtual assembly”), und zu Maschinencode für die PPUs innerhalb des Verarbeitungssubsystem 112 mappt. Der Maschinencode für diese PPUs mag im Systemspeicher 104 oder in einem Speicher, der an die PPUs gekoppelt ist, gespeichert sein.
  • In einer Ausführungsform stellt die Coprozessor-geeignete Anwendung 134 CUDATM-Code dar, der Programmbefehle enthält, die für Ausführung auf dem Parallelverarbeitungssystem 112 bestimmt sind. Im Kontext der vorliegenden Beschreibung mag der Begriff „Anwendung” oder „Programm” auf jeglichen Computercode, jegliche Befehle und/oder Funktionen hinweisen, die unter Verwendung eines Prozessors ausgeführt werden können. In verschiedenen Ausführungsformen mag die Coprozessor-geeignete Anwendung 134 zum Beispiel C-Code, C++-Code usw. enthalten. In einer Ausführungsform mag die Coprozessor-geeignete Anwendung 134 eine Programmierspracheerweiterung einer Computersprache enthalten (zum Beispiel C, C++ usw.).
  • Die Speicherbrücke 105, die zum Beispiel ein Northbridge-Chip sein mag, ist über einen Bus oder einen anderen Kommunikationspfad 106 (zum Beispiel einen HyperTransport-Link) mit einer Input/Output-(I/O)-Brücke 107 verbunden. Die I/O-Brücke 107, welche zum Beispiel ein Southbridge-Chip sein mag, erhält User-Input von einer oder mehreren User-Input-Vorrichtungen 108 (zum Beispiel Tastatur, Maus) und leitet den Input über den Kommunikationspfad 106 und die Speicherbrücke 105 an die CPU 102 weiter. Ein Parallelverarbeitungssubsystem 112 ist über einen Bus oder einen zweiten Kommunikationspfad 113 (zum Beispiel einen „Peripheral Component Interconnect Express” (PCIe), einen beschleunigten Grafikport (engl. „Accelerated Graphics Port”) (AGP), oder einen HyperTransport-Link) an die Speicherbrücke 105 gekoppelt; in einer Ausführungsform ist das Parallelverarbeitungssubsystem 112 ein Grafiksubsystem, das Pixel zu einer Displayvorrichtung 110 liefert, die jede konventionelle Kathodenstrahlröhre, Flüssigkristalldisplay, Lichtemittierende-Diode-Display oder ähnliches sein mag. Eine Systemdisk 114 ist auch mit der I/O-Brücke 107 verbunden und mag dazu konfiguriert sein, Inhalt und Anwendungen und Daten zu speichern, so dass diese von der CPU 102 und dem Parallelverarbeitungssubsystem 112 verwendet werden können. Die Systemdisk 114 stellt nicht flüchtigen Speicher für Anwendungen und Daten bereit und mag feste oder lösbare Festplattenlaufwerke, Flashspeichervorrichtungen und Compact-Disk-(CD)-Festspeicher (ROM), Digital-Video-Disk-(DVD)-ROM, Blu-Ray, High-Definition-(HD)-DVD oder andere magnetischen, optischen oder Festkörper-Speichervorrichtungen enthalten.
  • Ein Switch 116 stellt Verbindungen zwischen der I/O-Brücke 107 und anderen Bauteilen bereit, wie zum Beispiel einem Netzwerkadapter 118 und verschiedenen Erweiterungskarten (engl. „add-in cards”) 120 und 121. Andere (nicht explizit dargestellte) Bauteile, einschließlich Universal-Serial-Bus (USB) oder anderer Portanschlüsse (engl. „port connections”), CD-Laufwerke, DVD-Laufwerke, Filmaufzeichnungsvorrichtungen und ähnliches, mögen auch mit der I/O-Brücke 107 verbunden sein. Die verschiedenen Verbindungspfade, die in 1 gezeigt sind, einschließlich der spezifisch benannten Kommunikationspfade 106 und 113, mögen unter Verwendung von jeglichen geeigneten Protokollen, wie zum Beispiel PCIe, AGP, HyperTransport oder jedem anderen Bus oder Punkt-zu-Punkt-Kommunikationsprotokoll(en) (engl. „Point-to-Point Communication Protocol(s)”) implementiert sein, und Verbindungen zwischen verschiedenen Vorrichtungen mögen verschiedene Protokolle benutzen, wie es aus dem Stand der Technik bekannt ist.
  • Das Parallelverarbeitungssubsystem 112 weist in einer Ausführungsform Schaltkreise auf, die für Grafik- und Videoverarbeitung optimiert sind, einschließlich zum Beispiel Videoausgabeschaltkreise, und stellt eine Grafikverarbeitungseinheit (GPU) dar. In einer anderen Ausführungsform weist das Parallelverarbeitungssubsystem 112 Schaltkreise auf, die für Universalverarbeitung (engl. „general purpose processing”) optimiert sind, während die unterliegende rechnerische Architektur aufrechterhalten wird (wie es hierin detaillierter beschrieben wird). In noch einer anderen Ausführungsform mag das Parallelverarbeitungssubsystem 112 mit einem oder mehreren anderen Systemelementen in einem einzigen Subsystem integriert sein, wie zum Beispiel durch Zusammenführen der Speicherbrücke 105, der CPU 102 und der I/O-Brücke 107, um ein System-auf-Chip (engl. „system an chip”) (SoC) zu bilden.
  • Es wird verstanden werden, dass das hierin gezeigte System illustrativ ist und dass Variationen und Modifikationen möglich sind. Die Verbindungstopologie, einschließlich der Anzahl und Anordnung von Brücken, der Anzahl von CPUs 102 und der Anzahl von Parallelverarbeitungssubsystemen 112, mag wie gewünscht variiert werden. In einigen Ausführungsformen ist der Systemspeicher 104 zum Beispiel direkt mit der CPU 102 verbunden, statt durch eine Brücke, und andere Vorrichtungen kommunizieren über die Speicherbrücke 105 und die CPU 102 mit dem Systemspeicher 104. In anderen alternativen Topologien ist das Parallelverarbeitungssubsystem 112 mit der I/O-Brücke 107 oder direkt mit der CPU 102 verbunden, statt mit der Speicherbrücke 105. In noch anderen Ausführungsformen mögen die I/O-Brücke 107 und Speicherbrücke 105 in einem einzigen Chip integriert sein statt als eine oder mehrere diskrete Vorrichtungen zu existieren. Große Ausführungsformen mögen zwei oder mehr CPUs 102 und zwei oder mehr Parallelverarbeitungssubsysteme 112 aufweisen. Die jeweiligen hierin gezeigten Bauteile sind optional; zum Beispiel mag jede Anzahl von Erweiterungskarten oder Peripheriegeräten unterstützt werden. In einigen Ausführungsformen ist der Switch 116 entfernt und der Netzwerkadapter 118 und die Erweiterungskarten 120, 121 sind direkt mit der I/O-Brücke 107 verbunden.
  • 2 zeigt ein Parallelverarbeitungssubsystem 112 gemäß einer Ausführungsform der vorliegenden Erfindung. Das Parallelverarbeitungssubsystem 112 weist, wie gezeigt, eine oder mehr Parallelverarbeitungseinheiten (engl. „Parallel Processing Units”) (PPUs) 202 auf, wobei jede von denen an einen lokalen Parallelverarbeitungs-(PP)-Speicher 204 gekoppelt ist. Im Allgemeinen weist ein Parallelverarbeitungssubsystem eine Anzahl U von PPUs auf, wobei U größer oder gleich 1 ist. (Hierin werden mehrere Instanzen ähnlicher Objekte mit Bezugszeichen, die das Objekt identifizieren, und Ziffern in Klammern, die, wenn nötig, die Instanz identifizieren, gekennzeichnet.) Die PPUs 202 und die Parallelverarbeitungsspeicher 204 mögen unter Verwendung einer oder mehrerer integrierten Schaltungsvorrichtungen implementiert werden, wie zum Beispiel programmierbare Prozessoren, anwendungsspezifische integrierte Schaltungen (engl. „Application Specific Integrated Circuits”) (ASICs) oder Speichervorrichtungen, oder in jeder anderen technisch realisierbaren Art und Weise.
  • In einigen Ausführungsformen sind, wieder mit Bezug auf sowohl 1 als auch auf 2, einige oder alle der PPUs 202 in dem Parallelverarbeitungssubsystem 112 Grafikprozessoren mit Rendering-Pipelines, die dazu konfiguriert werden können, verschiedene Operationen in Bezug auf das Erzeugen von Pixeldaten aus Grafikdaten, die von der CPU 102 und/oder dem Systemspeicher 104 über die Speicherbrücke 105 und den zweiten Kommunikationspfad 113 bereitgestellt werden, auszuführen, mit lokalem Parallelverarbeitungsspeicher 204 (der als Grafikspeicher einschließlich, zum Beispiel, eines konventionellen Framepuffers benutzt werden kann) zu interagieren, um Pixeldaten zu speichern und zu aktualisieren, Pixeldaten an die Displayvorrichtung 110 zu übermitteln, und ähnliches. In einigen Ausführungsformen mag das Parallelverarbeitungssubsystem 112 eine oder mehrere PPUs 202 aufweisen, die als Grafikprozessoren arbeiten, und eine oder mehrere PPUs 202, die für Universalberechnungen (engl. „general-purpose computations”) benutzt werden. Die PPUs mögen identisch oder unterschiedlich sein, und jede PPU mag eine dedizierte(n) Parallelverarbeitungsspeichervorrichtung(en) oder keine dedizierte(n) Parallelverarbeitungsspeichervorrichtung(en) aufweisen. Eine oder mehrere PPUs 202 in dem Parallelverarbeitungssubsystem 112 mag bzw. mögen Daten an eine Displayvorrichtung 110 ausgeben oder jede PPU 202 in dem Parallelverarbeitungssubsystem 112 mag Daten an eine oder mehrere Displayvorrichtungen 110 ausgeben.
  • Im Betrieb ist die CPU 102 der Masterprozessor des Computersystems 100, welcher den Betrieb anderer Systembauteile steuert und koordiniert. Die CPU 102 erteilt insbesondere Befehle, die den Betrieb der PPUs 202 steuern. In einigen Ausführungsformen schreibt die CPU 102 einen Befehlsstrom für jede PPU 202 in eine (weder in 1 noch in 2 explizit gezeigte) Datenstruktur, die sich im Systemspeicher 104, Parallelverarbeitungsspeicher 204 oder in einer anderen Speicherstelle befinden mag, die für sowohl die CPU 102 als auch die PPU 202 zugreifbar ist. Ein Zeiger auf jede Datenstruktur wird in einen Stoßpuffer (engl. „push puffer”) geschrieben, um Verarbeitung des Befehlsstroms in der Datenstruktur zu initiieren. Die PPU 202 liest Befehlsströme aus einem oder mehreren Stoßpuffern aus und führt dann Befehle asynchron relativ zu dem Betrieb der CPU 102 aus. Ausführungsprioritäten mögen für jeden Stoßpuffer von einem Anwendungsprogramm über Gerätetreiber 103 festgelegt werden, um das Scheduling der verschiedenen Stoßpuffer zu steuern.
  • Jede PPU 202 weist eine I/O-(Input/Output)-Einheit 205 auf, die mit dem restlichen Computersystem 100 über Kommunikationspfad 113 kommuniziert, der mit der Speicherbrücke 105 (oder in einer alternativen Ausführungsform direkt mit der CPU 102) in Verbindung steht. Die Verbindung der PPU 202 an das restliche Computersystem 100 mag auch variiert werden. In einigen Ausführungsformen ist das Parallelverarbeitungssubsystem 112 als eine Erweiterungskarte implementiert, die in einen Erweiterungsslot (engl. „expansion slot”) des Computersystems 100 eingebracht werden kann. In anderen Ausführungsformen kann eine PPU 202 auf einem einzigen Chip mit einer Busbrücke, wie zum Beispiel Speicherbrücke 105 oder I/O-Brücke 107, integriert sein. In noch anderen Ausführungsformen mögen einige oder alle Elemente der PPU 202 auf einem einzigen Chip mit der CPU 102 integriert sein.
  • In einer Ausführungsform ist der Kommunikationspfad 113 ein PCIe-Anschluss (engl. „PCIe-link”), wie oben erwähnt, in welchem jeder PPU 202 dedizierte Spuren zugewiesen sind, wie es auf dem technischen Gebiet bekannt ist. Andere Kommunikationspfade mögen auch benutzt werden. Eine I/O-Einheit 205 erzeugt Pakete (oder andere Signale) für Transmission auf dem Kommunikationspfad 113 und empfängt auch alle ankommenden Pakete (oder anderen Signale) von dem Kommunikationspfad 113, wobei die ankommenden Pakete zu zweckmäßigen Bauteilen der PPU 202 geleitet werden. Befehle, die sich auf Bearbeitungstasks beziehen, mögen zum Beispiel zu einer Hostschnittstelle (engl. „host interface”) 206 geleitet werden, während Befehle, die sich auf Speichervorgänge (zum Beispiel Auslesen aus oder Schreiben auf den Parallelverarbeitungsspeicher 204) beziehen, zu einer Speicher-Kreuzschieneneinheit 210 geleitet werden mögen. Die Hostschnittstelle 206 liest jeden Stoßpuffer aus und gibt den Befehlsstrom, der in dem Stoßpuffer gespeichert ist, zu einem Frontend 212 aus.
  • Jede PPU 202 implementiert vorteilhafterweise eine in hohem Maße parallele Verarbeitungsarchitektur. Die PPU 202(0) weist, wie im Detail gezeigt, ein Verarbeitungscluster-Array (engl. „processing cluster array”) 230 auf, das eine Anzahl C von Allgemeinverarbeitungsclustern (engl. „general processing clusters”) (GPCs) 208 aufweist, wobei C ≥ 1. Jeder GPC 208 ist in der Lage, eine große Anzahl (zum Beispiel hunderte oder tausende) von Threads gleichzeitig auszuführen, wobei jeder Thread eine Instanz eines Programms ist. In verschiedenen Applikationen mögen unterschiedlichen GPCs 208 zur Verarbeitung unterschiedlicher Arten von Programmen oder zum Ausführen unterschiedlicher Arten von Berechnungen allokiert werden. Das Allokieren von GPCs 208 mag in Abhängigkeit von der Auslastung variieren, die für jede Art von Programm oder Berechnung entsteht.
  • Die GPCs 208 empfangen auszuführende Verarbeitungstasks von einer Arbeitsverteilungseinheit innerhalb einer Task/Arbeit-Einheit (engl. „task/work unit”) 207. Die Arbeitsverteilungseinheit empfängt Zeiger auf Verarbeitungstasks, die als Taskmetadaten (engl. „task metadata”) (TMD) kodiert und im Speicher gespeichert sind. Die Zeiger auf TMDs sind in den Befehlsstrom beinhaltet, der als ein Stoßpuffer gespeichert und mittels der Frontend-Einheit 212 von der Host-Schnittstelle 206 empfangen wird. Verarbeitungstasks, die als TMDs kodiert werden mögen, beinhalten Indices von zu verarbeitenden Daten sowie Zustandsparameter und Befehle, die definieren wie die Daten zu verarbeiten sind (zum Beispiel welches Programm auszuführen ist). Die Task/Arbeit-Einheit 207 empfängt Tasks von dem Frontend 212 und stellt sicher, dass die GPCs 208 zu einem gültigen Zustand konfiguriert sind, bevor die von jedem einzelnen der TMDs spezifizierte Verarbeitung eingeleitet wird. Eine Priorität mag für jede TMD, die zum Scheduling der Ausführung der Verarbeitungstasks benutzt wird, spezifiziert sein. Verarbeitungstasks können auch von dem Verarbeitungsclusterarray 230 erhalten werden. Die TMD können optional einen Parameter enthalten, der steuert, ob die TMD zu dem Kopf oder Ende von einer Liste von Verarbeitungstasks (oder Liste von Zeigern auf die Verarbeitungstasks) hinzugefügt wird, wodurch eine andere Stufe von der Steuerung der Priorität bereitgestellt wird.
  • Die Speicherschnittstelle 214 weist eine Anzahl D von Partitionseinheiten 215 auf, die jeweils direkt an einen Teil des Parallelverarbeitungsspeichers 204 gekoppelt sind, wobei D ≥ 1. Die Anzahl der Partitionseinheiten 215 ist, wie gezeigt, generell gleich der Anzahl von dynamischem RAM (DRAM) 220. In anderen Ausführungsformen mag die Anzahl der Partitionseinheiten 215 nicht gleich der Anzahl der Speichervorrichtungen sein. Durchschnittliche Fachleute werden verstehen, dass DRAM 220 durch andere geeignete Speichervorrichtungen ersetzt werden mag und von einer generell konventionellen Bauform sein kann. Eine detaillierte Beschreibung wird deswegen weggelassen. Render-Ziele, wie zum Beispiel Puffer- oder Strukturpläne, mögen quer über die DRAMs 220 gespeichert werden, was den Partitionseinheiten 215 ermöglicht, Teile von jedem Render-Ziel parallel zu schreiben, um die vorhandene Bandbreite des Parallelverarbeitungsspeichers 204 effizient zu nutzen.
  • Jeder der GPCs 208 mag Daten verarbeiten, die in irgendeinen der DRAMs 220 innerhalb des Parallelverarbeitungsspeichers 204 zu schreiben sind. Die Kreuzschieneneinheit 210 ist dazu konfiguriert, den Output jedes GPC 208 an den Input einer jeden Partitionseinheit 215 oder an einen anderen GPC 208 für weitere Verarbeitung zu leiten. Die GPCs 208 kommunizieren mit der Speicherschnittstelle 214 durch die Kreuzschieneneinheit 210, um aus bzw. in verschiedenen externen Speichervorrichtungen auszulesen bzw. zu schreiben. In einer Ausführungsform hat die Kreuzschieneneinheit 210 sowohl eine Verbindung zu der Speicherschnittstelle 214, um mit der I/O-Einheit 205 zu kommunizieren, als auch eine Verbindung zu dem lokalen Parallelverarbeitungsspeicher 204, wodurch es den Verarbeitungskernen innerhalb der verschiedenen GPCs 208 ermöglicht werden, mit dem Systemspeicher 104 oder einem anderen Speicher, der kein lokaler Teil der PPU 202 ist, zu kommunizieren. In der in 2 gezeigten Ausführungsform ist die Kreuzschieneneinheit 210 direkt mit der I/O-Einheit 205 verbunden. Die Kreuzschieneneinheit 210 mag virtuelle Kanäle benutzen, um Datenverkehrsströme zwischen den GPCs 208 und den Partitionseinheiten 215 zu separieren.
  • Wie erwähnt können die GPCs 208 zum Ausführen von Verarbeitungstasks, die sich auf eine umfangreiche Vielfalt von Applikationen beziehen, programmiert werden, einschließlich, aber nicht begrenzt auf, linearer und nicht-linearer Datentransformationen, Filtern von Video- und/oder Audiodaten, Modellierungsvorgänge (zum Beispiel der Anwendung von physikalischen Gesetzen zum Bestimmen von Position, Geschwindigkeit und anderen Eigenschaften von Objekten), Bild-Rendering-Vorgängen (zum Beispiel Mosaikshader-, Scheitelshader-, Geometrieshader- und/oder Pixel-Shaderprogramme (engl. „tesselation shader, vertex shader, geometry shader, and/or pixel shader programs”)), usw. Die PPUs 202 mögen Daten von dem Systemspeicher 104 und/oder den lokalen Parallelverarbeitungsspeichern 204 in einen internen (auf-dem-Chip) Speicher hinein übertragen, die Daten verarbeiten und die Ergebnisdaten zurück in den Systemspeicher 104 und/oder die lokalen Parallelverarbeitungsspeicher 204 schreiben, wo auf solche Daten von anderen Systembauteilen, einschließlich CPU 102 oder anderer Parallelverarbeitungssubsysteme 112, zugegriffen werden kann.
  • Eine PPU 202 mag mit jeder Menge lokaler Parallelverarbeitungsspeicher 204, einschließlich keiner lokalen Speicher, ausgestattet sein, und mag lokalen Speicher und Systemspeicher in jeder beliebigen Kombination benutzen. Eine PPU 202 kann zum Beispiel ein Grafikprozessor in einer Ausführungsform mit „unified memory architecture” (UMA) sein. In solchen Ausführungsformen würde wenig oder kein dedizierter Grafik-(Parallelverarbeitungs-)Speicher bereitgestellt werden, und die PPU 202 würde ausschließlich oder fast ausschließlich den Systemspeicher benutzen. In UMA-Ausführungsformen mag eine PPU 202 in einem Brückenchip oder Prozessorchip integriert sein oder als ein diskreter Chip mit einem Hochgeschwindigkeitsanschluss (beispielsweise PCI-Express), der die PPU 202 über einen Brückenchip oder ein anderes Kommunikationsmittel mit dem Systemspeicher verbindet, bereitgestellt werden. In der Ausführungsform der Erfindung, welche Ausführungsform in Zusammenhang mit den 36 beschrieben wird, ist jede PPU 202 mit einer nicht gleichmäßigen (engl. „non-uniform”) Speicherarchitektur implementiert und jede solche PPU 202 mag folglich Zugriff auf mehrere verschiedenen Speicherräume haben, wie es von der Coprozessor-geeigneten Anwendung 134 angewiesen wird.
  • Wie oben erwähnt, kann eine beliebige Anzahl von PPUs 202 in einem Parallelverarbeitungssubsystem 112 enthalten sein. Mehrere PPUs 202 können zum Beispiel auf einer einzigen Erweiterungskarte bereitgestellt werden oder mehrere Erweiterungskarten können mit dem Kommunikationspfad 113 verbunden werden oder eine oder mehrere der PPUs 202 können in einem Brückenchip integriert werden. Die PPUs 202 in einem Mehrfach-PPU-System mögen gleich oder unterschiedlich voneinander sein. Unterschiedliche PPUs 202 mögen zum Beispiel eine jeweils unterschiedliche Anzahl von Prozessorkernen, unterschiedliche Mengen von lokalem Parallelverarbeitungsspeicher usw. aufweisen. Wenn mehrere PPUs 202 vorhanden sind, mögen diese PPUs parallel betrieben werden, um Daten mit einem größeren Durchsatz, als es mit einer einzigen PPU 202 möglich ist, zu verarbeiten. Systeme, die eine oder mehrere PPUs 202 aufweisen, mögen in einer Vielfalt von Konfigurationen und Formfaktoren implementiert werden, einschließlich Desktop-, Laptop- oder handgeführter Rechner, Server, Arbeitsstationen (engl. „workstations”), Spielkonsolen, eingebetteter Systeme und ähnliches.
  • Wie erwähnt, in der Ausführungsform der Erfindung, die in Zusammenhang mit den 36 beschriebenen wurde, ist jede PPU 202 mit einer nicht uniformen Speicherarchitektur implementiert. Jede solche PPU 202 mag folglich Zugriff auf mehrere verschiedene Speicherräume haben, wie zum Beispiel Systemspeicher 104 oder PP-Speicher 204, unter anderem, wie es von der Coprozessor-geeigneten Anwendung 134 angewiesen wird. Eine Compiler-und-Linker-Anwendung, die vom Gerätetreiber 103 abgeleitet ist, ist dazu konfiguriert, Programmcode zu optimieren und kompilieren, um die Coprozessor-geeignete Anwendung 134 zu erzeugen. Dieser Programmcode mag anfangs verschiedene Speicherzugriffsoperationen enthalten, wie zum Beispiel Lade/Speicher-Operationen oder elementare Operationen, die keinen spezifischen Speicherraum definieren mögen, mit welchem die Speicherzugriffsoperationen auszuführen sind. Solche Speicherzugriffsoperationen werden hierin als „generische Speicherzugriffsoperationen” bezeichnet. Um den Programmcode zu optimieren, ist die Compiler-und-Linker-Anwendung dazu konfiguriert, dieser Programmcode nach Bedarf zu modifizieren, um generische Speicherzugriffsoperationen in spezifische Speicherzugriffsoperationen aufzulösen, die auf einen bestimmten Speicherraum abzielen, wie es unten in Zusammenhang mit den 36 detaillierter beschrieben wird.
  • 3 zeigt den Erstellungsprozess, der zum Kompilieren der Coprozessor-geeigneten Anwendung 134 von 1 verwendet wird, gemäß einer Ausführungsform der vorliegenden Erfindung. Der Programmcode 310 enthält Host-Quellcode 312 und Geräte-Quellcode 314. Der Host-Quellcode 312 enthält Programmbefehle, die dafür vorgesehen sind, auf einem Host, wie zum Beispiel einem ×86-basierten persönlichen Rechner (PC) oder Server, ausgeführt zu werden. Die Programmbefehle im Quellcode 312 mögen Aufrufe zu Funktionen enthalten, die in dem Geräte-Quellcode 314 definiert sind. Jeder technisch geeignete Mechanismus mag verwendet werden, um zu spezifizieren, welche Funktionen als Geräte-Quellcode 314 gekennzeichnet sind.
  • Der Host-Quellcode 312 wird vorverarbeitet, kompiliert und eingebunden (engl. „linked”) von einem Host-Compiler-und-Linker 322. Der Host-Compiler-und-Linker 322 erzeugt Hostmaschinencode 342, der innerhalb der Coprozessor-geeigneten Anwendung 134 gespeichert wird.
  • Der Geräte-Quellcode 314 wird vorverarbeitet, kompiliert und eingebunden von einem Geräte-Compiler-und-Linker 324. Diese Kompilierungsoperation bildet eine Kompilierung erster Stufe von dem Geräte-Quellcode 314. Der Geräte-Compiler-und-Linker 324 erzeugt virtuellen Geräte-Assembler 346, der innerhalb eines Geräte-Codespeichers 350 gespeichert wird, welcher sich bei oder innerhalb der Coprozessor-geeigneten Anwendung 134 befindet. Ein Übersetzer 334 virtueller Befehle mag Geräte-Maschinencode 324 aus dem virtuellen Geräte-Assembler 346 erzeugen. Diese Kompilierungsoperation bildet eine Kompilierung zweiter Stufe von dem Geräte-Quellcode 314. Der Übersetzer 334 virtueller Befehle mag mehr als eine Version von Geräte-Maschinencode 344 erzeugen, basierend auf der Verfügbarkeit von bekannten Architekturdefinitionen. Zum Beispiel mag der Übersetzer 334 virtueller Befehle eine erste Version vom Geräte-Maschinencode 344, die native 64-Bit arithmetische Befehle (die in der ersten Zielarchitektur zur Verfügung stehen) aufrufen, und eine zweite Version vom Geräte-Maschinencode 344 erzeugen, die 64-Bit arithmetische Befehle auf solchen Ziele emuliert, die keine native 64-Bit arithmetische Befehle enthalten.
  • Architekturinformation 348 kennzeichnet die tatsächliche Architekturversion, die zum Erzeugen des Geräte-Maschinencodes 344 verwendet wurde. Die tatsächliche Architekturversion definiert die Features, die in nativen Befehlen innerhalb eines tatsächlichen Ausführungsziels, wie zum Beispiel der PPU 202, implementiert sind. Die Architekturinformation 348 kennzeichnet auch die Version der virtuellen Architektur, die zum Erzeugen des virtuellen Geräte-Assemblers 346 verwendet wurde. Die virtuelle Architekturversion definiert die Features, die entweder als nativ oder leicht emulierbar zu sein angenommen werden, und die Features, die nicht zum Emulieren geeignet sind. Elementare (engl. „atomic”) Additionsoperationen sind zum Beispiel zum Emulieren auf der Befehlsebene nicht geeignet, obwohl sie auf der algorithmischen Ebene in bestimmten Fällen insgesamt vermieden werden mögen, und mögen folglich beeinflussen, welche Funktionen in der ersten Kompilierungsstufe kompiliert werden mögen.
  • Zusätzlich zu dem Geräte-Maschinencode 344 und virtuellen Geräte-Assembler 346 mag der Geräte-Codespeicher auch Architekturinformation 348 enthalten, die kennzeichnet, welche Architektur-Features angenommen wurde, wenn der Geräte-Maschinencode 344 und der virtuelle Geräte-Assembler 346 erzeugt wurden. Fachleute werden erkennen, dass die Funktionen, die innerhalb des Geräte-Maschinencodes 344 und virtuellen Assemblers 346 enthalten sind, Funktionen Wiederspiegeln (engl. „reflect”), die mit der tatsächlichen Architektur der PPU 202 assoziiert sind. Die Architekturinformation 348 stellt Kompatibilitätsinformation für den Geräte-Maschinencode 344 und Compilerhinweise für eine Kompilierungsoperation zweiter Stufe bereit, die zu irgendeinem Zeitpunkt, nachdem die Entwicklung der Coprozessor-geeigneten Anwendung 134 schon beendet wurde, von einem Gerätetreiber 103 ausgeführt werden mögen.
  • Inter-prozedurale Speicherraumoptimierung
  • Der Geräte-Compiler-und-Linker 324 ist auch dazu konfiguriert, verschiedene Optimierungsroutinen mit verschiedenen Prozeduren und/oder Funktionen innerhalb des Programmcodes 310 auszuführen. Wie erwähnt mag der Programmcode 310 anfangs generische Speicherzugriffsoperationen enthalten, die keinen bestimmten Speicherraum spezifizieren, und der Geräte-Compiler-und-Linker 324 ist dazu konfiguriert, den Programmcode derart zu modifizieren, dass die generischen Speicherzugriffsoperationen in solche Speicherzugriffsoperationen auflösen werden, die auf einen bestimmten Speicherraum abzielen. 4 beschreibt einen Ansatz zum Optimieren von Speicherzugriffsoperationen, 5 beschreibt einen Ansatz zum Verlagern konstanter Variable zum Residieren in einem globalen Speicherraum und 6 beschreibt ein beispielhaftes Szenario, in welchem die in Zusammenhang mit den 4 und 5 abgehandelten Ansätze vorteilhaft sein mögen.
  • 4 ist ein Flussdiagram von Verfahrensschritten zum Optimieren von Speicherzugriffsoperationen, gemäß einer Ausführungsform der vorliegenden Erfindung. Obwohl die Verfahrensschritte im Zusammenhang mit den Systemen von den 12 beschrieben werden, werden Fachleute verstehen, dass jedes System, das konfiguriert ist zum Ausführen der Verfahrensschritte, in jeglicher Reihenfolge, in dem Umfang der vorliegenden Erfindung enthalten ist. Der Geräte-Compiler-und-Linker 324, der in 3 gezeigt ist, ist dazu konfiguriert, die Verfahrensschritte zu implementieren.
  • Wie gezeigt beginnt ein Verfahren 400 bei Schritt 402, wo der Geräte-Compiler-und-Linker 324 Speicherzugriffsoperationen innerhalb des Programmcodes 310 sammelt, die auf einen generischen Speicherraum abzielen. Die Speicherzugriffsoperationen mögen Lade/Speicher-Operationen oder elementare Operationen sein, wie zum Beispiel Zeiger-Bezugsaufhebung (engl. „pointer de-referencing”). Bei Schritt 404 aszendiert der Geräte-Compiler-und-Linker 324 für jede Speicherzugriffsoperation, die beim Schritt 402 gesammelt wurde, eine Def-Use-Kette, die für den Zeiger erzeugt wurde, der mit der Speicherzugriffsoperation assoziiert ist, um den spezifischen Speicherraum festzustellen, von dem der Zeiger abgeleitet ist. Der Geräte-Compiler-und-Linker 324 mag die Def-Use-Kette unter Verwendung verschiedener Techniken erzeugen, wie zum Beispiel Datenflussanalyse, um die Verwendung des Zeigers und jede frühere Definitionen, die den Zeiger einbinden, zu identifizieren. In einer Ausführungsform erzeugt der Geräte-Compiler-und-Linker 324 die Def-Use-Kette unter Verwendung von live Analyse-basierten Techniken.
  • Bei Schritt 406 fügt der Geräte-Compiler-und-Linker 324 jeden Zeiger, der von einem spezifischen Speicherraum (wie zum Beispiel globalem Speicher, lokalem Speicher, gemeinsamem Speicher, usw.) abgeleitet ist, zu einem Vektor hinzu. Bei Schritt 408 modifiziert der Geräte-Compiler-und-Linker 324, für jeden Zieger in dem im Schritt 406 erzeugten Vektor, die Speicherzugriffsoperation, die mit diesem Zeiger assoziiert ist, um auf den spezifischen Speicherraum abzuzielen, von welchem der Zeiger abgeleitet wurde. Ein bestimmter Zeiger p, der von globalem Speicher abgeleitet ist, mag zum Beispiel während einer Ladeoperation bezugsaufgehoben (engl. „de-referenced”) werden. Durch Implementieren des Verfahrens 400 könnte der Geräte-Compiler-und-Linker 324 die Zeiger-Bezugsaufhebung durch eine Ladeoperation ersetzen, die spezifisch auf globalen Speicher abzielt.
  • In einigen Situationen mag der Geräte-Compiler-und-Linker 324 nicht dazu fähig sein, das Verfahren 400 zu implementieren, um eine gegebene Speicherzugriffsoperation derart zu modifizieren, dass er auf einen spezifischen Speicherraum innerhalb des Programmcodes 310 abzielt. Eine solche Situation mag auftreten, wenn der Programmcode 310 einen Verzweigungsbefehl enthält. Da das Ergebnis eines Verzweigungsbefehls bis zur Laufzeit unbekannt ist, mögen Speicherzugriffsoperationen, die in Abhängigkeit von dem Ergebnis des Verzweigungsbefehls auf unterschiedliche Speicherräume abzielen, nicht in der oben beschriebenen Art und Weise modifizierbar sein. In einigen Fällen mögen diese Speicherzugriffsoperationen als generische Speicherzugriffsoperationen unberührt belassen und zur Laufzeit aufgelöst werden.
  • Speicherzugriffsoperationen auf einen Speicherraum, der für konstanten Variable reserviert ist, mögen aber zur Laufzeit nicht effektiv aufgelöst werden. Da konstanter Speicherraum typischerweise innerhalb eines ausschließlich lesbaren (engl. „read-only”) Speichers residiert, sind Speicherzugriffsoperationen, die mit konstantem Speicher assoziiert sind, fundamental unterschiedlich von anderen Speicherzugriffsoperationen und mögen als solche zur Laufzeit nicht auflösbar sein. Der Geräte-Compiler-und-Linker 324 ist folglich dazu konfiguriert, bestimmte konstante Variable und die assoziierten Speicherzugriffsoperationen innerhalb des Programmcodes 310 derart zu verlagern, dass sie jeweils in einem globalen Speicherraum residiert und auf diesen abzielt, wie es unten in Zusammenhang mit der 5 detaillierter diskutiert wird.
  • 5 ist ein Blockdiagramm von Verfahrensschritten zur Verlagerung konstanter Variable, so dass diese in globalem Speicherraum residieren, gemäß einer Ausführungsform der vorliegenden Erfindung. Obwohl die Verfahrensschritte in Zusammenhang mit den Systemen der 12 beschrieben werden, werden Fachleute verstehen, dass jedes System, das zur Durchführung der Verfahrensschritte, in beliebiger Reihenfolge, konfiguriert ist, innerhalb des Umfangs der vorliegenden Erfindung ist. Der in 3 gezeigte Geräte-Compiler-und-Linker 324 ist dazu konfiguriert, die Verfahrensschritte zu implementieren.
  • Ein Verfahren 500 beginnt, wie gezeigt, bei Schritt 502, bei dem der Geräte-Compiler-und-Linker 324, für jede konstante Adresse im Programmcode 310, die Def-Use-Kette für die konstante Adresse aszendiert, bis eine Speicherzugriffsoperation erreicht wird. Der Geräte-Compiler-und-Linker 324 mag die Def-Use-Kette unter Verwendung von konventionellen Techniken erzeugen, wie zum Beispiel Datenflussanalyse, um die Deklaration der konstanten Adresse und jeder nachfolgenden Verwendungen zu identifizieren. In einer Ausführungsform erzeugt der Geräte-Compiler-und-Linker 324 die Def-Use-Kette unter Verwendung von live Analyse-basierten Techniken.
  • Bei Schritt 504 markiert der Geräte-Compiler-und-Linker 324, für jede Speicherzugriffsoperation, die im Schritt 502 erreicht wurde und mit einem bestimmten konstanten Adresse assoziiert ist, eine konstante Deklaration, die mit der konstanten Adresse assoziiert ist, als „muss verlagert werden” (engl. „must-transfer”), wenn die Speicherzugriffsoperation nicht auf einen spezifischen Speicherraum aufgelöst wurde.
  • Bei Schritt 506 erzeugt der Geräte-Compiler-und-Linker 324 eine Abhängigkeitsliste für jede Speicherzugriffsoperation. Bei Schritt 508 identifiziert der Geräte-Compiler-und-Linker 324 jegliche Abhängigkeitslisten, die konstante Adressen mit Deklarationen, die als „muss verlagert werden” markiert sind, enthalten. Bei Schritt 510 markiert der Geräte-Compiler-und-Linker 324 jegliche Speicherzugriffsoperationen, die mit den im Schritt 508 identifizierten Abhängigkeitslisten assoziiert sind, als „muss verlagert werden”. Bei Schritt 512 markiert der Geräte-Compiler-und-Linker 324 jegliche konstanten Deklarationen, die mit konstanten Adressen innerhalb der identifizierten Abhängigkeitslisten assoziiert sind, als „muss verlagert werden”. Bei Schritt 514 modifiziert der Geräte-Compiler-und-Linker 324 jede verlagerbare konstante Deklaration, um eine Stelle im globalen Speicherraum zu spezifizieren. Bei Schritt 516 modifiziert der Geräte-Compiler-und-Linker 324 jede verlagerbare Speicherzugriffsoperation, um auf globalen Speicher abzuzielen. Dann endet das Verfahren 500.
  • Durch Implementieren des Verfahrens 500 kann der Geräte-Compiler-und-Linker 324 konstante Variable verlagern, so dass diese in einem globalen Speicherraum residieren, in Situationen, wo Verzweigungsbefehle ansonsten Speicherzugriffsoperationen, die diese konstanten Variable einbinden, als generische Speicherzugriffsoperationen belassen wurden. Des Weiteren ist der Geräte-Compiler-und-Linker 324 auch dazu konfiguriert, jegliche konstante Variable und assoziierte Speicherzugriffsoperationen, die von früher verlagerten Variablen abhängig sind, zu verlagern, wodurch es gesichert wird, dass alle abhängigen konstanten Variable zusammen verlagert werden.
  • Die Verfahren 400 und 500, die oben im Zusammenhang mit den 4 und 5 jeweils beschrieben wurden, werden unten in Zusammenhang mit der 6 anhand eines Beispiels detaillierter dargestellt.
  • 6 legt ein Pseudocode-Beispiel zur Illustration der Operation eines Geräte-Compiler-und-Linker dar, gemäß einer Ausführungsform der vorliegenden Erfindung. Der Pseudocode 600 enthält, wie gezeigt, die Pseudocodeblöcke 610, 620, 630 und 640. Der Pseudocodeblock 610 enthält zwei konstante Int-Deklarationen (engl. „constant int declarations”) für die Variable c1 und c2 und eine gemeinsame Int-Deklaration für die Variable s. Der Pseudocodeblock 620 enthält drei Zeigerzuordnungen p1, p2 und p4 zu Adressen von den Variablen c1, s und c2. Der Pseudocodeblock 630 enthält Verzweigungsbefehle 632 und 634, die jeweils die Zeiger p3 und p5 unterschiedlich zuordnen, in Abhängigkeit davon, welche Abzweigung zur Laufzeit gefolgt wird. Der Pseudocodeblock 640 enthält Speicherzugriffsoperationen, die die Daten, die bei den Zeigern p3, p5 und p1 gespeichert sind, jeweils zu den Variablen x, y und z setzen. Fachleute werden verstehen, dass der oben beschriebene Pseudocode 600 in einfacher Weise in einer Vielzahl von Programmiersprachen implementiert werden kann. In einer Ausführungsform mag der Pseudocode 600 in der CUDATM-Programmiersprache implementiert werden und mag einen Teil von dem Programmcode 310 oder den ganzen Programmcode 310 darstellen.
  • Die folgende Beschreibung stellt nur ein Beispiel von einem Geräte-Compiler-und-Linker 324 dar, der das Verfahren 400 ausführt, das oben in Zusammenhang mit der 4 beschrieben wurde. In diesem Beispiel identifiziert der Geräte-Compiler-und-Linker 324 erst die Speicherzugriffsoperationen innerhalb des Pseudocodeblocks 640, ähnlich dem Schritt 402 des Verfahrens 400. Diese Speicherzugriffsoperationen sind, wie gezeigt, mit den Zeigern p1, p3 und p5 assoziiert.
  • Der Geräte-Compiler-und-Linker 324 aszendiert dann die Def-Use-Kette von jeder solchen Speicherzugriffsoperation, ähnlich dem Schritt 404 des Verfahrens 400. In dem Pseudocode 600 aszendiert der Geräte-Compiler-und-Linker 324 die Def-Use-Kette von p3 dadurch, dass er jede Abzweigung des Verzweigungsbefehls 632 bis auf die Zeigerzuordnungen von p1 und p2 im Pseudocodeblock 620 hinauf folgt, und dann (engl. „tracing”) die Variable c1 und s zurück zu der Deklaration dieser Variable innerhalb des Pseudocodeblocks 610 verfolgt. In ähnlicher Weise aszendiert der Geräte-Compiler-und-Linker 324 die Def-Use-Kette von p5 dadurch, dass er jede Abzweigung des Verzweigungsbefehls 634 bis auf die Zeigerzuordnungen von p1 und p4 im Pseudocodeblock 620 hinauf folgt, und dann die Variable c1 und c2 zurück zu der Deklaration dieser Variable innerhalb des Pseudocodeblocks 610 verfolgt. Der Geräte-Compiler-und-Linker 324 aszendiert die Def-Use-Kette von p1 dadurch, dass er diesen Zeiger zurück zu der Zeigerzuordnung im Pseudocodeblock 620 verfolgt, und dann die Variable c1 zurück zu der Deklaration dieser Variable innerhalb des Pseudocodeblocks 610 verfolgt.
  • Für jeden Zeiger, der mit den Speicherzugriffsoperationen, die im Schritt 404 gesammelt wurden, assoziiert sind, fügt der Geräte-Compiler-und-Linker 324 den Zeiger zu einem Vektor hinzu, wenn dieser Zeiger von einem spezifischen Speicherraum abgeleitet worden ist, ähnlich dem Schritt 406 in dem Verfahren 400. In dem Pseudocode 600 ist der Zeiger p1 von der konstanten Variable c1 abgeleitet, welche im konstanten Speicher residiert. Folglich fügt der Geräte-Compiler-und-Linker 324 p1 zu dem Vektor hinzu. Der Zeiger p3 ist von entweder p1 oder p2 abgeleitet, abhängig von dem Verzweigungsbefehl 632. Da p1 und p2 jeweils vom konstanten und gemeinsamen Speicher abgeleitet sind, kann der mit p3 assoziierte Speicherzugriff nicht zu einem spezifischen Speicherraum aufgelöst werden und p3 wird nicht zu dem Vektor hinzufügt. Der Zeiger p5 ist von einem der konstanten Variablen c1 und c2 abgeleitet und wird folglich, unabhängig davon, welche Abzweigung von dem Verzweigungsbefehl 634 zur Laufzeit gefolgt wird, immer noch von dem konstanten Speicher abgeleitet werden. Folglich fügt der Geräte-Compiler-und-Linker 324 p5 zu dem Vektor hinzu.
  • Der Geräte-Compiler-und-Linker 324 durchläuft (engl. „traverses”) den Vektor und modifiziert, für jeden Zeiger in dem Vektor, die assoziierte Speicherzugriffsoperation zum Abzielen auf den spezifischen Speicherraum, von dem der Zeiger abgeleitet wurde, ähnlich dem Schritt 408 des Verfahrens 400. Dabei modifiziert der Geräte-Compiler-und-Linker 324 die Speicherzugriffsoperationen von p1 und p5 derart, dass diese spezifisch auf konstanten Speicher abzielt. Die mit p3 assoziierte Speicherzugriffsoperation wird als eine generische Speicherzugriffsoperation gelassen.
  • Nachdem das Verfahren 400 von 4 auf dem Pseudocode 600 durchgeführt worden ist, mag der Geräte-Compiler-und-Linker 324 dann den Pseudocode 600 dadurch neu verarbeiten (engl. „re-process”), dass er das Verfahren 500 von 5 auf dem Pseudocode 600 durchführt, wie es unten anhand eines Beispiels diskutiert wird.
  • Die folgende Beschreibung stellt lediglich ein Beispiel dar, in dem der Geräte-Compiler-und-Linker 324 das Verfahren 500 durchführt, das oben in Zusammenhang mit der 5 beschrieben wurde. In diesem Beispiel deszendiert (engl. „descends”) der Geräte-Compiler-und-Linker 324 erst die Def-Use-Kette von jeder konstanten Adresse bis ein Speicherzugriff erreicht wird, ähnlich dem Schritt 502 des Verfahrens 500. Der Geräte-Compiler-und-Linker 324 aszendiert die Def-Use-Kette von den konstanten Variablen c1 und c2, die im Pseudocodeblock 610 deklariert wurden, bis zum Erreichen der mit diesen konstanten Variablen assoziierten Speicherzugriffsoperationen. Wie gezeigt kann c1 herunter zu den Speicherzugriffsoperationen, die die Zeiger p1, p3 und p5 einbinden, verfolgt werden, während c2 herunter zu den Speicherzugriffsoperationen, die lediglich den Zeiger p5 einbinden, verfolgt werden kann.
  • Für jede der Speicherzugriffsoperationen, die von einer bestimmten konstanten Deklaration abgeleitet sind, markiert der Geräte-Compiler-und-Linker 324 diese konstante Deklaration als „muss verlagert werden”, wenn der Speicherzugriff nicht auf einen spezifischen Speicherraum aufgelöst wird, ähnlich dem Schritt 504 des Verfahrens 500. Wie es oben in dem vorhergenden Beispiel diskutiert wurde, wurde die Speicherzugriffsoperation, die mit dem Zeiger p3 assoziiert ist, als eine generische Speicherzugriffsoperation gelassen, und so markiert der Geräte-Compiler-und-Linker 324 die konstante Deklaration, die mit dieser Speicherzugriffsoperation assoziiert ist, (die Deklaration für c1) als „muss verlagert werden”.
  • Dann erzeugt der Geräte-Compiler-und-Linker 324 eine Abhängigkeitsliste für jeden Speicherzugriff, ähnlich dem Schritt 506 des Verfahrens 500. Der Geräte-Compiler-und-Linker 324 ist konfiguriert zum Identifizieren jeglicher Abhängigkeitslisten, die konstanten Adressen mit konstanten Deklarationen enthalten, die als „muss verlagert werden” markiert sind, ähnlich dem Schritt 508 des Verfahrens 500. Im Pseudocode 600 ist die mit dem Zeiger p1 assoziierten Speicherzugriffsoperation abhängig von c1, die als „muss verlagert werden” markiert wurde. In ähnlicher Weise ist die Speicherzugriffsoperation, die mit dem Zeiger p3 assoziiert ist, abhängig von c1 und die Speicherzugriffsoperation, die mit dem Zeiger p5 assoziiert ist, ist auch abhängig von c1. Folglich würde der Geräte-Compiler-und-Linker 324 die Abhängigkeitslisten identifizieren, die mit diesen Speicherzugriffsoperationen assoziiert sind.
  • Der Geräte-Compiler-und-Linker 324 würde dann die Speicherzugriffsoperationen, die mit den identifizierten Abhängigkeitslisten assoziiert sind, als „muss verlagert werden” markieren, ähnlich dem Schritt 510 des Verfahrens 500. In dem hierin beschriebenen Beispiel würde der Geräte-Compiler-und-Linker 324 alle die Speicherzugriffsoperationen, die im Pseudocodeblock 640 gezeigt sind, als „muss verlagert werden” markieren.
  • Der Geräte-Compiler-und-Linker 324 würde dann jegliche andere konstanten Deklarationen, die mit konstanten Adressen in den identifizierten Abhängigkeitslisten assoziiert sind, als „muss verlagert werden” markieren, ähnlich dem Schritt 512 des Verfahrens 500. In dem Pseudocode 600 würde der Geräte-Compiler-und-Linker 324 feststellen, dass die Speicherzugriffsoperation für p5 abhängig von der konstanten Variable c2 ist, und da die Abhängigkeitsliste für diese Speicherzugriffsoperation früher identifiziert wurde, würde die konstante Variablendeklaration für c2 dann auch als „muss verlagert werden” markiert werden.
  • Der Geräte-Compiler-und-Linker 324 würde dann jede als „muss verlagert werden” markierte konstante Variablendeklaration derart modifizieren, dass sie im globalen Speicher residieren wird, ähnlich dem Schritt 514 des Verfahrens 500, und würde dann jede als „muss verlagert werden” markierte Speicherzugriffsoperation derart modifizieren, dass sie auf globalen Speicher abzielt, ähnlich dem Schritt 516 des Verfahrens 500. Dabei mag der Geräte-Compiler-und-Linker 324 auch Daten von dem konstanten Speicherraum zu dem globalen Speicherraum befördern, falls erforderlich. Durch Ausführen der in diesem Beispiel beschriebenen Technik verlagert der Geräte-Compiler-und-Linker 324 alle konstanten Speichervariable und Speicherzugriffsoperationen, so dass diese jeweils in globalem Speicher residieren und auf den globalen Speicher abzielen, wodurch Situationen vermieden werden, in denen eine generische Speicherzugriffsoperation auf konstanten Speicher in Abhängigkeit von dem Ergebnis eines Verzweigungsbefehls abzielen oder nicht abzielen mag.
  • Insgesamt ist ein Geräte-Compiler-und-Linker konfiguriert zum Optimieren von Programmcode einer Coprozessor-geeignete Anwendung durch Auflösen generischer Speicherzugriffsoperationen innerhalb dieses Programmcodes, so dass diese auf spezifische Speicherräume abzielen. In Situationen, in denen eine generische Speicherzugriffsoperation nicht aufgelöst werden kann und auf konstanten Speicher abzielen mag, werden konstante Variable, die mit diesen generischen Speicherzugriffsoperationen assoziiert sind, derart verlagert, dass sie im globalen Speicher residieren.
  • Eine Grafikverarbeitungseinheit (GPU) ist vorteilhafterweise nicht dazu gezwungen, alle generischen Speicherzugriffsoperationen zur Laufzeit aufzulösen, wodurch Ressourcen gespart werden und die Ausführung der Anwendung beschleunigt wird. Die GPU ist des Weiteren dazu befähigt, zusätzliche Programmcodeoptimierungen mit dem Programmcode der Anwendung durchzuführen, einschließlich eines Neuordnen des Speicherzugriffs und einer Aliasanalyse, was die Ausführung des Programmcodes weiter beschleunigt.
  • Eine Ausführungsform der Erfindung mag als ein Programmprodukt zur Verwendung mit einem Computersystem implementiert werden. Das Programm bzw. die Programme des Programmprodukts definiert bzw. definieren Funktionen der Ausführungsformen (einschließlich der hierin beschriebenen Verfahren) und kann bzw. können auf einer Vielfalt von computerlesbaren Speichermedien enthalten werden. Beispielhafte computerlesbare Speichermedien umfassen, sind aber nicht darauf begrenzt: (i) nicht-schreibbare Speichermedien (zum Beispiel schreibgeschützte (engl. „read-only”) Speichervorrichtungen innerhalb eines Computers, wie zum Beispiel CD-ROM-Discs, die mittels eines CD-ROM-Laufwerks lesbar sind, Flash-Speicher, ROM-Chips oder jede andere Art von nicht-flüchtigem Festkörper-Halbleiterspeicher (engl. „solid-state non-volatile semiconductor memory”)), auf welchen Informationen permanent gespeichert werden; und (ii) schreibbare Speichermedien (zum Beispiel Floppy-Disks in einem Diskettenlaufwerk oder Festplattenlaufwerk oder jede Art von Festkörper-Halbleiterspeicher mit wahlfreiem Zugriff (engl. „solid-state random-access semiconductor memory”)), auf welchem veränderbare Informationen gespeichert sind.
  • Die Erfindung ist mit Bezug auf spezifische Ausführungsformen oben beschrieben worden. Fachleute werden aber verstehen, dass verschiedene Modifikationen und Änderungen davon gemacht werden können, ohne von dem breiteren Geist und Umfang der Erfindung, wie sie in den angehängten Patentansprüchen dargestellt ist, abzuweichen. Die vorhergehenden Beschreibung und Zeichnungen sind folglich eher in einer illustrativen als in einer restriktiven Bedeutung zu beachten.

Claims (10)

  1. Ein computerimplementiertes Verfahren zur Optimierung von Programmcode, der zur Ausführung auf einer Parallelverarbeitungseinheit (PPU), die eine nicht uniforme Speicherarchitektur aufweist, kompiliert werden kann, das Verfahren aufweisend: Identifizieren einer ersten Speicherzugriffsoperation, die mit einem ersten Zeiger assoziiert ist, wobei die erste Speicherzugriffsoperation auf einen generischen Speicherraum abzielt; Aszendieren einer Def-Use-Kette, die sich auf den ersten Zeiger bezieht; Hinzufügen des ersten Zeigers zu einem Vektor, nachdem es festgestellt wurde, dass der erste Zeiger von einem spezifischen Speicherraum in der nicht uniformen Speicherarchitektur abgeleitet ist; und Bewirken, dass die erste Speicherzugriffsoperation auf den spezifischen Speicherraum abzielt, durch Modifizieren zumindest eines Abschnitts des Programmcodes.
  2. Das computerimplementierte Verfahren gemäß Anspruch 1, wobei der bestimmte Speicherraum einen globalen Speicherraum, der von einem Satz von Verarbeitungskernen innerhalb der PPU zugriffbar ist, einen lokalen Speicherraum, der mit einem ersten Verarbeitungskern assoziiert ist, der in dem Satz von Verarbeitungskernen enthalten ist, einen gemeinsamen Speicherraum, der von zwei oder mehr der Verarbeitungskerne zugriffbar ist, die in dem Satz von Verarbeitungskernen enthalten sind, oder einen konstanten Speicherraum aufweist, der in ausschließlich lesbarem Speicher residiert.
  3. Das computerimplementierte Verfahren gemäß Anspruch 1, wobei die Def-Use-Kette, die sich auf den ersten Zeiger bezieht, durch Ausführen von Datenflussanalyse mit dem Programmcode erzeugt wird, um jede Definition und jede Verwendung des ersten Zeigers zu identifizieren.
  4. Das computerimplementierte Verfahren gemäß Anspruch 1, ferner aufweisend: Identifizieren einer zweiten Speicherzugriffsoperation durch Aszendieren einer Def-Use-Kette, die sich auf eine erste Speicheradresse bezieht; Feststellen, dass die zweite Speicherzugriffsoperation nicht auf einen spezifischen Speicherraum abzielt; Identifizieren einer ersten Variablendeklaration, die mit der ersten Speicheradresse assoziiert ist, wobei die erste Variablendeklaration indiziert, dass die erste Speicheradresse sich auf eine Stelle in einem konstanten Speicherraum bezieht; und Bewirken, dass die erste Variablendeklaration indiziert, dass die erste Speicheradresse sich auf eine Stelle in einem globalen Speicherraum bezieht, durch Modifizieren zumindest eines Abschnitts des Programmcodes.
  5. Das computerimplementierte Verfahren gemäß Anspruch 4, ferner aufweisend ein Befördern von Daten, die mit der ersten Speicheradresse assoziiert sind, von dem konstanten Speicherraum zu dem globalen Speicherraum.
  6. Das computerimplementierte Verfahren gemäß Anspruch 4, wobei die Def-Use-Kette, die sich auf die erste Speicheradresse bezieht, durch Ausführen einer Datenflussanalyse mit dem Programmcode erzeugt wird, um jede Definition und jede Verwendung der ersten Speicheradresse zu identifizieren.
  7. Das computerimplementierte Verfahren gemäß Anspruch 4, ferner aufweisend: Identifizieren einer dritten Speicherzugriffsoperation, die abhängig von der ersten Variablendeklaration ist; Feststellen, dass die dritte Speicherzugriffsoperation auch von einer zweiten Variablendeklaration abhängig ist, die mit einer zweiten Speicheradresse assoziiert ist, wobei die zweite Variablendeklaration indiziert, dass die zweite Speicheradresse sich auf eine Stelle in dem konstanten Speicherraum bezieht; und Bewirken, dass die zweite Variablendeklaration indiziert, dass die zweite Speicheradresse sich auf eine Stelle in dem globalen Speicherraum bezieht, durch Modifizieren zumindest eines Abschnitts des Programmcodes.
  8. Das computerimplementierte Verfahren gemäß Anspruch 7, ferner aufweisend: Bewirken, dass die dritte Speicherzugriffsoperation auf den globalen Speicherraum abzielt, durch Modifizieren zumindest eines Abschnitts des Programmcodes; und Befördern von Daten, die mit der dritten Speicheradresse assoziiert sind, von dem konstanten Speicherraum zu dem globalen Speicherraum.
  9. Das computerimplementierte Verfahren gemäß Anspruch 1, ferner aufweisend ein Ausführen einer Code-Neuordnungsoperation und/oder einer Aliasanalyse basierend auf dem zumindest einen Abschnitt des Programmcodes, welcher Abschnitt modifiziert worden ist.
  10. Eine Rechenvorrichtung, die zum Optimieren von Programmcode konfiguriert ist, der zur Ausführung auf einer Parallelverarbeitungseinheit (PPU), die eine nicht uniforme Speicherarchitektur aufweist, kompiliert werden kann, die Vorrichtung aufweisend: eine Verarbeitungseinheit, die konfiguriert ist zum: Identifizieren einer ersten Speicherzugriffsoperation, die mit einem ersten Zeiger assoziiert ist, wobei die erste Speicherzugriffsoperation auf einen generischen Speicherraum abzielt, Aszendieren einer Def-Use-Kette, die sich auf den ersten Zeiger bezieht, Hinzufügen des ersten Zeigers zu einem Vektor, nachdem es festgestellt wurde, dass der erste Zeiger von einem spezifischen Speicherraum in der nicht uniformen Speicherarchitektur abgeleitet ist, und Bewirken, dass die erste Speicherzugriffsoperation auf den spezifischen Speicherraum abzielt, durch Modifizieren zumindest eines Abschnitts des Programmcodes.
DE112012000214T 2011-11-07 2012-11-06 Technik zur inter-prozeduralen Speicheradressenraumoptimierung in GPU-Rechencompiler Pending DE112012000214T5 (de)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201161556782P 2011-11-07 2011-11-07
USUS-61/556,782 2011-11-07
US13/659,802 US20130113809A1 (en) 2011-11-07 2012-10-24 Technique for inter-procedural memory address space optimization in gpu computing compiler
USUS-13/659,802 2012-10-24
PCT/US2012/063756 WO2013070636A1 (en) 2011-11-07 2012-11-06 Technique for inter-procedural memory address space optimization in gpu computing compiler

Publications (1)

Publication Number Publication Date
DE112012000214T5 true DE112012000214T5 (de) 2013-09-12

Family

ID=48223398

Family Applications (5)

Application Number Title Priority Date Filing Date
DE112012000212T Pending DE112012000212T5 (de) 2011-11-07 2012-11-06 Technik für live Analyse-basierte Rematerialisation zur Reduktion von Registerdruck und zur Verbesserung von Parallelität
DE112012000209T Pending DE112012000209T5 (de) 2011-11-07 2012-11-06 Ein nachfragegesteuerter Algorithmus zum Reduzieren der Vorzeichenerweiterungsinstruktionen, die in Programmschleifen eines 64-Bit-Computerprogramms enthalten sind
DE112012000214T Pending DE112012000214T5 (de) 2011-11-07 2012-11-06 Technik zur inter-prozeduralen Speicheradressenraumoptimierung in GPU-Rechencompiler
DE112012000187T Pending DE112012000187T5 (de) 2011-11-07 2012-11-06 Ein Algorithmus zur Optimierung eines 64-Bit-Adressiermodus
DE112012000195T Pending DE112012000195T5 (de) 2011-11-07 2012-11-06 Ein Algorithmus zur Vektorisierung und Speicherkoaleszierung während Kompilierung

Family Applications Before (2)

Application Number Title Priority Date Filing Date
DE112012000212T Pending DE112012000212T5 (de) 2011-11-07 2012-11-06 Technik für live Analyse-basierte Rematerialisation zur Reduktion von Registerdruck und zur Verbesserung von Parallelität
DE112012000209T Pending DE112012000209T5 (de) 2011-11-07 2012-11-06 Ein nachfragegesteuerter Algorithmus zum Reduzieren der Vorzeichenerweiterungsinstruktionen, die in Programmschleifen eines 64-Bit-Computerprogramms enthalten sind

Family Applications After (2)

Application Number Title Priority Date Filing Date
DE112012000187T Pending DE112012000187T5 (de) 2011-11-07 2012-11-06 Ein Algorithmus zur Optimierung eines 64-Bit-Adressiermodus
DE112012000195T Pending DE112012000195T5 (de) 2011-11-07 2012-11-06 Ein Algorithmus zur Vektorisierung und Speicherkoaleszierung während Kompilierung

Country Status (5)

Country Link
US (6) US20130113809A1 (de)
CN (5) CN103348317B (de)
DE (5) DE112012000212T5 (de)
TW (5) TWI498817B (de)
WO (5) WO2013070635A1 (de)

Families Citing this family (52)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9430204B2 (en) 2010-11-19 2016-08-30 Microsoft Technology Licensing, Llc Read-only communication operator
US9507568B2 (en) 2010-12-09 2016-11-29 Microsoft Technology Licensing, Llc Nested communication operator
US9395957B2 (en) * 2010-12-22 2016-07-19 Microsoft Technology Licensing, Llc Agile communication operator
US20130113809A1 (en) * 2011-11-07 2013-05-09 Nvidia Corporation Technique for inter-procedural memory address space optimization in gpu computing compiler
US9164743B2 (en) * 2012-07-02 2015-10-20 International Business Machines Corporation Strength reduction compiler optimizations for operations with unknown strides
US10588691B2 (en) 2012-09-12 2020-03-17 Relievant Medsystems, Inc. Radiofrequency ablation of tissue within a vertebral body
WO2014176587A2 (en) * 2013-04-26 2014-10-30 The Trustees Of Columbia University In The City Of New York Systems and methods for mobile applications
US9710388B2 (en) * 2014-01-23 2017-07-18 Qualcomm Incorporated Hardware acceleration for inline caches in dynamic languages
CN104915180B (zh) * 2014-03-10 2017-12-22 华为技术有限公司 一种数据操作的方法和设备
US9389890B2 (en) 2014-03-27 2016-07-12 Microsoft Technology Licensing, Llc Hierarchical directives-based management of runtime behaviors
EP3123316B1 (de) * 2014-03-27 2020-09-02 Microsoft Technology Licensing, LLC Unterstützung von dynamischem verhalten in statisch kompilierten programmen
US10061592B2 (en) 2014-06-27 2018-08-28 Samsung Electronics Co., Ltd. Architecture and execution for efficient mixed precision computations in single instruction multiple data/thread (SIMD/T) devices
US10061591B2 (en) 2014-06-27 2018-08-28 Samsung Electronics Company, Ltd. Redundancy elimination in single instruction multiple data/thread (SIMD/T) execution processing
CN104834532B (zh) * 2015-06-03 2018-01-02 星环信息科技(上海)有限公司 一种分布式数据向量化处理方法和装置
CN106708593B (zh) * 2015-07-16 2020-12-08 中兴通讯股份有限公司 一种程序链接的编译方法及装置
CN105183433B (zh) * 2015-08-24 2018-02-06 上海兆芯集成电路有限公司 指令合并方法以及具有多数据通道的装置
KR20170047957A (ko) * 2015-10-26 2017-05-08 삼성전자주식회사 반도체 장치의 동작 방법 및 반도체 시스템
CN105302577B (zh) * 2015-11-26 2019-05-07 上海兆芯集成电路有限公司 驱动执行单元的机器码产生方法以及装置
GB2546308B (en) * 2016-01-15 2019-04-03 Advanced Risc Mach Ltd Data processing systems
CN107292808B (zh) * 2016-03-31 2021-01-05 阿里巴巴集团控股有限公司 图像处理方法、装置及图像协处理器
CN105955892A (zh) * 2016-04-25 2016-09-21 浪潮电子信息产业股份有限公司 一种计算机系统中地址空间的扩展方法
US10198259B2 (en) * 2016-06-23 2019-02-05 Advanced Micro Devices, Inc. System and method for scheduling instructions in a multithread SIMD architecture with a fixed number of registers
EP3270371B1 (de) * 2016-07-12 2022-09-07 NXP USA, Inc. Verfahren und vorrichtung verwaltung von grafikschichten in einer grafikanzeigekomponente
CN108021563B (zh) * 2016-10-31 2021-09-07 华为技术有限公司 一种指令间数据依赖的检测方法和装置
US10359971B2 (en) * 2017-07-17 2019-07-23 Hewlett Packard Enterprise Development Lp Storing memory profile data of an application in non-volatile memory
US11755382B2 (en) * 2017-11-03 2023-09-12 Coherent Logix, Incorporated Programming flow for multi-processor system
US10877757B2 (en) * 2017-11-14 2020-12-29 Nvidia Corporation Binding constants at runtime for improved resource utilization
US11468312B2 (en) 2018-02-02 2022-10-11 Samsung Electronics Co., Ltd. Memory management for machine learning training on GPU
US11068247B2 (en) 2018-02-06 2021-07-20 Microsoft Technology Licensing, Llc Vectorizing conditional min-max sequence reduction loops
CN108304218A (zh) * 2018-03-14 2018-07-20 郑州云海信息技术有限公司 一种汇编代码的编写方法、装置、系统和可读存储介质
US11277455B2 (en) 2018-06-07 2022-03-15 Mellanox Technologies, Ltd. Streaming system
US10691430B2 (en) * 2018-08-27 2020-06-23 Intel Corporation Latency scheduling mehanism
US20200106828A1 (en) * 2018-10-02 2020-04-02 Mellanox Technologies, Ltd. Parallel Computation Network Device
CN111428327A (zh) * 2018-12-24 2020-07-17 深圳市中兴微电子技术有限公司 一种指令硬件架构的构建方法、装置及存储介质
US20220100484A1 (en) * 2019-01-25 2022-03-31 The Regents Of The University Of California Coalescing Operand Register File for Graphical Processing Units
US11625393B2 (en) 2019-02-19 2023-04-11 Mellanox Technologies, Ltd. High performance computing system
EP3699770A1 (de) 2019-02-25 2020-08-26 Mellanox Technologies TLV Ltd. System und verfahren zur kollektiven kommunikation
US11294685B2 (en) * 2019-06-04 2022-04-05 International Business Machines Corporation Instruction fusion using dependence analysis
CN110162330B (zh) * 2019-07-08 2021-04-13 上海赫千电子科技有限公司 一种应用于汽车ecu升级文件的系统及方法
US11200061B2 (en) * 2019-11-19 2021-12-14 Microsoft Technology Licensing, Llc Pre-instruction scheduling rematerialization for register pressure reduction
CN112862658A (zh) * 2019-11-28 2021-05-28 中兴通讯股份有限公司 Gpu运行方法、装置、设备及存储介质
US11750699B2 (en) 2020-01-15 2023-09-05 Mellanox Technologies, Ltd. Small message aggregation
US11252027B2 (en) 2020-01-23 2022-02-15 Mellanox Technologies, Ltd. Network element supporting flexible data reduction operations
US11429310B2 (en) 2020-03-06 2022-08-30 Samsung Electronics Co., Ltd. Adjustable function-in-memory computation system
US11210071B2 (en) * 2020-04-01 2021-12-28 Microsoft Technology Licensing, Llc Compiler sub expression directed acyclic graph (DAG) remat for register pressure
US11876885B2 (en) 2020-07-02 2024-01-16 Mellanox Technologies, Ltd. Clock queue with arming and/or self-arming features
CN112230931B (zh) 2020-10-22 2021-11-02 上海壁仞智能科技有限公司 适用于图形处理器的二次卸载的编译方法、装置和介质
CN112214443B (zh) 2020-10-22 2021-12-03 上海壁仞智能科技有限公司 设置于图形处理器中的二次卸载装置和方法
US11556378B2 (en) 2020-12-14 2023-01-17 Mellanox Technologies, Ltd. Offloading execution of a multi-task parameter-dependent operation to a network device
US20220374236A1 (en) * 2021-05-20 2022-11-24 Huawei Technologies Co., Ltd. Method and system for optimizing address calculations
US11645076B2 (en) * 2021-07-26 2023-05-09 International Business Machines Corporation Register pressure target function splitting
US11922237B1 (en) 2022-09-12 2024-03-05 Mellanox Technologies, Ltd. Single-step collective operations

Family Cites Families (98)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4449196A (en) 1979-04-27 1984-05-15 Pritchard Eric K Data processing system for multi-precision arithmetic
TW213998B (de) * 1990-08-23 1993-10-01 Supercomp Systems Ltd Partnership
IL100990A (en) 1991-02-27 1995-10-31 Digital Equipment Corp Multilingual optimization compiler that uses Gladi in the production of a multi-pass cipher
US6286135B1 (en) * 1997-03-26 2001-09-04 Hewlett-Packard Company Cost-sensitive SSA-based strength reduction algorithm for a machine with predication support and segmented addresses
EP0867808B1 (de) * 1997-03-29 2002-04-10 IMEC vzw Verfahren und Gerät für Grössenoptimierung von Speichereinheiten
US7548238B2 (en) * 1997-07-02 2009-06-16 Nvidia Corporation Computer graphics shader systems and methods
US6785888B1 (en) * 1997-08-29 2004-08-31 International Business Machines Corporation Memory allocator for a multiprocessor computer system
US5903761A (en) 1997-10-31 1999-05-11 Preemptive Solutions, Inc. Method of reducing the number of instructions in a program code sequence
DE69739404D1 (de) * 1997-12-10 2009-06-25 Hitachi Ltd Optimiertes speicherzugriffsverfahren
US6748587B1 (en) * 1998-01-02 2004-06-08 Hewlett-Packard Development Company, L.P. Programmatic access to the widest mode floating-point arithmetic supported by a processor
US6256784B1 (en) 1998-08-14 2001-07-03 Ati International Srl Interpreter with reduced memory access and improved jump-through-register handling
US6757892B1 (en) 1999-06-24 2004-06-29 Sarnoff Corporation Method for determining an optimal partitioning of data among several memories
US6415311B1 (en) 1999-06-24 2002-07-02 Ati International Srl Sign extension circuit and method for unsigned multiplication and accumulation
US6438747B1 (en) * 1999-08-20 2002-08-20 Hewlett-Packard Company Programmatic iteration scheduling for parallel processors
US20020129340A1 (en) 1999-10-28 2002-09-12 Tuttle Douglas D. Reconfigurable isomorphic software representations
US6523173B1 (en) 2000-01-11 2003-02-18 International Business Machines Corporation Method and apparatus for allocating registers during code compilation using different spill strategies to evaluate spill cost
US6941549B1 (en) * 2000-03-31 2005-09-06 International Business Machines Corporation Communicating between programs having different machine context organizations
US20020038453A1 (en) 2000-08-09 2002-03-28 Andrew Riddle Method and system for software optimization
US7039906B1 (en) * 2000-09-29 2006-05-02 International Business Machines Corporation Compiler for enabling multiple signed independent data elements per register
GB2367650B (en) 2000-10-04 2004-10-27 Advanced Risc Mach Ltd Single instruction multiple data processing
US20030028864A1 (en) 2001-01-29 2003-02-06 Matt Bowen System, method and article of manufacture for successive compilations using incomplete parameters
US20040205740A1 (en) * 2001-03-29 2004-10-14 Lavery Daniel M. Method for collection of memory reference information and memory disambiguation
US20020144101A1 (en) 2001-03-30 2002-10-03 Hong Wang Caching DAG traces
JP3763516B2 (ja) * 2001-03-30 2006-04-05 インターナショナル・ビジネス・マシーンズ・コーポレーション 変換プログラム、コンパイラ、コンピュータ装置およびプログラム変換方法
US7162716B2 (en) * 2001-06-08 2007-01-09 Nvidia Corporation Software emulator for optimizing application-programmable vertex processing
US6865614B2 (en) * 2001-07-02 2005-03-08 Hewlett-Packard Development Company, L.P. Method for transferring a packed data structure to an unpacked data structure by copying the packed data using pointer
US7032215B2 (en) * 2001-10-11 2006-04-18 Intel Corporation Method and system for type demotion of expressions and variables by bitwise constant propagation
US7107584B2 (en) * 2001-10-23 2006-09-12 Microsoft Corporation Data alignment between native and non-native shared data structures
US20110161977A1 (en) 2002-03-21 2011-06-30 Martin Vorbach Method and device for data processing
US8914590B2 (en) 2002-08-07 2014-12-16 Pact Xpp Technologies Ag Data processing method and device
US7243342B2 (en) 2002-06-11 2007-07-10 Intel Corporation Methods and apparatus for determining if a user-defined software function is a memory allocation function during compile-time
US6954841B2 (en) 2002-06-26 2005-10-11 International Business Machines Corporation Viterbi decoding for SIMD vector processors with indirect vector element access
US7353243B2 (en) * 2002-10-22 2008-04-01 Nvidia Corporation Reconfigurable filter node for an adaptive computing machine
US7051322B2 (en) * 2002-12-06 2006-05-23 @Stake, Inc. Software analysis framework
US7451278B2 (en) * 2003-02-13 2008-11-11 Silicon Graphics, Inc. Global pointers for scalable parallel applications
JP2004303113A (ja) * 2003-04-01 2004-10-28 Hitachi Ltd 階層メモリ向け最適化処理を備えたコンパイラおよびコード生成方法
US20040221283A1 (en) 2003-04-30 2004-11-04 Worley Christopher S. Enhanced, modulo-scheduled-loop extensions
US20050071823A1 (en) 2003-09-29 2005-03-31 Xiaodong Lin Apparatus and method for simulating segmented addressing on a flat memory model architecture
US7124271B2 (en) * 2003-10-14 2006-10-17 Intel Corporation Method and system for allocating register locations in a memory during compilation
US7457936B2 (en) * 2003-11-19 2008-11-25 Intel Corporation Memory access instruction vectorization
US7567252B2 (en) 2003-12-09 2009-07-28 Microsoft Corporation Optimizing performance of a graphics processing unit for efficient execution of general matrix operations
US7814467B2 (en) * 2004-01-15 2010-10-12 Hewlett-Packard Development Company, L.P. Program optimization using object file summary information
US7376813B2 (en) 2004-03-04 2008-05-20 Texas Instruments Incorporated Register move instruction for section select of source operand
US8689202B1 (en) * 2004-03-30 2014-04-01 Synopsys, Inc. Scheduling of instructions
US8677312B1 (en) * 2004-03-30 2014-03-18 Synopsys, Inc. Generation of compiler description from architecture description
US7386842B2 (en) * 2004-06-07 2008-06-10 International Business Machines Corporation Efficient data reorganization to satisfy data alignment constraints
US7802076B2 (en) * 2004-06-24 2010-09-21 Intel Corporation Method and apparatus to vectorize multiple input instructions
US7472382B2 (en) * 2004-08-30 2008-12-30 International Business Machines Corporation Method for optimizing software program using inter-procedural strength reduction
US7389499B2 (en) * 2004-10-21 2008-06-17 International Business Machines Corporation Method and apparatus for automatically converting numeric data to a processor efficient format for performing arithmetic operations
US7730114B2 (en) * 2004-11-12 2010-06-01 Microsoft Corporation Computer file system
US7681187B2 (en) * 2005-03-31 2010-03-16 Nvidia Corporation Method and apparatus for register allocation in presence of hardware constraints
TWI306215B (en) * 2005-04-29 2009-02-11 Ind Tech Res Inst Method and corresponding apparatus for compiling high-level languages into specific processor architectures
CN100389420C (zh) * 2005-09-13 2008-05-21 北京中星微电子有限公司 用协处理器加速文件系统操作的方法及装置
US7450131B2 (en) * 2005-09-30 2008-11-11 Intel Corporation Memory layout for re-ordering instructions using pointers
US8037465B2 (en) * 2005-09-30 2011-10-11 Intel Corporation Thread-data affinity optimization using compiler
US7694288B2 (en) * 2005-10-24 2010-04-06 Analog Devices, Inc. Static single assignment form pattern matcher
US20070124631A1 (en) 2005-11-08 2007-05-31 Boggs Darrell D Bit field selection instruction
JP4978025B2 (ja) * 2006-02-24 2012-07-18 株式会社日立製作所 ポインタの圧縮・伸張方法、これを実行するプログラム、及び、これを用いた計算機システム
WO2008002173A1 (en) * 2006-06-20 2008-01-03 Intel Corporation Method and apparatus to call native code from a managed code application
US9601199B2 (en) * 2007-01-26 2017-03-21 Intel Corporation Iterator register for structured memory
US8321849B2 (en) * 2007-01-26 2012-11-27 Nvidia Corporation Virtual architecture and instruction set for parallel thread computing
US9361078B2 (en) 2007-03-19 2016-06-07 International Business Machines Corporation Compiler method of exploiting data value locality for computation reuse
US8671401B2 (en) * 2007-04-09 2014-03-11 Microsoft Corporation Tiling across loop nests with possible recomputation
US8411096B1 (en) * 2007-08-15 2013-04-02 Nvidia Corporation Shader program instruction fetch
US20090070753A1 (en) 2007-09-07 2009-03-12 International Business Machines Corporation Increase the coverage of profiling feedback with data flow analysis
US8555266B2 (en) 2007-11-13 2013-10-08 International Business Machines Corporation Managing variable assignments in a program
US7809925B2 (en) 2007-12-07 2010-10-05 International Business Machines Corporation Processing unit incorporating vectorizable execution unit
JP5244421B2 (ja) 2008-02-29 2013-07-24 株式会社ソニー・コンピュータエンタテインメント 情報処理装置およびプログラム分割方法
US8255884B2 (en) * 2008-06-06 2012-08-28 International Business Machines Corporation Optimized scalar promotion with load and splat SIMD instructions
US20100184380A1 (en) 2009-01-20 2010-07-22 Qualcomm Incorporated Mitigating intercarrier and intersymbol interference in asynchronous wireless communications
US20100199270A1 (en) 2009-01-30 2010-08-05 Ivan Baev System, method, and computer-program product for scalable region-based register allocation in compilers
US8713543B2 (en) * 2009-02-11 2014-04-29 Johnathan C. Mun Evaluation compiler method
US8831666B2 (en) 2009-06-30 2014-09-09 Intel Corporation Link power savings with state retention
US8271763B2 (en) * 2009-09-25 2012-09-18 Nvidia Corporation Unified addressing and instructions for accessing parallel memory spaces
US8819622B2 (en) 2009-09-25 2014-08-26 Advanced Micro Devices, Inc. Adding signed 8/16/32-bit integers to 64-bit integers
CA2684226A1 (en) * 2009-10-30 2011-04-30 Ibm Canada Limited - Ibm Canada Limitee Eleminating redundant operations for common properties using shared real registers
US8578357B2 (en) * 2009-12-21 2013-11-05 Intel Corporation Endian conversion tool
US8453135B2 (en) 2010-03-11 2013-05-28 Freescale Semiconductor, Inc. Computation reuse for loops with irregular accesses
CN101833435A (zh) * 2010-04-19 2010-09-15 天津大学 基于传输触发架构可配置处理器指令冗余消除方法
US8645758B2 (en) * 2010-04-29 2014-02-04 International Business Machines Corporation Determining page faulting behavior of a memory operation
US8954418B2 (en) * 2010-05-14 2015-02-10 Sap Se Performing complex operations in a database using a semantic layer
US8799583B2 (en) * 2010-05-25 2014-08-05 International Business Machines Corporation Atomic execution over accesses to multiple memory locations in a multiprocessor system
JP5583514B2 (ja) * 2010-08-11 2014-09-03 インターナショナル・ビジネス・マシーンズ・コーポレーション バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム
US8538912B2 (en) * 2010-09-22 2013-09-17 Hewlett-Packard Development Company, L.P. Apparatus and method for an automatic information integration flow optimizer
KR101782373B1 (ko) * 2010-11-10 2017-09-29 삼성전자 주식회사 X-y 스택 메모리를 이용한 컴퓨팅 장치 및 방법
US8997066B2 (en) * 2010-12-27 2015-03-31 Microsoft Technology Licensing, Llc Emulating pointers
GB2488980B (en) * 2011-03-07 2020-02-19 Advanced Risc Mach Ltd Address generation in a data processing apparatus
US8566537B2 (en) * 2011-03-29 2013-10-22 Intel Corporation Method and apparatus to facilitate shared pointers in a heterogeneous platform
US8640112B2 (en) * 2011-03-30 2014-01-28 National Instruments Corporation Vectorizing combinations of program operations
US20130113809A1 (en) * 2011-11-07 2013-05-09 Nvidia Corporation Technique for inter-procedural memory address space optimization in gpu computing compiler
US9092228B2 (en) * 2012-01-17 2015-07-28 Texas Instruments Incorporated Systems and methods for software instruction translation from a high-level language to a specialized instruction set
JP5840014B2 (ja) * 2012-02-01 2016-01-06 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation コンパイル方法、プログラムおよび情報処理装置
US9043582B2 (en) * 2012-09-14 2015-05-26 Qualcomm Innovation Center, Inc. Enhanced instruction scheduling during compilation of high level source code for improved executable code
US9411558B2 (en) * 2012-10-20 2016-08-09 Luke Hutchison Systems and methods for parallelization of program code, interactive data visualization, and graphically-augmented code editing
US10140403B2 (en) * 2012-12-01 2018-11-27 Synopsys Inc. Managing model checks of sequential designs
US9396240B2 (en) * 2013-12-03 2016-07-19 Business Objects Software Ltd. Extreme visualization enabling extension for large data sets
US9710245B2 (en) * 2014-04-04 2017-07-18 Qualcomm Incorporated Memory reference metadata for compiler optimization
US10444759B2 (en) * 2017-06-14 2019-10-15 Zoox, Inc. Voxel based ground plane estimation and object segmentation

Also Published As

Publication number Publication date
TWI509561B (zh) 2015-11-21
WO2013070636A1 (en) 2013-05-16
WO2013070616A1 (en) 2013-05-16
US20130117548A1 (en) 2013-05-09
TW201333877A (zh) 2013-08-16
CN103339621A (zh) 2013-10-02
CN104641350A (zh) 2015-05-20
TW201337764A (zh) 2013-09-16
DE112012000209T5 (de) 2013-08-22
CN103348317A (zh) 2013-10-09
WO2013070635A1 (en) 2013-05-16
CN103460188A (zh) 2013-12-18
US9009686B2 (en) 2015-04-14
US20130117735A1 (en) 2013-05-09
TWI604410B (zh) 2017-11-01
TWI483182B (zh) 2015-05-01
TWI498817B (zh) 2015-09-01
US20190087164A1 (en) 2019-03-21
US20130117734A1 (en) 2013-05-09
TWI502509B (zh) 2015-10-01
TW201333874A (zh) 2013-08-16
WO2013070621A2 (en) 2013-05-16
CN103348317B (zh) 2017-02-15
WO2013070637A1 (en) 2013-05-16
US10228919B2 (en) 2019-03-12
TW201331833A (zh) 2013-08-01
TW201333816A (zh) 2013-08-16
WO2013070621A3 (en) 2016-05-19
DE112012000187T5 (de) 2013-09-12
US20130113809A1 (en) 2013-05-09
US9436447B2 (en) 2016-09-06
CN103608774A (zh) 2014-02-26
US9639336B2 (en) 2017-05-02
DE112012000195T5 (de) 2013-08-08
DE112012000212T5 (de) 2013-08-01
US20130117737A1 (en) 2013-05-09

Similar Documents

Publication Publication Date Title
DE112012000214T5 (de) Technik zur inter-prozeduralen Speicheradressenraumoptimierung in GPU-Rechencompiler
DE102013017982A1 (de) COMPILER gesteuerte Gebietsdisponierung für SIMD-Ausführung von Strängen
DE102011101202B4 (de) Permanentspeicher für Grafikhardware
DE112012002905B4 (de) Technik zum Kompilieren und Ausführen von Programmen in höheren Programmiersprachen auf heterogenen Computern
DE102020124932A1 (de) Vorrichtung und Verfahren zur Echtzeit-Grafikverarbeitung mittels lokaler und cloudbasierter Grafikverarbeitungsbetriebsmittel
DE112010003750T5 (de) Hardware für parallele Befehlslistenerzeugung
DE102010051477A1 (de) Das gemeinsame Benutzen von virtuellen speicherbasierten Mehrversionsdaten zwischen den verschiedenartigen Prozessoren einer Computerplattform
DE102013018139A1 (de) Technik zur Speicherung gemeinsamer Vertices
DE102013017509A1 (de) Effiziente Speichervirtualisierung in mehrsträngigen Verarbeitungseinheiten
DE102008005515A1 (de) Virtuelle Architektur und virtueller Befehlssatz für die Berechnung paralleler Befehlsfolgen
DE102013202173A1 (de) Einheitliche Lade-Verarbeitung für Teilsätze von parallelen Threads
DE102009039231A1 (de) Einzeldurchgang-Kachelung
DE102013019333A1 (de) Registerzuweisung für als cluster vorliegende mehrebenen-registerdaten
DE102013208421A1 (de) Sharing einer Grafikverarbeitungseinheit unter vielen Anwendungen
DE102013224160A1 (de) System, Verfahren und Computer-Programm-Produkt zum Optimieren des Managements von Thread-Stapel-Speicher
DE102013017511A1 (de) Effiziente speichervirtualisierung in mehrsträngigen verarbeitungseinheiten
US9645802B2 (en) Technique for grouping instructions into independent strands
DE102016122297A1 (de) Mehrfach-Durchlauf-Rendering in einer Bildschirm-Raum-Pipeline
DE102012222918A1 (de) Verfahren und Apparat zum Planen von Anweisungen ohne Anweisungs-Dekodieren
DE112017001703T5 (de) Verfahren und Vorrichtung zum effizienteren Ray-Tracing von instanziierter Geometrie
DE102013020966B4 (de) Leistungseffiziente Attribut-Handhabung für Parkettierungs- und Geometrie-Schattierungseinheiten
DE102013018136A1 (de) Technik zur Speicherung gemeinsamer Vertices
DE102013020485A1 (de) Technik zur Ausführung von Speicherzugriffsoperationen über eine Textur-Hardware
DE102018109538A1 (de) Techniken zum umfassenden Synchronisieren einer Ausführung von Threads
DE112020000865T5 (de) Speicherverwaltungssystem

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R079 Amendment of ipc main class

Free format text: PREVIOUS MAIN CLASS: G06F0013000000

Ipc: G06F0009450000

R079 Amendment of ipc main class

Free format text: PREVIOUS MAIN CLASS: G06F0013000000

Ipc: G06F0009450000

Effective date: 20130911

R082 Change of representative

Representative=s name: KRAUS & WEISERT PATENTANWAELTE PARTGMBB, DE

R079 Amendment of ipc main class

Free format text: PREVIOUS MAIN CLASS: G06F0009450000

Ipc: G06F0009440000

R016 Response to examination communication