diff --git a/paddle/framework/CMakeLists.txt b/paddle/framework/CMakeLists.txt index 2cad2e54fa5c0c80d582fa6488bdd889284fbe05..df79bc0e8f1444ebc0b5eafcb2379cdb555fce83 100644 --- a/paddle/framework/CMakeLists.txt +++ b/paddle/framework/CMakeLists.txt @@ -44,5 +44,5 @@ add_custom_command(TARGET framework_py_proto POST_BUILD cc_library(backward SRCS backward.cc DEPS net_op) cc_test(backward_test SRCS backward_test.cc DEPS backward recurrent_op device_context) -cc_library(executor SRCS executor.cc DEPS device_context framework_proto) +cc_library(executor SRCS executor.cc DEPS device_context scope framework_proto) cc_test(executor_test SRCS executor_test.cc DEPS executor) diff --git a/paddle/framework/executor.cc b/paddle/framework/executor.cc index b38d6be16f2aa99027cc1eab3d8509bbf3247a04..52963d20f066dca78294e1246e93e84789e5345f 100644 --- a/paddle/framework/executor.cc +++ b/paddle/framework/executor.cc @@ -14,6 +14,7 @@ limitations under the License. */ #include "paddle/framework/executor.h" #include +#include "paddle/framework/scope.h" #include "paddle/platform/device_context.h" namespace paddle { @@ -58,9 +59,10 @@ void GraphView::Initialize(const ProgramDesc*) { class ExecutorImpl : public Executor { public: - ExecutorImpl(const platform::DeviceContext* ctx, const ProgramDesc* pdesc, - bool is_linear) - : device_context_(ctx), + ExecutorImpl(Scope* scope, const platform::DeviceContext* ctx, + const ProgramDesc* pdesc, bool is_linear) + : scope_(scope), + device_context_(ctx), program_desc_(pdesc), view_(ProgramDescView::Create(is_linear)) {} @@ -73,6 +75,7 @@ class ExecutorImpl : public Executor { void Initialize(); private: + Scope* scope_; const platform::DeviceContext* device_context_; const ProgramDesc* program_desc_; ProgramDescView* view_; @@ -80,23 +83,29 @@ class ExecutorImpl : public Executor { template std::unique_ptr make_unique(Args&&... args) { - return std::unique_ptr(new T(std::forward(args)...)); + return std::unique_ptr(new T(std::forward(args)...)); } platform::CPUDeviceContext* GetCPUDeviceContext() { static std::unique_ptr g_cpu_device_context = - make_unique(platform::CPUPlace()); + make_unique(platform::CPUPlace()); return g_cpu_device_context.get(); } #ifndef PADDLE_ONLY_CPU platform::CUDADeviceContext* GetCUDADeviceContext() { static std::unique_ptr g_cuda_device_context = - make_unique(platform::GPUPlace(0)); + make_unique(platform::GPUPlace(0)); return g_cuda_device_context.get(); } #endif +framework::Scope* GetScope() { + static std::unique_ptr g_scope = + make_unique(); + return g_scope.get(); +} + Executor* NewLocalExecutor(const platform::Place& place, const ProgramDesc& pdesc, bool is_linear) { platform::DeviceContext* device_context = nullptr; @@ -110,11 +119,12 @@ Executor* NewLocalExecutor(const platform::Place& place, PADDLE_THROW("'GPUPlace' is not supported in CPU only device."); } #endif - return new ExecutorImpl(device_context, &pdesc, is_linear); + return new ExecutorImpl(GetScope(), device_context, &pdesc, is_linear); } void ExecutorImpl::Run() { // operators running + scope_->NewVar(); device_context_->Wait(); }