GPUハードウェアエラーをシミュレートする方法は?

GPUハードウェアエラーをシミュレートする方法は?

私はNVIDIAグラフィックスカードのGPGPU復元力に関する研究を行っており、ハードウェアエラーをできるだけ正確にシミュレートする方法を探しています。私は意図的に失敗するカーネルでcudaDeviceReset()とassert()を使用することを理解しています。私が間違っている場合は修正してください。しかし、これは現実的なハードウェア障害を正確に説明するものではありません。

最終的に私が達成したいのは、実行中にデバイスを効果的にシャットダウンし、ホストにそれを検出して回復しようとすることです。

Linuxカーネルを介して「GPUを再起動する」方法があるかどうか疑問に思います。

CentOS 7を使用しており、私のデバイスのコンピューティングパフォーマンスは2.1です。以下の uname -a 出力を参照してください。

Linux heisenbug 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

ベストアンサー1

デバイスのPCIバスレジスタの一部をかなり簡単に操作できます。PCI設定。注:これは危険であり、システムがハングアップする可能性があります!

たとえば、グラフィックカードのPCIバスとスロットを見つけます。

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)

$ lspci -s 00:02.0 -v
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) (prog-if 00 [VGA controller])
        DeviceName:  Onboard IGD
        Subsystem: Holco Enterprise Co, Ltd/Shuttle Computer Device 4018
        Flags: bus master, fast devsel, latency 0, IRQ 29
        Memory at f7400000 (64-bit, non-prefetchable) [size=4M]
        Memory at e0000000 (64-bit, prefetchable) [size=256M]
        I/O ports at f000 [size=64]
        Expansion ROM at <unassigned> [disabled]
        Capabilities: <access denied>
        Kernel driver in use: i915
        Kernel modules: i915

を使用してレジスタを読み書きできますsetpci。一部のレジスタを読み込んでそのうちの1つに書き込むには、ルートである必要があります。レジスタ名はでリストされていますsetpci --dumpregs。たとえば、

$ setpci -s 00:02.0 command   
0407

16ビットPCI構成commandレジスタは重要なレジスタです。このビットの意味は、以下で決定できます。Linuxヘッダファイル。下位3ビットは1で、デバイスがCPUのIOおよびメモリサイクルに応答してバスマスタになり、CPUのメインメモリにDMAできるようにします。

このビットをディセーブルすると、デバイスはドライバに応答しなくなります。 〜を警戒する、これによりシステムがクラッシュする可能性があります。。これを軽くテストしないでください。

$ sudo setpci -s 00:02.0 command=0000 # DONT DO THIS!

レジスタを0に設定し、グラフが描画されるまで数秒待ってから、レジスタを元の設定(command = 0407)に戻すスクリプトを作成できます。すべての数字は16進数です(0xプレフィックスなし)。コメントで述べたように、名前付きレジスタcommandの幅(たとえばsetpci、.レジスタ名のサフィックス.b(8ビット)、.w(16)、または(32)を介して.l明示的な幅を提供できます。

ハードウェアリセットは、通常、リセットするハードウェアまたは上位バスハードウェアの特定のレジスタを知る必要があるため、より困難です。

おすすめ記事