Renderização remota offscreen

6

Meu laboratório de pesquisa recentemente adicionou um servidor que tem uma placa gráfica NVIDIA, que gostaríamos de usar para fazer cálculos científicos. Como não é uma estação de trabalho, teremos que executar nossos trabalhos remotamente, através de uma conexão ssh. A maioria dos nossos aplicativos exige renderização opengl para um buffer fora da tela e, em seguida, faz uma análise de imagem no resultado em CUDA.

Minha investigação inicial sugere que o encaminhamento do X11 é uma má idéia, porque a renderização opengl ocorrerá na máquina cliente (ou melhor, no servidor X11 - que convenção de nomenclatura confusa!) e sofrerá gargalos de rede ao enviar nossas texturas massivas. Nós nunca precisaremos exibir a saída, então parece que o forwarding do X11 não deveria ser necessário, mas o Opengl precisa que o $ DISPLAY seja configurado para algo válido ou que nossos aplicativos não serão executados. Tenho certeza de que existem fazendas que fazem isso, mas como isso é feito? Acho que este é provavelmente um problema simples de configuração do X11, mas estou muito familiarizado com ele para saber por onde começar.

Estamos executando o servidor Ubuntu 10.04, sem o gdm, gnome, etc instalado. No entanto, o pacote xserver-xorg está instalado.

    
por redmoskito 02.10.2010 / 02:50

2 respostas

4

Já faz um tempo desde que fiz essa pergunta, então pensei em mencionar a solução que usamos em última análise.

Sequestrando a tela X local

No final, acabei de executar os programas opengl remotos na tela X local do servidor. A máquina rodava a edição do servidor Ubuntu e não estava rodando um xserver como padrão, então eu tive que configurar um xserver para rodar na inicialização (eu acabei de instalar o pacote ubuntu-desktop do Ubuntu, matando um mosquito com uma marreta) e então me dei acesso à tela X usando estes comandos como root: "export DISPLAY =: 0.0; xhost + local:". Então eu poderia ssh na máquina, chamar "export DISPLAY =: 0.0" e depois executar meus programas opengl normalmente. Qualquer pessoa sentada na máquina remota veria uma janela pop-up e veria meu programa rodando, mas não temos um monitor conectado, então isso não foi um problema.

É importante usar alguma forma de renderização fora da tela, porque a leitura de pixels diretamente do buffer de cores na tela pode resultar em dados inúteis se a janela ficar obscurecida por outra janela. Como você não pode ver a tela X, é difícil saber se isso aconteceu. A renderização fora da tela (por exemplo, objetos Framebuffer (fbo) ou pbuffers) não tem esse problema.

O sequestro do Xscreen local do servidor não é uma solução ideal, então aqui estão algumas alternativas que encontrei ao longo do caminho:

Virtual Framebuffers

Xvfb é uma opção, mas não funcionou para mim, porque o OpenGL não estava se beneficiando da aceleração de hardware, e os objetos framebuffer não eram suportados, que são necessários para a interoperabilidade do CUDA com o OpenGL. No entanto, isso pode ser uma opção viável quando o seqüestro da tela local não é aceitável, ou onde o usuário não pode obter privilégios de xhost.

VirtualGL

Do site da VirtualGL:

VirtualGL is an open source package which gives any Unix or Linux remote display software the ability to run OpenGL applications with full 3D hardware acceleration.

Isso é exatamente o que eu quero, e parece muito promissor, mas eu não tive tempo para lidar com uma nova dependência de biblioteca, então eu não testei isso. Meu palpite é que essa é a solução ideal, uma vez que posso compilá-la, instalá-la e configurá-la. É o que o VirtualBox e alguns servidores VNC usam para suportar 3D acelerado por hardware.

    
por 11.11.2010 / 18:55
0

você pode executar um buffer de quadro virtual vfb na máquina, é como um X11 fictício. Nós costumávamos rodar aplicativos que tinham que abrir um Xwindow que nós nunca olhamos e apenas instalamos o vfb e exportamos $ DISPLAY para isso - meio que como tela no cli HTH

    
por 02.10.2010 / 03:31