[osg-users] SingleThreaded leading to whole application just running on one core

Christoph Weiss weiss at wsoptics.de
Fri Sep 23 01:19:50 PDT 2016


Hi Robert,

> When running SingleThread the OSG just sets the affinity of the
> current thread.  That's it, that's all it's doing.

This actually has a very bad side effect that I only noticed now.  Since 
it explicitly sets the affinity to core zero, any other application that 
does so will share its CPU entirely with it.  In particular if you start 
a SingleThread OSG application twice, it will share the core and have 
degraded performance.

I also wouldn't be surprised if the kernel favors core zero for things 
that aren't properly multithreaded, but I'm just guessing here, and 
maybe that's a thing of the past already, at least under linux.

I'm not even sure why setting the CPU affinity to a single core should 
improve performance at all unless the OS's scheduler performs poorly.

> It does not explicitly change the affinity of any of threads created
> by user applications.  I think what Pete found was under Linux is that
> threads created after the set affinity to the current thread, all
> threads created by that thread then inherit that affinity, which what
> his code snippet looks to work around.

Yes, they inherit the mask.  It would be quite similar if OSG set up a 
ulimit().

>> Judging by your comment, this has already been discussed and not deemed a
>> fault that should be fixed?
>
> Changing something that was done by design because one class of usage
> on one platform doesn't do exactly what they want.  There isn't a bug
> to fix here.  It's sub-optimal behavior for certain types of
> application usage on certain platforms.

I agree, it's not a bug, it's a design choice.  However, it's a rather 
strict enforcement on the user.

> I haven't yet seen a reason to change the behaviour, it's not the case
> that the behaviour is wrong for all users, it's not a bug.  Removing
> the setting of affinity would leave the main thread to float around
> and increase the changes of breaking cache.  The OSG is just trying to
> do something sensible out of the box for most users.

I totally understand that.  But I disagree with it being the most 
sensible choice ;)  Subclassing CompositeViewer is a good solution.  For 
me, it really does not make that much of a difference if the design is 
changed or not.  I'd be surprised if I was the last to run into this 
issue though and spend quite some time on figuring this out.

Apart from this, I think in general a library should not impose 
restrictions on the calling thread without it explicitly asking for 
them.  Suppose a library just decided to close file descriptors 0, 1, 2 
because it doesn't need them and can thus save some memory...

> In the case of Qt application, they should be run multi-theaded, for
> all the native windowing systems the OSG support all work
> multi-threaded without any problem.  Unfortunately Qt has created a
> series of problems on the threading front that we've had to try and
> work around, Qt then goes and moves the goal posts though between
> releases. it's been a real pain to try and keep osgQt working well
> over the years.  If you don't need a traditional 2D UI then it's
> generally best to avoid Qt as it causes problems because it has it's
> way of working that doesn't fit well with the needs of real-time
> visualization.

Alas, we're quite stuck with Qt since we require a 2D UI.  But thanks 
for the information.

Christoph



More information about the osg-users mailing list