| 
					
				 | 
			
			
				@@ -68,7 +68,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <tbb/parallel_for.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <tbb/task_scheduler_init.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <tbb/task_arena.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace ceres { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -198,8 +198,10 @@ Eliminate(const BlockSparseMatrix* A, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifndef CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for (int i = num_eliminate_blocks_; i < num_col_blocks; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tbb::task_scheduler_init tbb_task_scheduler_init(num_threads_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tbb::parallel_for(num_eliminate_blocks_, num_col_blocks, [&](int i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tbb::task_arena task_arena(num_threads_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    task_arena.execute([&]{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      tbb::parallel_for(num_eliminate_blocks_, num_col_blocks, [&](int i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif // !CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const int block_id = i - num_eliminate_blocks_; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -220,6 +222,7 @@ Eliminate(const BlockSparseMatrix* A, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif // CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -245,8 +248,10 @@ Eliminate(const BlockSparseMatrix* A, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifndef CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (int i = 0; i < chunks_.size(); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tbb::task_scheduler_init tbb_task_scheduler_init(num_threads_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tbb::parallel_for(0, int(chunks_.size()), [&](int i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tbb::task_arena task_arena(num_threads_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  task_arena.execute([&]{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tbb::parallel_for(0, int(chunks_.size()), [&](int i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif // !CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const ScopedThreadToken scoped_thread_token(&thread_token_provider); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -317,7 +322,8 @@ Eliminate(const BlockSparseMatrix* A, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         thread_id, bs, inverse_ete, buffer, chunk.buffer_layout, lhs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif // CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // For rows with no e_blocks, the schur complement update reduces to 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -342,8 +348,10 @@ BackSubstitute(const BlockSparseMatrix* A, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifndef CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (int i = 0; i < chunks_.size(); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tbb::task_scheduler_init tbb_task_scheduler_init(num_threads_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tbb::parallel_for(0, int(chunks_.size()), [&](int i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tbb::task_arena task_arena(num_threads_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  task_arena.execute([&]{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tbb::parallel_for(0, int(chunks_.size()), [&](int i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif // !CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const Chunk& chunk = chunks_[i]; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -403,6 +411,7 @@ BackSubstitute(const BlockSparseMatrix* A, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif // CERES_USE_TBB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |