如何设计GPU芯片
Chapter 10 Reliability and Fault Tolerance Gpu Design

第10章:GPU设计中的可靠性和容错

随着GPU在自动驾驶汽车、机器人和医疗设备等安全关键型应用中的日益普及,确保其可靠性和容错性变得至关重要。GPU容易受到各种故障和错误的影响,这可能导致系统故障、数据损坏或结果不正确。在本章中,我们将探讨GPU中的故障和错误类型,错误检测和纠正方案,检查点和恢复机制,以及可靠性和弹性设计原则。

GPU中的故障和错误类型

基于故障和错误的起源、持续时间和对系统的影响,可将其分为几类。了解这些不同类型的故障和错误对于制定有效的缓解策略至关重要。

软错误

软错误,也称瞬态故障,是由宇宙射线、α粒子或电磁干扰等外部因素引起的临时性错误。这些错误不会对硬件造成永久性损坏,可通过重写受影响的数据或重新启动受影响的操作来纠正。

软错误可能出现在GPU的各个部分,例如:

  1. 触发器和锁存器:单事件翻转(SEU)可能导致触发器或锁存器的状态发生变化,从而导致数据或控制流不正确。

  2. SRAM单元:SRAM单元(如缓存和寄存器文件中使用的)中的软错误可能会损坏存储的数据。

  3. DRAM单元:尽管比SRAM软错误更少见,但DRAM单元也可能由于外部因素而发生位翻转。

图10.1说明了软错误对触发器的影响。

           宇宙射线
               |
               |
               v
        +------------+
        |            |
D ----->|  触发器    |----> Q
        |            |
        +------------+
               |
               |
               v
```软错误

图 10.1: 由宇宙射线击中触发器而引起的软错误。

硬错误

硬错误,也称为永久性故障,是硬件中持续存在的不可逆转的物理缺陷。这些错误可能由制造缺陷、磨损或设备的物理损坏引起。

GPU 中的硬错误示例包括:

  1. 卡住故障: 信号或存储元件永久地卡在逻辑 '0' 或 '1' 值,与输入无关。

  2. 桥接故障: 两条或多条信号线意外连接,导致短路。

  3. 断开故障: 信号线意外断开,导致浮动或不确定的值。

  4. 延迟故障: 信号在通过某条路径时比预期更长时间,导致时序违规。

图 10.2 展示了逻辑门中的卡住故障示例。

        卡住在 0 的故障
               |
               |
               v
           +---+
        -->| & |-->
           |   |
        -->|   |
           +---+

图 10.2: AND 门中的卡住在 0 的故障。

间歇性错误

间歇性错误是偶发发生且难以持续重现的故障。这些错误可能由以下因素引起:

  1. 边缘硬件: 工作接近其指定极限的组件,更容易受到环境因素或老化的影响。

  2. 环境因素: 温度波动、电压变化或电磁干扰可能触发间歇性错误。

  3. 老化效应: 随着设备老化,某些组件可能更容易出现间歇性故障,由于磨损或退化。

间歇性错误给错误检测和纠正带来了重大挑战,因为它们可能无法被传统的测试或监控技术捕获。

静默数据损坏

静默数据损坏(SDC)指的是在不引起任何警报的情况下损坏数据的错误。以下是该 Markdown 文件的中文翻译。对于代码部分,我只翻译了注释,而没有翻译代码本身。

软件或硬件检测不到的数据错误 (Silent Data Corruption, SDC) 可能导致错误结果或系统故障,并且这种情况可能长时间不被发现。

GPU 中 SDC 的示例包括:

  1. 算术错误: 加法器或乘法器等算术单元中的故障可能产生错误结果,而不会引发任何错误标志。

  2. 内存错误: 内存单元中的软错误或硬故障可能会损坏数据,而不被错误检查机制检测到。

  3. 控制流错误: 控制逻辑或指令解码器中的故障可能导致程序偏离预期执行路径,而不会触发任何异常。

SDC 特别危险,因为它可能在系统中传播并影响最终输出,而没有任何明显的症状。检测和缓解 SDC 需要硬件和软件技术的结合。

错误检测和纠正方案

为了减轻 GPU 中故障和错误的影响,已经开发了各种错误检测和纠正方案。这些方案旨在识别错误的存在,并在某些情况下纠正错误,以确保系统的正确运行。

奇偶校验检查

奇偶校验检查是一种简单的错误检测技术,它在每个数据字中添加一个额外的位(奇偶校验位),使'1'位的总数为偶数(偶校验)或奇数(奇校验)。通过检查数据字的奇偶性,可以检测到单比特错误。

图 10.3 illustrates 偶校验检查的一个示例。

    数据字: 1011010
    奇偶校验位:      1
    传输: 10110101

    接收:   10110111
    奇偶校验位:      0
    检测到错误!

图 10.3: 使用偶校验检查进行错误检测。

奇偶校验检查可以应用于 GPU 中的各种组件,如寄存器、缓存和内存接口。但是,奇偶校验检查只能检测奇数个比特错误,无法纠正错误。

错误纠正码 (ECC)

错误纠正码 (ECC) 是更高级的错误检测和纠正方案不仅可以检测错误,还可以纠正错误。ECC通过向数据字添加冗余位来工作,这允许接收方识别和纠正有限数量的比特错误。

一种常见的ECC方案是单错误纠正,双错误检测(SECDED)编码,它可以纠正单比特错误并检测双比特错误。SECDED编码通常用于内存系统(如DRAM和缓存)中,以防止软错误。

图10.4显示了SECDED编码的一个示例。

    数据字: 1011010
    ECC位:    01101
    传输: 101101001101

    接收:   101101011101
                       ^
                       |
                   比特错误

    纠正:  101101001101

图10.4:用于错误纠正和检测的SECDED编码。

其他ECC方案,如Bose-Chaudhuri-Hocquenghem(BCH)编码和Reed-Solomon编码,可以纠正多比特错误,但代价是更高的冗余度和复杂性。

冗余执行

冗余执行是一种在同一硬件或不同硬件单元上多次执行相同计算,并比较结果以检测错误的技术。如果结果不匹配,则检测到错误,系统可以采取适当的措施,如重试计算或启动恢复过程。

冗余执行可以在GPU的各个层次实现:

  1. 指令级冗余:每条指令都执行多次,结果在提交到寄存器文件或内存之前进行比较。

  2. 线程级冗余:多个线程执行相同的计算,并比较其结果以检测错误。

  3. 内核级冗余:整个内核执行多次,最终输出进行比较以检测错误。

图10.5说明了GPU中的线程级冗余。

    线程0   线程1   线程2   线程3
```以下是该 Markdown 文件的中文翻译版本。对于代码部分,我只翻译了注释,而没有翻译代码本身。

|          |          |          |          |
| -------- | -------- | -------- | -------- |
| v        | v        | v        | v        |
| +-------+| +-------+| +-------+| +-------+|
| | 计算机 || | 计算机 || | 计算机 || | 计算机 ||
| +-------+| +-------+| +-------+| +-------+|
| |        | |        | |        | |        |
| v        | v        | v        | v        |
| +------------+------------+------------+|
| |          比较器                     ||
| +------------+------------+------------+|
|             |
|             v
|        错误检测

图 10.5: 用于错误检测的线程级冗余。

冗余执行可以检测各种错误,包括软错误、硬故障和 SDC。但是,这会增加执行时间和能耗。

### 看门狗定时器

看门狗定时器是硬件或软件机制,用于监控 GPU 的执行情况,并检测系统是否变得无响应或无法在指定时间内完成任务。如果看门狗定时器超时,就表示出现了错误,系统可以启动恢复过程,如重置 GPU 或重新启动受影响的操作。

看门狗定时器可以在 GPU 的不同级别实现:

1. **内核级看门狗**: 监控每个内核的执行时间,并检测内核是否无法在指定时间内完成。

2. **线程级看门狗**: 监控每个线程的执行时间,并检测线程是否无法在指定时间内完成。

### 检查点和恢复机制

检查点和恢复机制用于定期保存 GPU 应用程序的状态,并在发生故障时恢复状态。通过定期保存应用程序的状态,系统可以在不需要从头重新启动整个计算的情况下进行故障恢复。

检查点和恢复机制可以在 GPU 的不同级别实现:

1. **应用程序级检查点**: 应用程序本身负责保存和恢复自己的状态。以下是该 Markdown 文件的中文翻译。对于代码部分,仅翻译注释,不翻译代码。

1. **应用程序级检查点**: 应用程序本身负责定期保存其状态。这可以通过显式地将内存和寄存器的内容保存到检查点文件来实现。

2. **系统级检查点**: GPU 运行时系统或驱动程序负责保存应用程序的状态。这可以透明地完成,而无需修改应用程序代码。

3. **硬件级检查点**: GPU 硬件本身提供保存和恢复应用程序状态的支持。这可以使用专用的硬件机制,如非易失性内存或特殊用途寄存器来实现。

图 10.8 说明了一个典型的检查点和恢复过程。

正常执行 | | v 检查点 | | v 正常执行 | | v 故障 | | v 恢复 | | v 正常执行

图 10.8: 检查点和恢复过程。

在正常执行期间,系统会定期保存应用程序的状态到检查点。如果发生故障,系统会从最近的检查点恢复状态,并从该点继续执行。

检查点和恢复机制可以帮助提高 GPU 应用程序的可靠性和弹性,特别是对于长时间运行的计算。但是,它们也会带来存储空间和执行时间方面的开销,因为保存和恢复状态需要额外的资源。

### 设计可靠性和弹性

设计可靠和弹性的 GPU 需要结合硬件和软件技术。一些关键的设计原则和技术包括:

1. **错误检测和纠正**: 在 GPU 的各个层面,包括内存、缓存和互连,都采用错误检测和纠正机制,如 ECC 和奇偶校验。

2. **冗余**: 使用冗余设计,如多个处理器核心、内存模块和互连,以提高容错能力。以下是该 Markdown 文件的中文翻译。对于代码部分,我只翻译了注释,而没有翻译代码本身。

蚂蚁硬件组件,如备用内核或内存模块,以提供容错能力并在出现故障时实现优雅降级。

3. **检查点和恢复**:实现检查点和恢复机制,以保存应用程序的状态并实现从故障中恢复。

4. **故障隔离**:设计 GPU 架构以限制错误的传播,并防止故障在系统中扩散。这可以通过分区、隔离和错误隔离屏障等技术实现。

5. **软件弹性**:开发软件技术,如基于算法的容错(ABFT),使应用程序能够通过软件级冗余和检查来检测和恢复错误。

6. **面向可靠性的调度**:调整 GPU 中任务和资源的调度,以考虑不同组件的可靠性特性,并优化性能和可靠性。

示例:GPU 中的面向可靠性的调度

考虑一个具有多个内核的 GPU,其中一些内核比其他内核更容易出现错误。面向可靠性的调度器可以将关键任务或具有高可靠性要求的任务分配给更可靠的内核,而将不太关键的任务分配给较不可靠的内核。

图 10.9 说明了一种面向可靠性的调度方法。

任务队列 +-------+ | 任务1 | | 任务2 | | 任务3 | | 任务4 | +-------+ | | v 面向可靠性的调度器 | | v +--------+--------+ | 内核 1 | 内核 2 | | (高可靠性) | (低可靠性) | +--------+--------+ | 任务1 | 任务3 | | 任务2 | 任务4 | +--------+--------+

图 10.9: GPU 中的面向可靠性的调度(高可靠性, 低可靠性)。

在这个例子中,调度器将具有高可靠性要求的任务1和任务2分配给内核1,因为它被认为更可靠。可靠性

## 任务3和任务4具有较低的可靠性要求,被分配给可靠性较低的Core 2。

## 结论

可靠性和容错是GPU设计和操作的关键方面,特别是随着GPU越来越多地用于安全关键型应用。了解GPU中可能发生的故障和错误类型,以及检测、纠正和恢复这些故障的技术,对于设计可靠和有弹性的GPU系统至关重要。

错误检测和纠正方案,如ECC和奇偶校验,在识别和缓解GPU各个组件中的软错误和硬故障方面发挥着关键作用。检查点和恢复机制使系统能够保存应用程序的状态并从故障中恢复,提高系统的整体弹性。

为可靠性和弹性设计GPU需要采取全面的方法,结合硬件和软件技术。冗余、故障隔离、软件弹性和面向可靠性的调度是可用于提高GPU可靠性和容错性的关键技术。

随着GPU不断发展并在自动驾驶、机器人和医疗保健等领域找到新的应用,确保其可靠性和弹性将变得越来越重要。针对错误检测和纠正、检查点和恢复以及面向可靠性的资源管理的新技术将对实现下一代可靠和容错GPU至关重要。