-
HINTERGRUND DER ERFINDUNG
-
Gebiet der Erfindung
-
Die vorliegende Erfindung betrifft im Allgemeinen Ausführung von Rechen-Aufgaben und insbesondere spekulative Ausführung von Anweisungen und Zurücksetzen (rollback).
-
Beschreibung der betreffenden Technik
-
Konventionelle in einer Pipeline angeordnete (pipelined) Prozessoren haben eine spekulative Ausführung von bedingten Verzweigungs-Anweisungen dadurch durchgeführt, dass vorhergesagt wurde, welche Seite der bedingten Verzweigung ausgeführt wird. Wenn die Vorhersage nicht korrekt ist, werden die Anweisungen zurückgesetzt (rolled back), so dass die andere Seite der bedingten Verzweigung ausgeführt werden kann. Wenn die Anweisungen zurückgesetzt werden, sind Pipeline-Stufen der Verarbeitungs-Pipeline untätig, bis die Anweisungen für die andere Seite der bedingten Verzweigung diese Pipeline-Stufen erreichen.
-
Demgemäß ist, was in der Technik gebraucht wird, ein System und ein Verfahren zum spekulativen Absetzen oder Ausstellen (issuing) von Anweisungen, was der Verarbeitungs-Pipeline erlaubt, damit fortzufahren, einige Anweisungen während eines Rücksetzens (rollback) von anderen Anweisungen zu verarbeiten. Wichtiger Weise sollte die spekulative Ausführung nicht auf bedingte Verzweigungs-Anweisungen begrenzt sein.
-
ZUSAMMENFASSUNG DER ERFINDUNG
-
Ein System und ein Verfahren zum spekulativen Absetzen oder Ausstellen (issuing) von Anweisungen erlaubt einer Verarbeitungs-Pipeline einige Anweisungen zu verarbeiten fortzufahren während eines Rücksetzens (rollback) von anderen Anweisungen. Eine Planer-Schaltung (scheduler circuit) setzt Anweisungen zur Ausführung mittels Mehrprozess-gestützter Ausführungseinheiten (multithreaded execution units) unter der Annahme ab, dass einige Zyklen später, wenn die Anweisungen die Mehrprozess-gestützten Ausführungseinheiten erreichen, Abhängigkeiten zwischen den Anweisungen aufgelöst werden, Ressourcen verfügbar sein werden, Operanden-Daten verfügbar sein werden und andere Bedingungen eine Ausführung der Anweisungen nicht verhindern werden. Wenn eine Zurücksetzen-Bedingung (rollback condition) bei dem Punkt einer Ausführung für eine Anweisung für eine bestimmte Thread-Gruppe existiert, dann wird die Anweisung nicht an die Mehrprozess-gestützten Ausführungseinheiten ausgeliefert (dispatched). Jedoch werden andere Anweisungen, welche mittels der Planer-Schaltung zur Ausführung mittels verschiedener Thread-Gruppen ausgestellt sind und für welche eine Zurücksetzen-Bedingung nicht existiert, mittels der Mehrprozess-gestützten Ausführungseinheiten ausgeführt. Die Anweisung, welche die Zurücksetzen-Bedingung erlitten hat, wird wieder ausgestellt (reissued), nachdem die Zurücksetzen-Bedingung nicht länger existiert.
-
Verschiedene Ausführungsformen eines Verfahrens der Erfindung zum Durchführen eines Zurücksetzens von spekulativ ausgestellten (issued) Anweisungen umfassen ein Ausstellen eines ersten Satzes von Anweisungen für eine erste Thread-Gruppe und Ausstellen eines zweiten Satzes von Anweisungen für eine zweite Thread-Gruppe. Eine Zurücksetzen-Bedingung wird für zumindest einen Thread in der ersten Thread-Gruppe während einer Vor-Ausführungsverarbeitung einer Anweisung in dem ersten Satz von Anweisungen detektiert und Ausstellen von zusätzlichen Anweisungen für die erste Thread-Gruppe wird gestoppt. Während des Flugs-(In-Flight)-Anweisungen, welche ausgestellt worden sind und nicht ausgeführt worden sind in dem ersten Satz von Anweisungen, werden verworfen und der zweite Satz von Anweisungen für die zweite Thread-Gruppe wird ausgeführt.
-
Verschiedene Ausführungsformen der Erfindung umfassen ein System zum Durchführen von Zurücksetzen (rollback) von spekulativ ausgestellten oder abgesetzten (issued) Anweisungen. Das System umfasst einen Speicher, eine Planer-Einheit (scheduler unit), eine Absetz-Einheit oder Ausliefer-Einheit (dispatch unit), und mehrere Ausführungseinheiten. Der Speicher ist konfiguriert, einen ersten Satz von Anweisungen für eine erste Thread-Gruppe und einen zweiten Satz von Anweisungen für eine zweite Thread-Gruppe zu speichern. Die Planer-Einheit ist konfiguriert, den ersten Satz von Anweisungen für die erste Thread-Gruppe auszustellen, den zweiten Satz von Anweisungen für die zweite Thread-Gruppe auszustellen, und ein Ausstellen von zusätzlichen Anweisungen für die erste Thread-Gruppe zu stoppen, wenn eine Zurücksetzen-Bedingung detektiert ist. Die Absetz-Einheit ist konfiguriert, für zumindest einen Thread in der ersten Thread-Gruppe während einer Vor-Ausführungs-Verarbeitung einer Anweisung in dem ersten Satz von Anweisungen die Zurücksetzen-Bedingung zu detektieren und In-Flug-Anweisungen zu verwerfen (discard), welche ausgestellt worden sind und nicht in dem ersten Satz von Anweisungen ausgeführt worden sind. Die mehreren Ausführungs-Einheiten sind konfiguriert, den zweiten Satz von Anweisungen für die zweite Thread-Gruppe auszuführen.
-
Wichtiger Weise ist das spekulative Ausstellen von Anweisungen nicht auf bedingte Verzweigungs-Anweisungen begrenzt. Die Planer-Schaltung dekodiert nicht die Anweisungen und führt daher keine prädiktiven Operationen durch. Wenn irgendeine Anweisung für eine bestimmte Thread-Gruppe eine Zurücksetzen-Bedingung erleidet (incurs), wird, so spät wie bei dem Ausführungspunkt, die Anweisung nicht ausgeführt und Zurücksetzen wird für die Anweisung durchgeführt und andere Anweisungen, welche bereits für die bestimmte Thread-Gruppe ausgestellt sind.
-
KURZE BESCHREIBUNG DER ZEICHNUNGEN
-
So dass die Weise, in welcher die oben zitierten Merkmale der vorliegenden Erfindung im Detail verstanden werden können, kann eine besondere Beschreibung der Erfindung, welche kurz oben zusammengefasst ist, durch Bezugnahme auf Ausführungsformen genommen werden, von welchen einige in den angehängten Zeichnungen illustriert sind. Es ist jedoch zu bemerken, dass die angehängten Zeichnungen nur typische Ausführungsformen dieser Erfindung illustrieren und dass sie daher nicht aufzufassen sind, ihren Geltungsbereich zu begrenzen, denn die Erfindung kann andere genauso effektive Ausführungsformen zulassen.
-
1 ist ein Blockdiagramm, welches ein Computersystem illustriert, welches konfiguriert ist, einen oder mehrere Aspekte der vorliegenden Erfindung zu implementieren;
-
2 ist ein Blockdiagramm eines Parallel-Verarbeitungs-Subsystems für das Computer-System der 1, gemäß einer Ausführungsform der vorliegenden Erfindung;
-
3A ist ein Blockdiagramm des Frontends von 2 gemäß einer Ausführungsform der vorliegenden Erfindung;
-
3B ist ein Blockdiagramm eines Allgemein-Verarbeitungs-Clusters innerhalb einer der Parallel-Verarbeitungs-Einheiten von 2 gemäß einer Ausführungsform der vorliegenden Erfindung;
-
3C ist ein Blockdiagramm eines Teils des Streaming-Mehrfach-Prozessors (SM) von 3B gemäß einer Ausführungsform der vorliegenden Erfindung;
-
4A illustriert ein spekulative-Anweisung-Ausstellung- und Anweisung-Zurücksetzen-Verfahren gemäß einer Ausführungsform der vorliegenden Erfindung; und
-
4B illustriert ein spekulative-Anweisung-Ausführung- und teilweise-Anweisung-Zurücksetzen-Verfahren gemäß einer Ausführungsform der Erfindung.
-
DETAILLIERTE BESCHREIBUNG
-
In der folgenden Beschreibung werden zahlreiche spezifische Details ausgeführt, um ein durchgängigeres Verständnis der vorliegenden Erfindung bereitzustellen. Es wird jedoch für den Fachmann in der Technik ersichtlich sein, dass die vorliegende Erfindung ohne ein oder mehrere dieser spezifischen Details praktiziert werden kann. In anderen Fällen sind wohl bekannte Merkmale nicht beschrieben worden, um ein Verschleiern der vorliegenden Erfindung zu vermeiden.
-
Systemüberblick
-
1 ist ein Blockdiagramm, welches ein Computersystem 100 illustriert, welches konfiguriert ist, einen oder mehrere Aspekte der vorliegenden Erfindung zu implementieren. Computersystem 100 umfasst eine Zentralverarbeitungseinheit (CPU) 102 und einen Systemspeicher 104, welcher über einen Zwischenverbindungspfad (interconnection path) kommuniziert, welcher eine Speicherbrücke 105 umfassen kann.
-
Speicherbrücke 105, welche z. B. ein Northbridge-Chip sein kann, ist über einen Bus oder einen anderen Kommunikationspfad 106 (z. B. HyperTransport-Link) mit einer I/O-(Eingabe/Ausgabe)-Brücke 107 verbunden. I/O-Brücke 107, welche z. B. ein Southbridge-Chip sein kann, empfängt Benutzereingabe von einem oder mehreren Benutzer-Eingabegeräten 108 (z. B. Tastatur, Maus) und leitet die Eingabe an CPU 102 über Pfad 106 und Speicherbrücke 105 weiter. Ein Parallel-Verarbeitungs-Subsystem 112 ist mit der Speicherbrücke 105 über einen Bus oder einen anderen Kommunikationspfad 113 (z. B. einen PCI-Express Accelerated Graphics Port, oder HyperTransport-Link) gekoppelt; in einer Ausführungsform ist das Parallel-Verarbeitungs-Subsystem 112 ein Grafik-Subsystem, welches Pixel an ein Anzeigegerät 110 (z. B. ein konventioneller CRT- oder LCD-basierter Monitor) liefert. Eine Systemplatte 114 ist auch mit der I/O-Brücke 107 verbunden. Ein Switch 116 stellt Verbindungen zwischen I/O-Brücke 107 und anderen Komponenten bereit, wie etwa ein Netzwerkadapter 118 und verschiedenen Hinzufügungskarten (Add-in-Cards) 120 und 121. Andere Komponenten (nicht explizit gezeigt) einschließlich USB- oder andere Port-Verbindungen, CD-Laufwerke, DVD-Laufwerke, Filmaufnahmegeräte, und dergleichen, können auch mit der I/O-Brücke 107 verbunden sein. Kommunikationspfade, welche die verschiedenen Komponenten in 1 wechselseitig verbinden, können unter Benutzung irgendwelcher geeigneten Protokolle implementiert sein, wie etwa PCI (Peripheral Component Interconnect), PCI-Express, AGP (Accelerated Graphics Port), HyperTransport, oder irgendeines oder irgendwelcher Bus- oder Punkt-zu-Punkt-Kommunikations-Protokoll(e), und Verbindungen zwischen verschiedenen Geräten können verschiedene Protokolle benutzen, wie in der Technik bekannt ist.
-
In einer Ausführungsform inkorporiert das Parallel-Verarbeitungs-Subsystem 112 Schaltung, welche für Grafik- und Video-Verarbeitung optimiert ist, einschließlich zum Beispiel Videoausgabe-Schaltung, und konstituiert eine Grafik-Verarbeitungseinheit (GPU). In einer anderen Ausführungsform umfasst das Parallel-Verarbeitungs-Subsystem 112 Schaltung, welche für Allgemeinzweck-Verarbeitung optimiert ist, während die darunter liegende Computer-Architektur, welche im größeren Detail hierin beschrieben ist, beibehalten ist. In noch einer anderen Ausführungsform kann das Parallel-Verarbeitungs-Subsystem 102 mit einem oder mit mehreren anderen Systemelementen integriert sein, wie etwa der Speicherbrücke 105, CPU 102 und I/O-Brücke 107, um ein System auf dem Chip (system on chip) (SoC) zu bilden.
-
Es wird geschätzt werden, dass das hierin gezeigte System illustrativ ist und dass Variationen und Modifikationen möglich sind. Die Verbindungstopologie, einschließlich der Anzahl und der Anordnung von Brücken, der Anzahl von CPUs 102, und der Anzahl von Parallel-Verarbeitungs-Subsystemen 112 kann wie gewünscht modifiziert werden. Zum Beispiel ist in einigen Ausführungsformen Systemspeicher 104 mit CPU 102 direkt gekoppelt anstatt durch eine Brücke, und andere Geräte kommunizieren mit Systemspeicher 104 über Speicherbrücke 105 und CPU 102. In anderen alternativen Topologien ist das Parallel-Verarbeitungs-Subsystem 112 mit I/O-Brücke 107 oder direkt mit CPU 102 verbunden anstatt mit der Speicherbrücke 105. In noch anderen Ausführungsformen können die I/O-Brücke 107 und Speicherbrücke 105 in einen einzelnen Chip integriert sein. Große Ausführungsformen können zwei oder mehr CPUs 102 und zwei oder mehr Parallel-Verarbeitungs-Subsysteme 112 umfassen. Die besonderen Komponenten, welche hierin gezeigt sind, sind optional; z. B. könnte irgendeine Anzahl von Hinzufügungskarten oder peripheren Geräten unterstützt sein. In einigen Ausführungsformen ist der Switch 116 eliminiert und der Netzwerkadapter 116 und Hinzufügungskarten 120, 121 verbinden direkt mit der I/O-Brücke 107.
-
2 illustriert ein Parallel-Verarbeitungs-Subsystem 112 gemäß einer Ausführungsform der vorliegenden Erfindung. Wie gezeigt, umfasst das Parallel-Verarbeitungs-Subsystem 112 eine oder mehrere Parallel-Verarbeitungseinheiten (PPUs) 202, wobei jede von diesen mit einem lokalen Parallel-Verarbeitungs-(PP)-Speicher 204 gekoppelt ist. Im Allgemeinen umfasst ein Parallel-Verarbeitungs-Subsystem eine Anzahl U von PPUs, wobei U ≥ 1 (hierin sind mehrere Instanzen von ähnlichen Objekten mit Referenznummern bezeichnet, welche das Objekt identifizieren und Nummern in Klammern die Instanz identifizieren, wenn benötigt). PPUs 202 und Parallel-Verarbeitungs-Speicher 204 können unter Benutzung von einem oder mehreren integrierte-Schaltung-Geräten implementiert sein, wie etwa programmierbare Prozessoren, Anwendungs-spezifische integrierte Schaltungen (ASICs), oder Speichergeräte, oder in irgendeiner anderen technisch machbaren Weise.
-
Mit Bezug wieder auf 1 sind in einigen Ausführungsformen einige oder alle der PPUs 202 in dem Parallel-Verarbeitungs-Subsystem 112 Grafikprozessoren mit Render-Pipelines, welche konfiguriert sein können, um verschiedene Aufgaben durchzuführen, welche das Erzeugen von Pixeldaten von Grafik-Daten, welche mittels CPU 102 und/oder Systemspeicher 104 über Speicherbrücke 105 und Kommunikationspfad 113 zugeführt sind, ein Interagieren mit lokalem Parallel-Verarbeitungs-Speicher 204 (welcher als ein Grafikspeicher benutzt werden kann einschließlich z. B. eines konventionellen Bildpuffers (frame buffer)), um Pixeldaten zu speichern und zu aktualisieren, ein Liefern von Pixeldaten an das Anzeigegeräte 110, und dergleichen betreffen. In einigen Ausführungsformen kann das Parallel-Verarbeitungs-Subsystem 112 eine oder mehrere PPUs 202 umfassen, welche als Grafikprozessoren operieren, und eine oder mehrere andere PPUs 202, welche für Allgemeinzweck-Berechnungen benutzt werden können. Die PPUs können identisch sein oder verschieden sein und jede PPU kann sein eigenes dediziertes Parallel-Verarbeitungs-Speichergerät(e) haben oder braucht nicht dedizierte Parallel-Verarbeitungs-Speichergerät(e) zu haben. Eine oder mehrere PPUs 202 können Daten an das Anzeigegeräte 110 ausgeben oder jede PPU 202 kann Daten an eines oder mehrere Anzeigegeräte 110 ausgeben.
-
Im Betrieb ist CPU 102 der Master-Prozessor von Computer-System 100, welcher Operationen von anderen System-Komponenten steuert und koordiniert. Insbesondere stellt CPU 102 Befehle aus, welche die Operation von PPUs 202 steuern. In einigen Ausführungsformen schreibt CPU 102 einen Strom von Befehlen für jede PPU 202 auf eine Datenstruktur (nicht explizit in weder 1 noch 2 gezeigt), welche in dem System-Speicher 104, Parallel-Verarbeitungs-Speicher 204 oder irgendeiner anderen Speicher-Stelle lokalisiert sein kann, welche sowohl für CPU 102 als auch für PPU 202 zugreifbar ist. Ein Zeiger (pointer) auf jede Datenstruktur wird auf einen Schiebepuffer (push buffer) geschrieben, um Verarbeitung des Stroms von Befehlen in der Datenstruktur zu initiieren. Die PPU 202 liest Befehlströme von einem oder mehreren Schiebepuffern und führt dann Befehle asynchron relativ zu dem Betrieb von CPU 102 aus. Ausführungs-Prioritäten können für jeden Schiebepuffer spezifiziert werden, um Planen der verschiedenen Schiebepuffer zu steuern.
-
Mit Bezug nun zurück auf 2B umfasst jede PPU 202 eine I/O-(Eingabe/Ausgabe)-Einheit 205, welche mit dem Rest des Computersystems 100 über Kommunikationspfad 113 kommuniziert, welcher zu Speicherbrücke 105 (oder in einer anderen Ausführungsform direkt mit CPU 102) verbindet. Die Verbindung von PPU 202 an den Rest des Computersystems 100 kann auch variiert werden. In einigen Ausführungsformen ist das Parallel-Verarbeitungs-Subsystem 112 als eine Hinzufügungskarte implementiert, welche in einen Erweiterungsschlitz oder Erweiterungssteckplatz (expansion slot) von Computersystem 100 eingeführt werden kann. In anderen Ausführungsformen kann eine PPU 202 auf einem einzelnen Chip integriert sein mit einer Bus-Brücke, wie etwa Speicherbrücke 105 oder I/O-Brücke 107.
-
In noch anderen Ausführungsformen können einige oder alle Elemente von PPU 202 auf einem einzelnen Chip mit CPU 102 integriert sein.
-
In einer Ausführungsform ist der Kommunikationspfad 113 ein PCI-Express-Link, in welchem dedizierte Spuren oder Bahnen (lanes) an jede PPU 202 alloziert sind, wie es in der Technik bekannt ist. Andere Kommunikationspfade können auch benutzt werden. Eine I/O-Einheit 205 erzeugt Pakete (oder andere Signale) für eine Übermittlung auf Kommunikationspfad 113 und empfängt auch alle einlaufenden oder hereinkommenden (incoming) Pakete (oder andere Signale) von Kommunikationspfad 113, wobei die einlaufenden Pakete zu den geeigneten Komponenten von PPU 202 gerichtet werden. Zum Beispiel können Befehle, welche Verarbeitungs-Aufgaben betreffen, an eine Host-Schnittstelle 206 gerichtet werden, während Befehle, welche Speicher-Operationen betreffen (z. B. Lesen von oder Schreiben auf Parallel-Verarbeitungsspeicher 204) an eine Speicher-Kreuzschiene-Einheit (memory crossbar unit) 202 gerichtet werden können. Host-Schnittstelle 206 liest jeden Push-Puffer und gibt die Arbeit, welche mittels des Push-Puffers spezifiziert ist, an ein Frontend 212 aus.
-
Jede PPU 202 implementiert vorteilhafter Weise eine Hochparallel-Verarbeitungs-Architektur. Wie im Detail gezeigt ist, umfasst PPU 202(0) ein Verarbeitungscluster-Feld (processing cluster array) 230, welches eine Anzahl C von Allgemein-Verarbeitungs-Clustern (GPCs) 208 umfasst, wobei C ≥ 1. Jedes GPC 208 ist in der Lage, eine große Anzahl (z. B. Hunderte oder Tausende) von Threads simultan (concurrently) auszuführen, wobei jeder Thread eine Instanz eines Programms ist. In verschiedenen Anwendungen können verschiedene GPCs 208 zur Verarbeitung von verschiedenen Typen von Programmen oder zum Durchführen von verschiedenen Typen von Berechnungen alloziert werden. Die Allozierung von GPCs 208 kann abhängig von der Arbeitsbelastung, welche für jeden Typ von Programm oder Berechnung auftritt, variieren.
-
GPCs 208 empfangen Verarbeitungs-Aufgaben, welche auszuführen sind, von einer Arbeits-Verteilungs-Einheit innerhalb einer Aufgabe-/Arbeit-Einheit 207. Die Arbeits-Verteilungs-Einheit empfängt Zeiger auf Rechen-Verarbeitungs-Aufgaben (Aufgabenzeiger), welche als Queue-Metadaten (QMD) kodiert sind und im Speicher gespeichert sind. Die Aufgabenzeiger auf QMDs sind in dem Befehls-Strom umfasst, welcher in einem Schiebepuffer gespeichert ist und mittels der Frontend-Einheit 212 von der Host-Schnittstelle 206 empfangen ist. Verarbeitungs-Aufgaben, welche als QMDs kodiert sein können, umfassen Indizes von zu verarbeitenden Daten, sowie Status- oder Zustands-Parameter und Befehle, welche definieren, wie die Daten zu prozessieren sind (z. B. welches Programm auszuführen ist). Die Aufgabe-/Arbeit-Einheit 207 empfängt Aufgaben von dem Frontend 212 und stellt sicher, dass die GPCs 208 in einem gültigen Zustand konfiguriert sind, bevor die Verarbeitung, welche mittels jeder der QMDs spezifiziert ist, initiiert ist. Eine Priorität kann für jede QMD spezifiziert sein, welche benutzt ist, um Ausführung der Verarbeitungs-Aufgaben zu planen (schedule).
-
Speicher-Schnittstelle 214 umfasst ein Anzahl D von Partitions-Einheiten 215, welche jeweils direkt mit einem Teil von Parallel-Verarbeitungs-Speicher 204 gekoppelt sind, wobei D ≥ 1. Wie gezeigt, ist die Anzahl von Partitions-Einheiten 215 im Allgemeinen gleich der Anzahl von DRAM 220. In anderen Ausführungsformen muss die Anzahl von Partitions-Einheiten 215 nicht gleich der Nummer von Speicher-Geräten sein. Fachleute in der Technik werden schätzen, dass DRAM 220 durch irgendwelche anderen geeigneten Speicher-Geräte ersetzt werden kann und von einem im Allgemeinen konventionellen Design sein kann. Eine detaillierte Beschreibung wird daher ausgelassen. Render-Ziele (render targets), wie etwa Frame-Puffer oder Textur-Karten (maps) können über DRAMs 220 gespeichert sein, was den Partitions-Einheiten 215 erlaubt, Teile von jedem Render-Target in paralleler Weise zu schreiben, um effektiv die verfügbare Bandbreite von Parallel-Verarbeitungs-Speicher 204 zu nutzen.
-
Irgendeines von GPCs 208 kann Daten verarbeiten, welche auf irgendeinen der DRAMs 220 innerhalb des Parallel-Verarbeitungs-Speichers 204 zu schreiben sind. Kreuzschiene-Einheit 210 ist konfiguriert, um die Ausgabe von jedem GPC 208 an den Eingang irgendeiner Partitions-Einheit 215 oder an irgendein GPC 208 für weitere Verarbeitung zu leiten (route). GPCs 208 kommunizieren mit der Speicher-Schnittstelle 214 durch die Kreuzschiene 210, um von/auf verschiedene externe Speicher-Geräte zu schreiben oder zu lesen. In einer Ausführungsform hat die Kreuzschiene-Einheit 210 eine Verbindung zu Speicher-Schnittstelle 214, um mit I/O-Einheit 205 zu kommunizieren, sowie eine Verbindung zu lokalem Parallel-Verarbeitungs-Speicher 204, um dadurch den Verarbeitungs-Kernen innerhalb der verschiedenen GPCs 208 zu ermöglichen, mit System-Speicher 104 oder einem anderen Speicher zu kommunizieren, welcher nicht lokal zu der PPU 202 ist. In der in 2 gezeigten Ausführungsform ist die Kreuzschiene-Einheit 210 direkt mit I/O-Einheit 205 verbunden. Kreuzschiene-Einheit 210 kann virtuelle Kanäle benutzen, um Verkehrsströme zwischen den GPCs 208 und den Partitions-Einheiten 215 zu separieren.
-
Wiederum können GPCs 208 programmiert sein, Verarbeitungs-Aufgaben durchzuführen, welche eine große Verschiedenheit von Anwendungen betreffen, einschließlich aber nicht darauf beschränkt, lineare oder nichtlineare Daten-Transformationen, Filtern von Video- und/oder Audio-Daten, Modellierungs-Operationen (z. B. Anwenden der Gesetze der Physik, um Position, Geschwindigkeit und andere Attribute von Objekten zu bestimmen), Bild-Render-Operationen (z. B. Tessellations-Schattierung, Vertex-Schattierung, Geometrie-Schattierung und/oder Pixel-Schattierungs-Programme), usw. PPUs 202 können Daten von dem System-Speicher 104 und/oder Lokal-Parallel-Verarbeitungs-Speichern 204 in internen (On-Chip)-Speicher transferieren, können die Daten prozessieren, und können Ergebnis-Daten zurück in den System-Speicher 104 und/oder lokalen Parallel-Verarbeitungs-Speicher 204 schreiben, wo auf solche Daten mittels anderer System-Komponenten zugegriffen werden kann, einschließlich CPU 102 oder ein anderes Parallel-Verarbeitungs-Subsystem 112.
-
Eine PPU 202 kann mit irgendeiner Menge/Umfang (amount) von Lokal-Parallel-Verarbeitungs-Speicher 204 bereitgestellt sein, einschließlich keines Lokal-Speichers, und kann Lokal-Speicher und System-Speicher in irgendeiner Kombination benutzen. Zum Beispiel kann eine PPU 202 ein Grafikprozessor in einer unifizierter-Speicher-Architektur-(unified memory architecture)(UMA)-Ausführungsform sein. In solchen Ausführungsformen würde wenig oder kein dedizierter Grafik-(Parallel-Verarbeitungs)-Speicher bereitgestellt sein und PPU 202 würde exklusiv oder fast exklusiv System-Speicher benutzen. In UMA-Ausführungsformen kann eine PPU 202 in einen Brücken-Chip oder Prozessor-Chip integriert sein oder als ein diskreter Chip bereitgestellt sein mit einem Hochgeschwindigkeits-Link (z. B. PCI-Express), welcher die PPU 202 mit System-Speicher über einen Brücke-Chip oder ein anderes Kommunikations-Mittel verbindet.
-
Wie oben bemerkt ist, kann irgendeine Anzahl von PPUs 202 in einem Parallel-Verarbeitungs-Subsystem 112 umfasst sein. Zum Beispiel können mehrere PPUs 202 auf einer einzelnen Hinzufügungskarte bereitgestellt sein oder mehrere Hinzufügungskarten können mit dem Kommunikationspfad 113 verbunden sein oder eine oder mehrere der PPUs 202 können in einen Brücken-Chip integriert sein. PPUs 202 in einem Mehr-PPU-System können identisch sein oder verschieden voneinander sein. Zum Beispiel könnten verschiedene PPUs 202 verschiedene Anzahlen von Verarbeitungs-Kernen haben, verschiedene Mengen oder Größen von Lokal-Parallel-Verarbeitungs-Speicher, usw. Wo mehrere PPUs 202 vorhanden sind, können diese PPUs in paralleler Weise betrieben werden, um Daten bei einem höheren Durchsatz zu verarbeiten als es mit einer einzelnen PPU 202 möglich ist. Systeme, welche eine oder mehrere PPUs 202 inkorporieren, können in einer Verschiedenheit von Konfigurationen und Formfaktoren implementiert sein, einschließlich Schreibtisch-Computer, Laptop-Computer, oder handgehaltenen Personal-Computern, Servern, Arbeitsstationen, Spielekonsolen, eingebetteten Systemen und dergleichen.
-
Mehrfach-Gleichzeitige-Aufgabe-Planung
-
Mehrfach-Verarbeitungs-Aufgaben können gleichzeitig auf den GPCs 208 ausgeführt werden und eine Verarbeitungs-Aufgabe kann eine oder mehrere „Kind”-Verarbeitungs-Aufgaben während der Ausführung erzeugen. Die Aufgabe-/Arbeit-Einheit 207 empfängt die Aufgaben und plant dynamisch die Verarbeitungs-Aufgaben und Kind-Verarbeitungs-Aufgaben zur Ausführung mittels der GPCs 208.
-
3A ist ein Blockdiagramm der Aufgabe-/Arbeit-Einheit 207 der 2, gemäß einer Ausführungsform der vorliegenden Erfindung. Die Aufgabe-/Arbeit-Einheit 207 umfasst eine Aufgabe-Management-Einheit 300 und die Arbeit-Verteilungs-Einheit 340. Die Aufgabe-Management-Einheit 300 organisiert Aufgaben, welche basierend auf Ausführungs-Prioritäts-Niveaus zu planen bzw. zeitlich zu planen sind (scheduled). Für jedes Prioritäts-Niveau speichert die Aufgabe-Management-Einheit 300 eine Liste von Aufgabezeigern (task pointers) auf die QMDs 322 entsprechend den Aufgaben in der Planer-Tabelle 321. Die QMDs 322 können in dem PP-Speicher 204 oder System-Speicher 104 gespeichert sein. Die Rate, bei welcher die Aufgabe-Management-Einheit 300 Aufgaben annimmt und die Aufgaben in der Planer-Tabelle 321 speichert, ist entkoppelt von der Rate, bei welcher die Aufgabe-Management-Einheit 300 Aufgaben zur Ausführung plant, was der Aufgabe-Management-Einheit 300 ermöglicht, Aufgaben basierend auf Prioritäts-Information oder Benutzung anderer Techniken zu planen.
-
Die Arbeit-Verteilungs-Einheit 340 umfasst eine Aufgabe-Tabelle 345 mit Fächern oder Zellen (slots), wobei jedes von der QMD 322 für eine Aufgabe besetzt sein kann, welche ausgeführt wird. Die Aufgabe-Management-Einheit 300 kann Aufgaben zur Ausführung planen, wenn es in der Aufgabe-Tabelle 345 ein freies Fach gibt. Wenn es kein freies Fach gibt, kann eine höhere-Priorität-Aufgabe, welche kein Fach besetzt, eine niedrigere-Priorität-Aufgabe, welche ein Fach besetzt, verdrängen oder ausweisen (evict). Wenn eine Aufgabe verdrängt ist oder ausgewiesen ist (evicted), wird die Aufgabe gestoppt und wenn die Ausführung der Aufgabe nicht vollständig ist, wird die Aufgabe an eine verkettete Liste in der Planer-Tabelle 321 hinzugefügt. Wenn eine Kind-Verarbeitungs-Aufgabe erzeugt ist, wird die Kind-Aufgabe an die verkettete Liste in der Planer-Tabelle 321 hinzugefügt. Eine Aufgabe wird von einem Fach entfernt, wenn die Aufgabe ausgewiesen ist (evicted).
-
Aufgabe-Verarbeitung-Überblick
-
3B ist ein Blockdiagramm eines GPC 208 innerhalb einer der PPUs 202 der 2, gemäß einer Ausführungsform der vorliegenden Erfindung. Jeder GPC 208 kann konfiguriert sein, eine große Anzahl von Threads parallel auszuführen, wobei der Ausdruck „Thread” sich auf eine Instanz eines bestimmten Programms bezieht, welches auf einem bestimmten Satz von Eingabe-Daten ausführt. In einigen Ausführungsformen werden Einzel-Anweisung-, Mehr-Daten-(SIMD)-Befehls-Ausstellungs-Techniken benutzt, um eine parallele Ausführung einer großen Anzahl von Threads zu unterstützen, ohne mehrere unabhängige Anweisungs-Einheiten bereitzustellen. In anderen Ausführungsformen werden Einzel-Anweisung-, Mehrfach-Thread-(SIMT)-Techniken benutzt, um eine parallele Ausführung einer großen Anzahl von im Allgemeinen synchronisierten Threads zu unterstützen, unter Benutzung einer gemeinsamen Anweisungs-Einheit, welche konfiguriert ist, Anweisungen für einen Satz von Verarbeitungs-Maschinen innerhalb jedes der GPCs 208 auszustellen (issue). Unähnlich zu einem SIMD-Ausführungs-Regime, wobei alle Verarbeitungs-Maschinen typischerweise identische Anweisungen ausführen, erlaubt SIMT-Ausführung verschiedenen Threads, leichter divergenten Ausführungspfaden durch ein gegebenes Thread-Programm zu folgen. Fachleute in der Technik werden verstehen, dass ein SIMD-Verarbeitungs-Regime eine funktionale Untermenge eines SIMT-Verarbeitungs-Regimes repräsentiert.
-
Betrieb von GPC 208 wird vorteilhafterweise über einen Pipeline-Manager 305 gesteuert, welcher Verarbeitungs-Aufgaben an Strömungs-Mehrfach-Prozessoren (streaming multiprocessors) (SMs) 310 verteilt. Pipeline-Manager 305 kann auch konfiguriert sein, eine Arbeitsverteilungs-Kreuzschiene (work distribution crossbar) 330 dadurch zu steuern, dass Ziele (destinations) für prozessierte Daten-Ausgaben mittels SMs 310 spezifiziert sind.
-
In einer Ausführungsform umfasst jeder GPC 208 eine Anzahl M von SMs 310, wobei M ≥ 1, wobei jeder SM 310 konfiguriert ist, eine oder mehrere Thread-Gruppen zu verarbeiten. Auch umfasst jeder SM 310 vorteilhafterweise einen identischen Satz von funktionalen Ausführungseinheiten (gezeigt als Exec-Einheiten 302 in 3C), welche in einer Pipeline angeordnet sein können (pipelined), was erlaubt, eine neue Anweisung auszustellen, bevor eine vorherige Anweisung beendet worden ist, wie es in der Technik bekannt ist. Irgendeine Kombination von funktionalen Ausführungs-Einheiten kann bereitgestellt sein. In einer Ausführungsform unterstützen die funktionalen Einheiten eine Verschiedenheit von Operationen, einschließlich Ganzzahl-Arithmetik und Gleitzahl-Arithmetik (z. B. Addition und Multiplikation), Vergleichs-Operationen, Bool'sche Operationen (AND, OR, XOR), Bit-Verschiebung und Berechnen von verschiedenen algebraischen Funktionen (z. B. planare Interpolation, trigonometrische, exponentiale und logarithmische Funktionen); und dieselbe Funktional-Einheit-Hardware kann eingesetzt werden, um verschiedene Operationen durchzuführen.
-
Die Serie von Anweisungen, welche an eine bestimmte GPC 208 übermittelt wird, konstituiert einen Thread, wie vorher hierin definiert ist, und die Sammlung einer gewissen Anzahl von simultan ausführenden Threads über die Parallel-Verarbeitungs-Maschinen (nicht gezeigt) innerhalb eines SM 310 wird hierin als ein „Warp” oder eine „Thread-Gruppe” bezeichnet. Wie hierin benutzt, bezeichnet eine „Thread-Gruppe” eine Gruppe von Threads, welche simultan dasselbe Programm auf verschiedenen Eingabe-Daten ausführen, wobei ein Thread der Gruppe an eine verschiedene Verarbeitungs-Maschine innerhalb eines SM 310 zugewiesen ist. Eine Thread-Gruppe kann weniger Threads umfassen als die Anzahl von Verarbeitungs-Einheiten innerhalb des SM 310, in welchem Fall einige Verarbeitungs-Maschinen während Zyklen untätig sein werden, wenn diese Thread-Gruppe verarbeitet wird. Eine Thread-Gruppe kann auch mehr Threads umfassen als die Anzahl von Verarbeitungs-Maschinen innerhalb des SM 310, in welchem Fall die Verarbeitung über nachfolgende Taktzyklen stattfinden wird. Da jeder SM 310 bis zu G Thread-Gruppen gleichzeitig unterstützen kann, folgt, dass bis zu G·M Thread-Gruppen zu einer gegebenen Zeit in GPC 208 ausführen können.
-
Zusätzlich kann eine Mehrzahl von bezogenen Thread-Gruppen aktiv sein (in verschiedenen Phasen einer Ausführung) zu derselben Zeit innerhalb eines SM 310. Diese Sammlung von Thread-Gruppen wird hierin als ein „kooperatives Thread-Feld” (cooperative thread array) („CTA”) oder „Thread-Feld” bezeichnet. Die Größe eines bestimmten CTA ist m·k, wobei k die Anzahl von gleichzeitig ausführenden Threads in einer Thread-Gruppe ist und typischerweise ein ganzzahliges Vielfaches der Anzahl von Parallel-Verarbeitungs-Einheiten innerhalb des SM 310 ist, und wobei m die Anzahl von Thread-Gruppen ist, welche simultan innerhalb des SM 310 aktiv sind. Die Größe eines CTA ist im Allgemeinen mittels des Programmierers bestimmt und mittels der Menge von Hardware-Ressourcen, wie Speicher oder Register, welche für das CTA verfügbar sind.
-
Jeder SM 310 beinhaltet einen (L1-)Cache (in 3C gezeigt) oder benutzt Raum (space) in einem entsprechenden L1-Cache außerhalb des SM 310, welcher benutzt ist, um Lade- und Speicher-Operationen durchzuführen. Jeder SM 310 hat auch Zugriff auf Level-zwei-(L2-)Caches, welche unter allen GPCs 208 gemeinsam benutzt oder geteilt sind (shared) und benutzt werden können, um Daten zwischen Threads zu transferieren. Schließlich haben die SMs 310 Zugriff auf Off-Chip „globalen” Speicher, welcher z. B. Parallel-Verarbeitungs-Speicher 204 oder System-Speicher 104 umfassen kann. Es ist verstanden, dass irgendein Speicher extern zu PPU 202 als globaler Speicher benutzt werden kann. Zusätzlich kann ein Level-eins-Komma-fünf-(L1.5-)Cache 335 innerhalb des GPC 208 umfasst sein, welcher konfiguriert ist, Daten zu empfangen und zu halten, welche von dem Speicher über Speicher-Schnittstelle 214 geholt sind, abgefragt mittels SM 310, einschließlich Anweisungen, uniforme Daten und konstante Daten, und die angefragten Daten an SM 310 bereitzustellen. Ausführungsformen, welche mehrere SMs 310 in GPC 208 haben, teilen oder benutzen gemeinsam (share) in vorteilhafter Weise gemeinsame Anweisungen und Daten, welche in L1.5-Cache 335 zwischengespeichert sind.
-
Jeder GPC 208 kann eine Speicher-Management-Einheit (MMU) 328 umfassen, welche konfiguriert ist, virtuelle Adressen in physikalische Adressen abzubilden (map). In anderen Ausführungsformen, können MMU(s) 328 innerhalb der Speicher-Schnittstelle 214 ansässig sein (reside). Die MMU 328 umfasst einen Satz von Seite-Tabelle-Einträgen (page table entry) (PTEs), welche benutzt werden, um eine virtuelle Adresse in eine physikalische Adresse einer Kachel (tile) und optional einen Cache-Zeilen-Index abzubilden. Die MMU 328 kann Adresse-Übersetzungs-Puffer (translation lookaside buffer) (TLB) oder Caches umfassen, welche innerhalb des Mehrfach-Prozessors SM 310 oder dem L1-Cache oder GPC 208 ansässig sein können. Die physikalische Adresse ist verarbeitet, um Oberflächendaten-Zugriffslokalität zu verteilen, um eine effiziente Abfrage-Verschachtelung (interleaving) unter Partitions-Einheiten zu erlauben. Der Cache-Zeile-Index kann benutzt werden, um zu bestimmen, ob eine Anfrage nach einer Cache-Zeile ein Treffer ist oder eine Verfehlung ist oder nicht.
-
In Grafik- und Berechnungs-Anwendungen kann ein GPC 208 derart konfiguriert sein, dass jeder SM 310 mit einer Textur-Einheit 315 zum Durchführen von Textur-Abbildungs-Operationen gekoppelt ist, z. B. Bestimmen von Textur-Proben-Positionen (texture sample position), Lesen von Textur-Daten und Filtern der Textur-Daten. Textur-Daten werden von einem internen Textur-L1-Cache (nicht gezeigt) oder in einigen Ausführungsformen von dem L1-Cache innerhalb von SM 310 gelesen und werden von einem L2-Cache, Parallel-Verarbeitungs-Speicher 204 oder System-Speicher 104 wie benötigt geholt. Jeder SM 310 gibt verarbeitete Aufgaben an die Arbeits-Verteilungs-Kreuzschiene 330 aus, um die verarbeitete Aufgabe an einen anderen GPC 208 für weitere Verarbeitung bereitzustellen oder um die verarbeitete Aufgabe in einem L2-Cache, Parallel-Verarbeitungs-Speicher 204 oder System-Speicher 104 über Kreuzschiene-Einheit 210 zu speichern. Ein preROP (Vorraster-Operationen) 325 ist konfiguriert, um Daten von SM 310 zu empfangen, Daten an ROP-Einheiten innerhalb der Partitions-Einheiten 215 zu richten, und Optimierungen für Farbmischung durchzuführen, Pixel-Farbdaten zu organisieren und Adress-Translationen durchzuführen.
-
Es wird geschätzt werden, dass die hierin beschriebene Kern-Architektur illustrativ ist und dass Variationen und Modifikationen möglich sind. Irgendeine Anzahl von Verarbeitungs-Einheiten, z. B. SMs 310 oder Textur-Einheiten 315, preROPs 325, können innerhalb eines GPC 208 umfasst sein kann. Während nur ein GPC 208 gezeigt ist, kann eine PPU 202 irgendeine Anzahl von GPCs 208 umfassen, welche vorteilhafterweise funktionell ähnlich zueinander sind, so dass ein Ausführungs-Verhalten nicht davon abhängt, welcher GPC 208 eine bestimmte Verarbeitungs-Aufgabe empfängt. Ferner operiert jeder GPC 208 vorteilhafterweise unabhängig von anderen GPCs 208 unter Benutzung von separaten und distinkten Verarbeitungs-Einheiten L1-Caches, usw.
-
Fachleute in der Technik werden verstehen, dass die in 1, 2, 3A und 3B beschriebene Architektur in keiner Weise den Geltungsbereich der vorliegenden Erfindung begrenzt und dass die hierin gelehrten Techniken auf irgendeiner korrekt konfigurierten Verarbeitungs-Einheit implementiert werden können, einschließlich ohne Begrenzung eine oder mehrere CPUs, eine oder mehrere Mehr-Kern-CPUs, eine oder mehrere PPUs 202, ein oder mehrere GPCs 208, eine oder mehrere Grafik- oder Spezialzweck-Verarbeitungs-Einheiten, oder dergleichen, ohne von dem Geltungsbereich der vorliegenden Erfindung abzuweichen.
-
In Ausführungsformen der vorliegenden Erfindung ist es wünschenswert, die PPU 202 oder andere Prozessor(en) eines Computer-Systems zu benutzen, um Allgemeinzweck-Berechnungen unter Benutzung von Thread-Feldern auszuführen. Jedem Thread in dem Thread-Feld ist ein eindeutiger Thread-Identifikator („Thread-ID”) zugewiesen, welcher für den Thread während seiner Ausführung zugreifbar ist. Der Thread-ID, welcher als ein eindimensionaler oder mehrdimensionaler numerischer Wert definiert werden kann, steuert verschiedene Aspekte des Verarbeitungs-Verhaltens des Threads. Zum Beispiel kann ein Thread-ID benutzt werden, um zu bestimmen, welchen Teil des Eingabe-Datensatzes ein Thread zu prozessieren hat, und/oder zu bestimmen, welchen Teil eines Ausgabe-Datensatzes ein Thread zu erzeugen hat oder zu schreiben hat.
-
Eine Sequenz von Pro-Thread-Anweisungen kann zumindest eine Anweisung umfassen, welche ein kooperatives Verhalten zwischen dem repräsentativen Thread und einem oder mehreren anderen Threads des Thread-Feldes definiert. Zum Beispiel könnte die Sequenz von Pro-Thread-Anweisungen eine Anweisung umfassen, um eine Ausführung von Operationen für den repräsentativen Thread bei einem bestimmten Punkt in der Sequenz anzuhalten (suspend), bis zu einer solchen Zeit, wenn einer oder mehrere der anderen Threads diesen bestimmten Punkt erreichen, eine Anweisung für den repräsentativen Thread, Daten in einem gemeinsamen Speicher zu speichern, auf welchen einer oder mehrere der anderen Threads zugreifen können, eine Anweisung für den repräsentativen Thread, um atomar Daten zu lesen und zu aktualisieren, welche in einem gemeinsamen Speicher gespeichert sind, auf welchen einer oder mehrere der anderen Threads Zugriff haben, basierend auf ihren Thread-IDs, oder dergleichen. Das CTA-Programm kann auch eine Anweisung umfassen, um eine Adresse in dem gemeinsamen Speicher zu berechnen, von welchem Daten zu lesen sind, wobei die Adresse eine Funktion der Thread-ID ist. Mittels eines Definierens von geeigneten Funktionen und mittels eines Bereitstellens von Synchronisations-Techniken können Daten auf eine bestimmte Stelle in dem gemeinsamen Speicher mittels eines Threads eines CTA geschrieben werden und von dieser Stelle mittels eines verschiedenen Threads desselben CTA in einer vorhersagbaren Weise gelesen werden. Folglich kann irgendein gewünschtes Muster von Daten-gemeinsam-Benutzen (data sharing) unter Threads unterstützt werden, und irgendein Thread in einem CTA kann mit irgendeinem anderen Thread in demselben CTA Daten gemeinsam nutzen bzw. teilen (share). Das Ausmaß, wenn überhaupt, eines gemeinsamen Benutzens von Daten unter Threads eines CTA ist mittels des CTA-Programms bestimmt; somit wird verstanden, dass in einer bestimmten Anwendung, welche CTAs benutzt, die Threads eines CTA tatsächlich Daten miteinander teilen bzw. benutzen könnten oder nicht, abhängig von dem CTA-Programm, und die Ausdrucke „CTA” und „Thread-Feld” werden hierin synonym benutzt.
-
Spekulatives Anweisung-Ausstellen und -Zurücksetzen
-
3C ist ein Blockdiagramm des SM 310 von 3B gemäß einer Ausführungsform der vorliegenden Erfindung. Der SM 310 umfasst einen Anweisungs-L1-Cache 370, welcher konfiguriert ist, Anweisungen von Speicher über L1.5-Cache 335 zu empfangen. Eine Warp-Planer- und Anweisungs-Einheit 312 empfängt Anweisungen von dem Anweisungs-L1-Cache 370 und stellt Anweisungen an die Anweisungs-Pipeline 324 aus. Der Anweisung-Ausstellungs-Prozess ist spekulativ, weil die Warp-Planer- und -Anweisungs-Einheit 312 nicht konfiguriert ist, irgendein Dekodieren der Anweisungen durchzuführen. Daher werden die Anweisungen spekulativ ausgestellt ohne irgendetwas über die Anweisungen zu bestimmen, z. B. den Anweisungs-Typ, Anzahl von Quellen- oder Ziel-Operationen, und dergleichen.
-
Die Anweisungs-Pipeline 324 führt Vor-Ausführungs-Anweisungs-Operationen durch, wie etwa Anweisungs-Dekodierung und Daten-Verifikation. Die Anweisungs-Pipeline 324 sammelt Operanden für die Anweisungen, greift auf lokale Registerdatei 304 zu, auf Speicher und Cache-Zwischenverbindung (interconnect) 380, auf gemeinsamen Speicher 306, und L1-Cache 320 gemäß den Anweisungen, um Operanden zu lesen und zu schreiben. Während der Vor-Ausführungs-Anweisungs-Operationen kann die Anweisungs-Pipeline 324 bestimmen, dass eine Zurücksetzen-Bedingung (rollback condition) aufgetreten ist. Die Anweisungs-Pipeline 324 zeigt an, ob eine Zurücksetzen-Bedingung eingetreten ist, indem eine Zurücksetzen-Flagge gesetzt wird, und stellt einen Zurücksetzen-Code bereit, welcher den Grund der Zurücksetzen-Bedingung identifiziert. Die Anweisungs-Pipeline 324 gibt die verarbeiteten Anweisungen, die Zurücksetzen-Flagge und den Zurücksetzen-Code an die Absetz-Einheit 326 aus.
-
Die Absetz-Einheit 326 hält eine Ressource-Anzeigetafel (recource scoreboard) und Status-Information für die Threads und Thread-Gruppen, welche in den N exec-(Ausführungs- oder Verarbeitungs-)-Einheiten 302 ausführen. Die Absetz-Einheit 326 empfängt die verarbeiteten Anweisungen, die Zurücksetzen-Flagge und Zurücksetzen-Code von der Anweisungs-Pipeline 324 und, wenn eine Zurücksetzen-Bedingung noch nicht mittels der Anweisungs-Pipeline 324 identifiziert worden ist, kann die Absetz-Einheit 326 bestimmen, dass eine Zurücksetzen-Bedingung erfolgt ist oder eingetreten ist basierend auf der Ressource-Anzeigetafel und der Status-Information. Der Zurücksetzen-Status umfasst die Adresse der Anweisungen, welche zu dem Zurücksetzen führte. Wenn eine Zurücksetzen-Bedingung auftritt, gibt die Absetz-Einheit 326 die Zurücksetzen-Flagge und den Zurücksetzen-Code an die Warp-Planer- und Anweisungs-Einheit 312 aus. Anderenfalls setzt die Absetz-Einheit 326 die verarbeiteten Anweisungen zur Ausführung mittels der exec-Einheiten 302 ab. In einer Ausführungsform zeigt, wenn mehrere Zurücksetzen-Bedingungen auftreten, die Zurücksetzen-Bedingung, welche an den Planer 312 berichtet ist, an, dass zwei oder mehr Zurücksetzen-Bedingungen aufgetreten sind. In einer anderen Ausführungsform werden die Prioritäts-Niveaus für die verschiedenen Zurücksetzen-Bedingungen spezifiziert und die Zurücksetzen-Bedingung, welche die höchste Priorität hat, wird an den Planer 312 berichtet.
-
Das Zurücksetzen (rollback) kann benutzt werden, um verschiedene Fehlerbedingungen zu handhaben, während auch ein spekulatives Ausstellen von Anweisungen ermöglicht ist. Wenn eine Zurücksetzen-Bedingung identifiziert ist, sollten alle In-Flug-Anweisungen (all in-flights instructions) für die Thread-Gruppe, welche das Zurücksetzen initiierten, ungültig gemacht werden. In-Flug-Anweisungen umfassen irgendwelche Anweisungen für die Thread-Gruppe, welche ausgestellt worden sind aber noch nicht abgesetzt (überwiesen oder übergeben) zur Ausführung mittels der exec-Einheiten 302 worden sind. In einer ersten Phase der Zurücksetzen-Operation stoppt ein Ausstellen von Anweisungen für die Thread-Gruppe und ein Holen von neuen Anweisungen für die Thread-Gruppe stoppt auch. Wenn In-Flug-Anweisungen für die Thread-Gruppe die Absetz-Einheit 326 erreichen, werden die In-Flug-Anweisungen verworfen. In einer alternativen Ausführungsform werden die In-Flug-Anweisungen mittels der Warp-Planer- und Anweisungs-Einheit 312, der Anweisungs-Pipeline 324 und der Absetz-Einheit 326 verworfen, so dass In-Flug-Anweisungen nicht zu der Absetz-Einheit 326 durchgereicht oder durchpassiert werden. Sobald die Zurücksetzen-Bedingung entfernt oder korrigiert worden ist, beginnt die zweite Phase der Zurücksetzen-Operation damit, dass die Warp-Planer- und Anweisungs-Einheit 312 den Programmzähler für die Thread-Gruppe aktualisiert. Die Warp-Planer- und Anweisungs-Einheit 312 holt dann die zurückgesetzten Anweisungen (rolled back instructions) von dem Anweisungs-L1-Cache 370, wobei bei dem Programmzähler gestartet wird, und stellt die zurückgesetzten Anweisungen aus.
-
SM 310 stellt einen Auf-Chip (on-chip) (internen) Daten-Speicher mit verschiedenen Zugriffs-Niveaus bereit. Spezielle Register (nicht gezeigt) sind lesbar aber nicht mittels Absetz-Einheit 326 schreibbar und werden benutzt, um Parameter zu speichern, welche die „Position” jedes CTA-Threads definieren. In einer Ausführungsform umfassen spezielle Register ein Register pro CTA-Thread (oder pro exec-Einheit 302 innerhalb SM 310), welches eine Thread-ID speichert; jedes Thread-ID-Register ist nur mittels einer entsprechenden der exec-Einheit 302 zugreifbar. Spezielle Register können auch zusätzliche Register umfassen, welche mittels aller Threads in demselben Gitter oder derselben Queue lesbar sind, welche einen CTA-Identifikator speichern, die CTA-Dimensionen, die Dimensionen des Gitters (grid), zu welchem das CTA gehört (oder Queue-Position, wenn eine Queue), und einen Identifikator eines Gitters oder Queen, zu welchem das CTA gehört. CTAs, die zu einem Gitter gehören, haben implizite x, y, z Parameter, welche die Position des jeweiligen CTA innerhalb des Gitters anzeigen. Spezielle Register werden während einer Initialisierung in Antwort auf Befehle geschrieben, welche über das Frontend 212 von dem Gerätetreiber 103 empfangen sind und welche sich während der CTA-Ausführung nicht ändern. Das Frontend 212 plant jede Verarbeitungsaufgabe zur Ausführung als entweder ein Gitter oder eine Queue. Jedes CTA ist mit einem spezifischen Gitter oder Queue für gleichzeitige Ausführung von einer oder mehreren Aufgaben assoziiert. Zusätzlich kann ein GPC 208 mehrere Aufgaben gleichzeitig ausführen.
-
Ein Parameter-Speicher (nicht gezeigt) speichert Laufzeit-Parameter (Konstanten), welche gelesen werden können aber welche nicht mittels irgendeines CTA-Threads (oder irgendeiner LSU 303) geschrieben werden können. In einer Ausführungsform stellt der Gerätetreiber 103 Parameter für den Parameter-Speicher bereit, bevor der SM 310 darauf gerichtet wird, eine Ausführung eines CTA zu beginnen, welches diese Parameter benutzt. Irgendein Thread innerhalb irgendeines CTA (oder irgendeine exec-Einheit 302 innerhalb SM 310) kann auf globalen Speicher durch eine Speicher-Schnittstelle 214 zugreifen. Teile von globalem Speicher können in dem L1-Cache 320 gespeichert sein.
-
Die lokale Register-Datei 304 ist mittels jedes Threads als ein Notizzettel-Raum (scratch spase) benutzt; jedes Register wird für die exklusive Benutzung eines Threads alloziert und Daten in irgendeiner Register-Datei 304 sind nur von dem Thread zugreifbar, an welchen sie alloziert ist. Die lokale Register-Datei 304 kann als eine Register-Datei implementiert sein, welche physikalisch oder logisch in P Spuren oder Bahnen aufgeteilt ist, wobei jede irgendeine Anzahl von Einträgen hat (wobei jeder Eintrag z. B. ein 32-Bit-Wort speichern könnte). Eine Spur ist jeder der N exec-Einheiten 302 zugewiesen und entsprechende Einträge in verschiedenen Spuren können mit Daten für verschiedene Threads befüllt sein, welche dasselbe Programm ausführen, um eine SIMD-Ausführung zu ermöglichen. Verschiedene Teile der Spuren können an verschiedene der G gleichzeitigen Thread-Gruppen alloziert sein, so dass ein gegebener Eintrag in der lokalen Register-Datei 304 nur für einen bestimmten Thread zugreifbar ist. In einer Ausführungsform werden gewisse Einträge innerhalb der lokalen Register-Datei 304 zum Speichern von Thread-Identifikatoren reserviert, welche eines der speziellen Register implementieren. Zusätzlich kann ein uniformer L1-Cache innerhalb von SM 310 umfasst sein, um uniforme und konstante Werte für jede Spur der N exec-Einheiten zu speichern.
-
Der gemeinsame Speicher 306 ist für alle Threads innerhalb eines einzelnen CTA zugreifbar, irgendeine Stelle in dem gemeinsamen Speicher 306 ist für irgendeinen Thread innerhalb desselben CTA zugreifbar (oder für irgendeine Verarbeitungs-Maschine innerhalb SM 310). Der gemeinsame Speicher 306 kann als eine gemeinsam benutzte oder geteilte (shared) Register-Datei oder ein gemeinsamer On-Chip-Cache-Speicher implementiert sein mit einer Zwischenverbindung, welche irgendeiner Verarbeitungs-Maschine erlaubt, von oder auf irgendeine Stelle in dem gemeinsamen Speicher zu lesen oder zu schreiben. In anderen Ausführungsformen könnte der gemeinsame Zustandsraum (shared state space) auf eine Pro-CTA-Region von Off-Chip-Speicher abbilden und könnte in L1-Cache 320 zwischengespeichert sein. Der Parameter-Speicher kann als ein designierter Abschnitt innerhalb derselben gemeinsamen Register-Datei oder des gemeinsamen Cache-Speichers implementiert sein, welcher den gemeinsamen Speicher 306 implementiert, oder als eine separate gemeinsame Register-Datei oder ein On-Chip-Cache-Speicher, auf welchen die LSUs 303 nur-Lese-Zugriff haben. In einer Ausführungsform ist der Bereich, welcher den Parameter-Speicher implementiert, auch dazu benutzt, um die CTA-ID und die Gitter-ID zu speichern, sowie CTA- und Gitter-Dimensionen oder Queue-Position, wobei Teile der speziellen Register implementiert sind. Der SM 310 kann auch einen unifizierte-Adress-Abbildungs-Einheit 352 umfassen, welche eine Adresse, welche für Lade- und Speicher-Befehle bereitgestellt ist, welche in einem unifizierten Speicher-Raum spezifiziert ist, in eine Adresse in jedem distinkten Speicherraum zu konvertieren. Folglich kann eine Anweisung genutzt werden, um auf irgendwelche der lokalen, gemeinsamen oder globalen Speicherräume dadurch zuzugreifen, dass eine Adresse in dem unifizierten Speicherraum spezifiziert wird.
-
Der L1-Cache 320 in jedem SM 310 kann benutzt werden, um private Pro-Thread-lokale Daten und auch Pro-Anwendung-globale Daten zu cachen bzw. zwischenzuspeichern. In einigen Ausführungsformen können die Pro-CTA-gemeinsamen Daten in den L1-Cache 320 zwischengespeichert werden. Die Anweisungs-Pipeline 324 ist mit dem gemeinsamen Speicher (shared memory) 306 und dem L1-Cache 320 über eine Speicher- und Zwischenspeicher-Zwischenverbindung 380 gekoppelt. Die Anweisungs-Pipeline 324 ist konfiguriert, eine Verschiedenheit von Zurücksetzen-Bedingungen zu detektieren, einschließlich Operanden, welche nicht verfügbar sind entweder aufgrund eines Cache-Verfehlens oder weil ein Operand noch nicht gespeichert worden ist. Wenn z. B. eine Konstante nicht in einem Konstante-Cache verfügbar ist, d. h. ein Cache-Verfehlen auftritt, zeigt die Anweisungs-Pipeline 324 an, dass eine Zurücksetzen-Bedingung existiert. Ein Compiler organisiert typischerweise die Anweisungen so, dass abhängige Anweisungen ohne eine Verzögerung dadurch ausgeführt werden, dass sichergestellt ist, dass irgendwelche Operanden, welche von den abhängigen Anweisungen benötigt werden, berechnet werden (wie benötigt) und mittels vorheriger Anweisungen in derselben oder einer verschiedenen oder anderen Thread-Gruppe gespeichert werden. Eine Zurücksetzen-Bedingung kann jedoch dazu führen, dass Anweisungen für eine oder mehrere Thread-Gruppen verzögert werden. Folglich kann die Anweisungs-Pipeline 324 konfiguriert sein, zu bestimmen, dass eine Zurücksetzen-Bedingung existiert, wenn ein Quell- oder Ziel-Operand nicht im Speicher verfügbar ist und für eine abhängige Anweisung erfordert ist.
-
Die Anweisungs-Pipeline 324 kann auch konfiguriert sein, ein ungültiges Super-Skalar-Paar zu detektieren, wenn eine Anweisung zwei Operationen spezifiziert, welche nicht parallel durchgeführt werden können. Wenn ein ungültiges Super-Skalar-Paar detektiert ist, existiert eine Zurücksetzen-Bedingung und die Warp-Planer- und Anweisungs-Einheit 312 wird jede Operation als eine separate Anweisung ausstellen, d. h. die ursprüngliche Anweisung wird serialisiert werden. Die Anweisungs-Pipeline 324 kann auch konfiguriert sein, zu detektieren, wenn ein Quell-Operand-Wert korrumpiert ist dadurch, dass ein Fehlerkorrektur-Code (error-correcting code) (ECC) benutzt wird. In einer Ausführungsform ist die Anweisungs-Pipeline 324 konfiguriert, den Quell-Operand-Wert unter Benutzung des ECC zu korrigieren. In anderen Ausführungsformen zeigt die Anweisungs-Pipeline 324 an, dass eine Zurücksetzen-Bedingung existiert, indem die Zurücksetzen-Flagge und der Zurücksetzen-Code dementsprechend gesetzt werden.
-
Die Absetz-Einheit 326 ist konfiguriert, eine Verschiedenheit von Zurücksetzen-Bedingungen zu detektieren, einschließlich Anzeigetafel-Verriegelungen (scoreboard interlocks) für Anweisungen aufgrund von Ressourcen-Disput (resource contention) und aufgrund einer Anweisung, welche mittels einer Synchronisierungs-Barriere blockiert ist, welche benutzt wird, um verschiedene Thread-Gruppen zu synchronisieren. Die Synchronisierungs-Barriere braucht nicht in der Lage sein, vervollständigt zu werden, bis Anweisungen, welche noch nicht ausgestellt worden sind, ausgeführt werden. Daher ist es wichtig, diesen nicht ausgestellten Anweisungen zu erlauben, auszuführen, wenn benötigt, was ein Umgehen der Anweisung beinhaltet, welcher die Zurücksetzen-Bedingungen begegnete.
-
Wenn ein Eintrag in der Anzeigetafel oder zum Speichern der Statusinformation für einen Thread oder eine Thread-Gruppe nicht verfügbar ist, kann die Absetz-Einheit 326 auch bestimmen, dass eine Zurücksetzen-Bedingung existiert. Wenn zusätzlich die Anzeigetafel anzeigt, dass Speicher- oder Verarbeitungs-Ressource-Disput zwischen einer Anweisung, welche nicht abgesetzt worden ist, und einer Anweisung existiert, welche geradeaus führt, zeigt die Absetz-Einheit 326 dadurch an, dass eine Zurücksetzen-Bedingung existiert, dass die Zurücksetzen-Flagge und der Zurücksetzen-Code dementsprechend gesetzt werden. Der Compiler kann konfiguriert sein, die Anweisungen für jede Thread-Gruppe unter der Annahme zu organisieren, dass vorbestimmte Wartezeiten (latencies) für einige Operationen vorliegen. Wenn die vorbestimmten Wartezeiten aufgrund von einer Vielzahl von Umständen überschritten werden, z. B. Cache-Verfehlen, Zurücksetzen-Operationen, bestimmt die Absetz-Einheit 326, dass eine Zurücksetzen-Bedingung existiert basierend auf den Inhalten der Anzeigetafel (scoreboard contents). Anstatt die einlaufenden oder hereinkommenden verarbeiteten Anweisungen anzuhalten (stall), während darauf gewartet wird, dass sich der Umstand auflöst, bestimmt die Absetz-Einheit 326, dass eine Rücksetzen-Bedingung existiert, und die hereinkommenden verarbeiteten Anweisungen werden ohne ein Anhalten gehandhabt.
-
Weil die Warp-Planer- und Anweisungs-Einheit 312 Anweisungen nicht dekodiert, bevor die Anweisungen an die Anweisungs-Pipeline 324 ausgestellt werden, werden die Anweisungen unter der Annahme ausgestellt, dass Verzweigungen nicht genommen werden, d. h. Anweisungen für den Durch-Fall-Pfad („Fall-Through”-path) durch das Programm werden spekulativ ausgestellt. Wenn der Fall-Through-Pfad nicht genommen wird, existiert eine Zurücksetzen-Bedingung. Wenn immer jedoch ein Fall-Through-Pfad für eine Verzweigungs- oder Sprung-Anweisung gültig ist, d. h. die Thread-Gruppe muss die Anweisungen in dem Fall-Through-Pfad zu einer Zeit ausführen, dann tritt kein Zurücksetzen ein, bis nachdem die Anweisungen in dem Fall-Through-Pfad ausgeführt sind. Mit anderen Worten wird das Zurücksetzen verzögert bzw. ausgesetzt (deferred) und Priorität wird den Fall-Through-Pfad gegeben. Die Absetz-Einheit 326 setzt das Zurücksetzen dadurch aus, dass ein Divergenz-Token auf den Ausführungsstapel für irgendeinen Thread in der Thread-Gruppe geschoben wird (pushing), welcher nicht den Fall-Through-Pfad nimmt und die Verzweigungs- oder Sprung-Anweisung ausführen wird. Das Divergenz-Token umfasst den Programmzähler für die Verzweigungs- oder Sprung-Anweisung und eine aktive Maske, welche die Threads in der Thread-Gruppe anzeigt, welche den Verzweigungs- oder Sprung-Pfad ausführen werden.
-
Die aktive Maske für jede Pfad-Gruppe, welche ausführt, ist von der Absetz-Einheit 326 gehalten und ist mittels der Warp-Planer- und Anweisungs-Einheit 312 mit jeder ausgestellten Anweisung ausgegeben. Die aktive Maske ist initialisiert, wenn eine Thread-Gruppe Ausführungen einer Rechen-Aufgabe beginnt und wenn ein Divergenz-Token aufgeworfen oder abgenommen wird (popped). Die Absetz-Einheit 326 kann konfiguriert sein, um Verzweigungs-Operationen aufzulösen zusätzlich zum Aufschieben und Entnehmen (pushing and popping) von Einträgen von dem Ausführungsstapel.
-
In einer Ausführungsform ist eine Ausführung der Durch-Fall-Pfade (fall-through-paths) optimiert, um ein Zurücksetzen zu vermeiden, um den Nicht-Durch-Fall-Pfad für bestimmte Umstände zu nehmen. Wenn z. B. die Nicht-Durch-Fall-Pfad-Anweisung eine „Entnahme”(popper)-Anweisung ist, welche den Thread veranlasst, welcher den Nicht-Durch-Fall-Pfad ausführt, Ausführung bei derselben Anweisung wieder aufzunehmen, wie die Threads, welche den Durch-Fall-Pfad nahmen (folgend einer Ausführung des Durch-Fall-Pfades), dann tritt kein Zurücksetzen auf. Ein Divergenz-Token wird nicht auf den Ausführungsstapel aufgeschoben (pushed), wenn die Verzweigungs- oder Sprung-Anweisung detektiert ist, welche die Zurücksetzen-Bedingung auslöste. Beispiele von „Entnahme”-(„popper”)-Anweisungen umfassen Exit, Return, Break, Continue, Longjump und eine Anweisung mit einer .S-Option, welche anzeigt, dass alle sich der aktiven Threads für die Thread-Gruppe synchronisieren müssen, bevor die Ausführung weitergeht. Im Gegensatz dazu führen unbedingte Verzweigungs-Anweisungen einschließlich eines relativen Aufrufs (call-relative) (CAL), eines absoluten Aufrufs (call absolute) (JCAL), Unterbrechungspunkt (breakpoint) (BPT) oder Unterbrechung, Rückkehr-von-Falle (return-from-trap) (RTT) oder Rückkehren von Unterbrechung (return from interrupt), Verzweigungs-indirekt (BRX), und Sprung-indirekt (jump indirect) (JMX) zu einer Rücksetzen-Bedingung, welche die Zurücksetzen-Operation erfordert.
-
Wenn der Ausführungsstapel konfiguriert ist, einige Einträge in einem Cache oder andere Einträge, weiter unten in dem Stapel, im Grafikspeicher zu speichern, kann die Absetz-Einheit 326 konfiguriert sein, anzuzeigen, dass eine Rücksetzen-Bedingung aufgetreten ist, wenn der Ausführungsstapel nicht verfügbar ist. Der Ausführungsstapel braucht nicht verfügbar sein, wenn Einträge von dem Cache zu dem Grafikspeicher oder von dem Grafikspeicher zu dem Cache transferiert werden.
-
4A illustriert ein spekulative-Anweisung-Ausstellung- und Anweisung-Zurücksetzen-Verfahren 400 gemäß einer Ausführungsform der Erfindung. Obwohl die Verfahrensschritte im Zusammenhang mit den Systemen von 1, 2, 3A, 3B und 3C beschrieben sind, werden Fachleute in der Technik verstehen, dass irgendein System, welches konfiguriert ist, die Verfahrensschritte durchzuführen, in irgendeiner Ordnung, innerhalb des Geltungsbereichs der Erfindungen ist.
-
Bei Schritt 405 stellt die Warp-Planer- und Anweisungs-Einheit 312 zumindest eine Anweisung in jedem Taktzyklus aus, verschachtelte (interleaving) Anweisungen für eine oder mehr Thread-Gruppen. Bei Schritt 410 führen die Anweisungs-Pipeline 324 und die Absetz-Einheit 326 Vor-Ausführungs-Anweisungs-Verarbeitung an den Anweisungen durch und identifizieren eine Zurücksetzen-Bedingung für die Anweisungen. Bei Schritt 415, gerade vor dem Überweisen (committing) einer verarbeiteten Anweisung zur Ausführung, untersucht die Absetz-Einheit 326 die Zurücksetzen-Flagge für die verarbeitete Anweisung, um zu bestimmen, ob eine Zurücksetzen-Bedingung für die verarbeitete Anweisung auftrat. Wenn eine Zurücksetzen-Bedingung nicht auftrat, dann setzt bei Schritt 445 die Absetz-Einheit 326 die verarbeitete Anweisung zur Ausführung mittels einer oder mehrerer exec-Einheiten 302 ab. Anderenfalls signalisiert bei Schritt 425 die Absetz-Einheit 326 der Warp-Planer- und Anweisungs-Einheit 312, ein Ausstellen von Anweisungen für die Thread-Gruppe zu stoppen, welche mit der verarbeiteten Anweisung assoziiert ist, welche mit der gesetzten Zurücksetzen-Flagge assoziiert ist. Die Absetz-Einheit 326 stellt auch der Warp-Planer- und Anweisungs-Einheit 312 den Zurücksetzen-Code bereit, welcher den Typ von Zurücksetzen-Bedingung spezifiziert.
-
Bei Schritt 430 entfernt die Absetz-Einheit 326 verarbeitete Anweisungen für die Thread-Gruppe, welche In-Flug-(in-flight) waren, als die Zurücksetzen-Bedingung detektiert wurde. Die Absetz-Einheit 326 fährt auch fort, verarbeitete Anweisungen für andere Thread-Gruppen abzusetzen, für die eine Zurücksetzen-Bedingung nicht aufgetreten ist, so dass Ausführung von Anweisungen für andere Thread-Gruppen anhält, während die Zurücksetz-Operation vollendet wird. Bei Schritt 435 bestimmt die Warp-Planer- und Anweisungs-Einheit 312, ob die Zurücksetzen-Operation vollendet ist, und Anweisungen, welche zurückgesetzt wurden, können für die Thread-Gruppe erneut ausgestellt werden. Die Zurücksetzen-Operation ist vollendet, wenn die Zurücksetzen-Bedingung entfernt oder korrigiert ist. Alle der In-Flug-Anweisungen für die Thread-Gruppe für das Zurücksetzen müssen nicht entfernt werden, damit die Anweisungen erneut ausgestellt werden. Nachdem die Zurücksetzen-Operation vollendet ist, werden die zurückgesetzten Anweisungen für die Thread-Gruppe von der Warp-Planer- und Anweisungs-Einheit 312 erneut ausgestellt.
-
Einige Zurücksetzen-Bedingungen erfordern nicht eine Zurücksetzen-Operation für alle der Threads in einer Thread-Gruppe.
-
Stattdessen kann eine teilweise Zurücksetzen-Operation durchgeführt werden. Threads in einer Thread-Gruppe, welche kein Zurücksetzen brauchen, werden mittels der Absetz-Einheit 326 ausgewiesen (committed) und mittels der exec-Einheit 302 ausgeführt, während eine (teilweise) Zurücksetzen-Operation für andere Threads in der Thread-Gruppe durchgeführt wird. Die Absetz-Einheit 326 rechnet und speichert eine Zurücksetzen-aktive-Maske für die Thread-Gruppe, was die Threads anzeigt, für welche die teilweise Zurücksetzen-Operation durchgeführt wird. Die Zurücksetzen-aktive-Maske ist mittels der Warp-Planer- und Anweisungs-Einheit 312 ausgegeben, wenn die Anweisungen für die Thread-Gruppe wieder ausgestellt werden. Während für eine Thread-Gruppe ein teilweises Rücksetzen anhängt, werden Falle-Operationen (trap operations) für die Thread-Gruppe nicht erlaubt und die Anweisungen und wieder ausgestellte Anweisungen müssen eine Ausführung vollenden, bevor irgendeine Falle genommen wird.
-
Anweisungen, für welche eine teilweise Zurücksetzen-Operation durchgeführt werden kann, umfassen eine Pixel-Attribut-Interpolations-Anweisung und eine indizierte-konstante-Beladung-Anweisung (indexed constant load instruction). Wenn ein Teil der Threads in einer Thread-Gruppe für diese Anweisungen divergiert, wird ein teilweises Rücksetzen für die divergenten Threads durchgeführt. Wenn die Anweisung, welche zu dem Zurücksetzen führte, wiederum ausgestellt ist, führen nur die divergenten Threads die Anweisungen aus (gemäß der Zurücksetzen-aktive-Maske).
-
4B illustriert ein spekulative-Anweisung-Ausstellung- und teilweises-Anweisung-Zurücksetzen-Verfahren 450 gemäß einer Ausführungsform der vorliegenden Erfindung. Obwohl die Verfahrensschritte im Zusammenhang mit den Systemen von 1, 2, 3A, 3B und 3C beschrieben sind, werden Fachleute in der Technik verstehen, dass irgendein System, welches konfiguriert ist, die Verfahrensschritte durchzuführen, in irgendeiner Ordnung innerhalb des Geltungsbereichs der Erfindungen ist.
-
Bei Schritt 405 stellt die Warp-Planer- und Anweisungs-Einheit 312 zumindest eine Anweisung in jedem Taktzyklus aus, wobei Instruktionen für eine oder mehrere Thread-Gruppen verschachtelt werden. Bei Schritt 410 führen die Anweisungs-Pipeline 324 und die Absetz-Einheit 326 Vor-Ausführungs-Anweisungs-Verarbeitung an den Anweisungen durch und identifizieren irgendwelche Zurücksetzen-Bedingungen für die Anweisungen. Bei Schritt 415, gerade vor dem Ausweisen (committing) einer verarbeiteten Anweisung zur Ausführung, untersucht die Absetz-Einheit 326 die Zurücksetzen-Flagge für die verarbeitete Anweisung, um zu bestimmen, ob eine Zurücksetzen-Bedingung für die verarbeitete Anweisung auftrat. Wenn eine Zurücksetzen-Bedingung nicht auftrat, dann setzt bei Schritt 445 die Absetz-Einheit 326 die verarbeitete Anweisung zur Ausführung mittels einer oder mehrerer exec-Einheiten 302 ab.
-
Anderenfalls bestimmt bei Schritt 420 die Absetz-Einheit 326, ob eine teilweise Zurücksetzen-Operation für die Anweisung durchgeführt werden kann, und wenn nicht, dann signalisiert bei Schritt 425 dir Absetz-Einheit 326 der Warp-Planer- und Anweisungs-Einheit 312, ein Ausstellen von Anweisungen für die Thread-Gruppe zu stoppen, welche mit der verarbeiteten Anweisung assoziiert ist, welche mit der gesetzten Zurücksetzen-Flagge assoziiert ist. Die Absetz-Einheit 326 stellt auch der Warp-Planer- und Anweisungs-Einheit 312 den Zurücksetzen-Code bereit, welcher den Typ von Zurücksetzen-Bedingung spezifiziert.
-
Bei Schritt 430 entfernt die Absetz-Einheit 326 verarbeitete Anweisungen für die Thread-Gruppe, welche In-Flug waren, als die Zurücksetzen-Bedingung detektiert wurde. Die Absetz-Einheit 326 fährt auch fort, verarbeitete Anweisungen für andere Thread-Gruppen abzusetzen, für welche eine Zurücksetzen-Bedingung nicht aufgetreten ist, so dass Ausführung von Anweisungen für andere Thread-Gruppen andauert, während die Zurücksetzen-Operation vollendet wird. Bei Schritt 435 bestimmt die Warp-Planer- und Anweisungs-Einheit 312, ob die Zurücksetze-Operation vollendet ist, und Anweisungen, welche zurückgesetzt wurden, können für die Thread-Gruppe wieder ausgestellt werden.
-
Wenn die Absetz-Einheit 326 bei Schritt 324 bestimmt, dass eine teilweise Zurücksetzen-Operation für die Anweisung durchgeführt werden kann, dann berechnet und speichert bei Schritt 455 die Absetz-Einheit 326 die partielles-Zurücksetzen-aktive-Maske und markiert (flags) die Thread-Gruppe, als eine partielles-Zurücksetzen-Operation durchführend. Bei Schritt 460 setzt die Absetz-Einheit 326 die Anweisung und irgendwelche In-Flug-Anweisungen zur Ausführung mittels der nicht-divergenten Threads in der Thread-Gruppe ab. Bei Schritt 465 aktualisiert die Absetz-Einheit 326 die aktive Maske für die Thread-Gruppe auf die teilweises-Zurücksetzen-aktive-Maske und schreitet zu Schritt 440 fort, um die zurückgesetzten Anweisungen wieder auszustellen. Nachdem die zurückgesetzten Anweisungen bei Schritt 445 ausgeführt sind, löscht die Absetz-Einheit 326 die partielles-Zurücksetzen-Flagge, wodurch eine Ausführung von Falle-Operationen (trap operations) für die Thread-Gruppe ermöglicht wird.
-
Anweisungen für eine oder mehr Thread-Gruppen werden spekulativ ausgestellt für eine Vor-Ausführungs-Verarbeitung und irgendwelche Anweisungen, welche nicht zur Ausführung ausgewiesen werden können (committed), werden verworfen und wieder ausgestellt für eine Thread-Gruppe, nachdem eine Zurücksetzen-Bedingung, welche Ausführung verhinderte, aufgelöst ist. Ein Verwerfen der Anweisungen, welche aufgrund einer Zurücksetzen-Bedingung nicht ausgewiesen werden können, erlaubt anderen Anweisungen für andere Thread-Gruppen, ausgewiesen zu werden und ausgeführt zu werden anstatt angehalten zu werden, während die Zurücksetzen-Bedingung aufgelöst wird. Daher wird ein Anweisungs-Verarbeitungs-Durchsatz für Thread-Gruppen beibehalten, welche nicht einer Zurücksetzen-Bedingung begegnen.
-
Eine Ausführungsform der Erfindung kann als ein Programm-Produkt zur Benutzung mit einer Computer-System implementiert sein. Das Programm oder die Programme des Programm-Produkts definieren Funktionen der Ausführungsformen (einschließlich der hierin beschriebenen Verfahren) und können auf einer Verschiedenheit von Computer-lesbaren Speichermedien beinhaltet sein. Illustrative Computer-lesbare Speichermedien umfassen, sind jedoch nicht darauf beschränkt: (i) nicht-schreibbare Speichermedien, z. B. Nur-Lese-Speicher-Geräte innerhalb eines Computers (wie CD-ROM-Platten, welche mittels eines CD-ROM-Laufwerks lesbar sind, Flash-Speicher, ROM-Chips oder irgendein anderer Typ von Festkörper-nicht-volatilem Halbleiter-Speicher), auf welchen Informationen permanent gespeichert ist; und (ii) schreibbare Speichermedien (z. B. Floppy-Disks innerhalb eines Disketten-Laufwerks oder eines Festplatten-Laufwerks oder irgendein anderer Typ von Festkörper-Halbleiter-Speicher mit willkürlichem Zugriff), auf welchen veränderbare Informationen gespeichert ist.
-
Die Erfindung ist oben mit Bezug auf spezifische Ausführungsformen beschrieben worden. Fachleute in der Technik werden jedoch verstehen, dass verschiedene Modifikationen und Änderungen daran gemacht werden können, ohne von dem weiteren Geist und Geltungsbereich abzuweichen, wie in den angehängten Ansprüchen ausgeführt. Die vorangehende Beschreibung und die Zeichnungen sind demgemäß in einem illustrativen anstatt in einem restriktiven Sinne anzusehen.