fusion_fc_relu_op.cpp 2.3 KB
Newer Older
qnqinan's avatar
qnqinan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/* 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. */

#ifdef FUSION_FC_RELU_OP

#include "operators/fusion_fc_relu_op.h"
namespace paddle_mobile {
qnqinan's avatar
qnqinan 已提交
19
namespace operators {
qnqinan's avatar
qnqinan 已提交
20

qnqinan's avatar
qnqinan 已提交
21 22 23 24 25 26
template <typename Dtype, typename T>
void FusionFcReluOp<Dtype, T>::InferShape() const {
  auto x_dims = this->param_.InputX()->dims();
  auto y_dims = this->param_.InputY()->dims();
  int x_num_col_dims = this->param_.XNumColDims();
  int y_num_col_dims = this->param_.YNumColDims();
qnqinan's avatar
qnqinan 已提交
27

qnqinan's avatar
qnqinan 已提交
28 29
  assert(x_dims.size() > x_num_col_dims);
  assert(y_dims.size() > y_num_col_dims);
qnqinan's avatar
qnqinan 已提交
30

qnqinan's avatar
qnqinan 已提交
31 32 33
  /// (1,2,3,4) , x_num_col_dims = 2  -> (2,12)
  auto x_mat_dims = framework::flatten_to_2d(x_dims, x_num_col_dims);
  auto y_mat_dims = framework::flatten_to_2d(y_dims, y_num_col_dims);
qnqinan's avatar
qnqinan 已提交
34

qnqinan's avatar
qnqinan 已提交
35
  assert(x_mat_dims[1] == y_mat_dims[0]);
qnqinan's avatar
qnqinan 已提交
36

qnqinan's avatar
qnqinan 已提交
37 38 39
  std::vector<int64_t> output_dims;
  output_dims.reserve(
      static_cast<size_t>(x_num_col_dims + y_dims.size() - y_num_col_dims));
qnqinan's avatar
qnqinan 已提交
40

qnqinan's avatar
qnqinan 已提交
41 42 43
  for (int i = 0; i < x_num_col_dims; ++i) {
    output_dims.push_back(x_dims[i]);
  }
qnqinan's avatar
qnqinan 已提交
44

qnqinan's avatar
qnqinan 已提交
45 46 47
  for (int i = y_num_col_dims; i < y_dims.size(); ++i) {
    output_dims.push_back(y_dims[i]);
  }
qnqinan's avatar
qnqinan 已提交
48

qnqinan's avatar
qnqinan 已提交
49 50 51
  framework::DDim ddim = framework::make_ddim(output_dims);
  this->param_.Out()->Resize(ddim);
}
qnqinan's avatar
qnqinan 已提交
52

53 54 55
static framework::FusionOpRegistrar fc_relu_registrar(
    new FusionFcReluMatcher());

qnqinan's avatar
qnqinan 已提交
56
}  // namespace operators
qnqinan's avatar
qnqinan 已提交
57 58 59 60 61 62 63 64 65 66
}  // namespace paddle_mobile

namespace ops = paddle_mobile::operators;
#ifdef PADDLE_MOBILE_CPU
REGISTER_OPERATOR_CPU(fusion_fc_relu, ops::FusionFcReluOp);
#endif
#ifdef PADDLE_MOBILE_MALI_GPU
REGISTER_OPERATOR_MALI_GPU(fusion_fc_relu, ops::FusionFcReluOp);
#endif
#ifdef PADDLE_MOBILE_FPGA
qnqinan's avatar
qnqinan 已提交
67
REGISTER_OPERATOR_FPGA(fusion_fc_relu, ops::FusionFcReluOp);
qnqinan's avatar
qnqinan 已提交
68
#endif
69 70 71
#ifdef PADDLE_MOBILE_X86
REGISTER_OPERATOR_X86(fusion_fc_relu, ops::FusionFcReluOp);
#endif
qnqinan's avatar
qnqinan 已提交
72 73

#endif