[osg-users] Running multiple (independent) viewers in different threads
Antoine Cully
antoinecully at hotmail.com
Wed May 22 09:49:34 PDT 2019
Dear OSG Community,
I searched quite a lot through the source code and the beginner guide, but I was unable to find a way to make this work, so I am posting here hoping that you could help me.
I am developing a tool to run physical simulations (of robots) in parallel. This tool is used to run stochastic optimisation (like deep reinforcement learning) algorithms, and for this I need to be able to run several, but fully independent, simulations in parallel thanks to multithreading. This enables to collect data faster and for instance with a 32-core multithreaded CPU the speed-up factor is quite significant.
In each simulation, I have one camera that observes the environment, and which can be used to change the behaviour of the robot running in this simulation. The camera is currently implemented as a pbuffer following closely the osgscreencapture example. The actual code of the camera can be found on github, but apprently I am not allowed to post URLs at the moment.
The multithreading is managed by TBB (an Intel library that I have been using for 6 years now).
If I run my code in a "sequential mode", i.e., all the simulations running one after the other, everything is going well. However, if I run it in parallel, then I have some unstable behaviours. For instance, I can have a segmentation fault happening after a random number of simulations or suddenly after again a random number of simulations, the pbuffer cannot be created anymore (OSG displays "Error: Unable to create pbuffer."). It seems to me that "::osg::ref_ptr<::osg::GraphicsContext> pbuffer = ::osg::GraphicsContext::createGraphicsContext(traits.get()); "
does not work in this setup.
If I remove the cameras (and all OSG components) from my code, it is working well in parallel, but of course I would like to have cameras in my simulations.
Ideally, I would like to run OSG in a single-thread mode and let TBB distribute the different instances of the simulator and OSG in different threads, but even with "setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded);" it does not work.
I tried different threading modes, with the same result.
So here is my question:
What would be the most appropriate way to run several independent viewers and pbuffers, each in a different thread?
The rendered scenes are really simple (no texture, just several primitive shapes) and I am only rendering a couple of frames in each simulation, so I don't need a complex threading model for OSG.
Some information about my system:
- Ubuntu 18.04
- OSG 3.6.4
Thank you in advance for your help.
Best regards,
Antoine
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=76134#76134
More information about the osg-users
mailing list