diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp index df6c17c5b..1d10bad92 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp @@ -284,26 +284,29 @@ struct UpdaterUnconstrainedMotion : public btIParallelForBody void btDiscreteDynamicsWorldMt::predictUnconstraintMotion( btScalar timeStep ) { BT_PROFILE( "predictUnconstraintMotion" ); - int grainSize = 50; // num of iterations per task for TBB - int bodyCount = m_nonStaticRigidBodies.size(); - UpdaterUnconstrainedMotion update; - update.timeStep = timeStep; - update.rigidBodies = bodyCount ? &m_nonStaticRigidBodies[ 0 ] : NULL; - btParallelFor( 0, bodyCount, grainSize, update ); + if ( m_nonStaticRigidBodies.size() > 0 ) + { + UpdaterUnconstrainedMotion update; + update.timeStep = timeStep; + update.rigidBodies = &m_nonStaticRigidBodies[ 0 ]; + int grainSize = 50; // num of iterations per task for task scheduler + btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update ); + } } void btDiscreteDynamicsWorldMt::createPredictiveContacts( btScalar timeStep ) { + BT_PROFILE( "createPredictiveContacts" ); releasePredictiveContacts(); - int grainSize = 50; // num of iterations per task for TBB or OPENMP - if ( int bodyCount = m_nonStaticRigidBodies.size() ) + if ( m_nonStaticRigidBodies.size() > 0 ) { UpdaterCreatePredictiveContacts update; update.world = this; update.timeStep = timeStep; update.rigidBodies = &m_nonStaticRigidBodies[ 0 ]; - btParallelFor( 0, bodyCount, grainSize, update ); + int grainSize = 50; // num of iterations per task for task scheduler + btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update ); } } @@ -311,14 +314,14 @@ void btDiscreteDynamicsWorldMt::createPredictiveContacts( btScalar timeStep ) void btDiscreteDynamicsWorldMt::integrateTransforms( btScalar timeStep ) { BT_PROFILE( "integrateTransforms" ); - int grainSize = 50; // num of iterations per task for TBB or OPENMP - if ( int bodyCount = m_nonStaticRigidBodies.size() ) + if ( m_nonStaticRigidBodies.size() > 0 ) { UpdaterIntegrateTransforms update; update.world = this; update.timeStep = timeStep; update.rigidBodies = &m_nonStaticRigidBodies[ 0 ]; - btParallelFor( 0, bodyCount, grainSize, update ); + int grainSize = 50; // num of iterations per task for task scheduler + btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update ); } } diff --git a/src/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp b/src/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp index 6373f60ff..99b34353c 100644 --- a/src/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp +++ b/src/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp @@ -548,6 +548,7 @@ void btSimulationIslandManagerMt::mergeIslands() void btSimulationIslandManagerMt::serialIslandDispatch( btAlignedObjectArray* islandsPtr, IslandCallback* callback ) { + BT_PROFILE( "serialIslandDispatch" ); // serial dispatch btAlignedObjectArray& islands = *islandsPtr; for ( int i = 0; i < islands.size(); ++i ) @@ -592,6 +593,7 @@ struct UpdateIslandDispatcher : public btIParallelForBody void btSimulationIslandManagerMt::parallelIslandDispatch( btAlignedObjectArray* islandsPtr, IslandCallback* callback ) { + BT_PROFILE( "parallelIslandDispatch" ); int grainSize = 1; // iterations per task UpdateIslandDispatcher dispatcher; dispatcher.islandsPtr = islandsPtr; diff --git a/src/LinearMath/btThreads.cpp b/src/LinearMath/btThreads.cpp index 85de7c4d2..876bc4bb1 100644 --- a/src/LinearMath/btThreads.cpp +++ b/src/LinearMath/btThreads.cpp @@ -14,6 +14,7 @@ subject to the following restrictions: #include "btThreads.h" +#include "btQuickprof.h" #include // for min and max #if BT_THREADSAFE @@ -114,10 +115,12 @@ public: } virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE { + BT_PROFILE( "parallelFor_OpenMP" ); btPushThreadsAreRunning(); #pragma omp parallel for schedule( static, 1 ) for ( int i = iBegin; i < iEnd; i += grainSize ) { + BT_PROFILE( "OpenMP_job" ); body.forLoop( i, ( std::min )( i + grainSize, iEnd ) ); } btPopThreadsAreRunning(); @@ -174,11 +177,13 @@ public: void operator()( const tbb::blocked_range& range ) const { + BT_PROFILE( "TBB_job" ); mBody->forLoop( range.begin(), range.end() ); } }; virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE { + BT_PROFILE( "parallelFor_TBB" ); // TBB dispatch BodyAdapter tbbBody; tbbBody.mBody = &body; @@ -232,11 +237,13 @@ public: void operator()( int i ) const { + BT_PROFILE( "PPL_job" ); mBody->forLoop( i, ( std::min )( i + mGrainSize, mIndexEnd ) ); } }; virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE { + BT_PROFILE( "parallelFor_PPL" ); // PPL dispatch BodyAdapter pplBody; pplBody.mBody = &body; @@ -488,6 +495,7 @@ public: virtual void setNumThreads( int numThreads ) BT_OVERRIDE {} virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE { + BT_PROFILE( "parallelFor_sequential" ); body.forLoop( iBegin, iEnd ); } };