kernel_base.h 5.6 KB
Newer Older
T
tensor-tang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/* Copyright (c) 2018 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
16
#include "paddle/fluid/operators/jit/macro.h"
T
tensor-tang 已提交
17 18 19 20
#include "paddle/fluid/platform/macros.h"

namespace paddle {
namespace operators {
T
tensor-tang 已提交
21
namespace jit {
T
tensor-tang 已提交
22

23
// TODO(TJ): reorder by alphabet
24
typedef enum {
T
tensor-tang 已提交
25 26 27 28 29 30 31 32 33
  kNone = 0,
  kVMul = 1,
  kVAdd = 2,
  kVAddRelu,
  kVSub,
  kVScal,
  kVAddBias,
  kVRelu,
  kVIdentity,
T
tensor-tang 已提交
34
  kVSquare,
T
tensor-tang 已提交
35 36 37 38 39 40 41 42 43 44 45
  kVExp,
  kVSigmoid,
  kVTanh,
  kLSTMCtHt,
  kLSTMC1H1,
  kGRUH1,
  kGRUHtPart1,
  kGRUHtPart2,
  kCRFDecoding,
  kLayerNorm,
  kNCHW16CMulNC,
T
tensor-tang 已提交
46
  kSeqPool,
T
tensor-tang 已提交
47
  kMatMul,
48 49 50
  kHSum,  // horizontal max
  kHMax,  // horizontal sum
  kSoftmax,
51
} KernelType;
T
tensor-tang 已提交
52

53 54
typedef enum {
  kNonePoolType = 0,
T
tensor-tang 已提交
55
  kSum = 1,
56 57 58 59
  kAvg,
  kSqrt,
} SeqPoolType;

T
tensor-tang 已提交
60
template <typename T>
61
struct XYZNTuples {
T
tensor-tang 已提交
62 63 64 65 66
  typedef T data_type;
  typedef int attr_type;
  typedef void (*func_type)(const T*, const T*, T*, int);
};

67 68 69
template <typename T>
struct AXYNTuples : public XYZNTuples<T> {};

70 71 72 73 74 75 76
template <typename T>
struct XYNTuples {
  typedef T data_type;
  typedef int attr_type;
  typedef void (*func_type)(const T*, T*, int);
};

77 78 79 80
// x, return and int
template <typename T>
struct XRNTuples : public XYNTuples<T> {};

T
tensor-tang 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
typedef struct {
  void* gates;  // gates: x_ch, x_ih, x_fh, x_oh
  const void* ct_1;
  void* ct;
  void* ht;
  /* weight_peephole and checked data are only used in peephole*/
  const void* wp{nullptr};  //  W_ic, W_fc, W_oc
  void* checked{nullptr};   // size: 2 * d
} lstm_t;

typedef struct {
  void* gates;  // gates: {x_update, x_reset; x_state}
  const void* ht_1;
  void* ht;
} gru_t;

struct rnn_attr_s {
  int d;
  KernelType act_gate, act_cand;
  rnn_attr_s() = default;
T
tensor-tang 已提交
101
  explicit rnn_attr_s(int _d, KernelType _act_gate, KernelType _act_cand)
T
tensor-tang 已提交
102 103 104 105 106 107 108
      : d(_d), act_gate(_act_gate), act_cand(_act_cand) {}
};

struct lstm_attr_s : public rnn_attr_s {
  bool use_peephole;
  KernelType act_cell;
  lstm_attr_s() = default;
T
tensor-tang 已提交
109 110
  explicit lstm_attr_s(int _d, KernelType _act_gate, KernelType _act_cand,
                       KernelType _act_cell, bool _use_peephole = false)
T
tensor-tang 已提交
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
      : rnn_attr_s(_d, _act_gate, _act_cand),
        use_peephole(_use_peephole),
        act_cell(_act_cell) {}
};

typedef struct rnn_attr_s gru_attr_t;
typedef struct lstm_attr_s lstm_attr_t;

template <typename T>
struct LSTMTuples {
  typedef T data_type;
  typedef lstm_attr_t attr_type;
  typedef void (*func_type)(lstm_t*, const lstm_attr_t*);
};

126 127 128 129 130 131 132
template <typename T>
struct GRUTuples {
  typedef T data_type;
  typedef gru_attr_t attr_type;
  typedef void (*func_type)(gru_t*, const gru_attr_t*);
};

133
typedef struct seq_pool_attr_s {
T
tensor-tang 已提交
134
  int h, w;  // h should always be the first one
T
tensor-tang 已提交
135
  SeqPoolType type;
136
  seq_pool_attr_s() = default;
T
tensor-tang 已提交
137
  explicit seq_pool_attr_s(int width, SeqPoolType pool_type, int height = 1)
138
      : h(height), w(width), type(pool_type) {}
T
tensor-tang 已提交
139 140 141 142 143 144 145 146 147
} seq_pool_attr_t;

template <typename T>
struct SeqPoolTuples {
  typedef T data_type;
  typedef seq_pool_attr_t attr_type;
  typedef void (*func_type)(const T*, T*, const seq_pool_attr_t*);
};

148 149 150 151 152 153 154 155
typedef struct matmul_attr_s {
  int m, n, k;
  void* packed_weight{nullptr};
  matmul_attr_s() = default;
  explicit matmul_attr_s(int m_, int n_, int k_, void* packed_weight_ = nullptr)
      : m(m_), n(n_), k(k_), packed_weight(packed_weight_) {}
} matmul_attr_t;

T
tensor-tang 已提交
156 157 158
template <typename T>
struct MatMulTuples {
  typedef T data_type;
159 160
  typedef matmul_attr_t attr_type;
  typedef void (*func_type)(const T*, const T*, T*, const matmul_attr_t*);
T
tensor-tang 已提交
161 162
};

163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
template <typename T>
struct CRFDecodingTuples {
  typedef T data_type;
  typedef int attr_type;
  typedef void (*func_type)(const int, const T*, const T*, T*, int*, int);
};

template <typename T>
struct LayerNormTuples {
  typedef T data_type;
  typedef int attr_type;
  typedef void (*func_type)(T*, T*, T*, T*, const T*, const T*, int,
                            const float, int);
};

178 179 180 181 182 183 184
template <typename T>
struct SoftmaxTuples {
  typedef T data_type;
  typedef int attr_type;
  typedef void (*func_type)(const T*, T*, int, int);
};

T
tensor-tang 已提交
185 186 187 188 189 190 191 192
// nChw16c = nChw16c .* NC
template <typename T>
struct NCHW16CMulNCTuples {
  typedef T data_type;
  typedef int attr_type;
  typedef void (*func_type)(const T*, const T*, T*, int, int);
};

T
tensor-tang 已提交
193 194 195 196
// Just for adding to kernel pool without template
class Kernel {
 public:
  Kernel() = default;
T
tensor-tang 已提交
197
  virtual ~Kernel() = default;
T
tensor-tang 已提交
198 199 200
  DISABLE_COPY_AND_ASSIGN(Kernel);
};

T
tensor-tang 已提交
201
template <typename KernelTuples>
T
tensor-tang 已提交
202
class KernelMore : public Kernel {
203
 public:
T
tensor-tang 已提交
204 205 206
  using T = typename KernelTuples::data_type;
  using Func = typename KernelTuples::func_type;
  using Attr = typename KernelTuples::attr_type;
T
tensor-tang 已提交
207
  virtual Func GetFunc() const { return func; }
T
tensor-tang 已提交
208 209
  virtual bool UseMe(const Attr& attr) const = 0;
  virtual const char* ImplType() const = 0;
T
tensor-tang 已提交
210 211 212 213 214

 protected:
  Func func{nullptr};
};

T
tensor-tang 已提交
215
template <typename KernelTuples>
T
tensor-tang 已提交
216
class ReferKernel : public KernelMore<KernelTuples> {
T
tensor-tang 已提交
217 218
 public:
  // Refer code can always be used
T
tensor-tang 已提交
219
  bool UseMe(const typename KernelTuples::attr_type& attr) const override {
T
tensor-tang 已提交
220 221
    return true;
  }
T
tensor-tang 已提交
222
  const char* ImplType() const override { return "Refer"; }
T
tensor-tang 已提交
223 224
};

T
tensor-tang 已提交
225
}  // namespace jit
T
tensor-tang 已提交
226 227
}  // namespace operators
}  // namespace paddle