Wouldn’t it be nice if we could be able to choose which GPU to render with on Eevee? I know having it rendering on several cards are probably out (even tho it would be awesome). But being able to choose a different card than that which is hooked up to the screen would be very helpful too.
There’s a suggestion on RightClickSelect for those who want to vote it up…
This is much easier said than done. Since Eevee is essentially a real-time graphics engine and isn’t being used as a compute device, it is far from trivial showing render results via a display device other than the one doing the work.
You can’t really do that with OpenGL (which is the hardware interface Eevee uses right now), but it should work with Vulkan (which is another hardware interface that Evee may support in the future). This has nothing to do with multithreading by the way, but that’s another thing that doesn’t really work well with OpenGL.
That level of code wizardry isn’t my expertise but maybe there could be something like Looking Glass to start a second process and render every other frame. I believe Eevee is most interesting for animations anyway.
Wouldn’t be exactly multithreading but should give a significant boost.
That wouldn’t just be starting a second process, that would be running a virtual machine (complete with its own operating system) that has its own GPU (which the host operating system then cannot use).
You could do that right now and render with Eevee from the commandline, or maybe some cluster rendering manager. You could even scale to multiple machines.
Again, this has nothing to do with multithreading. You can use multiple GPUs from a single thread, just not with OpenGL.
Yeah, should have worded that differently. (Not very fond of typing much when I’m on my phone). I am aware, that firing up a VM isn’t feasible for this. I just wondered if it might be possible to capture the output of a card within the same os.
But then you are right. We already are able to do this by simply starting two instances. I guess I was simply on the wrong track.
Never mind…
For what it’s worth, the Blender developers are aware of the desire to have this… it’d be especially useful for those of us rendering on farms or on machines with two or more GPUs. But as already noted, it’s a non-trivial task.
The difficulty, as I understand it (I’m sure someone will correct me if I’m wrong) is that Eevee is a realtime render engine that depends on OpenGL. If you’re rendering with OpenGL, it requires something called a “context” for drawing… and that context requires a screen to draw upon. Since typically only one GPU is ever used for drawing to the screen, that’s the only one that’s available for OpenGL rendering… and, by extension, that’s the only GPU available to Eevee.
There might be some ways to work around this, but from what I can tell, that’s exactly what they are: workarounds… and sometimes pretty kludgey ones at that.
I have a hope that this can be handled in the future… but I wouldn’t count on seeing it anywhere in the near term.
it is also true that today many games use multi gpu for better performance … I do not know if it only applies to direct x … but in theory it is a possible technique
The multi-GPU support for older APIs is something that the driver does, developers have no control over it and it only works in fullscreen. It also requires two equal GPUs.
The GPU affinity feature on NVIDIA GPUs (that beetdrabat mentioned) is something that can be controlled via an OpenGL extension, but it doesn’t allow for multiple device contexts for different GPUs.
For that, you need the newer APIs (Vulkan/D3D12) and then you can also do multi-GPU with different types of GPUs. Load-balancing is challenging though, so very few games (like Ashes of the Singularity) will support that.