diff --git a/include/updater/csv_file_parser.hpp b/include/updater/csv_file_parser.hpp index e0c7fabc0..1d746cdc0 100644 --- a/include/updater/csv_file_parser.hpp +++ b/include/updater/csv_file_parser.hpp @@ -17,6 +17,8 @@ #include #include +#include +#include #include namespace osrm @@ -80,7 +82,9 @@ template struct CSVFilesParser return LookupTable{lookup}; } - catch (const tbb::captured_exception &e) + catch (const std::exception &e) + // TBB should capture to std::exception_ptr and automatically rethrow in this thread. + // https://software.intel.com/en-us/node/506317 { throw util::exception(e.what() + SOURCE_REF); } diff --git a/src/contractor/contractor.cpp b/src/contractor/contractor.cpp index 266367080..f151eeb59 100644 --- a/src/contractor/contractor.cpp +++ b/src/contractor/contractor.cpp @@ -36,7 +36,12 @@ #include +#if TBB_VERSION_MAJOR == 2020 +#include +#else #include +#endif + namespace osrm { namespace contractor @@ -44,8 +49,13 @@ namespace contractor int Contractor::Run() { +#if TBB_VERSION_MAJOR == 2020 + tbb::global_control gc(tbb::global_control::max_allowed_parallelism, + config.requested_num_threads); +#else tbb::task_scheduler_init init(config.requested_num_threads); BOOST_ASSERT(init.is_active()); +#endif if (config.core_factor != 1.0) { diff --git a/src/customize/customizer.cpp b/src/customize/customizer.cpp index d7e2af90d..7c96617a6 100644 --- a/src/customize/customizer.cpp +++ b/src/customize/customizer.cpp @@ -21,7 +21,11 @@ #include +#if TBB_VERSION_MAJOR == 2020 +#include +#else #include +#endif namespace osrm { @@ -118,8 +122,13 @@ std::vector customizeFilteredMetrics(const partitioner::MultiLevelEd int Customizer::Run(const CustomizationConfig &config) { +#if TBB_VERSION_MAJOR == 2020 + tbb::global_control gc(tbb::global_control::max_allowed_parallelism, + config.requested_num_threads); +#else tbb::task_scheduler_init init(config.requested_num_threads); BOOST_ASSERT(init.is_active()); +#endif TIMER_START(loading_data); diff --git a/src/extractor/edge_based_graph_factory.cpp b/src/extractor/edge_based_graph_factory.cpp index 0d4023877..12e4ce0ec 100644 --- a/src/extractor/edge_based_graph_factory.cpp +++ b/src/extractor/edge_based_graph_factory.cpp @@ -31,13 +31,13 @@ #include #include #include +#include #include #include #include #include #include -#include namespace std { @@ -1080,7 +1080,7 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges( // to be balanced with the GRAINSIZE above - ideally, the pipeline puts as much work // as possible in the `intersection_handler` step so that those parallel workers don't // get blocked too much by the slower (io-performing) `buffer_storage` - tbb::parallel_pipeline(tbb::task_scheduler_init::default_num_threads() * 5, + tbb::parallel_pipeline(std::thread::hardware_concurrency() * 5, generator_stage & processor_stage & output_stage); // NOTE: buffer.delayed_data and buffer.delayed_turn_data have the same index diff --git a/src/extractor/extractor.cpp b/src/extractor/extractor.cpp index 36f137293..6892232d3 100644 --- a/src/extractor/extractor.cpp +++ b/src/extractor/extractor.cpp @@ -55,8 +55,12 @@ #include #include -#include +#if TBB_VERSION_MAJOR == 2020 +#include +#else #include +#endif +#include #include @@ -214,11 +218,16 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) { util::LogPolicy::GetInstance().Unmute(); - const unsigned recommended_num_threads = tbb::task_scheduler_init::default_num_threads(); + const unsigned recommended_num_threads = std::thread::hardware_concurrency(); const auto number_of_threads = std::min(recommended_num_threads, config.requested_num_threads); - tbb::task_scheduler_init init(number_of_threads ? number_of_threads - : tbb::task_scheduler_init::automatic); + +#if TBB_VERSION_MAJOR == 2020 + tbb::global_control gc(tbb::global_control::max_allowed_parallelism, + config.requested_num_threads); +#else + tbb::task_scheduler_init init(config.requested_num_threads); BOOST_ASSERT(init.is_active()); +#endif LaneDescriptionMap turn_lane_map; std::vector turn_restrictions; @@ -604,7 +613,7 @@ Extractor::ParseOSMData(ScriptingEnvironment &scripting_environment, // Parse OSM elements with parallel transformer // Number of pipeline tokens that yielded the best speedup was about 1.5 * num_cores - const auto num_threads = tbb::task_scheduler_init::default_num_threads() * 1.5; + const auto num_threads = std::thread::hardware_concurrency() * 1.5; const auto read_meta = config.use_metadata ? osmium::io::read_meta::yes : osmium::io::read_meta::no; diff --git a/src/guidance/guidance_processing.cpp b/src/guidance/guidance_processing.cpp index f2f014122..6e6aae8d4 100644 --- a/src/guidance/guidance_processing.cpp +++ b/src/guidance/guidance_processing.cpp @@ -10,7 +10,8 @@ #include #include -#include + +#include namespace osrm { @@ -324,7 +325,7 @@ void annotateTurns(const util::NodeBasedDynamicGraph &node_based_graph, // to be balanced with the GRAINSIZE above - ideally, the pipeline puts as much work // as possible in the `intersection_handler` step so that those parallel workers don't // get blocked too much by the slower (io-performing) `buffer_storage` - tbb::parallel_pipeline(tbb::task_scheduler_init::default_num_threads() * 5, + tbb::parallel_pipeline(std::thread::hardware_concurrency() * 5, generator_stage & guidance_stage & guidance_output_stage); // NOTE: EBG edges delayed_data and turns delayed_turn_data have the same index diff --git a/src/partitioner/partitioner.cpp b/src/partitioner/partitioner.cpp index bac7e6d66..29f6395a3 100644 --- a/src/partitioner/partitioner.cpp +++ b/src/partitioner/partitioner.cpp @@ -28,7 +28,11 @@ #include #include +#if TBB_VERSION_MAJOR == 2020 +#include +#else #include +#endif #include "util/geojson_debug_logger.hpp" #include "util/geojson_debug_policies.hpp" @@ -70,8 +74,13 @@ auto getGraphBisection(const PartitionerConfig &config) int Partitioner::Run(const PartitionerConfig &config) { +#if TBB_VERSION_MAJOR == 2020 + tbb::global_control gc(tbb::global_control::max_allowed_parallelism, + config.requested_num_threads); +#else tbb::task_scheduler_init init(config.requested_num_threads); BOOST_ASSERT(init.is_active()); +#endif const std::vector &node_based_partition_ids = getGraphBisection(config); diff --git a/src/tools/contract.cpp b/src/tools/contract.cpp index 244840beb..37b62c245 100644 --- a/src/tools/contract.cpp +++ b/src/tools/contract.cpp @@ -10,12 +10,11 @@ #include #include -#include - #include #include #include #include +#include #include "util/meminfo.hpp" @@ -45,7 +44,7 @@ return_code parseArguments(int argc, config_options.add_options()( "threads,t", boost::program_options::value(&contractor_config.requested_num_threads) - ->default_value(tbb::task_scheduler_init::default_num_threads()), + ->default_value(std::thread::hardware_concurrency()), "Number of threads to use")( "core,k", boost::program_options::value(&contractor_config.core_factor)->default_value(1.0), @@ -171,7 +170,7 @@ int main(int argc, char *argv[]) try return EXIT_FAILURE; } - const unsigned recommended_num_threads = tbb::task_scheduler_init::default_num_threads(); + const unsigned recommended_num_threads = std::thread::hardware_concurrency(); if (recommended_num_threads != contractor_config.requested_num_threads) { diff --git a/src/tools/customize.cpp b/src/tools/customize.cpp index 97217aa95..da8e8ed68 100644 --- a/src/tools/customize.cpp +++ b/src/tools/customize.cpp @@ -5,12 +5,11 @@ #include "util/meminfo.hpp" #include "util/version.hpp" -#include - #include #include #include +#include using namespace osrm; @@ -39,7 +38,7 @@ return_code parseArguments(int argc, // ("threads,t", boost::program_options::value(&customization_config.requested_num_threads) - ->default_value(tbb::task_scheduler_init::default_num_threads()), + ->default_value(std::thread::hardware_concurrency()), "Number of threads to use")( "segment-speed-file", boost::program_options::value>( diff --git a/src/tools/extract.cpp b/src/tools/extract.cpp index 6daf2495e..ba725e0c1 100644 --- a/src/tools/extract.cpp +++ b/src/tools/extract.cpp @@ -4,14 +4,13 @@ #include "util/log.hpp" #include "util/version.hpp" -#include - #include #include #include #include #include +#include #include "util/meminfo.hpp" @@ -49,7 +48,7 @@ return_code parseArguments(int argc, "Data version. Leave blank to avoid. osmosis - to get timestamp from file")( "threads,t", boost::program_options::value(&extractor_config.requested_num_threads) - ->default_value(tbb::task_scheduler_init::default_num_threads()), + ->default_value(std::thread::hardware_concurrency()), "Number of threads to use")( "small-component-size", boost::program_options::value(&extractor_config.small_component_size) diff --git a/src/tools/partition.cpp b/src/tools/partition.cpp index aeed36360..6c34bac10 100644 --- a/src/tools/partition.cpp +++ b/src/tools/partition.cpp @@ -7,8 +7,6 @@ #include "util/timing_util.hpp" #include "util/version.hpp" -#include - #include #include #include @@ -17,6 +15,7 @@ #include #include #include +#include using namespace osrm; @@ -86,7 +85,7 @@ return_code parseArguments(int argc, // ("threads,t", boost::program_options::value(&config.requested_num_threads) - ->default_value(tbb::task_scheduler_init::default_num_threads()), + ->default_value(std::thread::hardware_concurrency()), "Number of threads to use") // ("balance", diff --git a/unit_tests/contractor/graph_contractor.cpp b/unit_tests/contractor/graph_contractor.cpp index bac223930..a87e98fe4 100644 --- a/unit_tests/contractor/graph_contractor.cpp +++ b/unit_tests/contractor/graph_contractor.cpp @@ -5,7 +5,12 @@ #include +#include // For version lookup +#if TBB_VERSION_MAJOR == 2020 +#include +#else #include +#endif using namespace osrm; using namespace osrm::contractor; @@ -15,7 +20,11 @@ BOOST_AUTO_TEST_SUITE(graph_contractor) BOOST_AUTO_TEST_CASE(contract_graph) { +#if TBB_VERSION_MAJOR == 2020 + tbb::global_control scheduler(tbb::global_control::max_allowed_parallelism, 1); +#else tbb::task_scheduler_init scheduler(1); +#endif /* * <--1--< * (0) >--3--> (1) >--3--> (3) diff --git a/unit_tests/library/contract.cpp b/unit_tests/library/contract.cpp index 90f75dd22..1de33f16d 100644 --- a/unit_tests/library/contract.cpp +++ b/unit_tests/library/contract.cpp @@ -3,7 +3,7 @@ #include "osrm/contractor.hpp" #include "osrm/contractor_config.hpp" -#include // default_num_threads +#include BOOST_AUTO_TEST_SUITE(library_contract) @@ -12,7 +12,7 @@ BOOST_AUTO_TEST_CASE(test_contract_with_invalid_config) using namespace osrm; osrm::ContractorConfig config; - config.requested_num_threads = tbb::task_scheduler_init::default_num_threads(); + config.requested_num_threads = std::thread::hardware_concurrency(); BOOST_CHECK_THROW(osrm::contract(config), std::exception); // including osrm::util::exception, etc. } diff --git a/unit_tests/library/customize.cpp b/unit_tests/library/customize.cpp index 250f48160..f369f756b 100644 --- a/unit_tests/library/customize.cpp +++ b/unit_tests/library/customize.cpp @@ -3,7 +3,7 @@ #include "osrm/customizer.hpp" #include "osrm/customizer_config.hpp" -#include // default_num_threads +#include BOOST_AUTO_TEST_SUITE(library_customize) @@ -12,7 +12,7 @@ BOOST_AUTO_TEST_CASE(test_customize_with_invalid_config) using namespace osrm; osrm::CustomizationConfig config; - config.requested_num_threads = tbb::task_scheduler_init::default_num_threads(); + config.requested_num_threads = std::thread::hardware_concurrency(); BOOST_CHECK_THROW(osrm::customize(config), std::exception); // including osrm::util::exception, etc. } diff --git a/unit_tests/library/extract.cpp b/unit_tests/library/extract.cpp index de1351a72..23f5ea0d9 100644 --- a/unit_tests/library/extract.cpp +++ b/unit_tests/library/extract.cpp @@ -3,14 +3,14 @@ #include "osrm/extractor.hpp" #include "osrm/extractor_config.hpp" -#include // default_num_threads +#include BOOST_AUTO_TEST_SUITE(library_extract) BOOST_AUTO_TEST_CASE(test_extract_with_invalid_config) { osrm::ExtractorConfig config; - config.requested_num_threads = tbb::task_scheduler_init::default_num_threads(); + config.requested_num_threads = std::thread::hardware_concurrency(); BOOST_CHECK_THROW(osrm::extract(config), std::exception); // including osrm::util::exception, osmium::io_error, etc. } @@ -20,7 +20,7 @@ BOOST_AUTO_TEST_CASE(test_extract_with_valid_config) osrm::ExtractorConfig config; config.input_path = OSRM_TEST_DATA_DIR "/monaco.osm.pbf"; config.UseDefaultOutputNames(OSRM_TEST_DATA_DIR "/monaco.osm.pbf"); - config.requested_num_threads = tbb::task_scheduler_init::default_num_threads(); + config.requested_num_threads = std::thread::hardware_concurrency(); BOOST_CHECK_NO_THROW(osrm::extract(config)); } diff --git a/unit_tests/library/partition.cpp b/unit_tests/library/partition.cpp index ed8dbce24..c0fc61343 100644 --- a/unit_tests/library/partition.cpp +++ b/unit_tests/library/partition.cpp @@ -3,7 +3,7 @@ #include "osrm/partitioner.hpp" #include "osrm/partitioner_config.hpp" -#include // default_num_threads +#include BOOST_AUTO_TEST_SUITE(library_partition) @@ -12,7 +12,7 @@ BOOST_AUTO_TEST_CASE(test_partition_with_invalid_config) using namespace osrm; osrm::PartitionerConfig config; - config.requested_num_threads = tbb::task_scheduler_init::default_num_threads(); + config.requested_num_threads = std::thread::hardware_concurrency(); BOOST_CHECK_THROW(osrm::partition(config), std::exception); // including osrm::util::exception, etc. } diff --git a/unit_tests/partitioner/recursive_bisection.cpp b/unit_tests/partitioner/recursive_bisection.cpp index 165aca4c3..64c692678 100644 --- a/unit_tests/partitioner/recursive_bisection.cpp +++ b/unit_tests/partitioner/recursive_bisection.cpp @@ -8,8 +8,13 @@ #include // make sure not to leak in recursive bisection +#if TBB_VERSION_MAJOR == 2020 +#include +tbb::global_control scheduler(tbb::global_control::max_allowed_parallelism, 2); +#else #include tbb::task_scheduler_init init(2); +#endif using namespace osrm::partitioner; using namespace osrm::util; diff --git a/unit_tests/util/static_rtree.cpp b/unit_tests/util/static_rtree.cpp index 0e1572e28..8f18f915e 100644 --- a/unit_tests/util/static_rtree.cpp +++ b/unit_tests/util/static_rtree.cpp @@ -24,10 +24,14 @@ #include #include -#include - // explicit TBB scheduler init to register resources cleanup at exit +#if TBB_VERSION_MAJOR == 2020 +#include +tbb::global_control scheduler(tbb::global_control::max_allowed_parallelism, 2); +#else +#include tbb::task_scheduler_init init(2); +#endif BOOST_AUTO_TEST_SUITE(static_rtree)