Start typing to search...

Outputs and Channels, Multi-GPU


In this tutorial, we deal with the handling of video cards, the configuring of video outputs, and using the internal video channels of the Composer.


What is considered to be an output in Aximmetry? Primarily the monitors connected to the PC which can function as fullscreen displays. Secondly, the special I/O cards installed on the PC, for e.g. the cards capable of inputting and outputting SDI standard signals used in professional TV studios.


After starting Composer first we get a Startup Configuration window with a Video Outputs section. Here the available video outputs are listed. The list starts with the connected monitors. Currently, we have two monitors. For each of them, we can see the type of the monitor and the video card it’s plugged into. These two make up the unique name of the output. Also, we can see the resolution and the refresh frequency of the monitor. In this case, both monitors have full HD resolution and are running at 60Hz.


The other four outputs in this case represent the four available output channels of an AJA Corvid SDI card installed on the PC. Each of these have a configurable mode that determines the resolution and the frame rate of the channel. If we click the three-dots button we get a mode selector dialog. Here we can choose between the standard resolutions going from SD through HD until 4K. For each resolution, we can specify a frame rate including both the interlaced and the progressive ones. The default mode is the 1080i50 meaning the European HD standard with the 50Hz interlaced rate.


While we are in the Startup Configuration window we can see an ID panel on each output so that we can easily pair the listed items with the actual outputs. Each panel displays an index that corresponds with the numbers on the left side of the list items. In fact, these are buttons, and by clicking on them we can make their panels blink, thus making the identification easier.


Currently, we cannot see it in this video, but the ID panels are displayed on the SDI outputs as well. They’re displayed in a fullscreen format to make it easier to identify them on the split displays frequently used in studio control rooms.


The panels on the normal monitors can also be enlarged into a fullscreen format. It can be useful for e.g. when setting up projectors. For that, we have to turn on this little magnifier button. We cannot see anything yet, this is because on the specific monitor that contains the Startup Configuration window the enlargement is not applied to avoid mutual covering. So for now I drag the window to another monitor, and now we can see the fullscreen format.


The next step is to choose the outputs we want to use from Composer. We have to give each of these a logical identifier number, which should not be mistaken with the previously mentioned indices at the left of the list. The logical numbers later can be used in Composer to target specific outputs.


Let’s make output #1 one of our monitors. Of course, in a real-life situation, we would choose the secondary monitor currently not visible in this video, because the primary monitor will be occupied by the Composer UI. But now for the sake of the tutorial I’ll choose this monitor, which is monitor number 2 here in the list. I set it as output #1. We can see that #1 is displayed here on the ID panel. Then let’s make output #2 the first AJA channel.


Our next task is to assign Sync to one of our designated outputs. Basically, it synchronizes the rendering framerate to the frequency of the selected output. If we only use PC monitors, it’s not strictly required to assign Sync to one of them, however, it’s recommended. But if we use an SDI output, it’s crucial to assign the Synch to it.


If we set Sync to an output, it is displayed on the corresponding ID panel with red. When we assign Sync to a PC monitor the rendering framerate will be adjusted to the monitor frequency or one of its dividers. In this case, we have a 60Hz monitor, so we’ll be able to choose between 60, 30, or 15 fps rendering. It can be set in the Preferences, I’ll show it after starting the application.


In the case, we assign Sync to an I/O card the rendering framerate will be fixed strictly to the framerate of the device regardless of our Preferences settings. In this case, it means a 50 fps rendering since we set the video mode of the AJA card to i50. Furthermore, if we even selected an I/O card for outputting we have to put Sync there since most likely it will be our main output sending the signal into our studio system. The regular PC monitor will serve as a control display only, therefore it doesn’t matter that it may will show a bit twitching picture.


So we assigned numbers to the desired outputs and also set Sync. Let’s start Composer. We’ve seen the fullscreen monitor output appearing for a moment. During the tutorial, I’ll keep switching between the output and the GUI when necessary.


First of all let’s see the Preferences window I mentioned before by clicking Preferences in the Edit menu. Go to the Rendering section. We can find the Frame rate setting there. We can set any rendering frequency. We’re offered a number of standard framerates we can choose from, but we also can specify an arbitrary one by typing it in, for e.g. make it 52. In the case no Sync is assigned to any outputs, the system will render with the exact framerate we specified.


But if Sync is assigned the framerate will be overridden. If we assigned Sync to a PC monitor the framerate will be rounded to the closest divider of the monitor frequency. Since we have assigned Sync to an SDI output the framerate will be 50 completely regardless of what we specify here. For now, let’s set it back to default.


We can also find here the default Frame size of the rendering. Since we currently have HD1080 outputs it’s advisable to render in the same frame size. Of course, we can decide to render in Ultra HD and downscale the result on the output, thus improving the quality of the picture, but, of course, at the same time increasing the GPU load. Let’s set it back to Full HD.


Let’s examine how our rendered video signals get to the selected outputs. We create a new compound and add a couple of scenes we created in the Getting Started tutorials. Here is the Basics scene with 2D effects and the 3D one containing a simple 3D scene. Let’s expose their output to the right side one after the other. What’s happening upon doing this exactly? These video signals go to the so-called Channels of Composer. The firstly exposed one goes to Channel 1 and the secondly exposed one goes to Channel 2.


We can see these channels directly using the Preview panels. For each Preview, we can choose which channel we wish to see it on. For e.g. if I assign Channel 2 to Preview 1 we’ll see the same picture on both Previews here.


In Composer 99 channels are available. They’re not only accessible via wiring out video signals to the right one by one, but there’s also a direct way. Let’s load a third scene which is our animation sample scene. Suppose we want to send its output to Channel 43. For this, we have to add a Channel Out module and wire the output into it. Then we have to specify the channel number which is 43 in this case. From now on if we select Channel 43 on a Preview panel we’ll see the animation scene on it.


So far we only talked about channels that can be displayed on the Preview panels. But how do these signals reach our actual outputs? This is controlled by the so-called Channel Matrix which can be set up in the Preferences dialog. In the Channel Matrix section, we can see a list of our selected outputs. In this case one for the monitor and one for the AJA SDI output. For each output, we can specify a source channel to display. By default, these are set to the channel numbers identical to the output numbers. Channel 1 goes to Output #1 and Channel 2 goes to Output #2. And therefore the video signal firstly exposed at the right goes to Output #1 and the secondly exposed one goes to Output #2 etc. by default. So if I now switch to the fullscreen output which is Output #1 we can see that it shows our first signal with the 2D animation scene.


We can override this in the Channel Matrix. For e.g. make Channel 43 go to Output #1. We can see immediately that our third scene with the 3D animation is shown on the fullscreen output.


There’s another special module that is capable of sending video signals directly to the outputs circumventing the channel system. It’s called Video Out. Let’s remove our output exposions. Wire the 3D scenes into the Video Out module, and set its Output Index to 1. By doing this we send the video signal directly to Output #1 regardless of the Channel Matrix settings.


Furthermore, the Video Out module can be even more specific in the case when we use a multi-machine configuration. We can specify an individual machine and target one of its outputs with the module. Multi-machine situations are described in a separate tutorial.


Let’s return to the Preview panels for a bit. Currently, we can see two of them here, but there are a total of 9 of them in the system. These can be shown at will using the Previews submenu of the View menu. Alternatively, we can use the Alt + Numpad digit keyboard combinations. For e.g. let’s show the Preview 3 and 4 panels by pressing the Alt + Numpad 3 and 4 shortcuts. These, of course, can be placed anywhere in the docking system. For each of them, we can select a channel that it displays. Let’s select Channel 43 for Preview 3 and Channel 2 for Preview 4.


Let me emphasize once more: Preview panels display the signals going to the Channels, that must not be confused with the signals going to the Outputs. The latter is a product of the Channel signals going through the Channel Matrix.


Now let’s examine the case when two or more video cards are installed in the PC. How can we exploit the potentials of such a configuration? Our example PC here is equipped with two very different video cards: an old NVidia GTX 580 and a GTX 1080. We also have two monitors each connected to its own video cards.


The two video cards also mean two GPUs. And here comes this upper GPU selector field we haven’t talked about yet into the picture. From a dropdown list, we can choose which GPU we want to use for rendering. We have two very different GPUs regarding their performance. So if we plan to use a single GPU only for the rendering then we should select the stronger one, the 1080 in this case. Despite using two monitors connected to two different video cards, we can select both monitors for output, meaning that the image rendered on the 1080 still can be displayed on the monitor attached to the 580 as well.


But what if we want to render two completely different contents to the two monitors and we ran short of GPU performance? It’s logical to render each content on its own GPU thus distributing the load. This can be achieved using one of the Multi-GPU modes called Independent. In this mode, we can select multiple - 4 at maximum - GPUs. Let’s select our two available GPUs.


We can also see that for each output a GPU selector field has become available. That means that for each output we can specify which GPU we want to render on. It’s highly advisable that each GPU renders the content of its own connected monitor to avoid unnecessary data traffic. This configuration can be set up automatically by clicking the small A button here. We can see that the monitor attached to the 580 card is automatically assigned to GPU2 which is the 580 GPU of course. In the Independent mode, each output identifier panel is also extended with a field showing the selected GPU number for that output.


Let’s load out previous scene. Upon doing this the following happens. All the graphical data belonging to the scene is loaded into both video cards. So we have to be careful: we have to ensure that each video card has the necessary amount of onboard memory. But if we connect two completely separated content to the two outputs, meaning that there’s no wiring between the two subgraphs whatsoever, the two GPUs will only render it’s own graphical content. One GPU will only render this part and the other will only render this part.


At the moment this is not entirely true. We have to be careful with the Previews as well. Previews are always rendered on GPU1, so in this case, we still load GPU1 with both contents. Let’s switch off both Previews. What I’ve said before now it’s true: each GPU only renders its own content. Also, note that displaying a peeker window on a wire or a pin also loads GPU1.


What other cases can ruin the independent rendering? Obviously, any case that creates a connection between the two content. For e.g. let’s blend the two video signals together. In this case, the mix of the two content goes to Output #1, so GPU1 has to render both parts while the loaded GPU2 load remains untouched.


A bit of a more complex example is when we have three different parts and we blend the third part into the two others. In this case GPU1 will render parts 1 and 3 while GPU2 will render part 2 and 3 together.


What’s the situation with this Channel Out module here? Currently, nothing, since we directed it to Channel 43 which is displayed neither on any Previews nor on any outputs, so it would not add any load to the GPUs in itself. Of course, in the moment I select it for a Preview, it will add its own load on GPU1. (Not in this particular case, because part 3 is already rendered anyway because of the blending.)


To summarize, the Independent GPU mode can be exploited only in the case when the scene graph contains at least as many independent parts as the number of GPUs, and these parts are meant to be displayed on different outputs.


There’s another Multi-GPU mode available, but it’s only usable when we direct out outputs to I/O cards. So it cannot be used properly with normal PC monitors. It’s based on rendering two or more consecutive frames at the same time parallel on the multiple GPUs thus multiplying the usable GPU performance per frame. The frames rendered this way are lined up afterwards and sent to the I/O card sequentially.


This mode is called Linked. We have to select the GPUs in this mode as well. But, in contrary to the Independent GPU mode, it’s advisable to use the same video card model for each slot, or else the weakest card will determine the overall performance of the system.


Let’s select the AJA card as output, and assign Sync to it. Its current video mode is 1080i50, meaning that the system has to render 50 frames per second. If we distribute it to two GPUs then each GPU only renders 25 frames per second. i50 also means an interlaced mode, so after parallel rendering two consecutive frames, the system interleaves them into a single frame that is sent to the output afterwards. In the case, we choose the p50 mode the system simply buffers the two frames rendered parallel and sends them out in succession.

And this concludes the tutorial of the output modes.

Article content

Loading spinner icon