Link TBB task_scheduler lifetime with Engine scope

This commit is contained in:
Michael Krasnyk 2017-08-29 22:46:06 +02:00
parent 172a8bdcdb
commit ee19383f4d
6 changed files with 61 additions and 55 deletions

View File

@ -3,6 +3,8 @@
- New function to support relations: `process_relation`. Read more in profiles documentation. - New function to support relations: `process_relation`. Read more in profiles documentation.
- Infrastructure: - Infrastructure:
- Lua 5.1 support is removed due to lack of support in sol2 https://github.com/ThePhD/sol2/issues/302 - Lua 5.1 support is removed due to lack of support in sol2 https://github.com/ThePhD/sol2/issues/302
- Node.js Bindings:
- Exposes `use_threads_number=Number` parameter of `EngineConfig` to limit a number of threads in a TBB internal pool
# 5.12.0 # 5.12.0
- Guidance - Guidance

View File

@ -24,6 +24,8 @@
#include "util/fingerprint.hpp" #include "util/fingerprint.hpp"
#include "util/json_container.hpp" #include "util/json_container.hpp"
#include <tbb/task_scheduler_init.h>
#include <memory> #include <memory>
#include <string> #include <string>
@ -53,7 +55,8 @@ template <typename Algorithm> class Engine final : public EngineInterface
{ {
public: public:
explicit Engine(const EngineConfig &config) explicit Engine(const EngineConfig &config)
: route_plugin(config.max_locations_viaroute, config.max_alternatives), // : task_scheduler(config.use_threads_number),
route_plugin(config.max_locations_viaroute, config.max_alternatives), //
table_plugin(config.max_locations_distance_table), // table_plugin(config.max_locations_distance_table), //
nearest_plugin(config.max_results_nearest), // nearest_plugin(config.max_results_nearest), //
trip_plugin(config.max_locations_trip), // trip_plugin(config.max_locations_trip), //
@ -125,6 +128,7 @@ template <typename Algorithm> class Engine final : public EngineInterface
} }
std::unique_ptr<DataFacadeProvider<Algorithm>> facade_provider; std::unique_ptr<DataFacadeProvider<Algorithm>> facade_provider;
mutable SearchEngineData<Algorithm> heaps; mutable SearchEngineData<Algorithm> heaps;
tbb::task_scheduler_init task_scheduler;
const plugins::ViaRoutePlugin route_plugin; const plugins::ViaRoutePlugin route_plugin;
const plugins::TablePlugin table_plugin; const plugins::TablePlugin table_plugin;

View File

@ -90,6 +90,8 @@ struct EngineConfig final
int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user
bool use_shared_memory = true; bool use_shared_memory = true;
Algorithm algorithm = Algorithm::CH; Algorithm algorithm = Algorithm::CH;
int use_threads_number = 1;
std::string verbosity;
}; };
} }
} }

View File

@ -186,6 +186,7 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo
params->Get(Nan::New("max_locations_map_matching").ToLocalChecked()); params->Get(Nan::New("max_locations_map_matching").ToLocalChecked());
auto max_results_nearest = params->Get(Nan::New("max_results_nearest").ToLocalChecked()); auto max_results_nearest = params->Get(Nan::New("max_results_nearest").ToLocalChecked());
auto max_alternatives = params->Get(Nan::New("max_alternatives").ToLocalChecked()); auto max_alternatives = params->Get(Nan::New("max_alternatives").ToLocalChecked());
auto use_threads_number = params->Get(Nan::New("use_threads_number").ToLocalChecked());
if (!max_locations_trip->IsUndefined() && !max_locations_trip->IsNumber()) if (!max_locations_trip->IsUndefined() && !max_locations_trip->IsNumber())
{ {
@ -217,6 +218,11 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo
Nan::ThrowError("max_alternatives must be an integral number"); Nan::ThrowError("max_alternatives must be an integral number");
return engine_config_ptr(); return engine_config_ptr();
} }
if (!use_threads_number->IsUndefined() && !use_threads_number->IsNumber())
{
Nan::ThrowError("use_threads_number must be an integral number");
return engine_config_ptr();
}
if (max_locations_trip->IsNumber()) if (max_locations_trip->IsNumber())
engine_config->max_locations_trip = static_cast<int>(max_locations_trip->NumberValue()); engine_config->max_locations_trip = static_cast<int>(max_locations_trip->NumberValue());
@ -233,6 +239,8 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo
engine_config->max_results_nearest = static_cast<int>(max_results_nearest->NumberValue()); engine_config->max_results_nearest = static_cast<int>(max_results_nearest->NumberValue());
if (max_alternatives->IsNumber()) if (max_alternatives->IsNumber())
engine_config->max_alternatives = static_cast<int>(max_alternatives->NumberValue()); engine_config->max_alternatives = static_cast<int>(max_alternatives->NumberValue());
if (use_threads_number->IsNumber())
engine_config->use_threads_number = static_cast<int>(use_threads_number->NumberValue());
return engine_config; return engine_config;
} }

View File

@ -20,7 +20,7 @@ bool EngineConfig::IsValid() const
unlimited_or_more_than(max_locations_trip, 2) && unlimited_or_more_than(max_locations_trip, 2) &&
unlimited_or_more_than(max_locations_viaroute, 2) && unlimited_or_more_than(max_locations_viaroute, 2) &&
unlimited_or_more_than(max_results_nearest, 0) && unlimited_or_more_than(max_results_nearest, 0) &&
max_alternatives >= 0; max_alternatives >= 0 && use_threads_number >= 1;
return ((use_shared_memory && all_path_are_empty) || storage_config.IsValid()) && limits_valid; return ((use_shared_memory && all_path_are_empty) || storage_config.IsValid()) && limits_valid;
} }

View File

@ -52,36 +52,37 @@ const static unsigned INIT_OK_START_ENGINE = 0;
const static unsigned INIT_OK_DO_NOT_START_ENGINE = 1; const static unsigned INIT_OK_DO_NOT_START_ENGINE = 1;
const static unsigned INIT_FAILED = -1; const static unsigned INIT_FAILED = -1;
static EngineConfig::Algorithm stringToAlgorithm(std::string algorithm) namespace osrm
{ {
boost::to_lower(algorithm); namespace engine
{
std::istream &operator>>(std::istream &in, EngineConfig::Algorithm &algorithm)
{
std::string token;
in >> token;
boost::to_lower(token);
if (algorithm == "ch") if (token == "ch")
return EngineConfig::Algorithm::CH; algorithm = EngineConfig::Algorithm::CH;
if (algorithm == "corech") else if (token == "corech")
return EngineConfig::Algorithm::CoreCH; algorithm = EngineConfig::Algorithm::CoreCH;
if (algorithm == "mld") else if (token == "mld")
return EngineConfig::Algorithm::MLD; algorithm = EngineConfig::Algorithm::MLD;
throw util::RuntimeError(algorithm, ErrorCode::UnknownAlgorithm, SOURCE_REF); else
throw util::RuntimeError(token, ErrorCode::UnknownAlgorithm, SOURCE_REF);
return in;
}
}
} }
// generate boost::program_options object for the routing part // generate boost::program_options object for the routing part
inline unsigned generateServerProgramOptions(const int argc, inline unsigned generateServerProgramOptions(const int argc,
const char *argv[], const char *argv[],
std::string verbosity,
boost::filesystem::path &base_path, boost::filesystem::path &base_path,
std::string &ip_address, std::string &ip_address,
int &ip_port, int &ip_port,
int &requested_num_threads,
bool &use_shared_memory,
std::string &algorithm,
bool &trial, bool &trial,
int &max_locations_trip, EngineConfig &config)
int &max_locations_viaroute,
int &max_locations_distance_table,
int &max_locations_map_matching,
int &max_results_nearest,
int &max_alternatives)
{ {
using boost::program_options::value; using boost::program_options::value;
using boost::filesystem::path; using boost::filesystem::path;
@ -91,7 +92,7 @@ inline unsigned generateServerProgramOptions(const int argc,
generic_options.add_options() // generic_options.add_options() //
("version,v", "Show version")("help,h", "Show this help message")( ("version,v", "Show version")("help,h", "Show this help message")(
"verbosity,l", "verbosity,l",
boost::program_options::value<std::string>(&verbosity)->default_value("INFO"), boost::program_options::value<std::string>(&config.verbosity)->default_value("INFO"),
std::string("Log verbosity level: " + util::LogPolicy::GetLevels()).c_str())( std::string("Log verbosity level: " + util::LogPolicy::GetLevels()).c_str())(
"trial", value<bool>(&trial)->implicit_value(true), "Quit after initialization"); "trial", value<bool>(&trial)->implicit_value(true), "Quit after initialization");
@ -105,31 +106,32 @@ inline unsigned generateServerProgramOptions(const int argc,
value<int>(&ip_port)->default_value(5000), value<int>(&ip_port)->default_value(5000),
"TCP/IP port") // "TCP/IP port") //
("threads,t", ("threads,t",
value<int>(&requested_num_threads)->default_value(8), value<int>(&config.use_threads_number)->default_value(8),
"Number of threads to use") // "Number of threads to use") //
("shared-memory,s", ("shared-memory,s",
value<bool>(&use_shared_memory)->implicit_value(true)->default_value(false), value<bool>(&config.use_shared_memory)->implicit_value(true)->default_value(false),
"Load data from shared memory") // "Load data from shared memory") //
("algorithm,a", ("algorithm,a",
value<std::string>(&algorithm)->default_value("CH"), value<EngineConfig::Algorithm>(&config.algorithm)
->default_value(EngineConfig::Algorithm::CH, "CH"),
"Algorithm to use for the data. Can be CH, CoreCH, MLD.") // "Algorithm to use for the data. Can be CH, CoreCH, MLD.") //
("max-viaroute-size", ("max-viaroute-size",
value<int>(&max_locations_viaroute)->default_value(500), value<int>(&config.max_locations_viaroute)->default_value(500),
"Max. locations supported in viaroute query") // "Max. locations supported in viaroute query") //
("max-trip-size", ("max-trip-size",
value<int>(&max_locations_trip)->default_value(100), value<int>(&config.max_locations_trip)->default_value(100),
"Max. locations supported in trip query") // "Max. locations supported in trip query") //
("max-table-size", ("max-table-size",
value<int>(&max_locations_distance_table)->default_value(100), value<int>(&config.max_locations_distance_table)->default_value(100),
"Max. locations supported in distance table query") // "Max. locations supported in distance table query") //
("max-matching-size", ("max-matching-size",
value<int>(&max_locations_map_matching)->default_value(100), value<int>(&config.max_locations_map_matching)->default_value(100),
"Max. locations supported in map matching query") // "Max. locations supported in map matching query") //
("max-nearest-size", ("max-nearest-size",
value<int>(&max_results_nearest)->default_value(100), value<int>(&config.max_results_nearest)->default_value(100),
"Max. results supported in nearest query") // "Max. results supported in nearest query") //
("max-alternatives", ("max-alternatives",
value<int>(&max_alternatives)->default_value(3), value<int>(&config.max_alternatives)->default_value(3),
"Max. number of alternatives supported in the MLD route query"); "Max. number of alternatives supported in the MLD route query");
// hidden options, will be allowed on command line, but will not be shown to the user // hidden options, will be allowed on command line, but will not be shown to the user
@ -180,15 +182,15 @@ inline unsigned generateServerProgramOptions(const int argc,
boost::program_options::notify(option_variables); boost::program_options::notify(option_variables);
if (!use_shared_memory && option_variables.count("base")) if (!config.use_shared_memory && option_variables.count("base"))
{ {
return INIT_OK_START_ENGINE; return INIT_OK_START_ENGINE;
} }
else if (use_shared_memory && !option_variables.count("base")) else if (config.use_shared_memory && !option_variables.count("base"))
{ {
return INIT_OK_START_ENGINE; return INIT_OK_START_ENGINE;
} }
else if (use_shared_memory && option_variables.count("base")) else if (config.use_shared_memory && option_variables.count("base"))
{ {
util::Log(logWARNING) << "Shared memory settings conflict with path settings."; util::Log(logWARNING) << "Shared memory settings conflict with path settings.";
} }
@ -203,28 +205,13 @@ int main(int argc, const char *argv[]) try
bool trial_run = false; bool trial_run = false;
std::string ip_address; std::string ip_address;
int ip_port, requested_thread_num; int ip_port;
EngineConfig config; EngineConfig config;
std::string verbosity;
boost::filesystem::path base_path; boost::filesystem::path base_path;
std::string algorithm;
const unsigned init_result = generateServerProgramOptions(argc, const unsigned init_result =
argv, generateServerProgramOptions(argc, argv, base_path, ip_address, ip_port, trial_run, config);
verbosity,
base_path,
ip_address,
ip_port,
requested_thread_num,
config.use_shared_memory,
algorithm,
trial_run,
config.max_locations_trip,
config.max_locations_viaroute,
config.max_locations_distance_table,
config.max_locations_map_matching,
config.max_results_nearest,
config.max_alternatives);
if (init_result == INIT_OK_DO_NOT_START_ENGINE) if (init_result == INIT_OK_DO_NOT_START_ENGINE)
{ {
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -234,7 +221,7 @@ int main(int argc, const char *argv[]) try
return EXIT_FAILURE; return EXIT_FAILURE;
} }
util::LogPolicy::GetInstance().SetLevel(verbosity); util::LogPolicy::GetInstance().SetLevel(config.verbosity);
if (!base_path.empty()) if (!base_path.empty())
{ {
@ -253,7 +240,6 @@ int main(int argc, const char *argv[]) try
} }
return EXIT_FAILURE; return EXIT_FAILURE;
} }
config.algorithm = stringToAlgorithm(algorithm);
util::Log() << "starting up engines, " << OSRM_VERSION; util::Log() << "starting up engines, " << OSRM_VERSION;
@ -262,6 +248,10 @@ int main(int argc, const char *argv[]) try
util::Log() << "Loading from shared memory"; util::Log() << "Loading from shared memory";
} }
// Use the same number of threads for Server and TBB threads pools
// It doubles number of used threads
auto requested_thread_num = config.use_threads_number;
util::Log() << "Threads: " << requested_thread_num; util::Log() << "Threads: " << requested_thread_num;
util::Log() << "IP address: " << ip_address; util::Log() << "IP address: " << ip_address;
util::Log() << "IP port: " << ip_port; util::Log() << "IP port: " << ip_port;