Wie man GPU-Chips entwirft
Chapter 10 Reliability and Fault Tolerance Gpu Design

Kapitel 10: Zuverlässigkeit und Fehlertoleranz im GPU-Design

Da GPUs in sicherheitskritischen Anwendungen wie autonomen Fahrzeugen, Robotik und medizinischen Geräten immer präsenter werden, wird ihre Zuverlässigkeit und Fehlertoleranz immer wichtiger. GPUs sind anfällig für verschiedene Arten von Fehlern und Störungen, die zu Systemausfällen, Datenverlust oder falschen Ergebnissen führen können. In diesem Kapitel werden wir die Arten von Fehlern und Störungen in GPUs, Fehlererkennungs- und Korrekturverfahren, Checkpoint- und Wiederherstellungsmechanismen sowie Gestaltungsprinzipien für Zuverlässigkeit und Resilienz untersuchen.

Arten von Fehlern und Störungen in GPUs

Fehler und Störungen in GPUs können basierend auf ihrer Herkunft, Dauer und Auswirkung auf das System in mehrere Kategorien eingeteilt werden. Das Verständnis dieser verschiedenen Arten von Fehlern und Störungen ist entscheidend für die Entwicklung wirksamer Minderungsstrategien.

Weiche Fehler

Weiche Fehler, auch als transiente Fehler bezeichnet, sind vorübergehende Fehler, die durch externe Faktoren wie kosmische Strahlung, Alphastrahlung oder elektromagnetische Störungen verursacht werden. Diese Fehler führen nicht zu dauerhaften Schäden an der Hardware und können durch Neuschreiben der betroffenen Daten oder Neustart der betroffenen Operation korrigiert werden.

Weiche Fehler können in verschiedenen Teilen der GPU auftreten, wie zum Beispiel:

  1. Flip-Flops und Latches: Ein einzelnes Ereignis kann den Zustand eines Flip-Flops oder einer Latch ändern, was zu falschen Daten oder Kontrollflüssen führen kann.

  2. SRAM-Zellen: Weiche Fehler in SRAM-Zellen, wie sie in Caches und Registerdateien verwendet werden, können die gespeicherten Daten beschädigen.

  3. DRAM-Zellen: Obwohl seltener als SRAM-Weichfehler, können auch DRAM-Zellen aufgrund externer Faktoren Bitfehler aufweisen.

Abbildung 10.1 veranschaulicht die Auswirkungen eines weichen Fehlers auf ein Flip-Flop.

           Kosmische Strahlung
               |
               |
               v
        +------------+
        |            |
D ----->|  Flip-Flop |----> Q
        |            |
        +------------+
               |
               |
               v
```Weicher Fehler

Abbildung 10.1: Weicher Fehler, verursacht durch einen kosmischen Strahl, der ein Flipflop trifft.

Harte Fehler

Harte Fehler, auch als permanente Fehler bekannt, sind irreversible physische Defekte in der Hardware, die über die Zeit hinweg bestehen bleiben. Diese Fehler können durch Fertigungsfehler, Verschleiß oder physische Schäden am Gerät verursacht werden.

Beispiele für harte Fehler in GPUs sind:

  1. Stuck-at-Fehler: Ein Signal oder ein Speicherelement ist dauerhaft auf den logischen Wert '0' oder '1' festgelegt, unabhängig vom Eingang.

  2. Brückenfehler: Zwei oder mehr Signalleitungen sind versehentlich miteinander verbunden, was zu einem Kurzschluss führt.

  3. Offene Fehler: Eine Signalleitung ist versehentlich getrennt, was zu einem schwebenden oder unbestimmten Wert führt.

  4. Verzögerungsfehler: Ein Signal benötigt länger als erwartet, um einen Pfad zu durchlaufen, was zu Zeitverletzungen führt.

Abbildung 10.2 zeigt ein Beispiel für einen Stuck-at-0-Fehler in einem Logikgatter.

        Stuck-at-0-Fehler
               |
               |
               v
           +---+
        -->| & |-->
           |   |
        -->|   |
           +---+

Abbildung 10.2: Stuck-at-0-Fehler in einem UND-Gatter.

Intermittierende Fehler

Intermittierende Fehler sind Fehler, die sporadisch auftreten und nur schwer konsistent reproduzierbar sind. Diese Fehler können durch verschiedene Faktoren verursacht werden, wie:

  1. Marginale Hardware: Komponenten, die nahe an ihren spezifizierten Grenzen arbeiten, sind anfälliger für Umgebungsfaktoren oder Alterung.

  2. Umgebungsfaktoren: Temperaturschwankungen, Spannungsschwankungen oder elektromagnetische Störungen können intermittierende Fehler auslösen.

  3. Alterungseffekte: Mit zunehmendem Alter des Geräts können bestimmte Komponenten anfälliger für intermittierende Ausfälle aufgrund von Verschleiß oder Degradation werden.

Intermittierende Fehler stellen eine erhebliche Herausforderung für die Fehlererkennung und -korrektur dar, da sie möglicherweise nicht von herkömmlichen Test- oder Überwachungstechniken erfasst werden.

Stille Datenverfälschung

Stille Datenverfälschung (Silent Data Corruption, SDC) bezeichnet Fehler, die Daten verfälschen, ohneHier ist die deutsche Übersetzung der Markdown-Datei. Für den Code wurden nur die Kommentare übersetzt, der Code selbst wurde nicht übersetzt.

Stille Datenfehler (SDC) können von der Hardware oder Software nicht erkannt werden. SDC kann zu falschen Ergebnissen oder Systemausfällen führen, die über einen längeren Zeitraum unbemerkt bleiben können.

Beispiele für SDC in GPUs umfassen:

  1. Arithmetische Fehler: Fehler in arithmetischen Einheiten wie Addierern oder Multiplizierer können falsche Ergebnisse liefern, ohne Fehlermeldungen auszulösen.

  2. Speicherfehler: Weiche Fehler oder harte Defekte in Speicherzellen können Daten beschädigen, ohne von Fehlerkorrektursystemen erkannt zu werden.

  3. Kontrollfluss-Fehler: Fehler in der Kontrolllogik oder Befehlsdecodern können dazu führen, dass das Programm vom beabsichtigten Ausführungspfad abweicht, ohne Ausnahmen auszulösen.

SDC ist besonders gefährlich, da sich Fehler durch das System ausbreiten und die Endausgabe beeinflussen können, ohne sichtbare Symptome zu zeigen. Die Erkennung und Minderung von SDC erfordert eine Kombination aus Hardware- und Softwaretechniken.

Fehlererkennungs- und Korrekturverfahren

Um die Auswirkungen von Fehlern und Störungen in GPUs zu mindern, wurden verschiedene Fehlererkennungs- und Korrekturverfahren entwickelt. Diese Verfahren zielen darauf ab, das Vorhandensein von Fehlern zu erkennen und in einigen Fällen zu korrigieren, um den korrekten Betrieb des Systems sicherzustellen.

Paritätsprüfung

Die Paritätsprüfung ist eine einfache Fehlerkennungstechnik, bei der ein zusätzliches Bit (das Paritätsbit) zu jedem Datenwort hinzugefügt wird, um die Gesamtzahl der '1'-Bits entweder gerade (gerade Parität) oder ungerade (ungerade Parität) zu machen. Durch Prüfung der Parität des Datenwortes können Einzelbitfehler erkannt werden.

Abbildung 10.3 zeigt ein Beispiel für die Erkennung von Fehlern mit gerader Parität.

    Datenwort: 1011010
    Paritätsbit:      1
    Übertragen: 10110101

    Empfangen:  10110111
    Paritätsbit:      0
    Fehler erkannt!

Abbildung 10.3: Fehlererkennung mit gerader Parität.

Die Paritätsprüfung kann auf verschiedene Komponenten in der GPU, wie Register, Caches und Speicherinterfaces, angewendet werden. Die Paritätsprüfung kann jedoch nur ungerade Anzahlen von Bitfehlern erkennen und kann die Fehler nicht korrigieren.

Fehlerkorrigierende Codes (ECC)

Fehlerkorrigierende Codes (ECC) sind ...Hier ist die deutsche Übersetzung der Datei:

Fortgeschrittenere Fehlererkennungs- und Korrekturverfahren, die nicht nur Fehler erkennen, sondern auch korrigieren können. ECC funktioniert, indem redundante Bits zum Datenwort hinzugefügt werden, was dem Empfänger ermöglicht, eine begrenzte Anzahl von Bitfehlern zu identifizieren und zu korrigieren.

Ein gängiges ECC-Schema ist der Single Error Correction, Double Error Detection (SECDED)-Code, der Einzelbitfehler korrigieren und Doppelbitfehler erkennen kann. SECDED-Codes werden oft in Speichersystemen wie DRAM und Caches verwendet, um gegen Soft-Fehler geschützt zu sein.

Abbildung 10.4 zeigt ein Beispiel für einen SECDED-Code.

    Datenwort: 1011010
    ECC-Bits:    01101
    Übertragen: 101101001101

    Empfangen:   101101011101
                       ^
                       |
                   Bitfehler

    Korrigiert:  101101001101

Abbildung 10.4: SECDED-Code zur Fehlererkennung und -korrektur.

Andere ECC-Schemata wie Bose-Chaudhuri-Hocquenghem (BCH)-Codes und Reed-Solomon-Codes können mehrere Bitfehler korrigieren, was jedoch mit höherer Redundanz und Komplexität einhergeht.

Redundante Ausführung

Redundante Ausführung ist eine Technik, bei der die gleiche Berechnung mehrmals, entweder auf der gleichen Hardware oder auf verschiedenen Hardwareeinheiten, durchgeführt und die Ergebnisse verglichen werden, um Fehler zu erkennen. Wenn die Ergebnisse nicht übereinstimmen, wird ein Fehler erkannt, und das System kann geeignete Maßnahmen ergreifen, wie z.B. einen erneuten Versuch der Berechnung oder einen Wiederherstellungsprozess einleiten.

Redundante Ausführung kann auf verschiedenen Ebenen in der GPU implementiert werden:

  1. Instruktionsebene-Redundanz: Jede Anweisung wird mehrmals ausgeführt, und die Ergebnisse werden verglichen, bevor sie in das Registerdatei oder den Speicher geschrieben werden.

  2. Thread-Ebene-Redundanz: Mehrere Threads führen die gleiche Berechnung durch, und ihre Ergebnisse werden verglichen, um Fehler zu erkennen.

  3. Kernel-Ebene-Redundanz: Der gesamte Kernel wird mehrmals ausgeführt, und die endgültigen Ausgaben werden verglichen, um Fehler zu erkennen.

Abbildung 10.5 veranschaulicht die Thread-Ebene-Redundanz in einer GPU.

    Thread 0   Thread 1   Thread 2   Thread 3
```Hier ist die deutsche Übersetzung der Markdown-Datei. Für den Code wurden die Kommentare übersetzt, der Code selbst blieb unverändert.

|          |          |          |          |
| -------- | -------- | -------- | -------- |
| +-------+| +-------+| +-------+| +-------+|
| | Comp. || | Comp. || | Comp. || | Comp. ||
| +-------+| +-------+| +-------+| +-------+|
|          |          |          |          |
|          |          |          |          |
| +------------+------------+------------+|
| |          Comparator                 ||
| +------------+------------+------------+|
|                          |
|                          |
|                     Fehlererfassung    |

Abbildung 10.5: Thread-basierte Redundanz zur Fehlererfassung.

Redundante Ausführung kann eine Vielzahl von Fehlern erkennen, einschließlich weicher Fehler, harter Defekte und SDC. Dies geht jedoch mit erhöhter Ausführungszeit und Energieverbrauch einher.

### Watchdog-Timer

Watchdog-Timer sind Hardware- oder Softwaremechanismen, die die Ausführung der GPU überwachen und erkennen, wenn das System nicht mehr reagiert oder eine Aufgabe innerhalb eines bestimmten Zeitlimits nicht abschließt. Wenn der Watchdog-Timer abläuft, deutet dies auf einen Fehler hin, und das System kann einen Wiederherstellungsprozess einleiten, wie z.B. das Zurücksetzen der GPU oder den Neustart der betroffenen Operation.

Watchdog-Timer können auf verschiedenen Ebenen in der GPU implementiert werden:

1. **Kernel-Watchdog**: Überwacht die Ausführungszeit jedes Kernels und erkennt, wenn ein Kernel die Ausführung innerhalb eines bestimmten Zeitlimits nicht abschließt.

2. **Thread-Watchdog**: Überwacht die Ausführungszeit jedes Threads und erkennt, wenn ein Thread die Ausführung innerhalb eines bestimmten Zeitlimits nicht abschließt.

### Checkpoint- und Wiederherstellungsmechanismen

Checkpoint- und Wiederherstellungsmechanismen werden verwendet, um den Zustand einer GPU-Anwendung in regelmäßigen Abständen zu speichern und den Zustand im Falle eines Ausfalls wiederherzustellen. Durch das regelmäßige Speichern des Anwendungszustands kann das System Ausfälle ohne einen Neustart der gesamten Berechnung von Anfang an bewältigen.

Checkpoint- und Wiederherstellungsmechanismen können auf verschiedenen Ebenen in der GPU implementiert werden:

1. **Anwendungs-Checkpointing**: Die Anwendung selbst ist verantwortlich für das Speichern und Wiederherstellen ihres Zustands.Hier ist die deutsche Übersetzung der Markdown-Datei. Für den Code wurden nur die Kommentare übersetzt, der Code selbst wurde nicht übersetzt.

1. **Anwendungsebenen-Checkpointing**: Die Anwendung selbst ist verantwortlich für das regelmäßige Speichern ihres Zustands. Dies kann durch explizites Speichern des Speicherinhalts und der Register in einer Checkpoint-Datei erfolgen.

2. **Systemebenen-Checkpointing**: Das GPU-Laufzeitsystem oder der Treiber ist für das Speichern des Anwendungszustands verantwortlich. Dies kann für die Anwendung transparent erfolgen, ohne dass Änderungen am Anwendungscode erforderlich sind.

3. **Hardwareebenen-Checkpointing**: Die GPU-Hardware selbst bietet Unterstützung zum Speichern und Wiederherstellen des Anwendungszustands. Dies kann mithilfe dedizierter Hardwaremechanismen wie nichtflüchtigem Speicher oder speziellen Registern erfolgen.

Abbildung 10.8 veranschaulicht einen typischen Checkpoint- und Wiederherstellungsprozess.

Normale Ausführung | | v Checkpoint | | v Normale Ausführung | | v Fehler | | v Wiederherstellung | | v Normale Ausführung

Abbildung 10.8: Checkpoint- und Wiederherstellungsprozess.

Während der normalen Ausführung speichert das System den Zustand der Anwendung regelmäßig in einem Checkpoint. Bei einem Fehler stellt das System den Zustand aus dem letzten Checkpoint wieder her und setzt die Ausführung von dort aus fort.

Checkpoint- und Wiederherstellungsmechanismen können die Zuverlässigkeit und Resilienz von GPU-Anwendungen, insbesondere bei langfristigen Berechnungen, verbessern. Sie führen jedoch auch zu Overhead in Bezug auf Speicherplatz und Ausführungszeit, da das Speichern und Wiederherstellen des Zustands zusätzliche Ressourcen erfordert.

### Entwicklung für Zuverlässigkeit und Resilienz

Die Entwicklung von GPUs für Zuverlässigkeit und Resilienz erfordert eine Kombination aus Hardware- und Softwaretechniken. Einige wichtige Gestaltungsprinzipien und -techniken sind:

1. **Fehlererkennung und -korrektur**: Einbindung von Mechanismen zur Fehlererkennung und -korrektur wie ECC und Paritätsprüfung auf verschiedenen Ebenen der GPU, einschließlich Speicher, Caches und Interconnects.

2. **Redundanz**: Verwendung von redundanten Komponenten, um Ausfälle zu tolerieren.Hier ist die deutsche Übersetzung der Markdown-Datei. Für den Code wurden nur die Kommentare übersetzt, der Code selbst blieb unverändert.

Ant-Hardware-Komponenten wie Ersatzkerne oder Speichermodule bereitstellen, um Fehlertoleranz zu bieten und einen sanften Leistungsabbau bei Ausfällen zu ermöglichen.

3. **Checkpunkt und Wiederherstellung**: Implementierung von Checkpunkt- und Wiederherstellungsmechanismen, um den Zustand der Anwendung zu speichern und eine Wiederherstellung nach Ausfällen zu ermöglichen.

4. **Fehlereingrenzung**: Gestaltung der GPU-Architektur, um die Ausbreitung von Fehlern zu begrenzen und zu verhindern, dass Fehler sich über das gesamte System ausbreiten. Dies kann durch Techniken wie Partitionierung, Isolation und Fehlereingrenzungsbarrieren erreicht werden.

5. **Software-Resilienz**: Entwicklung von Softwaretechniken wie algorithmusbasierter Fehlertoleranz (ABFT), die es Anwendungen ermöglichen, Fehler durch softwarebasierte Redundanz und Prüfungen zu erkennen und zu beheben.

6. **Zuverlässigkeitsbasierte Planung**: Anpassung der Aufgaben- und Ressourcenplanung in der GPU, um die Zuverlässigkeitsmerkmale verschiedener Komponenten zu berücksichtigen und sowohl Leistung als auch Zuverlässigkeit zu optimieren.

Beispiel: Zuverlässigkeitsbasierte Planung in einer GPU

Betrachten Sie eine GPU mit mehreren Kernen, von denen einige anfälliger für Fehler sind als andere. Ein zuverlässigkeitsbasierter Planer kann kritische Aufgaben oder Aufgaben mit hohen Zuverlässigkeitsanforderungen den zuverlässigeren Kernen zuweisen, während weniger kritische Aufgaben den weniger zuverlässigen Kernen zugewiesen werden.

Abbildung 10.9 veranschaulicht einen zuverlässigkeitsbasierten Planungsansatz.

Aufgabenwarteschlange +-------+ | Aufg1 | | Aufg2 | | Aufg3 | | Aufg4 | +-------+ | | v Zuverlässigkeitsbasierter Planer | | v +--------+--------+ | Kern 1 | Kern 2 | | (HR) | (LR) | +--------+--------+ | Aufg1 | Aufg3 | | Aufg2 | Aufg4 | +--------+--------+

Abbildung 10.9: Zuverlässigkeitsbasierte Planung in einer GPU (HR: Hohe Zuverlässigkeit, LR: Niedrige Zuverlässigkeit).

In diesem Beispiel weist der Planer Aufg1 und Aufg2, die hohe Zuverlässigkeitsanforderungen haben, Kern 1 zu, der als zuverlässiger bekannt ist.Hier ist die deutsche Übersetzung der Markdown-Datei. Für den Code wurden nur die Kommentare übersetzt, der Code selbst blieb unverändert.

## Schlussfolgerung

Zuverlässigkeit und Fehlertoleranz sind entscheidende Aspekte des GPU-Designs und -Betriebs, insbesondere da GPUs zunehmend in sicherheitskritischen Anwendungen eingesetzt werden. Das Verständnis der Arten von Fehlern und Störungen, die in GPUs auftreten können, sowie der Techniken zur Erkennung, Korrektur und Wiederherstellung von diesen Fehlern, ist für das Entwerfen zuverlässiger und belastbarer GPU-Systeme unerlässlich.

Fehlererkennungs- und Korrekturverfahren wie ECC und Paritätsprüfung spielen eine entscheidende Rolle bei der Identifizierung und Abschwächung von Soft-Fehlern und Hardwaredefekten in verschiedenen Komponenten der GPU. Checkpoint- und Wiederherstellungsmechanismen ermöglichen es dem System, den Zustand der Anwendung zu speichern und von Ausfällen zu erholen, was die Gesamtbelastbarkeit des Systems verbessert.

Das Entwerfen von GPUs für Zuverlässigkeit und Belastbarkeit erfordert einen ganzheitlichen Ansatz, der Hardware- und Softwaretechniken kombiniert. Redundanz, Fehlereingrenzung, Softwarebelastbarkeit und zuverlässigkeitsorientierte Planung sind einige der Schlüsseltechniken, die eingesetzt werden können, um die Zuverlässigkeit und Fehlertoleranz von GPUs zu verbessern.

Da sich GPUs weiterentwickeln und neue Anwendungen in Bereichen wie autonome Fahrzeuge, Robotik und Gesundheitswesen finden, wird die Sicherstellung ihrer Zuverlässigkeit und Belastbarkeit immer wichtiger. Neuartige Techniken zur Fehlererkennung und -korrektur, Checkpoint und Wiederherstellung sowie zuverlässigkeitsorientiertes Ressourcenmanagement werden für die Ermöglichung der nächsten Generation zuverlässiger und fehlertoleranter GPUs unerlässlich sein.