想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
2年前关闭。
我曾经将一张Radeon HD7850卡连接到台式机。当我购买新的显卡时,我遇到了Nvidia Quadro4000。暂时这是一张不错的卡片,所以我决定在我的Linux系统(Ubuntu 17.10)上利用它。
我花了一段时间才找到有效的配置。而且我真的不明白为什么会起作用。所以我决定问:
当我将Radeon作为第一张卡(插入第一台显示器)并安装radeon开源驱动程序时。我留下了第二个没有驱动程序的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 Official驱动程序,以便可以利用GPU。
结果是系统无法启动X。它进入循环并挂起。我不得不删除它们。这怎么可能呢?
我做所有事情都是因为我想在两张卡中都运行OpenCL软件。而且我希望每个卡都可以在OpenCL中使用不同的数据运行完整的程序,因此我可以通过软件将数据流传输到两个卡中。我需要做些什么配置才能将两张卡单独带其驱动程序但扩展台式机?
有任何想法吗?
最佳答案
在Linux / X11 libGL.so
上,即OpenGL实现不仅执行高级任务,而且还包含GPU驱动程序的重要部分。整个架构有点混乱,DDX(取决于设备的X)X11驱动程序也引入了libGL.so
,以支持间接GLX渲染。
缺点是,混合使用OpenGL实现的供应商会引起很多麻烦。在你的情况下1您实际上由单个供应商(Mesa项目)实施了OpenGL实现,该供应商实际上知道如何与两个GPU通讯。一个具有完整的3D支持(radeon或amdgpu驱动程序),而另一个仅具有有限的2D支持(nouveau驱动程序)。虽然Nvidia GPU不支持OpenGL,但有足够的支持来扩展两张卡上的帧缓冲。
第一张卡是否渲染并将结果发送到屏幕上显示的Nvidia?
是。
这会导致延迟
轻微,但远低于任何明显的东西。具有16通道的现代PCIe Gen3可以在总线主控DMA模式下的设备之间传输高达12GByte / s的速度,其中一个设备的内存直接由另一设备写入。 4k HDR屏幕总计约为4096×2560×3×10bit≈40MByte
以12GByte / s的速度允许每秒传输300帧,并且在总线上未压缩。换句话说,这种最坏情况的延迟仅为1/300秒。
(因为内存和pci端口)和较差的性能。对?
它消耗了一些PCIe传输带宽,但是由于PCIe是全双工的,并且在大多数情况下,渲染GPU的带宽是瓶颈,因此这没什么大不了的。
所以我决定安装Nvidia Binary Official驱动程序,以便我可以利用GPU
这意味着您已经用只知道如何与(非传统)Nvidia GPU对话的变体替换了libGL.so
。尝试在混合供应商环境中运行时,如果不采取额外的预防措施,将会造成一些麻烦。这样的环境包括擎天柱或您所拥有的。归结为,不是直接加载OpenGL实现,而是调度层根据运行时环境(即哪个GPU上的哪个窗口)将工作委托给匹配的变体。您可以在此处找到由Nvidia编写的调度程序实现:
https://github.com/NVIDIA/libglvnd
关于linux - Master/Slave AMD + NVidia中的GPU和linux ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48259845/