如何模拟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。您需要成为 root 才能读取某些寄存器以及写入其中的任何寄存器。寄存器名称用 列出setpci --dumpregs。例如:

$ setpci -s 00:02.0 command   
0407

16位pci配置command寄存器是一个重要的寄存器。该位的含义可以从Linux头文件。低 3 位为 1,使设备能够响应来自 cpu 的 io 和内存周期,并成为总线主控,以便它可以 dma 到 cpu 的主内存中。

如果禁用这些位,设备将不再响应您的驱动程序。谨防,这可能会让你的系统崩溃。不要轻易测试这个:

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

您可以尝试编写一个脚本将寄存器设置为 0,在图形尝试绘制时等待几秒钟,然后将寄存器设置回其原始设置(命令=0407)。所有数字均为十六进制(没有任何 0x 前缀)。正如评论中提到的,您可能需要为值提供 4 位数字,尽管事实上命名寄存器(如command)的宽度由 已知setpci。您可以通过寄存器名称后缀.b(8 位)、.w(16)或.l(32)提供显式宽度。

重置硬件更加困难,因为它通常要求您了解要重置的硬件中或父总线硬件中的特定寄存器。

相关内容