LINUX.ORG.RU

cuda, nvidia-bumblebee, ld_library_path

 , ,


0

1

Установил cuda вместе с драйвером nvidia-440, который шёл в комплекте. Потом поставил и настроил bumblebee. Ubuntu 16.04.

Собственно, что хотел: запускать всё с интелом по умолчанию. И только через optirun с невидией. И чтобы cuda была доступна всегда.

Что получилось:

  • На невидии нормально запускается optirun glxgears.
  • Кудавский /usr/local/cuda/samples/1_Utilities/deviceQuery# ./deviceQuery выдаёт что-то нормальное (RESULT=PASS).
  • Просто glxgears выдаёт Error: couldn't get an RGB, Double-buffered visual.
  • Окей. Путём думания, была придумана и опробована команда LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/mesa/:/usr/lib/x86_64-linux-gnu/mesa-egl/:/usr/lib/x86_64-linux-gnu glxgears. Запустилось успешно.

Значит, подумал я, дело в том, как ищутся библиотеки. Смотрим:

# update-alternatives --config x86_64-linux-gnu_gl_conf 
  0            /usr/lib/nvidia-440/ld.so.conf              8604      автоматический режим
  1            /usr/lib/nvidia-440-prime/ld.so.conf        8603      ручной режим
  2            /usr/lib/nvidia-440/ld.so.conf              8604      ручной режим
* 3            /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf   500       ручной режим
# update-alternatives --config x86_64-linux-gnu_egl_conf 
  0            /usr/lib/nvidia-440/ld.so.conf                  8604      автоматический режим
  1            /usr/lib/nvidia-440-prime/ld.so.conf            8603      ручной режим
  2            /usr/lib/nvidia-440/ld.so.conf                  8604      ручной режим
* 3            /usr/lib/x86_64-linux-gnu/mesa-egl/ld.so.conf   500       ручной режим

На всякий случай проверю симлинки:

# ls -l /usr/lib/x86_64-linux-gnu/ | grep nvidia | sed -r "s/(\S+\s+){8}//"
libGLX_indirect.so.0 -> ../nvidia-440/libGLX_nvidia.so.440.33.01
libGLX_nvidia.so.0 -> libGLX_indirect.so.0
libnvidia-opencl.so.1 -> libnvidia-opencl.so.440.33.01
libnvidia-opencl.so.440.33.01
# ls -l /usr/lib/x86_64-linux-gnu/mesa/ | sed -r "s/(\S+\s+){8}//"
ld.so.conf
libGL.so -> libGL.so.1.2.0
libGL.so.1 -> libGL.so.1.2.0
libGL.so.1.2.0
# ls -l /usr/lib/x86_64-linux-gnu/mesa-egl/ | sed -r "s/(\S+\s+){8}//"
ld.so.conf
libEGL.so -> libEGL.so.1.0.0
libEGL.so.1 -> libEGL.so.1.0.0
libEGL.so.1.0.0
libGLESv2.so -> libGLESv2.so.2.0.0
libGLESv2.so.2 -> libGLESv2.so.2.0.0
libGLESv2.so.2.0.0

Что-то странно. Вроде бы такая конфигурация должна быть эквивалентна тому, что приложения видят как раз то, что я передал в LD_LIBRARY_PATH выше. Но тем не менее, приложения видят что-то другое (наверно нвидиевское?).

Я не особо шарю, что тут происходит, но меня устроит, если для запуска приложений через nvidia мне придётся ставить что-то в LD_LIBRARY_PATH (optirun сам такого не делает). Но категорически не нравится в сценарии по умолчанию в каждую графическую программу, которая должна выводиться через интеловскую графику, добавлять такой «префикс».

Я мог бы просто добавить это в bashrc или ещё куда-нибудь, но мне не нравится такой костыль, хочется понять, что тут происходит и сделать как надо.

Как добиться нужного мне поведения?