Моя исследовательская лаборатория недавно добавила сервер с мощной видеокартой NVIDIA, которую мы хотели бы использовать для научных вычислений. Поскольку это не рабочая станция, нам придется запускать наши задания удаленно через ssh-соединение. Для большинства наших приложений требуется выполнить рендеринг opengl в закадровый буфер, а затем выполнить анализ изображения на основе CUDA.
Мое первоначальное расследование показывает, что пересылка X11 - плохая идея, потому что рендеринг opengl будет происходить на клиентской машине (или, скорее, на сервере X11 - какое запутанное соглашение об именах!) И будет страдать от сетевых узких мест при отправке наших массивных текстур. Нам никогда не понадобится отображать вывод, поэтому кажется, что перенаправление X11 не требуется, но Opengl требует, чтобы $ DISPLAY был установлен на что-то допустимое, иначе наши приложения не будут работать. Я уверен, что существуют фермы рендеринга, которые это делают, но как это сделать? Я думаю, что это, вероятно, простая проблема конфигурации X11, но я слишком незнаком с ней, чтобы знать, с чего начать.
Мы запускаем сервер Ubuntu 10.04 без установленных gdm, gnome и т. Д. Однако пакет xserver-xorg установлен.
Прошло много времени с тех пор, как я задавал этот вопрос, поэтому я подумал, что упомяну решение, которое мы в конечном итоге использовали.
Взлом локального X-экрана
В конце концов, я просто запустил удаленные программы opengl на локальном X-экране сервера. На машине была запущена версия сервера Ubuntu, и по умолчанию на ней не работал xserver, поэтому мне пришлось настроить xserver для запуска при запуске (я только что установил пакет Ubuntu-desktop, убив комара кувалдой), а затем предоставил себе доступ к экрану X, используя эти команды как root: "export DISPLAY =: 0.0; xhost + local:". Затем я мог подключиться к машине по ssh, вызвать «export DISPLAY =: 0.0» и затем запустить мои программы opengl как обычно. Любой, кто сидит за удаленной машиной, увидит всплывающее окно и будет наблюдать за работой моей программы, но у нас нет подключенного монитора, так что это не проблема.
Важно использовать какую-либо форму внеэкранного рендеринга, потому что чтение пикселей непосредственно из экранного цветового буфера может привести к появлению мусора, если окно станет закрытым другим окном. Поскольку вы не видите экран X, трудно понять, произошло ли это. Внеэкранный рендеринг (например, объекты Framebuffer (fbo) или pbuffers) не имеет этой проблемы.
Взлом локального Xscreen сервера не является идеальным решением, поэтому вот несколько альтернатив, которые я нашел на этом пути:
Виртуальные буферы кадров
Xvfb - это вариант, но он не сработал для меня, потому что OpenGL не выигрывал от аппаратного ускорения, а объекты фреймбуфера не поддерживались, что необходимо для взаимодействия CUDA с OpenGL. Тем не менее, это может быть работоспособным вариантом, когда захват локального экрана неприемлем или когда пользователь не может получить привилегии xhost.
VirtualGL
С веб-сайта VirtualGL:
VirtualGL - это пакет с открытым исходным кодом, который дает любому программному обеспечению удаленного отображения Unix или Linux возможность запускать приложения OpenGL с полным аппаратным ускорением 3D.
Это именно то, что я хочу, и это выглядит многообещающим, но у меня не было времени разбираться с новой зависимостью библиотеки, поэтому я не тестировал ее. Я предполагаю, что это идеальное решение, если я смогу его скомпилировать, установить и настроить. Это то, что VirtualBox и некоторые серверы VNC используют для поддержки 3D с аппаратным ускорением.
вы можете запустить виртуальный буфер кадра vfb- на машине, как фиктивный X11. Раньше мы запускали приложения, которые ДОЛЖНЫ открывать Xwindow, на которое мы никогда не смотрели, и просто установили vfb и экспортируем в него $ DISPLAY - вроде как screen на cli HTH