[RunHandler] Minor optimizations to environment variable handling.
1. Avoid re-evaluating the "TF_RUN_HANDLER_USE_SUB_THREAD_POOL" environment variable each time a task is enqueued, by caching the result in a static local variable. 2. A similar optimization in `ChooseRequestsWithExponentialDistribution()`. 3. Since all the arguments are string literals, we can pass `const char*` to the `ParamFromEnv*WithDefault()` methods, to avoid creating a temporary `std::string` on each call. PiperOrigin-RevId: 308915732 Change-Id: I1642b5d924477eb006497acf95ac7cfc17956feb
This commit is contained in:
		
							parent
							
								
									1a40c422ff
								
							
						
					
					
						commit
						bb1e5c0d09
					
				@ -167,7 +167,7 @@ Task ThreadWorkSource::EnqueueTask(Task t, bool is_blocking) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Waiter* w = nullptr;
 | 
			
		||||
  bool use_sub_thread_pool =
 | 
			
		||||
  static const bool use_sub_thread_pool =
 | 
			
		||||
      ParamFromEnvBoolWithDefault("TF_RUN_HANDLER_USE_SUB_THREAD_POOL", false);
 | 
			
		||||
 | 
			
		||||
  Waiter* waiter_queue;
 | 
			
		||||
@ -424,7 +424,8 @@ void RunHandlerThreadPool::SetThreadWorkSources(
 | 
			
		||||
    // thread_work_sources are order as start_request_idx, 0, 2, 4 ... 1, 3,
 | 
			
		||||
    // 5... for half of the threads and start_request_idx, 1, 3, 5 ... 0, 2,
 | 
			
		||||
    // 4... for the other half of the threads.
 | 
			
		||||
    int num_shards = ParamFromEnvWithDefault("TF_RUN_HANDLER_QUEUE_SHARDS", 1);
 | 
			
		||||
    static const int num_shards =
 | 
			
		||||
        ParamFromEnvWithDefault("TF_RUN_HANDLER_QUEUE_SHARDS", 1);
 | 
			
		||||
    int token = tid % num_shards;
 | 
			
		||||
    for (int i = 0; i < num_shards; ++i) {
 | 
			
		||||
      for (int j = token; j < thread_work_sources.size(); j += num_shards) {
 | 
			
		||||
 | 
			
		||||
@ -23,16 +23,15 @@ limitations under the License.
 | 
			
		||||
 | 
			
		||||
namespace tensorflow {
 | 
			
		||||
 | 
			
		||||
double ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
                               double default_value) {
 | 
			
		||||
  const char* val = std::getenv(var_name.c_str());
 | 
			
		||||
double ParamFromEnvWithDefault(const char* var_name, double default_value) {
 | 
			
		||||
  const char* val = std::getenv(var_name);
 | 
			
		||||
  double num;
 | 
			
		||||
  return (val && strings::safe_strtod(val, &num)) ? num : default_value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<double> ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
std::vector<double> ParamFromEnvWithDefault(const char* var_name,
 | 
			
		||||
                                            std::vector<double> default_value) {
 | 
			
		||||
  const char* val = std::getenv(var_name.c_str());
 | 
			
		||||
  const char* val = std::getenv(var_name);
 | 
			
		||||
  if (!val) {
 | 
			
		||||
    return default_value;
 | 
			
		||||
  }
 | 
			
		||||
@ -51,9 +50,9 @@ std::vector<double> ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<int> ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
std::vector<int> ParamFromEnvWithDefault(const char* var_name,
 | 
			
		||||
                                         std::vector<int> default_value) {
 | 
			
		||||
  const char* val = std::getenv(var_name.c_str());
 | 
			
		||||
  const char* val = std::getenv(var_name);
 | 
			
		||||
  if (!val) {
 | 
			
		||||
    return default_value;
 | 
			
		||||
  }
 | 
			
		||||
@ -72,9 +71,8 @@ std::vector<int> ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ParamFromEnvBoolWithDefault(const std::string& var_name,
 | 
			
		||||
                                 bool default_value) {
 | 
			
		||||
  const char* val = std::getenv(var_name.c_str());
 | 
			
		||||
bool ParamFromEnvBoolWithDefault(const char* var_name, bool default_value) {
 | 
			
		||||
  const char* val = std::getenv(var_name);
 | 
			
		||||
  return (val) ? str_util::Lowercase(val) == "true" : default_value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -148,19 +146,20 @@ std::vector<int> ChooseRequestsWithExponentialDistribution(
 | 
			
		||||
  static const double kPowerBase =
 | 
			
		||||
      ParamFromEnvWithDefault("TF_RUN_HANDLER_EXP_DIST_POWER_BASE", 2.0);
 | 
			
		||||
 | 
			
		||||
  static const int kMinEvenThreadsFromEnv = static_cast<int>(
 | 
			
		||||
      ParamFromEnvWithDefault("TF_RUN_HANDLER_EXP_DIST_MIN_EVEN_THREADS", 1));
 | 
			
		||||
  static const int kMaxEvenThreadsFromEnv = static_cast<int>(
 | 
			
		||||
      ParamFromEnvWithDefault("TF_RUN_HANDLER_EXP_DIST_MAX_EVEN_THREADS", 3));
 | 
			
		||||
 | 
			
		||||
  std::vector<int> request_idx_list;
 | 
			
		||||
  request_idx_list.resize(num_threads);
 | 
			
		||||
  // Each request gets at least this number of threads that steal from it first.
 | 
			
		||||
  int min_threads_per_request =
 | 
			
		||||
      num_threads * kCapacityFractionForEvenDistribution / num_active_requests;
 | 
			
		||||
  min_threads_per_request =
 | 
			
		||||
      std::max(static_cast<int>(ParamFromEnvWithDefault(
 | 
			
		||||
                   "TF_RUN_HANDLER_EXP_DIST_MIN_EVEN_THREADS", 1)),
 | 
			
		||||
               min_threads_per_request);
 | 
			
		||||
      std::max(kMinEvenThreadsFromEnv, min_threads_per_request);
 | 
			
		||||
  min_threads_per_request =
 | 
			
		||||
      std::min(static_cast<int>(ParamFromEnvWithDefault(
 | 
			
		||||
                   "TF_RUN_HANDLER_EXP_DIST_MAX_EVEN_THREADS", 3)),
 | 
			
		||||
               min_threads_per_request);
 | 
			
		||||
      std::min(kMaxEvenThreadsFromEnv, min_threads_per_request);
 | 
			
		||||
 | 
			
		||||
  int num_remaining_threads =
 | 
			
		||||
      std::max(0, num_threads - num_active_requests * min_threads_per_request);
 | 
			
		||||
 | 
			
		||||
@ -56,25 +56,23 @@ std::vector<int> ChooseRequestsWithExponentialDistribution(
 | 
			
		||||
 | 
			
		||||
// Look up environment variable named 'var_name' and return the value if it
 | 
			
		||||
// exist and can be parsed. Return 'default_value' otherwise.
 | 
			
		||||
double ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
                               double default_value);
 | 
			
		||||
double ParamFromEnvWithDefault(const char* var_name, double default_value);
 | 
			
		||||
 | 
			
		||||
// Look up environment variable named 'var_name' and return the value if it
 | 
			
		||||
// exist and can be parsed. The value must be in format val1,val2... Return
 | 
			
		||||
// 'default_value' otherwise.
 | 
			
		||||
std::vector<double> ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
std::vector<double> ParamFromEnvWithDefault(const char* var_name,
 | 
			
		||||
                                            std::vector<double> default_value);
 | 
			
		||||
 | 
			
		||||
// Look up environment variable named 'var_name' and return the value if it
 | 
			
		||||
// exist and can be parsed. The value must be in format val1,val2... Return
 | 
			
		||||
// 'default_value' otherwise.
 | 
			
		||||
std::vector<int> ParamFromEnvWithDefault(const std::string& var_name,
 | 
			
		||||
std::vector<int> ParamFromEnvWithDefault(const char* var_name,
 | 
			
		||||
                                         std::vector<int> default_value);
 | 
			
		||||
 | 
			
		||||
// Look up environment variable named 'var_name' and return the value if it
 | 
			
		||||
// exist and can be parsed. Return 'default_value' otherwise.
 | 
			
		||||
bool ParamFromEnvBoolWithDefault(const std::string& var_name,
 | 
			
		||||
                                 bool default_value);
 | 
			
		||||
bool ParamFromEnvBoolWithDefault(const char* var_name, bool default_value);
 | 
			
		||||
 | 
			
		||||
}  // end namespace tensorflow
 | 
			
		||||
#endif  // TENSORFLOW_CORE_FRAMEWORK_RUN_HANDLER_UTIL_H_
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user