56 const circle::Tensor *input1;
57 const circle::Tensor *input2;
58 const circle::Tensor *output;
64 const circle::SubOptions *options;
68 runtime_kernel.
readKernel(op_index, runtime_context);
70 input1 = runtime_kernel.
inputs[input1TensorIdx];
71 input2 = runtime_kernel.
inputs[input2TensorIdx];
72 output = runtime_kernel.
outputs[outputTensorIdx];
73 assert(input1 !=
nullptr);
74 assert(input2 !=
nullptr);
75 assert(output !=
nullptr);
79 input1_data = runtime_kernel.
inputs_data[input1TensorIdx];
80 input2_data = runtime_kernel.
inputs_data[input2TensorIdx];
81 output_data = runtime_kernel.
outputs_data[outputTensorIdx];
82 assert(input1_data !=
nullptr);
83 assert(input2_data !=
nullptr);
84 assert(output_data !=
nullptr);
86 options = runtime_kernel.
first_operator->builtin_options_as_SubOptions();
98 switch (input1->type())
101 case circle::TensorType_FLOAT32:
104 ¶ms.float_activation_min,
105 ¶ms.float_activation_max);
110 params, input1_shape, core::utils::castInputData<float>(input1_data), input2_shape,
111 core::utils::castInputData<float>(input2_data),
output_shape,
112 core::utils::castOutputData<float>(output_data));
117 pal::Sub(params, input1_shape.
flatSize(), core::utils::castInputData<float>(input1_data),
118 core::utils::castInputData<float>(input2_data),
119 core::utils::castOutputData<float>(output_data));
123 case circle::TensorType_INT64:
126 ¶ms.int64_activation_min,
127 ¶ms.int64_activation_max);
132 params, input1_shape, core::utils::castInputData<int64_t>(input1_data), input2_shape,
133 core::utils::castInputData<int64_t>(input2_data),
output_shape,
134 core::utils::castOutputData<int64_t>(output_data));
139 core::utils::castInputData<int64_t>(input1_data),
140 core::utils::castInputData<int64_t>(input2_data),
141 core::utils::castOutputData<int64_t>(output_data));
145 case circle::TensorType_INT32:
148 ¶ms.int32_activation_min,
149 ¶ms.int32_activation_max);
154 params, input1_shape, core::utils::castInputData<int32_t>(input1_data), input2_shape,
155 core::utils::castInputData<int32_t>(input2_data),
output_shape,
156 core::utils::castOutputData<int32_t>(output_data));
161 core::utils::castInputData<int32_t>(input1_data),
162 core::utils::castInputData<int32_t>(input2_data),
163 core::utils::castOutputData<int32_t>(output_data));
169 case circle::TensorType_INT8:
174 options->fused_activation_function());
179 sub_params, input1_shape, core::utils::castInputData<int8_t>(input1_data), input2_shape,
180 core::utils::castInputData<int8_t>(input2_data),
output_shape,
181 core::utils::castOutputData<int8_t>(output_data));
186 core::utils::castInputData<int8_t>(input1_data),
187 core::utils::castInputData<int8_t>(input2_data),
188 core::utils::castOutputData<int8_t>(output_data));
196 assert(
false &&
"Unsupported type.");