• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2021 Huawei Technologies Co., Ltd
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "coder/opcoders/serializers/nnacl_serializer/nnacl_fp32_serializer.h"
18 #include "src/common/log_adapter.h"
19 #include "coder/log.h"
20 #include "coder/opcoders/parallel.h"
21 #include "nnacl/pooling_parameter.h"
22 
23 namespace mindspore::lite::micro::nnacl {
CodeStruct(const std::string & name,const PoolingParameter & pooling_parameter)24 void NNaclFp32Serializer::CodeStruct(const std::string &name, const PoolingParameter &pooling_parameter) {
25   CodeBaseStruct("PoolingParameter", name,
26                  // Primitive parameter
27                  pooling_parameter.op_parameter_, pooling_parameter.pool_mode_, pooling_parameter.round_mode_,
28                  pooling_parameter.pad_mode_, pooling_parameter.act_type_, pooling_parameter.avg_mode_,
29                  pooling_parameter.global_, pooling_parameter.window_w_, pooling_parameter.window_h_,
30                  pooling_parameter.stride_w_, pooling_parameter.stride_h_,
31                  // shape correlative
32                  pooling_parameter.input_w_, pooling_parameter.input_h_, pooling_parameter.input_batch_,
33                  pooling_parameter.input_channel_, pooling_parameter.output_w_, pooling_parameter.output_h_,
34                  pooling_parameter.output_batch_, pooling_parameter.output_channel_, pooling_parameter.pad_u_,
35                  pooling_parameter.pad_d_, pooling_parameter.pad_l_, pooling_parameter.pad_r_,
36                  // other parameter
37                  gThreadNum, nullptr, pooling_parameter.quantize_);
38 }
39 
CodeStruct(const std::string & name,const BatchNormParameter & batch_norm_parameter)40 void NNaclFp32Serializer::CodeStruct(const std::string &name, const BatchNormParameter &batch_norm_parameter) {
41   CodeBaseStruct("BatchNormParameter", name, batch_norm_parameter.op_parameter_, batch_norm_parameter.epsilon_,
42                  batch_norm_parameter.momentum_, batch_norm_parameter.unit_, batch_norm_parameter.units_,
43                  batch_norm_parameter.channel_, batch_norm_parameter.fused_);
44 }
45 
CodeStruct(const std::string & name,const ArithmeticParameter & arithmetic_parameter)46 void NNaclFp32Serializer::CodeStruct(const std::string &name, const ArithmeticParameter &arithmetic_parameter) {
47   CodeBaseStruct("ArithmeticParameter", name, arithmetic_parameter.op_parameter_, arithmetic_parameter.broadcasting_,
48                  arithmetic_parameter.ndim_, arithmetic_parameter.activation_type_,
49                  ToString(arithmetic_parameter.in_shape0_), arithmetic_parameter.in_elements_num0_,
50                  ToString(arithmetic_parameter.in_shape1_), arithmetic_parameter.in_elements_num1_,
51                  ToString(arithmetic_parameter.out_shape_), arithmetic_parameter.out_elements_num_,
52                  ToString(arithmetic_parameter.in_strides0_), ToString(arithmetic_parameter.in_strides1_),
53                  ToString(arithmetic_parameter.out_strides_), ToString(arithmetic_parameter.multiples0_),
54                  ToString(arithmetic_parameter.multiples1_));
55 }
56 
CodeStruct(const std::string & name,const SoftmaxParameter & softmax_parameter)57 void NNaclFp32Serializer::CodeStruct(const std::string &name, const SoftmaxParameter &softmax_parameter) {
58   CodeBaseStruct("SoftmaxParameter", name, softmax_parameter.op_parameter_, softmax_parameter.axis_,
59                  ToString(softmax_parameter.input_shape_), softmax_parameter.element_size_, softmax_parameter.n_dim_);
60 }
61 
CodeStruct(const std::string & name,const ConvParameter & conv_parameter)62 void NNaclFp32Serializer::CodeStruct(const std::string &name, const ConvParameter &conv_parameter) {
63   code << "int thread_num = MSMIN(" << gThreadNum << ", " << conv_parameter.output_h_ << ");\n";
64   CodeBaseStruct<false>(
65     "ConvParameter", name, conv_parameter.op_parameter_, "{}", conv_parameter.kernel_h_, conv_parameter.kernel_w_,
66     conv_parameter.stride_h_, conv_parameter.stride_w_, conv_parameter.dilation_h_, conv_parameter.dilation_w_,
67     conv_parameter.pad_u_, conv_parameter.pad_d_, conv_parameter.pad_l_, conv_parameter.pad_r_, conv_parameter.group_,
68     conv_parameter.tile_num_, conv_parameter.input_batch_, conv_parameter.input_h_, conv_parameter.input_w_,
69     conv_parameter.input_channel_, conv_parameter.output_batch_, conv_parameter.output_h_, conv_parameter.output_w_,
70     conv_parameter.output_channel_, "thread_num", conv_parameter.input_unit_, conv_parameter.output_unit_,
71     conv_parameter.pad_mode_, conv_parameter.act_type_, conv_parameter.channel_multiplie_,
72     conv_parameter.output_padding_w_, conv_parameter.output_padding_h_);
73 }
74 
CodeStruct(const std::string & name,const MatMulParameter & mat_mul_parameter)75 void NNaclFp32Serializer::CodeStruct(const std::string &name, const MatMulParameter &mat_mul_parameter) {
76   CodeBaseStruct(
77     "MatMulParameter", name, mat_mul_parameter.op_parameter_, mat_mul_parameter.has_bias_, mat_mul_parameter.row_,
78     mat_mul_parameter.col_, mat_mul_parameter.row_4_, mat_mul_parameter.row_6_, mat_mul_parameter.row_12_,
79     mat_mul_parameter.row_16_, mat_mul_parameter.row_align_, mat_mul_parameter.col_4_, mat_mul_parameter.col_8_,
80     mat_mul_parameter.col_align_, mat_mul_parameter.deep_, mat_mul_parameter.deep_4_, mat_mul_parameter.deep_16_,
81     mat_mul_parameter.batch, mat_mul_parameter.a_transpose_, mat_mul_parameter.b_transpose_, mat_mul_parameter.a_const_,
82     mat_mul_parameter.b_const_, mat_mul_parameter.act_type_, mat_mul_parameter.use_axis_, mat_mul_parameter.axis_);
83 }
84 
CodeStruct(const std::string & name,const ScaleParameter & scale_parameter)85 void NNaclFp32Serializer::CodeStruct(const std::string &name, const ScaleParameter &scale_parameter) {
86   CodeBaseStruct("ScaleParameter", name, scale_parameter.op_parameter_, scale_parameter.outer_size_,
87                  scale_parameter.axis_size_, scale_parameter.inner_size_, scale_parameter.axis_,
88                  scale_parameter.const_scale_, scale_parameter.const_offset_);
89 }
90 
CodeStruct(const std::string & name,const SliceParameter & slice_parameter)91 void NNaclFp32Serializer::CodeStruct(const std::string &name, const SliceParameter &slice_parameter) {
92   CodeBaseStruct("SliceParameter", name, slice_parameter.op_parameter_, ToString(slice_parameter.shape_),
93                  ToString(slice_parameter.begin_), ToString(slice_parameter.end_), ToString(slice_parameter.size_),
94                  "{0}", slice_parameter.param_length_);
95 }
96 
CodeStruct(const std::string & name,const TileParameter & tile_parameter)97 void NNaclFp32Serializer::CodeStruct(const std::string &name, const TileParameter &tile_parameter) {
98   CodeBaseStruct("TileParameter", name, tile_parameter.op_parameter_, ToString(tile_parameter.multiples_),
99                  ToString(tile_parameter.in_shape_), ToString(tile_parameter.out_shape_),
100                  ToString(tile_parameter.in_strides_), ToString(tile_parameter.out_strides_), tile_parameter.in_dim_);
101 }
102 
CodeStruct(const std::string & name,const TransposeParameter & transpose_parameter)103 void NNaclFp32Serializer::CodeStruct(const std::string &name, const TransposeParameter &transpose_parameter) {
104   CodeBaseStruct<false>(
105     "TransposeParameter", name, transpose_parameter.op_parameter_, ToString(transpose_parameter.perm_),
106     transpose_parameter.perm_size_, transpose_parameter.conjugate_, ToString(transpose_parameter.strides_),
107     ToString(transpose_parameter.out_strides_), transpose_parameter.num_axes_, transpose_parameter.data_num_);
108 }
109 
CodeStruct(const std::string & name,const LstmParameter & lstm_parameter)110 void NNaclFp32Serializer::CodeStruct(const std::string &name, const LstmParameter &lstm_parameter) {
111   CodeBaseStruct("LstmParameter", name, lstm_parameter.op_parameter_, lstm_parameter.input_size_,
112                  lstm_parameter.hidden_size_, lstm_parameter.seq_len_, lstm_parameter.batch_,
113                  lstm_parameter.output_step_, lstm_parameter.bidirectional_, lstm_parameter.zoneout_cell_,
114                  lstm_parameter.zoneout_hidden_, lstm_parameter.input_row_align_, lstm_parameter.input_col_align_,
115                  lstm_parameter.state_row_align_, lstm_parameter.state_col_align_);
116 }
117 
CodeStruct(const std::string & name,const DeQuantArg & de_quant_arg)118 void NNaclFp32Serializer::CodeStruct(const std::string &name, const DeQuantArg &de_quant_arg) {
119   // this clusters is meaningless which will be supported in future
120   CodeBaseStruct("DeQuantArg", name, de_quant_arg.scale, de_quant_arg.zeroPoint, de_quant_arg.var_corr,
121                  de_quant_arg.mean_corr, "NULL", de_quant_arg.clusters_nums, de_quant_arg.bitNum);
122 }
CodeStruct(const std::string & name,const SpliceParameter & splice_parameter)123 void NNaclFp32Serializer::CodeStruct(const std::string &name, const SpliceParameter &splice_parameter) {
124   CodeArray("splice_context", splice_parameter.context_, splice_parameter.context_dim_, false);
125   CodeBaseStruct("SpliceParameter", name, splice_parameter.op_parameter_, splice_parameter.context_dim_,
126                  splice_parameter.forward_indexes_dim_, splice_parameter.src_to_dst_row_offset_, "splice_context",
127                  nullptr, splice_parameter.output_dim_);
128 }
129 
CodeStruct(const std::string & name,const ExpParameter & exp_parameter)130 void NNaclFp32Serializer::CodeStruct(const std::string &name, const ExpParameter &exp_parameter) {
131   CodeBaseStruct("ExpParameter", name, exp_parameter.op_parameter_, exp_parameter.base_, exp_parameter.scale_,
132                  exp_parameter.shift_, exp_parameter.op_parameter_.thread_num_, exp_parameter.in_scale_,
133                  exp_parameter.out_scale_, exp_parameter.element_num_);
134 }
135 
CodeStruct(const std::string & name,const StridedSliceParameter & strided_slice_parameter)136 void NNaclFp32Serializer::CodeStruct(const std::string &name, const StridedSliceParameter &strided_slice_parameter) {
137   CodeBaseStruct("StridedSliceParameter", name, strided_slice_parameter.op_parameter_,
138                  ToString(strided_slice_parameter.begins_), ToString(strided_slice_parameter.ends_),
139                  ToString(strided_slice_parameter.strides_), strided_slice_parameter.isScale,
140                  strided_slice_parameter.in_shape_length_, ToString(strided_slice_parameter.in_shape_),
141                  strided_slice_parameter.num_axes_, strided_slice_parameter.data_type,
142                  strided_slice_parameter.begins_mask_, strided_slice_parameter.ellipsisMask_,
143                  strided_slice_parameter.newAxisMask_, strided_slice_parameter.shrinkAxisMask_);
144 }
145 
CodeStruct(const std::string & name,const ArithmeticWrapperInfo & arithmetic_wrapper_info)146 void NNaclFp32Serializer::CodeStruct(const std::string &name, const ArithmeticWrapperInfo &arithmetic_wrapper_info) {
147   CodeBaseStruct("ArithmeticWrapperInfo", name, arithmetic_wrapper_info.offset0_, arithmetic_wrapper_info.stride0_,
148                  arithmetic_wrapper_info.offset1_, arithmetic_wrapper_info.stride1_,
149                  arithmetic_wrapper_info.out_offset_, arithmetic_wrapper_info.out_stride_,
150                  arithmetic_wrapper_info.arithmetic_func_type_);
151 }
152 }  // namespace mindspore::lite::micro::nnacl
153