多GPU加速渲染

来自CGTWiki
跳转至:导航搜索

程序编写:刘雪郭潇(外援)、李远航

研究目标

基于光线追踪技术,在双8K光场显示设备上完成实时三维显示。

研究内容

本项目曾经尝试使用多GPU实现加速,但经过测试发现多GPU的加速效果并没有单GPU下PBO的加速效果优秀,且目前无法解决多GPU和PBO同时加速的问题,因此目前的解决思路为使用PBO实现加速,并且使用两台主机(配置GV100)分别渲染1块8K屏,两台主机之间使用UDP传输关键数据实现同步。

图2 多屏示意图


多GPU

使用多GPU方法主要是用于加速,理想情况下可以实现2倍加速。如果只是单纯地叠加GPU,会因为GPU之间大量的数据传输严重影响帧率,从而导致多GPU的效率比单GPU更慢。

对于NVIDIA显卡,可用NVLink。NVLink是纯物理接口,将多GPU当作一个逻辑单元,GPU间大量的数据传输通过NVLink交换,基本可以忽略GPU间数据传输的影响。NVIDIA支持多GPU的显卡基本都是通过NVLink来实现SLI(可升级连接接口)。SLI功能是通过一种特殊的接口连接方式,在一块支持双显卡插槽的主板上,同时使用两块同一型号的显卡,以增强系统图形处理能力。对于一部分高端显卡来说,有时不需要NVLink即可实现SLI功能。但是未使用NVLink实现的SLI功能无法在多台显示设备下工作,进而无法实现之后提出的多屏同步交互功能。

需要在程序中完成对多GPU的调用。否则,不仅会识别不出多GPU,默认仅使用单GPU进行计算,而且其他GPU还会消耗电量。

然而,本项目中只是用到了多台主机中的多GPU。

预览屏和双8K

加入预览屏:使用二维屏作为预览屏,实现二维屏和8K屏的同步交互。同时,每台8K屏只显示一半场景内容,两台8K屏才显示完整的场景内容。实现如图2所示。

场景内容及交互

放入地形和小飞机模型,同时加入交互:放缩平移,及拖动小飞机控制其飞行,以及小飞机自动飞行。

UDP传输

双8K分别显示全部场景内容的上班部分和下半部分。Client端控制预览屏和上半部分(主窗体和子窗体1),Server端控制下半部分(子窗体2),使用UDP传输每帧的相机参数及小飞机的运动参数,以实现两端同步。

编码

对8K的两部分场景内容分别单独编码。

开发中遇到的问题

帧率过低

  • 问题:第一次结合光场设备调试时,可以实现完好的多屏功能,但存在严重的帧率过低的问题,仅为3帧,还不如PPT快。
  • 解决:发现PBO设为FALSE,设为TRUE之后发现帧率实现大幅提升(虽然实际只用了一块GV100,PBO的性能看起来远远优秀于多GPU,这两种方法目前无法兼容)

无法实现多屏显示

  • 问题:为解决帧率过低的问题使PBO=TRUE,影响了多屏功能。
  • 解决:去掉了预览设计,2个Context中分别有1个buffer,可以实现2个窗体的基本显示操作,仅能在光场设备上完成交互,第3个窗体会出现内容缩小在某一角的情况。
  • 优化:创建子窗体时增加了glfwSetWindowSizeCallback函数,可以实现第3个窗体的正常显示,实现最初的预览设计。

解决中:编码失败

  • 问题:远航师兄成功完成了1*8K的编码,尝试使用1个2*8K的buffer(1个Context中)生成EIA,他的预想是执行全屏功能后,二维显示屏内容保持不变,8K屏上的buffer自动扩展为2个8K屏上,显然他失败了(2个Context分别1个buffer也不行),全屏就之后就不能扩展了,显示器并不是那么智能。
  • 解决:UDP传参(相机参数和小飞机参数),在两台主机上已经测试完成,下一步需要在双8K上测试

源代码

下载地址: 双8K程序