Remove Intel TBB threading support. - In light of the C++11 threads threading option this is no longer necessary for cross-platform threading support and did not offer a noticeable performance gain over either the C++11 threads implementation or OpenMP. Change-Id: Icb588d520888c19a1775171795b55bcaffb3d256
diff --git a/bazel/ceres.bzl b/bazel/ceres.bzl index 28eef28..cbd2c51 100644 --- a/bazel/ceres.bzl +++ b/bazel/ceres.bzl
@@ -93,7 +93,6 @@ "normal_prior.cc", "parallel_for_cxx.cc", "parallel_for_openmp.cc", - "parallel_for_tbb.cc", "parallel_utils.cc", "parameter_block_ordering.cc", "partitioned_matrix_view.cc",
diff --git a/cmake/CeresCompileOptionsToComponents.cmake b/cmake/CeresCompileOptionsToComponents.cmake index 971b833..e2e8ec8 100644 --- a/cmake/CeresCompileOptionsToComponents.cmake +++ b/cmake/CeresCompileOptionsToComponents.cmake
@@ -84,8 +84,6 @@ CERES_RESTRICT_SCHUR_SPECIALIZATION "SchurSpecializations") add_to_output_if_found(CURRENT_CERES_COMPILE_OPTIONS ${CERES_COMPONENTS_VAR} CERES_USE_OPENMP "OpenMP;Multithreading") - add_to_output_if_found(CURRENT_CERES_COMPILE_OPTIONS ${CERES_COMPONENTS_VAR} - CERES_USE_TBB "TBB;Multithreading") # Remove duplicates of SparseLinearAlgebraLibrary if multiple sparse backends # are present. list(REMOVE_DUPLICATES ${CERES_COMPONENTS_VAR})
diff --git a/cmake/CeresThreadingModels.cmake b/cmake/CeresThreadingModels.cmake index 910f4a8..24e8aab 100644 --- a/cmake/CeresThreadingModels.cmake +++ b/cmake/CeresThreadingModels.cmake
@@ -29,7 +29,7 @@ # Author: alexs.mac@gmail.com (Alex Stewart) # Ordered by expected preference. -set(CERES_THREADING_MODELS "CXX11_THREADS;OPENMP;TBB;NO_THREADS") +set(CERES_THREADING_MODELS "CXX11_THREADS;OPENMP;NO_THREADS") function(find_available_ceres_threading_models CERES_THREADING_MODELS_AVAILABLE_VAR) set(CERES_THREADING_MODELS_AVAILABLE ${CERES_THREADING_MODELS}) @@ -38,10 +38,6 @@ if (NOT OPENMP_FOUND) list(REMOVE_ITEM CERES_THREADING_MODELS_AVAILABLE "OPENMP") endif() - find_package(TBB QUIET) - if (NOT TBB_FOUND) - list(REMOVE_ITEM CERES_THREADING_MODELS_AVAILABLE "TBB") - endif() if (NOT CERES_THREADING_MODELS_AVAILABLE) # At least NO_THREADS should never be removed. This check is purely # protective against future threading model updates. @@ -62,12 +58,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") endmacro() -macro(set_ceres_threading_model_to_tbb) - find_package(TBB REQUIRED) - list(APPEND CERES_COMPILE_OPTIONS CERES_USE_TBB) - include_directories(${TBB_INCLUDE_DIRS}) -endmacro() - macro(set_ceres_threading_model_to_no_threads) list(APPEND CERES_COMPILE_OPTIONS CERES_NO_THREADS) endmacro() @@ -77,8 +67,6 @@ set_ceres_threading_model_to_cxx11_threads() elseif ("${CERES_THREADING_MODEL_TO_SET}" STREQUAL "OPENMP") set_ceres_threading_model_to_openmp() - elseif ("${CERES_THREADING_MODEL_TO_SET}" STREQUAL "TBB") - set_ceres_threading_model_to_tbb() elseif ("${CERES_THREADING_MODEL_TO_SET}" STREQUAL "NO_THREADS") set_ceres_threading_model_to_no_threads() else()
diff --git a/cmake/FindSuiteSparse.cmake b/cmake/FindSuiteSparse.cmake index e887e3b..e4de8b0 100644 --- a/cmake/FindSuiteSparse.cmake +++ b/cmake/FindSuiteSparse.cmake
@@ -105,12 +105,6 @@ # == Serial Graph Partitioning and Fill-reducing Matrix Ordering (METIS) # METIS_FOUND # METIS_LIBRARY -# -# == Intel Thread Building Blocks (TBB) -# TBB_FOUND -# TBB_LIBRARY -# TBB_MALLOC_FOUND -# TBB_MALLOC_LIBRARY # Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when # FindSuiteSparse was invoked.
diff --git a/cmake/config.h.in b/cmake/config.h.in index f766c5c..1caacfe 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in
@@ -75,8 +75,6 @@ @CERES_NO_THREADS@ // If defined Ceres was compiled with OpenMP multithreading support. @CERES_USE_OPENMP@ -// If defined Ceres was compiled with TBB multithreading support. -@CERES_USE_TBB@ // If defined Ceres was compiled with C++11 thread support. @CERES_USE_CXX11_THREADS@
diff --git a/docs/source/features.rst b/docs/source/features.rst index 6a4b652..579875e 100644 --- a/docs/source/features.rst +++ b/docs/source/features.rst
@@ -54,7 +54,7 @@ of Non-linear Conjugate Gradients, BFGS and LBFGS. * **Speed** - Ceres Solver has been extensively optimized, with C++ - templating, hand written linear algebra routines and OpenMP or TBB + templating, hand written linear algebra routines and OpenMP or C++11 threads based multithreading of the Jacobian evaluation and the linear solvers. * **Solution Quality** Ceres is the `best performing`_ solver on the NIST
diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 24ccc0c..51ad156 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst
@@ -98,10 +98,6 @@ ``SuiteSparse``, and optionally used by Ceres directly for some operations. -- `TBB <https://www.threadingbuildingblocks.org/>`_ is a C++11 template - library for parallel programming that optionally can be used as an - alternative to OpenMP. **Optional** - On ``UNIX`` OSes other than Mac OS X we recommend `ATLAS <http://math-atlas.sourceforge.net/>`_, which includes ``BLAS`` and ``LAPACK`` routines. It is also possible to use `OpenBLAS @@ -728,17 +724,11 @@ gains in the ``SPARSE_SCHUR`` solver, you can disable some of the template specializations by turning this ``OFF``. -#. ``CERES_THREADING_MODEL [Default: CXX11_THREADS > OPENMP > TBB > NO_THREADS]``: +#. ``CERES_THREADING_MODEL [Default: CXX11_THREADS > OPENMP > NO_THREADS]``: Multi-threading backend Ceres should be compiled with. This will automatically be set to only accept the available subset of threading options in the CMake GUI. - .. NOTE:: - - Up to and including version 4.4, TBB was licensed under - GPL/Commercial terms. From 2017.x versions onwards, TBB is licensed under - the Apache 2.0 license (and commerical terms). - #. ``BUILD_SHARED_LIBS [Default: OFF]``: By default Ceres is built as a static library, turn this ``ON`` to instead build Ceres as a shared library. @@ -926,9 +916,6 @@ #. ``OpenMP``: Ceres built with OpenMP (``CERES_THREADING_MODEL=OPENMP``). -#. ``TBB``: Ceres built with Intel Thread Building Blocks (TBB) - (``CERES_THREADING_MODEL=TBB``). - #. ``Multithreading``: Ceres built with *a* multithreading library. This is equivalent to (``CERES_THREAD != NO_THREADS``).
diff --git a/docs/source/nnls_solving.rst b/docs/source/nnls_solving.rst index 4a34b83..713d54d 100644 --- a/docs/source/nnls_solving.rst +++ b/docs/source/nnls_solving.rst
@@ -2210,8 +2210,8 @@ Number of threads actually used by the solver for Jacobian and residual evaluation. This number is not equal to - :member:`Solver::Summary::num_threads_given` if none of `OpenMP`, - `TBB` or `CXX11_THREADS` is available. + :member:`Solver::Summary::num_threads_given` if none of `OpenMP` + or `CXX11_THREADS` is available. .. member:: LinearSolverType Solver::Summary::linear_solver_type_given
diff --git a/include/ceres/internal/port.h b/include/ceres/internal/port.h index f579028..07bb505 100644 --- a/include/ceres/internal/port.h +++ b/include/ceres/internal/port.h
@@ -35,23 +35,19 @@ #include "ceres/internal/config.h" #if defined(CERES_USE_OPENMP) -# if defined(CERES_USE_TBB) || defined(CERES_USE_CXX11_THREADS) || defined(CERES_NO_THREADS) -# error CERES_USE_OPENMP is mutually exclusive to CERES_USE_TBB, CERES_USE_CXX11_THREADS, and CERES_NO_THREADS -# endif -#elif defined(CERES_USE_TBB) -# if defined(CERES_USE_OPENMP) || defined(CERES_USE_CXX11_THREADS) || defined(CERES_NO_THREADS) -# error CERES_USE_TBB is mutually exclusive to CERES_USE_OPENMP, CERES_USE_CXX11_THREADS and CERES_NO_THREADS +# if defined(CERES_USE_CXX11_THREADS) || defined(CERES_NO_THREADS) +# error CERES_USE_OPENMP is mutually exclusive to CERES_USE_CXX11_THREADS and CERES_NO_THREADS # endif #elif defined(CERES_USE_CXX11_THREADS) -# if defined(CERES_USE_OPENMP) || defined(CERES_USE_TBB) || defined(CERES_NO_THREADS) +# if defined(CERES_USE_OPENMP) || defined(CERES_NO_THREADS) # error CERES_USE_CXX11_THREADS is mutually exclusive to CERES_USE_OPENMP, CERES_USE_CXX11_THREADS and CERES_NO_THREADS # endif #elif defined(CERES_NO_THREADS) -# if defined(CERES_USE_OPENMP) || defined(CERES_USE_TBB) || defined(CERES_USE_CXX11_THREADS) -# error CERES_NO_THREADS is mutually exclusive to CERES_USE_OPENMP, CERES_USE_TBB and CERES_USE_CXX11_THREADS +# if defined(CERES_USE_OPENMP) || defined(CERES_USE_CXX11_THREADS) +# error CERES_NO_THREADS is mutually exclusive to CERES_USE_OPENMP and CERES_USE_CXX11_THREADS # endif #else -# error One of CERES_USE_OPENMP, CERES_USE_TBB,CERES_USE_CXX11_THREADS or CERES_NO_THREADS must be defined. +# error One of CERES_USE_OPENMP, CERES_USE_CXX11_THREADS or CERES_NO_THREADS must be defined. #endif // CERES_NO_SPARSE should be automatically defined by config.h if Ceres was
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt index a6999d8..0b0fc7d 100644 --- a/internal/ceres/CMakeLists.txt +++ b/internal/ceres/CMakeLists.txt
@@ -43,13 +43,6 @@ # Add thread library dependencies for OpenMP to the Ceres target. list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${CMAKE_THREAD_LIBS_INIT}) endif() -elseif (CERES_THREADING_MODEL STREQUAL "TBB") - set(CERES_PARALLEL_FOR_SRC parallel_for_tbb.cc) - list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${TBB_LIBRARIES}) - if (NOT MSVC) - # Add thread library dependencies for OpenMP to the Ceres target. - list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${CMAKE_THREAD_LIBS_INIT}) - endif (NOT MSVC) elseif (CERES_THREADING_MODEL STREQUAL "NO_THREADS") set(CERES_PARALLEL_FOR_SRC parallel_for_nothreads.cc) endif()
diff --git a/internal/ceres/covariance_impl.cc b/internal/ceres/covariance_impl.cc index f7f1dc9..4804173 100644 --- a/internal/ceres/covariance_impl.cc +++ b/internal/ceres/covariance_impl.cc
@@ -77,7 +77,7 @@ #ifdef CERES_NO_THREADS if (options_.num_threads > 1) { LOG(WARNING) - << "Neither OpenMP nor TBB support is compiled into this binary; " + << "No threading support is compiled into this binary; " << "only options.num_threads = 1 is supported. Switching " << "to single threaded mode."; options_.num_threads = 1;
diff --git a/internal/ceres/parallel_for_openmp.cc b/internal/ceres/parallel_for_openmp.cc index b64f3d7..ae35d6b 100644 --- a/internal/ceres/parallel_for_openmp.cc +++ b/internal/ceres/parallel_for_openmp.cc
@@ -31,7 +31,7 @@ // This include must come before any #ifndef check on Ceres compile options. #include "ceres/internal/port.h" -#if !(defined(CERES_USE_TBB) || defined(CERES_USE_CXX11_THREADS)) +#if defined(CERES_USE_OPENMP) #include "ceres/parallel_for.h" @@ -80,4 +80,4 @@ } // namespace internal } // namespace ceres -#endif // !(defined(CERES_USE_TBB) || defined(CERES_USE_CXX11_THREADS)) +#endif // defined(CERES_USE_OPENMP)
diff --git a/internal/ceres/parallel_for_tbb.cc b/internal/ceres/parallel_for_tbb.cc deleted file mode 100644 index e235b50..0000000 --- a/internal/ceres/parallel_for_tbb.cc +++ /dev/null
@@ -1,92 +0,0 @@ -// Ceres Solver - A fast non-linear least squares minimizer -// Copyright 2018 Google Inc. All rights reserved. -// http://ceres-solver.org/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// * Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// Author: vitus@google.com (Michael Vitus) - -// This include must come before any #ifndef check on Ceres compile options. -#include "ceres/internal/port.h" - -#ifdef CERES_USE_TBB - -#include "ceres/parallel_for.h" - -#include <tbb/parallel_for.h> -#include <tbb/task_arena.h> - -#include "ceres/scoped_thread_token.h" -#include "ceres/thread_token_provider.h" -#include "glog/logging.h" - -namespace ceres { -namespace internal { - -void ParallelFor(ContextImpl* context, - int start, - int end, - int num_threads, - const std::function<void(int)>& function) { - CHECK_GT(num_threads, 0); - CHECK(context != NULL); - if (end <= start) { - return; - } - - // Fast path for when it is single threaded. - if (num_threads == 1) { - for (int i = start; i < end; ++i) { - function(i); - } - return; - } - - tbb::task_arena task_arena(num_threads); - task_arena.execute([&]{ - tbb::parallel_for(start, end, function); - }); -} - -void ParallelFor(ContextImpl* context, - int start, - int end, - int num_threads, - const std::function<void(int thread_id, int i)>& function) { - CHECK(context != NULL); - - ThreadTokenProvider thread_token_provider(num_threads); - ParallelFor(context, start, end, num_threads, [&](int i) { - const ScopedThreadToken scoped_thread_token(&thread_token_provider); - const int thread_id = scoped_thread_token.token(); - function(thread_id, i); - }); -} - - -} // namespace internal -} // namespace ceres - -#endif // CERES_USE_TBB
diff --git a/internal/ceres/preprocessor.cc b/internal/ceres/preprocessor.cc index 74627a5..08eacc8 100644 --- a/internal/ceres/preprocessor.cc +++ b/internal/ceres/preprocessor.cc
@@ -59,7 +59,7 @@ #ifdef CERES_NO_THREADS if (options->num_threads > 1) { LOG(WARNING) - << "Neither OpenMP nor TBB support is compiled into this binary; " + << "No threading support is compiled into this binary; " << "only options.num_threads = 1 is supported. Switching " << "to single threaded mode."; options->num_threads = 1;
diff --git a/internal/ceres/problem_impl.cc b/internal/ceres/problem_impl.cc index 94af8ad..3fdbfed 100644 --- a/internal/ceres/problem_impl.cc +++ b/internal/ceres/problem_impl.cc
@@ -812,7 +812,7 @@ evaluator_options.linear_solver_type = SPARSE_NORMAL_CHOLESKY; #ifdef CERES_NO_THREADS LOG_IF(WARNING, evaluate_options.num_threads > 1) - << "Neither OpenMP nor TBB support is compiled into this binary; " + << "No threading support is compiled into this binary; " << "only evaluate_options.num_threads = 1 is supported. Switching " << "to single threaded mode."; evaluator_options.num_threads = 1;
diff --git a/internal/ceres/program_evaluator.h b/internal/ceres/program_evaluator.h index 13f2e83..6781eb7 100644 --- a/internal/ceres/program_evaluator.h +++ b/internal/ceres/program_evaluator.h
@@ -43,7 +43,7 @@ // residual jacobians are written directly into their final position in the // block sparse matrix by the user's CostFunction; there is no copying. // -// The evaluation is threaded with OpenMP or TBB. +// The evaluation is threaded with OpenMP or C++11 threads. // // The EvaluatePreparer and JacobianWriter interfaces are as follows: // @@ -118,7 +118,7 @@ #ifdef CERES_NO_THREADS if (options_.num_threads > 1) { LOG(WARNING) - << "Neither OpenMP nor TBB support is compiled into this binary; " + << "No threading support is compiled into this binary; " << "only options.num_threads = 1 is supported. Switching " << "to single threaded mode."; options_.num_threads = 1;
diff --git a/internal/ceres/solver_utils.cc b/internal/ceres/solver_utils.cc index 4b400d3..177a928 100644 --- a/internal/ceres/solver_utils.cc +++ b/internal/ceres/solver_utils.cc
@@ -33,9 +33,6 @@ #include "ceres/internal/config.h" #include "Eigen/Core" -#ifdef CERES_USE_TBB -#include "tbb/tbb_stddef.h" -#endif // CERES_USE_TBB #include "ceres/internal/port.h" #include "ceres/solver_utils.h" #include "ceres/version.h" @@ -48,10 +45,6 @@ CERES_TO_STRING(EIGEN_MAJOR_VERSION) "." \ CERES_TO_STRING(EIGEN_MINOR_VERSION) -#define CERES_TBB_VERSION \ - CERES_TO_STRING(TBB_VERSION_MAJOR) "." \ - CERES_TO_STRING(TBB_VERSION_MINOR) - std::string VersionString() { std::string value = std::string(CERES_VERSION_STRING); value += "-eigen-(" + std::string(CERES_EIGEN_VERSION) + ")"; @@ -88,12 +81,6 @@ value += "-no_openmp"; #endif -#ifdef CERES_USE_TBB - value += "-tbb-(" + std::string(CERES_TBB_VERSION) + ")"; -#else - value += "-no_tbb"; -#endif - #ifdef CERES_NO_CUSTOM_BLAS value += "-no_custom_blas"; #endif
diff --git a/internal/ceres/thread_token_provider.cc b/internal/ceres/thread_token_provider.cc index 61a16e0..337217b 100644 --- a/internal/ceres/thread_token_provider.cc +++ b/internal/ceres/thread_token_provider.cc
@@ -39,13 +39,6 @@ ThreadTokenProvider::ThreadTokenProvider(int num_threads) { (void)num_threads; -#ifdef CERES_USE_TBB - pool_.set_capacity(num_threads); - for (int i = 0; i < num_threads; i++) { - pool_.push(i); - } -#endif - #ifdef CERES_USE_CXX11_THREADS for (int i = 0; i < num_threads; i++) { pool_.Push(i); @@ -63,12 +56,6 @@ return 0; #endif -#ifdef CERES_USE_TBB - int thread_id; - pool_.pop(thread_id); - return thread_id; -#endif - #ifdef CERES_USE_CXX11_THREADS int thread_id; CHECK(pool_.Wait(&thread_id)); @@ -79,10 +66,6 @@ void ThreadTokenProvider::Release(int thread_id) { (void)thread_id; -#ifdef CERES_USE_TBB - pool_.push(thread_id); -#endif - #ifdef CERES_USE_CXX11_THREADS pool_.Push(thread_id); #endif
diff --git a/internal/ceres/thread_token_provider.h b/internal/ceres/thread_token_provider.h index e4c9cd8..f6298b7 100644 --- a/internal/ceres/thread_token_provider.h +++ b/internal/ceres/thread_token_provider.h
@@ -34,10 +34,6 @@ #include "ceres/internal/config.h" #include "ceres/internal/port.h" -#ifdef CERES_USE_TBB -#include <tbb/concurrent_queue.h> -#endif - #ifdef CERES_USE_CXX11_THREADS #include "ceres/concurrent_queue.h" #endif @@ -45,8 +41,8 @@ namespace ceres { namespace internal { -// Helper for TBB and C++11 thread number identification that is similar to -// omp_get_thread_num() behaviour. This is necessary to support TBB and C++11 +// Helper for C++11 thread number identification that is similar to +// omp_get_thread_num() behaviour. This is necessary to support C++11 // threading with a sequential thread id. This is used to access preallocated // resources in the parallelized code parts. The sequence of tokens varies from // 0 to num_threads - 1 that can be acquired to identify the thread in a thread @@ -76,22 +72,12 @@ // Returns the first token from the queue. The acquired value must be // given back by Release(). - // - // With TBB this function will block if all the tokens are aquired by - // concurent threads. int Acquire(); // Makes previously acquired token available for other threads. void Release(int thread_id); private: -#ifdef CERES_USE_TBB - // This queue initially holds a sequence from 0..num_threads-1. Every - // Acquire() call the first number is removed from here. When the token is not - // needed anymore it shall be given back with corresponding Release() call. - tbb::concurrent_bounded_queue<int> pool_; -#endif - #ifdef CERES_USE_CXX11_THREADS // This queue initially holds a sequence from 0..num_threads-1. Every // Acquire() call the first number is removed from here. When the token is not