Como simular a falha de hardware da GPU?

3

Estou fazendo algumas pesquisas relacionadas à resiliência do GPGPU com placas gráficas NVIDIA e tenho procurado uma maneira de, com a maior precisão possível, simular falhas de hardware. Eu sei sobre cudaDeviceReset () e usando intencionalmente failing asserts () dentro do kernel; corrija-me se estiver errado, mas não acho que isso retrate com precisão uma falha de hardware realista.

Por fim, o que estou tentando alcançar é efetivamente desativar o dispositivo durante a execução, fazer com que o host detecte isso e tente se recuperar dele.

O que eu gostaria de saber é se existe algum método de "power cycle" na GPU através do kernel Linux.

Estou usando o CentOS 7 e a capacidade de computação do meu dispositivo é 2.1. Por favor, veja abaixo a saída do 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
    
por John 04.04.2016 / 20:04

1 resposta

2

Você pode manipular alguns dos registradores do barramento PCI do dispositivo facilmente com setpci . Nota: isso é perigoso e pode travar seu sistema!

Por exemplo, encontre o barramento pci e o slot da sua placa gráfica:

$ 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

Você pode ler e gravar registros usando setpci . Você precisa ser root para ler alguns registros e escrever qualquer um deles. Os nomes dos registradores são listados com setpci --dumpregs . Por exemplo:

$ setpci -s 00:02.0 command   
0407

O 16bit pci config command register é um registro importante. O significado do bit pode ser obtido no cabeçalho linux . Os 3 bits baixos são 1 para permitir que o dispositivo responda aos ciclos io e de memória da cpu e para ser o mestre do barramento, de modo que possa acessar a memória principal da cpu.

Se você desabilitar esses bits, o dispositivo não responderá mais ao seu driver. Cuidado, isso pode travar seu sistema . Não teste isso levemente:

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

Você pode tentar escrever um script para definir o registro como 0, aguardar alguns segundos enquanto seus gráficos tentam desenhar e, em seguida, configurar o registro de volta para sua configuração original (comando = 0407). Todos os números estão em hexadecimal (sem qualquer prefixo 0x). Como mencionado nos comentários, talvez seja necessário fornecer 4 dígitos para o valor, apesar do fato de que a largura dos registros nomeados (como command ) é conhecida por setpci . Você pode fornecer uma largura explícita com um sufixo ao nome de registro de .b (8bits), .w (16) ou .l (32).

A redefinição do hardware é mais difícil, pois geralmente é necessário saber de um registro específico no hardware para redefinir ou no hardware do barramento pai.

    
por 05.04.2016 / 10:37