Перевод документации драйвера NVIDIA для Linux, часть 8

Глава 23. Использование Composite-расширения Х-интерфейса

Серверы Х-интерфейса X.org, начиная с версии X11R6.8.0 содержит экспериментальную поддержку нового расширения под названием «Composit»e. Это расширение позволяет окнам прорисовываться в пиксельные карты, а не напрямую в экран. В сочетании с расширениями DAMAGE и RENDER, это позволяет приложению вызывать диспетчер расширения composite для смешивания изображения окон друг с другом при выводе на экран.

Производительность может быть существенно снижена, если опция "RenderAccel" в файле xorg.conf отключена. Обратитесь к приложению B за дополнительной информацией.

При использовании драйвера Х-интерфейса NVIDIA и сервера Х-интерфейса X.Org версии X11R6.9.0 или более новой, и включенном расширении Composite, реализация OpenGL NVIDIA корректно взаимодействует с расширениями Damage и Composite. Это означает, что вывод изображения OpenGL идет во внеэкранные пиксельные карты и сервер Х-интерфейса информируется событием Damage о выводе изображения OpenGL в пиксельные карты. Это позволяет OpenGL приложениям выглядеть правильно на рабочем столе.

Если расширение Composite включено на сервере Х-интерфейса версии старше X11R6.9.0, GLX отключается. Вы можете заставить работать GLX при включенном на старых серверах Х-интерфейса расширении Composite с помощью опции конфигурации Х-интерфейса "AllowGLXWithComposite". Однако, в этих условиях GLX не будет работать правильно. Рекомендуется обновить сервер Х-интерфейса до версии X11R6.9.0 или более новой.

Вы можете включить расширение Composite выполнением nvidia-xconfig --composite. Composite может быть отключено командой nvidia-xconfig --no-composite. Обратитесь к странице руководства по nvidia-xconfig(1) за дополнительной информацией.

Если вы используете расширение Composite совместно с GLX, рекомендуется включить опцию конфигурации Х-интерфейса "DamageEvents" для повышения производительности. Если используется основанный на OpenGL диспетчер расширения composite, также может потребоваться опция "DisableGLXRootClipping" для получения правильного изображения.

Расширение Composite также приводит к проблемам с другими компонентами драйвера:

  • В серверах Х-интерфейса версии более ранней, чем X.Org 7.1, Xv не может прорисовывать изображение в пиксельные карты, перенаправляемые во внеэкранный буфер, и прорисовывает изображение напрямую в экран. Для некоторых приложений можно воспользоваться альтернативным драйвером вывода видео, например, mplayer -vo x11 должен работать нормально, также как и xine -V xshm. Если вы хотите пользоваться Xv, вам надо просто отключить диспетчер расширения composite и включить его после просмотра видео. При использовании X.Org версии 7.1 и более новой, драйвер будет правильно перенаправлять видеоизображение закадровые пиксельные карты. Обратите внимание, что Xv-совместимые видеокарты будут игнорировать опцию «sync-to-vblank» при отрисовке в перенаправляемое окно;
  • Наложения для рабочих станций, стереорежим и UBB несовместимы с Composite. Эти функции автоматически отключаются при обнаружении Composite;
  • Расширение Composite в настоящее время несовмеcтимо с расширением Xinerama, из-за ограничений сервера Х-интерфейса X.Org. Поддержка Composite будет автоматически отключена при включении Xinerama.

Драйвер поддерживает вывод изображений OpenGL в 32-битные ARGB окна при использовании сервера Х-интерфейса X.Org версии 7.2 или более новой, либо при включенной опции "AddARGBGLXVisuals" файла конфигурации Х-интерфейса. Экран должен иметь глубину цвета 24 или 30-бит. Если вы разработчик программ, то можете использовать новые области вывода изображения совместно с диспетчером composite для создания OpenGL приложений с прозрачным интерфейсом:

int attrib[] = {
GLX_RENDER_TYPE, GLX_RGBA_BIT,
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
GLX_ALPHA_SIZE, 1,
GLX_DOUBLEBUFFER, True,
GLX_DEPTH_SIZE, 1,
None };
GLXFBConfig *fbconfigs, fbconfig;
int numfbconfigs, render_event_base, render_error_base;
XVisualInfo *visinfo;
XRenderPictFormat *pictFormat;

/* Make sure we have the RENDER extension */
if(!XRenderQueryExtension(dpy, &render_event_base, &render_error_base)) {
fprintf(stderr, "No RENDER extension found\n");
exit(EXIT_FAILURE);
}

/* Get the list of FBConfigs that match our criteria */
fbconfigs = glXChooseFBConfig(dpy, scrnum, attrib, &numfbconfigs);
if (!fbconfigs) {
/* None matched */
exit(EXIT_FAILURE);
}

/* Find an FBConfig with a visual that has a RENDER picture format that
* has alpha */
for (i = 0; i < numfbconfigs; i++) {
visinfo = glXGetVisualFromFBConfig(dpy, fbconfigs[i]);
if (!visinfo) continue;
pictFormat = XRenderFindVisualFormat(dpy, visinfo->visual);
if (!pictFormat) continue;
if(pictFormat->direct.alphaMask > 0) {
fbconfig = fbconfigs[i];
break;
}
XFree(visinfo);
}

if (i == numfbconfigs) {
/* None of the FBConfigs have alpha. Use a normal (opaque)
* FBConfig instead */
fbconfig = fbconfigs[0];
visinfo = glXGetVisualFromFBConfig(dpy, fbconfig);
pictFormat = XRenderFindVisualFormat(dpy, visinfo->visual);
}

XFree(fbconfigs);

При выводе изображения в 32-битное окно помните, что расширение RENDER, используемое большинством диспетчеров composite, ожидает цветовых данных, предварительно умноженных на значение альфа-канала. Это означает, что если ваше изображение использует трехкомпонентные цвета (r,g,b) и альфа-канал a, в изображении, выводимом в целевое окно, цвета должны быть в формате (a*r, a*g, a*b, a).

Дополнительную информацию о Composite можно найти на freedesktop.org.

Глава 24. Использование утилиты nvidia-settings

Утилита настройки с графическим интерфейсом «nvidia-settings» включена в состав драйвера NVIDIA для Linux. После установки драйвера и запуска Х-интерфейса, вы можете запустить утилиту командой:

% nvidia-settings

в окне терминала.

Расширенная информация о настройках доступна в документации окна помощи утилиты. За дополнительной информацией обратитесь к странице руководства nvidia-settings (man).

Исходные тексты утилиты nvidia-settings доступны на условиях лицензии GPL на FTP сайте NVIDIA.

Глава 25. Настройка режимов SLI и Multi-GPU

Драйвер поддерживает возможности NVIDIA SLI и Multi-GPU. Обе технологии позволяют приложениям OpenGL использовать несколько графических процессоров одновременно для повышения производительности. Различия между SLI и Multi-GPU сводятся к тому, что SLI используется для объединения производительности графических процессоров двух или большего числа видеокарт, тогда как Multi-GPU используется для объединения производительности двух графических процессоров, размещенных на одной видеокарте. Если вы хотите объединить две видеокарты, следует использовать опцию "SLI" конфигурации X-интерфейса. Соответственно, если нужно объединить два графических процессора на одной видеокарте, следует использовать опцию "MultiGPU" конфигурации X-интерфейса. Если имеется две видеокарты, на каждой из которых два графических процессора, и вы хотите объединить их, следует использовать опцию "SLI".

25A. Режимы рендеринга

В среде Linux технологии SLI и Multi-GPU могут работать в одном из трех режимов: рендеринг с чередованием кадров (AFR), рендеринг с разделением экрана (SFR), и полноэкранное сглаживание изображения с использованием SLI (AA). В режиме AFR один графический процессор рассчитывает один кадр, а второй — кадр, следующий за ним. В режиме SFR, каждый кадр делится горизонтально на две части, и каждый графический процессор обрабатывает свою часть. Линия раздела подстраивается для сбалансированной нагрузки обоих графических процессоров. В режиме AA работа по полноэкранному сглаживанию изображения делится между двумя графическими процессорами. Оба процессора работают над одним изображением, и результаты складываются для формирования итогового кадра. Этот режим полезен для приложений, большую часть времени занятых обсчетом на центральном процессоре, и не способных получить преимущество от AFR.

При наличии четырех графических процессоров могут использоваться эти же режимы. В режиме AFR работа распределяется по всем четырем процессорам, каждый подготавливает один кадр за цикл. В режиме SFR кадр делится на четыре части. В режиме AA работа распределяется между четырьмя процессорами, позволяя проводить сглаживание изображения со степенью до 64x. При наличии четырех графических процессоров в режиме SLI возможен еще один режим, рендеринг с чередованием кадров с полноэкранным сглаживанием (AFRAA). В этом режиме пары графических процессоров рассчитывают разные кадры, каждый процессор в паре делает половину работы по полноэкранному сглаживанию изображения. Эти сценарии равноприменимы для случая четырех видеокарт и для случая двух видеокарт, каждая из которых оснащена двумя графическими процессорами.

В некоторых конфигурациях дополнительно доступен специальный режим SLI Mosaic Mode, позволяющий расширить один экран X-интерфейса прозрачно на все видеовыходы каждого графического процессора. Ниже перечислены конфигурации, позволяющие использовать режим SLI Mosaic.

25B. Включение Multi-GPU

Режим Multi-GPU включается в опции "MultiGPU" файла конфигурации Х-интерфейса; обратитесь к приложению B за дополнительной информацией о настройке Multi-GPU.

Утилита «nvidia-xconfig» может быть использована для включения опции Multi-GPU вместо редактирования файла конфигурации вручную. Например:

% nvidia-xconfig --multigpu=on

25C. Включение SLI

SLI включается выставлением опции "SLI" файла конфигурации Х-интерфейса; обратитесь к приложению B за дополнительной информацией о настройке SLI.

Утилита «nvidia-xconfig» может быть использована для включения опции SLI вместо редактирования файла конфигурации вручную. Например:

% nvidia-xconfig --sli=on

25D. Включение режима SLI Mosaic Mode

Проще всего настроить режим SLI Mosaic для набора дисплеев через утилиту  «nvidia-settings» (Глава 24). Проделайте следующие действия:

  1. Присоедините нужные дисплеи к выходам видеокарт. Если вы решили использовать меньшее число дисплеев, чем имеется видеовыходов, присоедините сначала по дисплею для каждого графического процессора перед подключением остальных дисплеев.
  2. Установите драйвер NVIDIA.
  3. Настройте экран X-интерфейса на использование драйвера "nvidia" хотя бы для одного графического процессора (обратитесь к Главе 6 за дополнительной информацией).
  4. Запустите X-интерфейс.
  5. Запустите утилиту «nvidia-settings». Вы должны увидеть на левой панели программы закладку, озаглавленную «SLI Mosaic Mode Settings». Возможно, вам понадобится дополнить запись для экрана Х-интерфейса, который вы сконфигурировали ранее.
  6. Отметьте опцию «Use SLI Mosaic Mode».
  7. Выберите подходящую конфигурацию дисплеев из выпадающего списка «display configuration».
  8. Выберите предпочтительные разрешение и частоту обновления для каждого дисплея в отдельности.
  9. Укажите желаемое перекрытие изображения между дисплеями.
  10. Нажмите кнопку «Save to X Configuration File». Внимание: если у вас нет прав записи в системный файл конфигурации Х-интерфейса, вам будет предложено указать размещение для созданного файла. После этого, вы должны вручную скопировать этот файл в место, из которого берет конфигурацию сервер Х-интерфейса при загрузке (обычно /etc/X11/xorg.conf для серверов X.Org или /etc/X11/XF86Config для серверов XFree86).
  11. Выйдите из утилиты «nvidia-settings» и перезапустите сервер X-интерфейса.

Как вариант, режим SLI Mosaic может быть настроен с помощью утилиты nvidia-xconfig командой вида: nvidia-xconfig --sli=Mosaic --metamodes=METAMODES, где METAMODES — строка, задающая требуемую конфигурацию. Например:

nvidia-xconfig --sli=Mosaic --metamodes="GPU-0.DFP-0: 1920x1024+0+0, GPU-0.DFP-1: 1920x1024+1920+0, GPU-1.DFP-0: 1920x1024+0+1024, GPU-1.DFP-1: 1920x1024+1920+1024"

Настроит четыре цифровых плоских дисплея как 2x2, с разрешением каждого 1920x1024, где GPU-0 выводит изображение на верхнюю пару экранов, а GPU-1 — на нижнюю. Смотрите описание опции конфигурации Х-интерфейса MetaModes в Главе 13. Обратитесь к приложению C за дополнительной информацией о системе наименования дисплеев и графических процессоров.

25E. Требования к оборудованию

Для технологии SLI требуются:

  • идентичные видеокарты с интерфейсом PCI-Express;
  • поддерживаемая материнская плата (кроме систем Quadro Plex);
  • в большинстве случаев, специальный «мост», соединяющий две видеокарты;
  • для использования режима SLI Mosaic графические процессоры должны быть частью системы Quadro Plex VCS модели IV или новее, или каждый графический процессор должен быть Quadro FX 5800, или же процессором Quadro на базе архитектуры Fermi.

Для получения последнего перечня поддерживаемых конфигураций для SLI, включая графические процессоры и материнские платы, обратитесь на сайт SLI Zone.

25F. Прочие требования и замечания

Следующие особенности влияют на SLI и Multi-GPU:

  • графические процессоры в ноутбуках не поддерживаются;
  • для использования SLI с видеокартами Quadro обязательна установка специального «моста»;
  • TwinView не поддерживается совместно с SLI и Multi-GPU. Только один дисплей может использоваться при включенной поддержке SLI или Multi-GPU, за исключением режима Mosaic;
  • если Х-интерфейс настроен на множество экранов, и для экрана 0 включен SLI или MultiGPU, прочие экраны, использующие драйвер nvidia, отключаются. Обратите внимание, что если включены SLI или MultiGPU, используемые в этих конфигурациях графические процессоры недоступны для однопроцессорного рендеринга.

Часто задаваемые вопросы об SLI и Multi-GPU

Вопрос: Почему приложение glxgears работает медленнее при включенном SLI или Multi-GPU?

Ответ: При включенном SLI или Multi-GPU драйвер NVIDIA должен координировать работу обоих графических процессоров при выводе каждого нового кадра. Для большинства приложений эта нагрузка несущественна. Однако, поскольку в glxgears создается очень много кадров в секунду, нагрузка процессом синхронизации составляет заметную величину во времени, и частота кадров снижается.

Вопрос: Почему Doom 3 работает медленнее при включенном SLI или Multi-GPU?

Ответ: Драйвер NVIDIA для Linux не определяет оптимальные настройки SLI или Multi-GPU для таких игр как Doom 3 и Quake 4. В качестве обходного пути может быть использована переменная среды __GL_DOOM3 для использования OpenGL оптимальных настроек для Doom 3. В Bash это можно сделать той же командой, что запускает Doom 3, так что переменная среды не остается установленной для остальных приложений OpenGL, запускаемых в это же сеансе работы:

% __GL_DOOM3=1 doom3

Сценарий запуска Doom 3 также может быть изменен для установки значения этой переменной среды:

#!/bin/sh
# Needed to make symlinks/shortcuts work.
# the binaries must run with correct working directory
cd "/usr/local/games/doom3/"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
export __GL_DOOM3=1
exec ./doom.x86 "$@" 

Эта переменная введена временно, и будет удалена в будущем.

Вопрос: Почему не инициализируется SLI или Multi-GPU?

Ответ: Может быть несколько причин, по которым SLI или Multi-GPU не инициализируется. Многие из них должны быть объяснены в файле журнала Х-интерфейса, например:

  • "Unsupported bus type" (тип шины не поддерживается)
  • "The video link was not detected" (соединительный мост не обнаружен)
  • "GPUs do not match" (графические процессоры не совпадают)
  • "Unsupported GPU video BIOS" (BIOS видеокарты не поддерживается)
  • "Insufficient PCI-E link width" (недостаточная полоса пропускания PCIE)

Сообщение «Unsupported PCI topology» возникает в основном из-за проблем с ядром Linux. Драйвер NVIDIA должен иметь доступ к мосту PCI (часто называемому корневым мостом), к которому подсоединяется каждый графический процессор NVIDIA для правильной настройки SLI или MultiGPU. Многие версии ядра не распознают правильно этот мост и в результате не дают доступа к нему драйверу NVIDIA. Смотрите ниже «Как определить, что ядро правильно обнаруживает мост PCI?» для получения дополнительной информацией.

Ниже приведены некоторые шаги по решению проблем с инициализацией SLI.

  • Убедитесь, что поддержка ACPI включена в вашем ядре. По наблюдениям NVIDIA, необходимо использование ACPI для правильного определения ядром корневого моста. Учтите, что в некоторых случаях версии ядра с поддержкой ACPI все еще могут иметь проблемы, и может потребоваться обновление ядра.
  • Выполните команду lspci для проверки, что несколько графических процессоров NVIDIA могут быть обнаружены операционной системой, например:

    % /sbin/lspci | grep -i nvidia

    Если lspci не сообщает обо всех графических процессорах, имеющихся в системе, то имеется проблема с ядром операционной системы Linux, и рекомендуется использовать другое ядро.

    Обратите внимание на то, что утилита «lspci» в вашей системе может быть установлена по иному пути, нежели /sbin. Если вышеприведенная команда выдает ошибку /sbin/lspci: No such file or directory, попробуйте выполнить команду:

    % lspci | grep -i nvidia

    Вам также может понадобиться установить пакет «pciutils» для вашего дистрибутива.
  • Убедитесь, что используется последняя версия SBIOS для материнской платы.
  • Слоты шины PCI-Express материнской платы должны предоставлять минимально необходимую полосу пропускания. Убедитесь, что слоты на вашей материнской плате соответствуют нижеприведенным требованиям и что видеокарты установлены в нужные слоты PCI-Express:
  • Двухпроцессорной видеокарте требуется как минимум 8 каналов шины (слот x8 или x16)
  • Паре однопроцессорных видеокарт требуется соответствие одной из комбинаций:
    • x16 + x16
    • x16 + x8
    • x16 + x4
    • x8 + x8

Вопрос: Как определить, что ядро правильно обнаруживает мост PCI?

Ответ: как обсуждалось выше, драйвер NVIDIA должен иметь доступ к мосту PCI, к которому подключен каждый графический процессор NVIDIA, чтобы было возможно правильно настроить SLI.

Следующие действия требуются для определения способности ядра распознать мост PCI:

  • Идентифицируйте все графические процессоры NVIDIA:
% /sbin/lspci | grep -i vga

0a:00.0 VGA compatible controller: nVidia Corporation [...]
81:00.0 VGA compatible controller: nVidia Corporation [...]
  • Определите, что каждый графический процессор подключен к шине, подключенной к корневому мосту (обратите внимание, что процессоры в предыдущем вопросе находятся на шинах 0a и 81):

% /sbin/lspci -t

правильно:

-+-[0000:80]-+-00.0
| +-01.0
| \-0e.0-[0000:81]----00.0
...
\-[0000:00]-+-00.0
+-01.0
+-01.1
+-0e.0-[0000:0a]----00.0

неправильно:

-+-[0000:81]---00.0
...
\-[0000:00]-+-00.0
+-01.0
+-01.1
+-0e.0-[0000:0a]----00.0

Обратите внимание, что в первом примере шина 81 подсоединена к корневому мосту 80, но во втором примере нет корневого моста 80 и шина 81 неправильно подсоединена к корню дерева устройств. В таких случаях остается только обновление ядра на версию, правильно определяющую конфигурацию шины PCI.

 /