Установил 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 или ещё куда-нибудь, но мне не нравится такой костыль, хочется понять, что тут происходит и сделать как надо.
Как добиться нужного мне поведения?