主/从AMD + NVidia中的GPU和Linux

时间:2018-01-15 09:10:21

标签: linux opengl x11 nvidia amd

我曾经将一台Radeon HD7850卡连接到我的桌面。当我购买一个新的时,我遇到了一个N​​vidia Quadro 4000.这是一张很棒的卡,所以我决定在我的Linux系统上利用它(Ubuntu 17.10)。

我花了一段时间才找到有效的配置。我真的不明白它为什么会起作用。所以我决定问:

  • 当我插入Radeon作为第一张卡(第一台显示器)并安装radeon opensource驱动程序时。我离开了第二个Nvidia没有它的工作原理。

我可以运行X,游戏和所有内容.OpenGL渲染器是Radeon上的渲染器,但屏幕会根据需要扩展到Nvidia。但我不明白的是它的原因。在这种配置下,我希望:

  • 在第一屏幕(glxinfo)中运行OpenGL程序,它将检测运行的Radeon软件/硬件,并显示OpenGL4.0处于活动状态并正在运行。
  • 在第一屏幕(glxinfo)中运行OpenGL程序,它将显示我没有可用的OpenGL或至少是默认的nvidia驱动程序可以做什么。 OpenGL 1.1?

但我在两个界面都运行了完整的OpenGL 4.0(记得第二台显示器连接到Nvidia)。这怎么可能?第一张卡是否会渲染并将结果发送到屏幕上显示的Nvidia?这会导致延迟(因为内存和pci端口)和性能更差。正确?

所以我决定安装Nvidia Binary官方驱动程序,以便我可以利用GPU。

结果是系统无法启动X.它进入循环并挂起。我不得不删除它们。这怎么可能呢?

我做的一切都是因为我想在两张卡中运行OpenCL软件。我希望每张卡在OpenCL中使用不同的数据运行完整程序,因此我可以将数据流式传输到两张卡(通过软件)。我必须做什么配置才能使两个卡独立地使用其驱动程序但扩展桌面?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在Linux / X11 libGL.so上,即OpenGL实现不仅可以执行高级操作,还包含GPU驱动程序的重要部分。整个架构有点混乱,libGL.so也被DDX(依赖于设备的X)X11驱动程序拉入,以支持间接GLX渲染。

这样做的缺点是,混合OpenGL实现供应商会引起很多麻烦。在你的情况下没有。 1实际上,单个供应商(Mesa项目)实际上知道如何与两个GPU通信的OpenGL实现。一个具有全3D支持(radeon或amdgpu驱动程序),另一个具有有限的2D支持(nouveau驱动程序)。虽然没有OpenGL支持Nvidia GPU,但是有足够的支持来扩展两个卡上的帧缓冲。

  

第一张卡是否会渲染并将结果发送到屏幕上显示的Nvidia?

  

这会导致延迟

轻微的,但远低于任何明显的。具有16个通道的现代PCIe Gen3可以在总线DMA模式下传输高达12GByte / s的速率,其中一个设备的存储器由另一个设备直接写入。 4k,HDR屏幕总计约4096×2560×3×10比特≈40MByte

在12GByte / s时允许每秒传输300帧,在总线上未压缩。或者换句话说,这种最坏情况的延迟只是1/300秒。

  

(因为内存和pci端口)性能更差。正确?

它消耗了一些PCIe传输带宽,但由于PCIe是全双工的,并且在大多数情况下,渲染GPU的带宽是瓶颈,这并不是什么大不了的事。

  

所以我决定安装Nvidia Binary官方驱动程序,以便我可以利用GPU

这意味着您已将libGL.so替换为仅知道如何与(非传统)Nvidia GPU通信的变体。在尝试在混合供应商环境中运行时,如果不采取额外的预防措施,这将导致一些麻烦。这样的环境包括擎天柱,或你拥有的。归结为,不是直接加载OpenGL实现,而是根据运行时环境(即哪个GPU上的哪个窗口)将调度层委托给匹配变量。你可以在这里找到由Nvidia编写的调度程序实现:

https://github.com/NVIDIA/libglvnd