私は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
明示的な幅を提供できます。
ハードウェアリセットは、通常、リセットするハードウェアまたは上位バスハードウェアの特定のレジスタを知る必要があるため、より困難です。