Ubuntu 16.04 上的双 GPU 配置

Ala*_*ler 3 multiple-monitors nvidia xorg multi-gpu ubuntu-16.04

客观的:

拥有一个多显示器扩展显示器,显示器位于两个相同的 GPU 上。

硬件:

  • Geforce GTX 970 (x2)
  • 戴尔 E207WFP 显示器 (x6)
  • Z97-PRO主板
  • i5-4690K CPU @3.50GHz
  • 24GB 内存

软件:

  • Ubuntu 16.04.04 LTS
  • 4.4.0-116-通用内核
  • NVIDIA 驱动程序版本 384.111

测试程序

1) 硬件测试

  • 测试了每台显示器及其端口。(成功)
  • 使用 GPU 和显示器一次一个地测试每个 Mobo PCI 端口。(成功)
  • 测试了每个 GPU 及其所有显示端口。(成功)

    注意:每个 GPU 有 1 个显示器、1 个 HDMI 和 2 个 DVI 端口。

    • 自己测试了每个端口。(成功)
    • 测试所有端口同时显示。(成功)
  • 单独测试了所有涉及的布线。(成功)

2) 软件测试

  • 测试 Ubuntu 是否可以在扩展模式下在 1 个 GPU 上处理 4 个显示器。(成功)
    • 监视器 1:全屏播放高清电影。
    • 监视器 2:玩方舟生存进化在最高质量的设置。
    • 监视器 3:Active Discord 视频通话。
    • 监视器 4:用于活动流的 OBS 软件渲染游戏和 Discord。
  • 测试 Nvidia X Server 在同时插入时是否可以看到两个 GPU。(成功)

    注意:默认情况下禁用一个 GPU。


尝试我的目标

我已尝试使用 xorg.conf 文件进行多种配置。我得到最多试验的最接近成功的是:

  • 所有屏幕都在工作,显示跨显示器拉伸的扩展屏幕保护程序图像。
  • 鼠标能够在屏幕保护程序上愉快地穿越所有屏幕。
  • 不幸的是,当尝试登录时,我得到一个无限登录循环,它重新加载登录屏幕并重新提示再次登录。

xorg.conf 文件:

#xorg.file for 6-screen, 2-GPU setup

###############################################################
# Mouse Configuration options
Section "InputDevice"
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection


# Keyboard Configuration options
Section "InputDevice"
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

###############################################################
# Monitor Configuration options
Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Dell, Inc."
    ModelName      "DELL E207WFP"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 75.0
EndSection

Section "Monitor"
    Identifier     "Monitor1"
    VendorName     "Dell, Inc."
    ModelName      "DELL E207WFP"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 75.0
EndSection

Section "Monitor"
    Identifier     "Monitor2"
    VendorName     "Dell, Inc."
    ModelName      "DELL E207WFP"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 75.0
EndSection

Section "Monitor"
    Identifier     "Monitor3"
    VendorName     "Dell, Inc."
    ModelName      "DELL E207WFP"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 75.0
EndSection

Section "Monitor"
    Identifier     "Monitor4"
    VendorName     "Dell, Inc."
    ModelName      "DELL E2009W"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 75.0
EndSection

Section "Monitor"
    Identifier     "Monitor5"
    VendorName     "Dell, Inc."
    ModelName      "DELL E2009W"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 75.0
EndSection

################################################################
# GPU Configuration options
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce GTX 970"
    BusID          "PCI:1:0:0"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce GTX 970"
    BusID          "PCI:2:0:0"
EndSection

################################################################
# device & monitor bindings configuration options
Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    Monitor        "Monitor1"
    Monitor        "Monitor2"
    Monitor        "Monitor3"
    Option         "Stereo" "0"
    Option         "nvidiaXineramaInfoOrder" "DFP-0"
    Option         "metamodes" "DVI-I-1: nvidia-auto-select +1680+0, HDMI-0: nvidia-auto-select +3360+0, DP-1: nvidia-auto-select +5040+0, DVI-D-0: nvidia-auto-select +0+0"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection


Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    Monitor        "Monitor4"
    Monitor        "Monitor5"
    Option         "Stereo" "0"
    Option         "metamodes" "DVI-I-1: nvidia-auto-select +1680+1050, DVI-D-0: nvidia-auto-select +3360+1050"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

#############################################################
# Xinerma & Compsite extensions
Section "Extensions"
    Option         "Composite" "Disable"
EndSection

##############################################################
# Screen bindings configuration options
Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 1050
    Screen      1  "Screen1" Above "Screen0"

    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"

    Option         "Xinerama" "1"
EndSection

###########################################################
# Unused section
Section "Files"
EndSection
Run Code Online (Sandbox Code Playgroud)

澄清

不是一个无限登录循环问题。无限登录循环是我的问题的症状。

有几个无限循环问题/答案,它们假设您犯了一个错误并希望通过重置为默认值来“修复”问题。这里有几个重置为默认“修复”的不是我的问题。

想要重置为默认设置,并在每次尝试之后可以在我的系统恢复到工作状态上一个显卡。我在问如何进一步更改设置/配置以实现我的目标(没有登录循环)?

Ala*_*ler 5

好的,我通过一些广泛的研究和测试回答了我的问题。如果你有一个多 GPU、多显示器系统,你想要一个统一的桌面(这意味着窗口会吸附到显示器,并且可以跨显示器拖动程序窗口,而不管哪个显示器在哪个 gpu 上)。那么简短的回答是 Nvidia 显卡的 SLI/base Mosaic。

但是,除非您花费 60 多个小时阅读文档并与他人交谈(这就是我所做的),否则会丢失多个信息点。

我将提供多个链接和澄清点,以帮助解决其他人的挫折和努力。理解所有命令和建议来自 Ubuntu 16.04、Unity DE、Nvidia Geforce 驱动程序 v380+,可能不适用于其他系统和硬件。


Nvidia --> X 服务器和 RandR

之间有几个[错误]沟通点:

  • RandR(本地安装的显示管理器,在 CLI 中也称为 xrandr)
  • X 服务器(输入和输出之间的主要管理/连接系统,包括 Xorg、xorg.conf 方面)
  • Nvidia-settings(Nvidia 的显示管理器,将信息发送到 X 服务器和 RandR)

使用 时nvidia-settings,Nvidia 将配置并向 x 服务器和 RandR 发送错误信息,然后在内部自行处理逻辑。

  1. Nvidia 有自己的 xinerama 与 X 服务器 xinerama 分开。如果你在 xorg.conf 文件中启用了 xinerama,那是 X 服务器自己的 Xinerma 而不是 Nvidia 的(所以如果你试图通过nvidia-settings.

  2. Nvidia 将所有显示器置于 1 个屏幕下,并将此屏幕作为统一桌面呈现给 X 服务器,同时使用其自己的内部 xinerama 逻辑让 RandR 能够正确地看到单独的显示器。

    • 这意味着在 xorg.conf 中制作单独的屏幕、监视器、设备部分正在打破nvidia-settings管理桌面的自然方式(IE 禁用 Nvidia 的内部 xinerama)。因此,这将要求在 xorg.conf 文件中启用 X 服务器的 xinerama(然而,这往往会破坏我在开头提到的统一桌面期望之一)。
    • 即使在处理多个 gpu 以呈现桌面时,它仍然以 1 个屏幕呈现给 X 服务器,同时使用其内部逻辑向 RandR 报告所有可用的显示器。这将需要一个名为 base/SLI Mosaic 的选项,但我还需要在下面澄清这一点。

Nvidia 结束 --> RandR & X 服务器解释


英伟达 --> xorg.conf

Nvidia 如何使用 xorg.conf 文件并不反映您在X serverX orgxorg.conf文档中阅读的内容。相反,您需要专注于阅读Nvidia文档。但是,当您访问文档时请注意 URL。'/README/' 之前的数字需要是您的 Nvidia 驱动程序版本号,即下面示例 URL 中的 '390.42'。许多谷歌对 nvidia-settings 文档的点击对于旧驱动程序来说确实是旧文档。如果您获得旧文档,这将使您陷入循环。例子:

http://us.download.nvidia.com/XFree86/Linux-x86_64/390.42/README/index.html

  1. 如前所述,Nvidia 仅向 X 服务器报告一个屏幕。在这里,我将向您展示Section "Screen"一个 xorg.conf 文件的示例以进行澄清。

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "Stereo" "0"
    Option         "nvidiaXineramaInfoOrder" "DFP-0"
    Option         "metamodes" "GPU-0.DFP-0: nvidia-auto-select +0+0, 
                                GPU-0.DFP-4: nvidia-auto-select +1680+0, 
                                GPU-1.DFP-0: nvidia-auto-select +3360+0, 
                                GPU-1.DFP-4: nvidia-auto-select +5040+0, 
    Option         "MultiGPU" "Off"
    Option         "SLI" "on"
    Option         "BaseMosaic" "on"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection 
Run Code Online (Sandbox Code Playgroud)
  • 如您所见,它仍然是一个屏幕,但metamode可以特定于要使用的 gpu 和端口。
  • 还有一点是MultiGPU不是指你主板上的显卡数量。
  • nvidia-auto-select 负责您的 Horizo​​n 同步、垂直刷新范围、显示器分辨率,但正如您从用于显示器放置的尾随数字中看到的那样,我希望它将我的系统分辨率设置为 1680x1050。

一个不那么模棱两可的Section Screen是:


Section "Screen"
    Identifier "Screen0"
    Device "Device0"
    Monitor "Monitor0"
    DefaultDepth 24
    Option "Stereo" "0"
    Option "nvidiaXineramaInfoOrder" "DFP-0"
    Option "metamodes" "GPU-a0bd4a65-1c2b-f765-eeb2-db96b3f4b25a.GPU-0.DVI-I-1: nvidia-auto-select +0+0, 
                        GPU-a0bd4a65-1c2b-f765-eeb2-db96b3f4b25a.GPU-0.DVI-D-0: nvidia-auto-select +1680+0, 
                        GPU-a85ce4bc-1e9b-6275-2aee-0d1ed8bd7ce2.GPU-1.DVI-I-1: nvidia-auto-select +3360+0, 
                        GPU-a85ce4bc-1e9b-6275-2aee-0d1ed8bd7ce2.GPU-1.DVI-D-0: nvidia-auto-select +5040+0"
    Option "MultiGPU" "Off"
    Option "SLI" "on"
    Option "BaseMosaic" "on"
    SubSection "Display"
        Depth 24
    EndSubSection
EndSection
Run Code Online (Sandbox Code Playgroud)
  • 通过添加 GPU 哈希,您可以直接说明要使用哪些显卡,而不是让系统自行解释。
  • DVI-D-0 在我的系统上是 == 到 DFP-4,因此系统没有任何解释,但是我认为使用端口类型而不是 DFP 放置可以消除用户的歧义。

Nvidia 结束 --> xorg.conf


SLI/Base Mosiac catch 22

所以最终的答案是在nvidia-settings用于我想要的统一桌面时需要 SLI Mosiac 。但是,如果它们不是 Quadro 或 NVS选择的 GPU 系列,它只允许在 2 个或更多 GPU 上启用三个屏幕。这不是因为我宝贵的 Geforce GTX 970 的技术无法处理它,而是因为 Nvidia 在代码中人为地限制了这一点,以推广他们的新 GPU。我可以从这个Nvidia 论坛和查看测试存储库中的代码中注意到这一点。nvidia-settings

事实上,最初你可以在 2 个未选择的 GPU 上拥有超过 3 个屏幕,直到 296 驱动程序在那里他们强制更改。

如果您在没有适当 GPU 的情况下尝试任何方式,它将导致所有屏幕都显示在 RandR GUI 和 Nvidia 设置 GUI 中。但是,您会注意到除了三个监视器之外的所有监视器都将被禁用,并且只有在您禁用已启用的 3 个监视器中的一个时才能启用它们。


有用的命令

xrandr --version
xrandr --listproviders
sudo Xorg -version
sudo lspci -vvv |grep -i -A 20 nvidia
nvidia-smi
nvidia-xconfig --query-gpu-info
nvidia-settings
cat /var/log/Xorg.0.log
nvidia-xconfig -t
Run Code Online (Sandbox Code Playgroud)

功能齐全的 xorg.conf

Section "ServerLayout"
     Identifier "Layout0"
     Screen 0 "Screen0" 0 0
     InputDevice "Keyboard0" "CoreKeyboard"
     InputDevice "Mouse0" "CorePointer"
     Option "Xinerama" "0"
EndSection

Section "InputDevice"
    Identifier "Mouse0"
     Driver "mouse"
     Option "Protocol" "auto"
     Option "Device" "/dev/psaux"
     Option "Emulate3Buttons" "no"
     Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
     Identifier "Keyboard0"
     Driver "kbd"
EndSection

Section "Monitor"
     Identifier "Monitor0"
     VendorName "Dell, Inc."
     ModelName "DELL E207WFP"
     HorizSync 30.0 - 83.0
     VertRefresh 56.0 - 75.0
     Option "DPMS"
EndSection

Section "Device"
     Identifier "Device0"
     Driver "nvidia"
     VendorName "NVIDIA Corporation"
     BoardName "Geforce GTX 970"
     BusID "PCI:1:0:0"
EndSection 

Section "Screen"
     Identifier "Screen0"
     Device "Device0"
     Monitor "Monitor0"
     DefaultDepth 24
     Option "Stereo" "0"
     Option "nvidiaXineramaInfoOrder" "DFP-0"
     Option "metamodes" "GPU-a0bd4a65-1c2b-f765-eeb2-db96b3f4b25a.GPU-0.DVI-I-1: nvidia-auto-select +0+0, 
                         GPU-a0bd4a65-1c2b-f765-eeb2-db96b3f4b25a.GPU-0.DVI-D-0: nvidia-auto-select +1680+0, 
                         GPU-a85ce4bc-1e9b-6275-2aee-0d1ed8bd7ce2.GPU-1.DVI-I-1: nvidia-auto-select +3360+0, 
                         GPU-a85ce4bc-1e9b-6275-2aee-0d1ed8bd7ce2.GPU-1.DVI-D-0: nvidia-auto-select +5040+0"

                        #GPU-a0bd4a65-1c2b-f765-eeb2-db96b3f4b25a.GPU-0.DP-1: nvidia-auto-select +1680+1050,
                        #GPU-a0bd4a65-1c2b-f765-eeb2-db96b3f4b25a.GPU-0.HDMI-0: nvidia-auto-select +0+1050,

                        #GPU-a85ce4bc-1e9b-6275-2aee-0d1ed8bd7ce2.GPU-1.HDMI-0: nvidia-auto-select +3360+1050,
                        #GPU-a85ce4bc-1e9b-6275-2aee-0d1ed8bd7ce2.GPU-1.DP-1: nvidia-auto-select +5040+1050"
     Option "MultiGPU" "Off"
     Option "SLI" "on"
     Option "BaseMosaic" "on"
     SubSection "Display"
         Depth 24
     EndSubSection
EndSection
Run Code Online (Sandbox Code Playgroud)