Equalizer logo
Collage logo
GPU-SD logo

Cross-Segment Load Balancing

Author: eilemann@gmail.com
State:

Overview

Cross-segment load balancing allocates resources (GPUs) dynamically to a set of destination channels. Normally all destination channels managed by a view equalizer belong to multiple segments (displays) of a single view.

A configuration with cross-segment load balancing is hierarchical. The top-level compound has a view equalizer. Each child of this root compound has one destination channel and a load equalizer. Each destination channel compound has the potential leaf nodes executing the rendering. One resource is normally used in multiple leaf nodes of different destination compounds.

For each frame, the view equalizer sets the usage of each leaf compound to activate or deactivate it for rendering. The load equalizer assigns work to each leaf compound according to its allowed usage.

Cross-segment load balancing
Cross-segment load balancing

The Figure on the right depicts a snapshot of a simple cross-segment load balancing setup. Two destination channel, each connected to a projector, create the final output. Each projector is driven be a distinct GPU. Each GPU can potentially contribute to the rendering of the other segment (and GPU) through the channels Source 1 and 2.

The left segment has a lower load than the right segment. Consequently, the view equalizer assigns 80% of the 'left' GPU to the left segment, and 20% to the right segment. The 'right' GPU is fully assigned to the right segment, assigning 0.8 resources to the right segment and 1.2 to the left. The load balancing within a segment is performed by the load equalizer assigned to each segment and not described here.

Cross-segment load balancing allows for optimal resource usage of multiple GPUs used for display output and additional source GPUs. It combines multi-display parallel rendering with scalable rendering for optimal performance.

Algorithm

File Format

  compound
  {
      view_equalizer {}
      compound
      {
          channel "destination1"
          load_equalizer{}
          compound {} # self
          compound { channel "source1" outputframe {} }
          inputframe{}
          ...
      }
      compound
      {
          channel "destination2"
          load_equalizer{}
          ...
      }
      ...
  }