diff --git a/paddle/framework/CMakeLists.txt b/paddle/framework/CMakeLists.txt index 8a5d8532bb32db917b893f7f59039e08d85c8c34..3ee721ac9371c15deba2f9cef0c4f30ab39c90d3 100644 --- a/paddle/framework/CMakeLists.txt +++ b/paddle/framework/CMakeLists.txt @@ -43,3 +43,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) diff --git a/paddle/framework/executor.cc b/paddle/framework/executor.cc new file mode 100644 index 0000000000000000000000000000000000000000..ccf67169496940387781190803d674fd96326bcb --- /dev/null +++ b/paddle/framework/executor.cc @@ -0,0 +1,108 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "paddle/framework/executor.h" + +#include "paddle/platform/device_context.h" + +namespace paddle { +namespace framework { + +class LinearListView; +class GraphView; + +// Immutable view of a ProgramDesc organized for efficient execution. +class ProgramDescView { + public: + virtual ~ProgramDescView() {} + virtual void Initialize(const ProgramDesc*) = 0; + static ProgramDescView* Create(bool is_linear); +}; + +class LinearListView : public ProgramDescView { + public: + void Initialize(const ProgramDesc*) override; +}; + +class GraphView : public ProgramDescView { + public: + void Initialize(const ProgramDesc*) override; +}; + +static ProgramDescView* Create(bool is_linear) { + if (is_linear) { + return new LinearListView(); + } else { + return new GraphView(); + } +} + +void LinearListView::Initialize(const ProgramDesc*) { + // get a LinearView of ProgramDesc +} + +void GraphView::Initialize(const ProgramDesc*) { + // get a GraphView of ProgramDesc +} + +class ExecutorImpl : public Executor { + public: + ExecutorImpl(const platform::DeviceContext* ctx, const ProgramDesc* pdesc, + bool is_linear) + : device_context_(ctx), + program_desc_(pdesc), + view_(ProgramDescView::Create(is_linear)) {} + + virtual ~ExecutorImpl() { + if (view_) delete view_; + } + + void Run() override; + + void Initialize(); + + private: + const platform::DeviceContext* device_context_; + const ProgramDesc* program_desc_; + ProgramDescView* view_; +}; + +static Executor* NewLocalExecutor(const platform::Place& place, + const ProgramDesc& pdesc, bool is_linear) { + platform::DeviceContext* device_context = nullptr; + if (platform::is_cpu_place(place)) { + device_context = + new platform::CPUDeviceContext(boost::get(place)); + } +#ifndef PADDLE_ONLY_CPU + else if { + device_context = + new platform::CUDADeviceContext(boost::get(place)); + } +#endif + return new ExecutorImpl(device_context, &pdesc, is_linear); +} + +void ExecutorImpl::Run() { + // operators running + device_context_->Wait(); +} + +void ExecutorImpl::Initialize() { + // Initialize the ProgramDescView + view_->Initialize(program_desc_); +} + +} // namespace framework +} // namespace paddle diff --git a/paddle/framework/executor.h b/paddle/framework/executor.h new file mode 100644 index 0000000000000000000000000000000000000000..69f0e3f18fc2fee2959752ded052179f93599a46 --- /dev/null +++ b/paddle/framework/executor.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#pragma once + +#include "paddle/framework/framework.pb.h" +#include "paddle/platform/place.h" + +namespace paddle { +namespace framework { + +class Executor { + public: + virtual ~Executor() {} + virtual void Run() = 0; +}; + +static Executor* NewLocalExecutor(const platform::Place&, const ProgramDesc&); + +} // namespace framework +} // namespace paddle diff --git a/paddle/framework/executor_test.cc b/paddle/framework/executor_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..f8a41b12ad218f8fb895710687c7477419bbac29 --- /dev/null +++ b/paddle/framework/executor_test.cc @@ -0,0 +1,18 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "paddle/framework/executor.h" +#include "gtest/gtest.h" + +TEST(Executor, Init) {} \ No newline at end of file