Компания Nvidia без лишнего шума и анонсов добавила в драйверах версии 435.17 для Linux поддержку работы с Vulkan и OpenGL + GLX в динамическом (on-demand) режиме рендеринга PRIME. Поддержки EGL пока нет.


Вся масштабность анонса в одном скриншоте

PRIME — это Linux-реализация системы распределения рендеринга приложений по нескольким графическим процессорам известной как Nvidia Optimus, что актуально для ноутбуков, оснащенных, например, связкой из встроенного видео Intel HD Graphics и дискретным чипом Nvidia.

Режим PRIME актуален для тех, кто пытается сэкономить заряд батареи, при этом сохраняя возможность при необходимости максимально использовать ресурсы системы. Он позволяет рендерить на более производительном дискретном чипе какое-то конкретное приложение, а для работы всего остального — задействовать встроенное в CPU видео.

Для работы в режиме PRIME вам понадобится X Server, а также желание пропатчить его вручную. Коммиты, которые позволяют запустить вышеупомянутые изменения, уже есть в мастер-ветке проекта X Server на Git, но еще не вошли ни в один из релизов.

NVIDIA's PRIME render offload support requires the following git commits in the X.Org X server:

7f962c70 — xsync: Add resource inside of SyncCreate, export SyncCreate
37a36a6b — GLX: Add a per-client vendor mapping
8b67ec7c — GLX: Use the sending client for looking up XID's
56c0a71f — GLX: Add a function to change a clients vendor list

b4231d69 — GLX: Set GlxServerExports::{major,minor}Version

Полную информацию по сборке X Server и настройке экранов можно найти тут.

У пользователей Ubuntu 18.04 и 19.04 есть альтернатива и они могут воспользоваться собранным на стороне Nvidia ppa-репозиторием.

Также вам потребуется настроить переменные среды для выгрузки рендера разных типов приложений.

Для приложений Vulkan нужно использовать __NV_PRIME_RENDER_OFFLOAD=1

Например:

__NV_PRIME_RENDER_OFFLOAD=1 vkcube.

Для приложений GLX вам нужно использовать оба:

__NV_PRIME_RENDER_OFFLOAD=1 и __GLX_VENDOR_LIBRARY_NAME=nvidia.

Например:

__NV_PRIME_RENDER_OFFLOAD=1
__GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep vendor
.



Все ссылки:


Комментарии (6)


  1. Zeben
    10.09.2019 15:07

    Новость вышла тихо, но событие однозначно громкое.

    Я, как пользователь ноутбука с Intel + NVIDIA, который всё время пользовался Bumblebee, испытывал с ним проблемы, начиная от того, что для запуска чего-либо на дискретной карте запускается отдельный Xorg и заканчивая детскими болячками, вроде тиринга и input lag, причём получается избавиться либо от одного, либо от другого.

    Прочитал новость поподробнее и начал копаться в своём Arch Linux:
    1. Удалил всё, что связано с Bumblebee: bbswitch, nvidia-xrun, primus и т.д;
    2. Настроил TLP, убрав PCI-устройство с чёрного списка, после чего его питание начало управляться динамически, DPM;
    3. Скачал слепок репозитория отсюда, скомпилировал, установил.
    4. Подправил xorg.conf (пример взял с этой статьи). Так как по некоторым причинам я не использую драйвер modesetting, я изменил в конфигурационном файле на intel (xf86-video-intel);
    5. Перезапустил X-сессию и добавил в ~/.zshrc такую «гениальную» строку:

    alias optirun='__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia'

    6. Проверил.

    В результате я получил отсутствие тиринга, input lag'а и даже небольшое повышение FPS в 3D-приложениях.

    Остаётся ждать релиза Xorg с патчами в официальных репозиториях.


    1. SaturnTeam
      10.09.2019 15:40

      Эххх, ваш бы комментарий с подробностями на арчвики…


      1. Zeben
        10.09.2019 16:22

        На русской ArchWiki есть, а на англоязычной ещё нет (странно, обычно бывает наоборот). Можно попробовать перевести.


    1. 4umak
      10.09.2019 19:05

      А как с выгрузкой и последующим энергопотреблением дела обстоят? Он правда перестаёт запитывать дискретку? А то даже в лучшие годы Bumblebee он, бывало, забывал её отключить.


      1. Zeben
        11.09.2019 19:35
        +1

        Кстати, если бы Вы об этом не сказали — я бы и не вспомнил.

        Прелесть bumblebee в том, что он полностью выгружает модули ядра, после чего bbswitch полностью отключает питание дискретной карты, и наоборот.

        В нативном nvidia-prime питание дискретной карты управляется линуксовым DPM (при условии, если правильно настроен TLP/laptop-mode-tools). Тем не менее, модули ядра (nvidia, nvidia-drm etc) остаются загруженными, а к видяхе можно обратиться в любой момент.

        К сожалению, после серии экспериментов я пришёл к выводу, что нативный Nvidia PRIME + DPM не обеспечивает такое энергосбережение, как bumblebee + bbswitch.

        Возможно, я что-то недонастроил.


      1. Zeben
        12.09.2019 12:34

        Покопался на различных форумах и после продолжительного гуглинга наткнулся на такой пост касаемо управления питанием дискретных адаптеров.

        Вкратце: карты с архитектурой Turing используют более стандартные методы управления питанием, в то время как в Pre-Turing-картах используются DSM (device specific method), который и дёргается модулем bbswitch, чтобы обесточить карту. В частности, в этом посте описано.

        На данный момент имеем ситуацию, когда для Nvidia PRIME требуются загруженные модули ядра nvidia и, пока они загружены — Pre-Turing-карты остаются включёнными, а DPM большой погоды тут не играет (в частности, этот метод позволяет свести энергопотребление карты к минимум, но не до нуля).

        Остаётся ждать полноценного внедрения в модули nvidia возможности дёргать их же DSM-вызовы для полноценного энергосбережения.