我曾经将一台Radeon HD7850卡连接到我的桌面。当我购买一个新的时,我遇到了一个Nvidia Quadro 4000.这是一张很棒的卡,所以我决定在我的Linux系统上利用它(Ubuntu 17.10)。
我花了一段时间才找到有效的配置。我真的不明白它为什么会起作用。所以我决定问:
我可以运行X,游戏和所有内容.OpenGL渲染器是Radeon上的渲染器,但屏幕会根据需要扩展到Nvidia。但我不明白的是它的原因。在这种配置下,我希望:
但我在两个界面都运行了完整的OpenGL 4.0(记得第二台显示器连接到Nvidia)。这怎么可能?第一张卡是否会渲染并将结果发送到屏幕上显示的Nvidia?这会导致延迟(因为内存和pci端口)和性能更差。正确?
所以我决定安装Nvidia Binary官方驱动程序,以便我可以利用GPU。
结果是系统无法启动X.它进入循环并挂起。我不得不删除它们。这怎么可能呢?
我做的一切都是因为我想在两张卡中运行OpenCL软件。我希望每张卡在OpenCL中使用不同的数据运行完整程序,因此我可以将数据流式传输到两张卡(通过软件)。我必须做什么配置才能使两个卡独立地使用其驱动程序但扩展桌面?
有什么想法吗?
答案 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编写的调度程序实现: