[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