cinn_launch_context.h 5.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
//
// 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 <map>
#include <memory>
#include <string>
#include <unordered_map>
#include <unordered_set>
22
#include <vector>
23
#include "paddle/fluid/framework/lod_tensor.h"
24
#include "paddle/fluid/framework/scope.h"
25
#include "paddle/fluid/platform/place.h"
26
#include "paddle/pten/core/ddim.h"
27 28 29 30 31 32 33 34 35

// type declaration forward
struct cinn_buffer_t;
struct cinn_pod_value_t;
namespace cinn::hlir::framework {
class Tensor;
class Scope;
class Program;
}  // namespace cinn::hlir::framework
36 37

namespace paddle {
38
namespace operators::details {
39 40 41 42

using CinnTensor = ::cinn::hlir::framework::Tensor;
using CinnScope = ::cinn::hlir::framework::Scope;

43 44 45 46 47 48 49
// This class is used to cache some reusable data among repeated
// executions for efficiency and it also provides easy interfaces
// to get details of the compilation result.
// A object of this class is constructed and saved in the
// compilation cache once a graph compiled by CINN.
// Generally speaking, here, a variable is refer to a Paddle
// Variable while a CINN variable is called an Argument.
50 51 52 53 54 55
class CinnLaunchContext {
 public:
  explicit CinnLaunchContext(
      const std::unordered_map<std::string, std::string>& paddle2cinn_varmap,
      const std::shared_ptr<CinnScope>& cinn_scope);

56 57 58 59 60 61 62 63
  // explicitly update several environment variables captured
  // by callback of execution arguments
  void UpdateCapturedEnv(const framework::Scope& scope,
                         const platform::Place& place);

  // Return whether execution arguments has been initialized
  bool IsArgumentsInitialized() const;

64 65
  // Return whether a Paddle variable used in cinn execution
  bool IsVariableUsed(const std::string& var_name) const;
66 67

  // Assign tensor buffer to input or output variables
68
  void AssignExternalVariable(const std::string& var_name);
69 70

  // Assign tensor buffer to internal variables
71
  void AssignInternalVariable(const std::string& var_name);
72

73 74 75 76 77
  // Extract internal variable names from all applied variables
  // in execution by excluding the input and output variables
  std::unordered_set<std::string> ExtractInternalVarNames(
      const std::vector<std::string>& input_var_names,
      const std::vector<std::string>& output_var_names);
78

79
  // Finalize all execution arguments and return the name->argument map
80 81
  const std::map<std::string, cinn_pod_value_t>& FinalizeArguments() const;

82 83
  // Return the cinn_buffer_t* of a specific variable
  cinn_buffer_t* GetCinnBufferOfVar(const std::string& var_name);
84

85
 private:
86 87 88 89 90 91 92 93 94 95
  // Get CinnTensor with CINN argument name
  CinnTensor GetCinnTensor(const std::string& arg_name);
  // Build the name maps of paddle->cinn and cinn->paddle
  // in reverse for all variables used in cinn execution
  void BuildVarNameMap(
      const std::unordered_map<std::string, std::string>& compiled_varmap,
      const std::unordered_set<std::string>& argument_names);

  // Check whether the tensor in Paddle and the compiled
  // tensor returned by CINN of a same variable
96 97
  // are equivalent in type and dimension
  void CheckTensorEquivalent(const std::string& var_name,
98
                             const framework::LoDTensor& paddle_tensor,
99 100
                             const CinnTensor& cinn_tensor);

101 102 103
  // Append an argument with (cinn name)->(cinn_buffer_t) pair
  void AppendArgument(const std::string& arg_name,
                      std::unique_ptr<cinn_buffer_t>&& buffer);
104 105

 private:
106 107 108 109
  const framework::Scope* cached_scope_ = nullptr;
  const platform::Place* cached_place_ = nullptr;
  std::unique_ptr<framework::Scope> cached_temp_scope_ = nullptr;

110
  // a name map from paddle variables to cinn execution arguments
111
  std::unordered_map<std::string, std::string> paddle2cinn_varmap_;
112
  // a name map from cinn execution arguments to paddle variables
113
  std::unordered_map<std::string, std::string> cinn2paddle_varmap_;
114 115 116
  // the names of the cinn arguments used in compiled executable program
  std::unordered_set<std::string> cinn_argument_names_;
  // the variable scope compiled from cinn
117 118
  const std::shared_ptr<CinnScope> cinn_scope_;

119 120
  // because a cinn_pod_value_t does not own a cinn_buffer_t object,
  // an extra stroage is necessary to keep those objects and they can
121
  // not be released until the runtime program finish execution.
122 123
  std::vector<std::unique_ptr<cinn_buffer_t>> hold_buffers_;

124 125
  // this map saves all execution arguments with their cinn names as key,
  // and it is passed to the Execute interface of a cinn runtime program.
126 127 128
  std::map<std::string, cinn_pod_value_t> name2argument_;
};

129
}  // namespace operators::details
130
}  // namespace paddle