第10章: GPU设计中的可靠性和容错
随着GPU在自动驾驶汽车、机器人和医疗设备等安全关键应用中的日益普及,确保其可靠性和容错性变得至关重要。GPU容易受到各种故障和错误的影响,这可能导致系统故障、数据损坏或结果不正确。在本章中,我们将探讨GPU中的故障和错误类型、错误检测和纠正方案、检查点和恢复机制,以及可靠性和弹性设计原则。
GPU中的故障和错误类型
基于故障和错误的起源、持续时间和对系统的影响,可将其分为几类。了解这些不同类型的故障和错误对于制定有效的缓解策略至关重要。
软错误
软错误,也称为瞬时故障,是由宇宙射线、α粒子或电磁干扰等外部因素引起的临时性错误。这些错误不会对硬件造成永久性损坏,可通过重写受影响的数据或重新启动受影响的操作来纠正。
软错误可能出现在GPU的各个部分,如:
-
触发器和锁存器: 单事件翻转(SEU)可能导致触发器或锁存器的状态发生变化,从而导致数据或控制流不正确。
-
SRAM单元: SRAM单元(如缓存和寄存器文件中使用的)中的软错误可能会损坏存储的数据。
-
DRAM单元: 尽管比SRAM软错误更少见,但DRAM单元也可能由于外部因素而发生位翻转。
图10.1 illustrates the impact of a soft error on a flip-flop.
宇宙射线
|
|
v
+------------+
| |
D ----->| 触发器 |----> Q
| |
+------------+
|
|
v
```ソフトエラー
図10.1: コズミック線がフリップフロップに当たることによって引き起こされるソフトエラー。
ハードエラー
ハードエラー、または永続的な故障は、ハードウェアの不可逆的な物理的欠陥で、時間の経過とともに持続します。これらのエラーは、製造上の欠陥、経年劣化、または物理的な損傷が原因となる可能性があります。
GPUにおけるハードエラーの例には以下のようなものがあります:
-
固定故障: シグナルや記憶素子が、入力に関わらず論理的に'0'または'1'の値に固定されている。
-
ブリッジング故障: 2つ以上のシグナル線が偶発的に接続され、ショートが発生する。
-
オープン故障: シグナル線が偶発的に切断され、フロートまたは不確定な値になる。
-
遅延故障: シグナルが予想より長い時間でパスを伝播し、タイミング違反を引き起こす。
図10..2は論理ゲートにおける固定故障の例を示しています。
固定故障(0)
|
|
v
+---+
-->| & |-->
| |
-->| |
+---+
図10.2: AND ゲートにおける固定故障(0)。
間欠的エラー
間欠的エラーは、不規則に発生し、一貫して再現することが困難な故障です。これらのエラーは様々な要因によって引き起こされる可能性があります:
-
限界ハードウェア: 仕様限界付近で動作するコンポーネントは、環境要因や経年劣化の影響を受けやすい。
-
環境要因: 温度変動、電圧変動、電磁干渉などが間欠的エラーの引き金となる。
-
経年劣化: デバイスの経年劣化に伴い、特定のコンポーネントが間欠的故障に陥りやすくなる。
間欠的エラーは、従来の試験や監視技術では捕捉できないため、エラー検出と訂正に大きな課題をもたらします。
潜在的データ破損
潜在的データ破損(SDC)とは、データが破損しているにもかかわらず検知されない以下は、提供されたマークダウンファイルの日本語翻訳です。コードについては、コメントのみ翻訳しています。
ハードウェアまたはソフトウェアによる検出が困難な場合があります。SDCは、長期にわたって気づかれずに、不正確な結果やシステム障害を引き起こす可能性があります。
GPUにおけるSDCの例は以下のとおりです:
-
算術エラー: アドダーやマルチプライヤーなどの算術ユニットの故障により、エラーフラグを発生させずに誤った結果が生成される可能性があります。
-
メモリエラー: メモリセルのソフトエラーまたはハードフォルトにより、エラー検査メカニズムによって検出されずにデータが破損する可能性があります。
-
制御フローエラー: 制御ロジックや命令デコーダの故障により、例外を引き起こすことなく、プログラムが意図した実行パスから逸脱する可能性があります。
SDCは特に危険です。システムを通じて伝播し、目に見える症状なしに最終的な出力に影響を及ぼす可能性があるためです。SDCの検出と軽減には、ハードウェアとソフトウェアの両方の手法が必要です。
エラー検出および訂正スキーム
GPUのフォルトおよびエラーの影響を軽減するために、さまざまなエラー検出および訂正スキームが開発されています。これらのスキームは、エラーの存在を特定し、場合によってはそれを修正して、システムの正常な動作を確保することを目的としています。
パリティチェック
パリティチェックは、データワードに余分なビット(パリティビット)を追加して、'1'ビットの合計数が偶数(偶数パリティ)または奇数(奇数パリティ)になるようにする、単純なエラー検出手法です。データワードのパリティをチェックすることで、単一ビットエラーを検出できます。
図10.3は、偶数パリティチェックの例を示しています。
データワード: 1011010
パリティビット: 1
送信: 10110101
受信: 10110111
パリティビット: 0
エラー検出!
図10.3: エラー検出のための偶数パリティチェック
パリティチェックは、レジスタ、キャッシュ、メモリインターフェースなど、GPUのさまざまなコンポーネントに適用できます。ただし、パリティチェックは奇数個のビットエラーしか検出できず、エラーを訂正することはできません。
誤り訂正符号(ECC)
誤り訂正符号(ECC)は、以下は、提供されたマークダウンファイルの日本語翻訳です。コードの部分は翻訳せず、コメントのみ翻訳しています。
検出と修正のより高度なスキームを提供し、エラーを検出するだけでなく修正することもできます。ECCは、データワードに冗長ビットを追加することで機能し、受信側がビットエラーを特定し修正することを可能にします。
一般的なECCスキームの1つは、Single Error Correction, Double Error Detection (SECDED)コードで、単一ビットエラーを修正し、ダブルビットエラーを検出することができます。SECDEDコードは、ソフトエラーから保護するために、DRAMやキャッシュなどのメモリシステムでよく使用されています。
図10.4は、SECDEDコードの例を示しています。
データワード: 1011010
ECCビット: 01101
送信: 101101001101
受信: 101101011101
^
|
ビットエラー
修正: 101101001101
図10.4: エラー修正と検出のためのSECDEDコード
BCHコードやリード・ソロモンコードなどの他のECCスキームは、より高い冗長性と複雑性の代償で、複数ビットエラーを修正することができます。
冗長実行
冗長実行は、同じ計算を複数回実行し、結果を比較してエラーを検出する手法です。結果が一致しない場合、エラーが検出され、計算の再試行やリカバリプロセスの開始などの適切な対応を取ることができます。
冗長実行は、GPUの様々なレベルで実装できます:
-
命令レベルの冗長性: 各命令が複数回実行され、レジスタファイルやメモリにコミットする前に結果が比較されます。
-
スレッドレベルの冗長性: 複数のスレッドが同じ計算を実行し、結果を比較してエラーを検出します。
-
カーネルレベルの冗長性: 全体のカーネルが複数回実行され、最終的な出力が比較されてエラーを検出します。
図10.5は、GPUにおけるスレッドレベルの冗長性を示しています。
スレッド0 スレッド1 スレッド2 スレッド3
```以下は、提供されたマークダウンファイルの日本語翻訳です。コードについては、コメントのみ翻訳しています。
| | | | |
|----------|----------|----------|----------|
| コンピュータ | コンピュータ | コンピュータ | コンピュータ |
+-------+ +-------+ +-------+ +-------+
| | | | | | | |
| v | v | v | v
+------------+------------+------------+
| 比較器 |
+------------+------------+------------+
| |
| v
| エラー検出
図10.5: エラー検出のためのスレッドレベルの冗長性
冗長実行は、ソフトエラー、ハードフォルト、SDCを含む幅広いエラーを検出できますが、実行時間とエネルギー消費が増加するコストがかかります。
ウォッチドッグタイマー
ウォッチドッグタイマーは、GPUの実行を監視し、システムが応答しなくなったり、指定された時間内にタスクを完了できない場合にエラーを検出するためのハードウェアまたはソフトウェアメカニズムです。ウォッチドッグタイマーが期限切れになると、エラーが示され、GPUのリセットや影響を受けた操作の再起動などの回復プロセスが開始されます。
ウォッチドッグタイマーは、GPUの様々なレベルで実装できます:
-
カーネルレベルのウォッチドッグ: 各カーネルの実行時間を監視し、指定された時間内に完了しない場合を検出します。
-
スレッドレベルのウォッチドッグ: 各スレッドの実行時間を監視し、指定された時間内に完了しない場合を検出します。
チェックポイントと回復メカニズム
チェックポイントと回復メカニズムは、GPUアプリケーションの状態を定期的に保存し、障害発生時にその状態を復元するために使用されます。アプリケーションの状態を定期的に保存することで、最初から計算を再開する必要なく、障害から回復できます。
チェックポイントと回復メカニズムは、GPUの様々なレベルで実装できます:
-
アプリケーションレベルのチェックポイント: アプリケーション自体が状態の保存と復元を担当します。以下は、提供されたマークダウンファイルの日本語翻訳です。コードについては、コメントのみ翻訳しています。
-
アプリケーション主導のチェックポイント: アプリケーション自体がメモリやレジスタの状態を定期的に保存することで、状態を復元できるようにします。これは、メモリの内容やレジスタの状態をチェックポイントファイルに明示的に保存することで行えます。
-
システムレベルのチェックポイント: GPUランタイムシステムやドライバーがアプリケーションの状態を保存します。これはアプリケーションコードを変更することなく、透過的に行うことができます。
-
ハードウェアレベルのチェックポイント: GPUハードウェア自体がアプリケーションの状態を保存および復元する機能を提供します。不揮発性メモリや特殊な目的のレジスタなどのハードウェアメカニズムを使って行うことができます。
図10.8は、典型的なチェックポイントおよび復元プロセスを示しています。
通常の実行
|
|
v
チェックポイント
|
|
v
通常の実行
|
|
v
障害
|
|
v
復元
|
|
v
通常の実行
図10.8: チェックポイントおよび復元プロセス
通常の実行中、システムはアプリケーションの状態を定期的にチェックポイントに保存します。障害が発生した場合、システムは最新のチェックポイントから状態を復元し、その時点から実行を再開します。
チェックポイントおよび復元メカニズムは、特に長時間の計算に対して、GPUアプリケーションの信頼性と耐障害性を向上させることができます。ただし、状態の保存と復元には、ストレージ容量と実行時間の面でオーバーヘッドが発生するという課題もあります。
信頼性と耐障害性のためのデザイン
GPUの信頼性と耐障害性を実現するには、ハードウェアとソフトウェアの両面からアプローチする必要があります。主な設計原則と手法には以下のようなものがあります:
-
エラー検出と訂正: メモリ、キャッシュ、インターコネクトなど、GPUのさまざまなレベルでECCやパリティチェックなどのエラー検出および訂正メカニズムを組み込む。
-
冗長性: アントのハードウェアコンポーネント、例えばスペアコアやメモリモジュールなどを使用して、障害に対する耐性を提供し、障害が発生した場合でも優雅な劣化を可能にする。
-
チェックポイントと復旧: アプリケーションの状態を保存し、障害からの復旧を可能にするためのチェックポイントと復旧メカニズムの実装。
-
障害の封じ込め: エラーの伝播を制限し、障害がシステム全体に広がるのを防ぐためのGPUアーキテクチャの設計。これには、パーティショニング、分離、エラー封じ込め障壁などの手法が使用される。
-
ソフトウェアの耐性: アルゴリズムベースの耐障害性(ABFT)などのソフトウェアレベルの冗長性とチェックを通じて、エラーの検出と復旧を可能にするソフトウェア手法の開発。
-
信頼性を考慮したスケジューリング: 異なるコンポーネントの信頼性特性を考慮し、パフォーマンスと信頼性の両方を最適化するためのGPUにおけるタスクとリソースのスケジューリング。
例: GPUにおける信頼性を考慮したスケジューリング
複数のコアを持つGPUを考えると、一部のコアはエラーに more prone であることが知られている。信頼性を考慮したスケジューラは、重要なタスクや高い信頼性要件を持つタスクを、より信頼性の高いコアに割り当て、一方で、あまり重要でないタスクを信頼性の低いコアに割り当てることができる。
図10.9は、信頼性を考慮したスケジューリングアプローチを示している。
タスクキュー
+-------+
| タスク1 |
| タスク2 |
| タスク3 |
| タスク4 |
+-------+
|
|
v
信頼性を考慮したスケジューラ
|
|
v
+--------+--------+
| コア 1 | コア 2 |
| (高信頼性) | (低信頼性) |
+--------+--------+
| タスク1 | タスク3 |
| タスク2 | タスク4 |
+--------+--------+
図10.9: GPUにおける信頼性を考慮したスケジューリング (高信頼性、低信頼性)
この例では、スケジューラはタスク1とタスク2(高い信頼性要件を持つ)をコア1(より信頼性が高い)に割り当て、一方でタスク3とタスク4をコア2(より信頼性が低い)に割り当てている。信頼性の高い。Task3とTask4は、信頼性要件が低いため、より信頼性の低いCore 2に割り当てられています。
結論
信頼性と耐障害性は、GPUの設計と運用における重要な側面です。特に、GPUが安全性の高い用途に使用されるようになるにつれて、重要性が高まっています。GPUで発生する可能性のある障害やエラーの種類を理解し、それらの障害を検出、修正、回復する手法を理解することは、信頼性の高い耐障害性のあるGPUシステムを設計するために不可欠です。
ECCやパリティチェックなどのエラー検出・修正方式は、GPUの各コンポーネントにおけるソフトエラーやハードフォールトを特定し、軽減する上で重要な役割を果たします。チェックポイントと回復メカニズムにより、アプリケーションの状態を保存し、障害から回復することができ、システム全体の耐障害性が向上します。
信頼性と耐障害性を備えたGPUを設計するには、ハードウェアとソフトウェアの両面からアプローチする必要があります。冗長性、障害の封じ込め、ソフトウェアの耐障害性、信頼性を考慮したスケジューリングなどの主要な手法を活用することで、GPUの信頼性と耐障害性を向上させることができます。
GPUが自動運転、ロボティクス、ヘルスケアなどの新しい分野で活用されるにつれ、その信頼性と耐障害性を確保することがますます重要になってきます。次世代の信頼性の高い耐障害性のあるGPUを実現するためには、エラー検出・修正、チェックポイントと回復、信頼性を考慮したリソース管理などの新しい手法が不可欠となります。