86 const circle::Tensor *input1;
87 const circle::Tensor *input2;
88 const circle::Tensor *output;
94 const circle::MulOptions *options;
98 runtime_kernel.
readKernel(op_index, runtime_context);
100 input1 = runtime_kernel.
inputs[input1TensorIdx];
101 input2 = runtime_kernel.
inputs[input2TensorIdx];
102 output = runtime_kernel.
outputs[outputTensorIdx];
103 assert(input1 !=
nullptr);
104 assert(input2 !=
nullptr);
105 assert(output !=
nullptr);
109 input1_data = runtime_kernel.
inputs_data[input1TensorIdx];
110 input2_data = runtime_kernel.
inputs_data[input2TensorIdx];
111 output_data = runtime_kernel.
outputs_data[outputTensorIdx];
112 assert(input1_data !=
nullptr);
113 assert(input2_data !=
nullptr);
114 assert(output_data !=
nullptr);
116 options = runtime_kernel.
first_operator->builtin_options_as_MulOptions();
128 switch (input1->type())
131 case circle::TensorType_FLOAT32:
134 ¶ms.float_activation_min,
135 ¶ms.float_activation_max);
140 params, input1_shape, core::utils::castInputData<float>(input1_data), input2_shape,
141 core::utils::castInputData<float>(input2_data),
output_shape,
142 core::utils::castOutputData<float>(output_data));
147 pal::Mul(params, input1_shape.
flatSize(), core::utils::castInputData<float>(input1_data),
148 core::utils::castInputData<float>(input2_data),
149 core::utils::castOutputData<float>(output_data));
153 case circle::TensorType_INT64:
156 ¶ms.int64_activation_min,
157 ¶ms.int64_activation_max);
162 params, input1_shape, core::utils::castInputData<int64_t>(input1_data), input2_shape,
163 core::utils::castInputData<int64_t>(input2_data),
output_shape,
164 core::utils::castOutputData<int64_t>(output_data));
169 core::utils::castInputData<int64_t>(input1_data),
170 core::utils::castInputData<int64_t>(input2_data),
171 core::utils::castOutputData<int64_t>(output_data));
175 case circle::TensorType_INT32:
178 ¶ms.int32_activation_min,
179 ¶ms.int32_activation_max);
184 params, input1_shape, core::utils::castInputData<int32_t>(input1_data), input2_shape,
185 core::utils::castInputData<int32_t>(input2_data),
output_shape,
186 core::utils::castOutputData<int32_t>(output_data));
191 core::utils::castInputData<int32_t>(input1_data),
192 core::utils::castInputData<int32_t>(input2_data),
193 core::utils::castOutputData<int32_t>(output_data));
199 case circle::TensorType_INT8:
203 calculateQuantParamsForMul(add_params, input1, input2, output,
204 options->fused_activation_function());
209 add_params, input1_shape, core::utils::castInputData<int8_t>(input1_data), input2_shape,
210 core::utils::castInputData<int8_t>(input2_data),
output_shape,
211 core::utils::castOutputData<int8_t>(output_data));
218 core::utils::castInputData<int8_t>(input1_data),
219 core::utils::castInputData<int8_t>(input2_data),
220 core::utils::castOutputData<int8_t>(output_data));
228 assert(
false &&
"Unsupported type.");