0030573: OSD_Parallel_TBB: limit number of execution threads using settings of OSD_Th...
authoroan <oan@opencascade.com>
Thu, 14 Mar 2019 16:22:04 +0000 (19:22 +0300)
committerapn <apn@opencascade.com>
Sat, 16 Mar 2019 13:46:53 +0000 (16:46 +0300)
Add tbb::task_scheduler_init to OSD_Parallel::forEach().

src/OSD/OSD_Parallel_TBB.cxx

index 508119f..425fdf2 100644 (file)
 #ifdef HAVE_TBB
 
 #include <OSD_Parallel.hxx>
+#include <OSD_ThreadPool.hxx>
 #include <Standard_ProgramError.hxx>
 
 #include <tbb/parallel_for.h>
 #include <tbb/parallel_for_each.h>
 #include <tbb/blocked_range.h>
+#include <tbb/task_scheduler_init.h>
 
 //=======================================================================
 //function : forEach
@@ -34,15 +36,19 @@ void OSD_Parallel::forEach (UniversalIterator& theBegin,
                             const FunctorInterface& theFunctor,
                             Standard_Integer theNbItems)
 {
-  (void )theNbItems;
   try
   {
-    tbb::parallel_for_each(theBegin, theEnd, theFunctor);
+    const Handle(OSD_ThreadPool)& aThreadPool = OSD_ThreadPool::DefaultPool();
+    const Standard_Integer aNbThreads = theNbItems > 0 ?
+      Min (theNbItems, aThreadPool->NbDefaultThreadsToLaunch()) : -1;
+
+    tbb::task_scheduler_init aScheduler (aNbThreads);
+    tbb::parallel_for_each (theBegin, theEnd, theFunctor);
   }
   catch (tbb::captured_exception& anException)
   {
-    throw Standard_ProgramError(anException.what());
+    throw Standard_ProgramError (anException.what());
   }
 }
 
-#endif /* HAVE_TBB */
\ No newline at end of file
+#endif /* HAVE_TBB */