0%

【文献阅读06】Equalizer:A Scalable Parallel Rendering Framework

原文链接

Equalizer: A Scalable Parallel Rendering Framework

论文要解决的问题

本文提出了一种可以应用于多种并行场景下的并行渲染框架,该框架的主要贡献如下:

  1. 提出一种可以灵活配置图形系统资源的概念:compound trees
  2. 通过compound trees可以简单指定并行任务的分解和图形合成方法
  3. 根据compound tree可以自动分解和分布式执行渲染任务
  4. 支持并行渲染合成时的深度检测和α-混合
  5. 完全去中心化的架构,并提供网络swap barrier(用于同步)和分布式object方法
  6. 支持低延迟的分布式帧同步和图像合成
  7. 最小化的侵入式编程模型

基础概念

equalizer的网络传输只需要交换基础的渲染参数,不传输大量的图形质量和数据。应用程序可以通过equalizer基于分布式对象或消息传递实现高效的动态数据库更新。
此外,Equalizer的另一个优点是灵活且可扩展的配置,因此可以轻松地指定任务分解和图像合成方式。
Equalizer的网络层支持消息传递和分布式对象的创建。通过创建分布式对象的子类,可以创建静态或版本化的对象。对象可以使用集群中的唯一识别符进行处理,这允许对象的远程映射。版本化对象通常用于特定帧的数据,其中为每一个新帧创建一个新的版本。版本信息会通过Equalizer正确地传输到应用程序的渲染代码。这种机制使得分布式变得简单。

系统架构

并行渲染的配置由应用程序或用户提供的配置文件进行初始化,服务器页启动和控制应用程序提供的渲染客户端。
虽然高级别的Euqualizer使用客户端-服务器方法(C-S)但其构建在对等网络层(p2p)上。目前Equalizer提供了TCP/IP套接字和无线带宽技术(InfiniBand)的实现。

应用程序

Equalizer中的应用程序单独驱动渲染,也就是说,它只执行主渲染循环,但并不实际执行任何渲染。
渲染客户端通常与应用程序具有相同的可执行文件,然而在更复杂的实现中,渲染客户端可能是一个瘦渲染器,只包含应用程序指定的渲染代码。
服务器将渲染客户端部署到所有配置指定的节点中。

Equalizer简化的执行流图如下:
simplified execution flow

渲染客户端

渲染客户端不必执行主循环,由Equalizer完全控制。
渲染客户端由如下几个线程组成:节点主线程、网络接收线程和每一个GPU一个的渲染任务线程。
客户端实现节点主循环用于接收网络事件并进行处理,网络数据包括渲染任务参数,基于此,客户端库设置渲染环境并调用应用程序提供的任务方法。渲染环境包括使用正确的渲染线程,提供任务方法包括视口、平头椎体、视角矩阵和sort-last的数据范围。
所有任务都有默认实现,只有应用程序特定的方法需要实现,包括frameDraw()方法。比如sort-first和sort-last方法。

Equalizer服务器

Equalizer服务器使用应用程序的特定配置为接收到的应用程序的请求提供服务。它服务这些请求通过使用特定的配置、启动节点上的渲染客户端、决定一帧的渲染任务和同步完成帧。
服务器为应用程序维持配置,这有利于跨应用的负载均衡、资源预留和系统资源管理。
配置由两部分组成:

  • 第一部分是分层的资源描述
  • 第二部分是compound tree,用于说明资源如何被渲染。

分层的资源描述如下表所示:

resource description

其中每一个node代表一个CPU核,pip为node上运行的线程(一个线程对应一个GPU)。此外,window代表屏上或离屏的渲染。channel代表视口的一部分(tile-based)。

资源配置的例子如下所示:

resource configuration

Compound Trees

Compound tree结构描述了渲染和合成任务。
由于渲染是异步的,因此Equalizer引入了一个配置延迟,它定义了最慢的渲染线程可以落后多少帧,以便于充分利用资源。
一个compound提供output frames表示向其他节点输出帧,input frames表示从其他节点接收的帧,input frames和output frames用name链接。

一个简单的Compound配置如下所示,其中viewport的四个参数分别为x,y,宽和高。
range代表渲染的数据集的比例。

Compound Configuration

合成的配置如下所示:

Compositing Configuration

Compound Tree配置案例

sort-first

sort-first

sort-last

sort-last

Stereo sort-first

stereo sort-first
其中Eye表示VR中的左眼或右眼

实际案例

CAVE

Equalizer实现

需要提供Channel::frameDraw()的实现,用于将渲染例程通过Equalizer并行渲染。cull()和draw()函数由frameDraw进行调用。
此外,渲染参数如摄像机数据被实现为分布式对象,该应用程序的子类基于eqNet::Object基类,并为基类提供数据的指针和大小以便于网络部署。在初始化期间,对象在渲染会话中注册。在每一帧的开始,将提交该对象的一个新版本,并由Equalizer将新版本传递给渲染回调,Equalzier将其对象实例同步到给定版本。
渲染结构由Equalizer基于compound tree进行收集。
高级应用程序可以为渲染的任何阶段提供实现,比如可以覆盖Channel::frameAssemble(),以实现帧图像的自定义合成。
虽然compound tree中的值是固定的但可以根据应用程序的需求(比如负载均衡)进行更新。

Equalizer的UML图如下所示:
UML

总结

Equalizer提供了一种非常便于配置的并行渲染框架,这十分利于在此之上设计负载均衡算法。此外,该框架可以实现渲染的任何阶段,以设计自己的渲染逻辑,使得该框架没有那么死板。程序员似乎不需要考虑Equalizer内部的通信过程,只需要通过eqNet便可以轻松实现自动的分布式对象。