diff --git a/tensorflow/compiler/tf2xla/xla_compiler.cc b/tensorflow/compiler/tf2xla/xla_compiler.cc index 17adb9b1fdd..d56d6518b7a 100644 --- a/tensorflow/compiler/tf2xla/xla_compiler.cc +++ b/tensorflow/compiler/tf2xla/xla_compiler.cc @@ -256,24 +256,12 @@ Status ExecuteGraph(XlaContext* xla_context, std::unique_ptr<Graph> graph, std::unique_ptr<Executor> exec(exec_ptr); // At this point ownership of the graph has been transferred to exec. - auto runner = [](Executor::Args::Closure c) { - // TODO(misard) Temporarily just schedule c eagerly while we - // decide what to do about the fact that the ComputationBuilder is - // thread-compatible, but we don't really want Op writers to have - // to remember to acquire a lock around every call to - // ComputationBuilder. One possibility is to add the (generally - // useful) ability to run a single-threaded Executor based on an - // option in LocalExecutorParams. Another is to automagically - // acquire a lock around ComputationBuilder calls using some - // wrapper or RAII funny business. - c(); - }; - // Run the graph symbolically, turning the graph into an XLA computation. Executor::Args exec_args; exec_args.step_id = step_id; exec_args.step_container = step_container.get(); - exec_args.runner = runner; + // Run all compilation kernels on the main thread. + exec_args.runner = [](Executor::Args::Closure c) { c(); }; TF_RETURN_WITH_CONTEXT_IF_ERROR( exec->Run(exec_args), "Conversion from TensorFlow graph to XLA computation failed."); diff --git a/tensorflow/compiler/tf2xla/xla_context.cc b/tensorflow/compiler/tf2xla/xla_context.cc index a770271628c..05876f86dca 100644 --- a/tensorflow/compiler/tf2xla/xla_context.cc +++ b/tensorflow/compiler/tf2xla/xla_context.cc @@ -131,8 +131,6 @@ Status XlaContext::CollectResults( xla::Computation* computation, bool* requires_runtime_context, std::vector<ConstRetVal>* compile_time_constants, int* num_nonconst_outputs) { - mutex_lock l(mu_); - xla::ComputationDataHandle handle; if (retval_.empty() && has_side_effects_) { // Build a empty tuple return value for computations that have side effects @@ -200,7 +198,6 @@ XlaContext::XlaContext(XlaCompiler* compiler, xla::Client* client, const xla::ComputationDataHandle& XlaContext::GetOrCreateRuntimeContextParameter() { - mutex_lock lock(mu_); CHECK(allow_cpu_custom_calls_); CHECK(!use_tuple_arg_); if (has_context_parameter_) return context_parameter_; @@ -220,7 +217,6 @@ void XlaContext::AddRetval(int retval_index, // Add the return value to the list being built up. The executor // is multi-threaded so this has to happen under the // lock. - mutex_lock l(mu_); retval_.emplace_back(retval_index, handle); } @@ -232,17 +228,14 @@ Status XlaContext::AddConstRetval(int retval_index, DataType dtype, ConstRetVal value; value.index = retval_index; TF_RETURN_IF_ERROR(LiteralToHostTensor(literal, dtype, &value.value)); - mutex_lock l(mu_); compile_time_constant_.push_back(std::move(value)); } else { - mutex_lock l(mu_); retval_.emplace_back(retval_index, xla_builder_.ConstantLiteral(literal)); } return Status::OK(); } void XlaContext::AddSideEffects() { - mutex_lock lock(mu_); has_side_effects_ = true; } @@ -323,7 +316,6 @@ const xla::Computation* XlaContext::LookupOrCreate( DataType type, ComputationMap* out, const std::function<xla::Computation()>& create) { { - mutex_lock l(mu_); const auto& entry = (*out)[type]; if (!entry.IsNull()) { return &entry; @@ -331,7 +323,6 @@ const xla::Computation* XlaContext::LookupOrCreate( } auto new_entry = create(); { - mutex_lock l(mu_); // Somebody else might have made one concurrently. auto& entry = (*out)[type]; if (entry.IsNull()) { diff --git a/tensorflow/compiler/tf2xla/xla_context.h b/tensorflow/compiler/tf2xla/xla_context.h index 8ece3d37984..53009bf8809 100644 --- a/tensorflow/compiler/tf2xla/xla_context.h +++ b/tensorflow/compiler/tf2xla/xla_context.h @@ -29,8 +29,6 @@ limitations under the License. #include "tensorflow/core/framework/resource_mgr.h" #include "tensorflow/core/graph/graph.h" #include "tensorflow/core/platform/macros.h" -#include "tensorflow/core/platform/mutex.h" -#include "tensorflow/core/platform/thread_annotations.h" namespace tensorflow { @@ -223,11 +221,9 @@ class XlaContext : public ResourceBase { XlaCompiler* const compiler_; - mutable mutex mu_; - // The ComputationBuilder used to construct the subgraph's compiled // representation. - xla::ComputationBuilder xla_builder_ GUARDED_BY(mu_); + xla::ComputationBuilder xla_builder_; // Number of XLA Parameters, not counting the context parameter, if any. int num_parameters_; @@ -252,18 +248,17 @@ class XlaContext : public ResourceBase { // for an additional final parameter to the computation, through which will be // passed a XlaLocalRuntimeContext* at runtime. Created on demand by // GetOrCreateRuntimeContextParameter(). - bool has_context_parameter_ GUARDED_BY(mu_) = false; - xla::ComputationDataHandle context_parameter_ GUARDED_BY(mu_); + bool has_context_parameter_ = false; + xla::ComputationDataHandle context_parameter_; // The data-dependent return values of the computation. - std::vector<std::pair<int, xla::ComputationDataHandle>> retval_ - GUARDED_BY(mu_); + std::vector<std::pair<int, xla::ComputationDataHandle>> retval_; // The non-data-dependent return values of the computation. - std::vector<ConstRetVal> compile_time_constant_ GUARDED_BY(mu_); + std::vector<ConstRetVal> compile_time_constant_; // Does the computation have side effects, i.e., Send() calls? - bool has_side_effects_ GUARDED_BY(mu_) = false; + bool has_side_effects_ = false; // Cache of prebuilt computations indexed by their type. using ComputationMap = std::map<DataType, xla::Computation>; @@ -273,16 +268,16 @@ class XlaContext : public ResourceBase { // map. The returned value != nullptr and is owned by the map. const xla::Computation* LookupOrCreate( DataType type, ComputationMap* out, - const std::function<xla::Computation()>& create) LOCKS_EXCLUDED(mu_); + const std::function<xla::Computation()>& create); // Cached computation to compute Max of two elements, specialized by type. - ComputationMap max_func_ GUARDED_BY(mu_); + ComputationMap max_func_; // Cached computation to compute Sum of two elements, specialized by type. - ComputationMap add_func_ GUARDED_BY(mu_); + ComputationMap add_func_; // Cached computation to compute Sigmoid of an element, specialized by type. - ComputationMap sigmoid_func_ GUARDED_BY(mu_); + ComputationMap sigmoid_func_; TF_DISALLOW_COPY_AND_ASSIGN(XlaContext); };