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