Frame Lock / V-Sync and Multi-GPU - Best Practices?

Two part question for ya’ll:

  1. When using hardware that is genlocked / locked at the GPU, should you enable “Hardware Frame-Lock” and/or “V-Sync” on your output windows? I’m finding that with a 720p60Hz external sync source, as soon as I enable “Hardware Frame Lock,” my framerate drops to 30fps.

  2. Any thoughts on the best way to share textures between GPUs on a Windows PC? Shared Mem TOPs seem to cause an unacceptable performance hit. Spout and DirectX seem pretty good, but will they work across multiple GPUs? Any other brilliant ideas?

Currently working with 2020.24520 64-bit running on Windows 10 with a WX7100 and S400 Sync card.

The hardware frame-lock is used to sync the vsync of multiple windows coming from multple GPUs (only 1 window per GPU ideally though). It does have an overhead though so it’s possible your framerate will be worse with it in. Make sure you are using Perform Mode when enabling it.

There isn’t any good ways to get data between GPUs. Shared Mem is likely the best way. What kind of data are you trying to get between the GPUs?

Thanks, Malcolm! That makes sense. So for a single-GPU system with external genlock, I should enable V-Sync and disable Hardware Frame Lock?

On a multi-GPU system where both cards are synchronized with a sync card (via the AMD/Nvidia panel), do I still need to enable Hardware Frame Lock? Or will simply enabling V-Sync let the GPU and its sync card handle it?

For sharing between GPUs, it’d be large textures - possibly as high as 15360 x 2160. Any thoughts on improving performance with Shared Mem? In my test project (which admittedly is a little busy) trying to share a 7680 x 2160 texture yielded the following:
Spout @ 60 fps
DirectX @ 54 fps
Touchout HapQ @ 48 fps
NDI 8bit @ 40 fps
Touchout Uncompressed @ 32 fps
Sharedmem Local @ 24 fps
Sharedmem Global @ 18 fps

What hardware frame lock gives you is a guarantee that a Window on GPU 1 won’t update unless the Window on GPU 2 is also ready to update. This means if one drops a frame, they both will. Often, depending on your content, this doesn’t actually matter. This is the only thing that hardware frame lock gives you. The Vsyncs of both GPUs will be in sync with your genlock regardless of if the window updates between the processes are frame locked.

What is the content on one GPU that you need to get to the other though? Can you not just re-create the content on the 2nd GPU as well?

Ah gotcha, totally makes sense RE: frame lock / v-sync - thanks!

The project is very UI-driven and composites quite a bit of geometry / lights / movie players / modifiers, etc - so to be honest, I hadn’t really considered recreating the content as an option - but now you’ve got me thinking about it haha :slight_smile:

All that “stuff” gets composited and needs to feed some very large LED walls, so I was hoping to simply carve out a slice to share with another simpler .toe running on the other GPU to spit its slice out of its outputs.

If possible, try to use a splitter and a single GPU instead of multiple GPUs. That’ll make managing this much easier.