The logic seems to be if there are more than 1 CPU, and the threadingModel is 
set to singlethreaded (the default), then set CPU affinity (on what is very 
likely the main thread of the application) to 0.

This really seems to be a poor idea - it might help a specific OSG app 
configuration, but silently causes unexpected and almost certainly undesirable 
behaviour in situations where the programmer is doing their own multithreading.

Its fine to say 'you can reset the CPU affinity manually' but why would anyone 
think they would need to do this? The only way you notice this is that your app 
turns into a jerkfest and 'top' puzzlingly shows the OSG app pegging a single 
core while the others sit idle. 

Running multiple instances of an OSG-based app where the viewer is hardcoding 
CPU affinity to 0 on both instances is also not going to be pretty, despite the 
app seemingly working acceptably during single-process testing.

Moving a line of code to create a thread from before the Viewer is initialised 
to after it will also do very different things w/regard to CPU resource usage.

This also introduces discrepancies between behaviour on different platforms - 
as setting CPU affinity on OS X does basically nothing, so the same app running 
on OS X will scale to use all cores just fine - however if/when you did add 
support for OS X setCPUAffinity to OpenThreads, you would be forcing 
programmers to write platform-specific hacks around OSG's hardcoded behaviour 
(since there is no 'unset cpu affinity' function in OpenThreads) , instead of 
treating OSG as a cross-platform library.

Surely if the programmer wishes CPU affinity to be set, this should be 
explicit, and should return some kind of status so the programmer is aware the 
operation did not succeed (e.g. on OS X).

It seems to me that there is no reason apps  cannot make the same direct 
OpenThreads call to set CPU affinity, if this is desired, rather than baking it 
into the guts of osgViewer.



Code:

void ViewerBase::setUpThreading()
{
    ...
    if (_threadingModel==SingleThreaded)
    {
        if (_threadsRunning) stopThreading();
        else
        {
            // we'll set processor affinity here to help single threaded apps
            // with multiple processor cores, and using the database pager.
            int numProcessors = OpenThreads::GetNumberOfProcessors();
            bool affinity = numProcessors>1;
            if (affinity)
            {
                OpenThreads::SetProcessorAffinityOfCurrentThread(0);
                ...
            }




------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=65784#65784





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to