MCPcopy Create free account
hub / github.com/OAID/Tengine / GetOutResult

Method GetOutResult

executor/operator/arm64/softmax_float.cpp:176–220  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

174 }
175
176 static void GetOutResult(float* input, float* output, float* maxarray, float* sum_array, int in_size, int on_size)
177 {
178 float* input_ptr = ( float* )input;
179 float* output_ptr = ( float* )output;
180 float* maxarray_ptr = ( float* )maxarray;
181 float* sum_array_ptr = ( float* )sum_array;
182
183 memset(sum_array, 0x0, in_size * sizeof(float));
184
185 /* get the exp and the summary */
186
187 for(int j = 0; j < on_size; j++)
188 {
189 for(int i = 0; i < (in_size & -4); i += 4)
190 {
191 int index = j * in_size + i;
192 float32x4_t out = vexpq10_f32(vsubq_f32(vld1q_f32(input_ptr + index), vld1q_f32(maxarray_ptr + i)));
193 float32x4_t sum = vaddq_f32(vld1q_f32(sum_array_ptr+i), out);
194 vst1q_f32(output_ptr+index, out);
195 vst1q_f32(sum_array_ptr+i, sum);
196
197 }
198 for(int i = in_size & ~3; i < in_size; i++)
199 {
200 int index = j * in_size + i;
201 output_ptr[index] = exp(input_ptr[index] - maxarray_ptr[i]);
202 sum_array_ptr[i] += output_ptr[index];
203 }
204 }
205 /*
206 for(int l = 0; l < in_size; l++)
207 {
208 int index = j * in_size + l;
209 output_ptr[index] = exp(input_ptr[index] - array_ptr[l]);
210 sum_array_ptr[l] += output_ptr[index];
211 }
212 */
213 /* the final result */
214 for(int j = 0; j < on_size; j++)
215 for(int l = 0; l < in_size; l++)
216 {
217 int index = j * in_size + l;
218 output_ptr[index] /= sum_array_ptr[l];
219 }
220 }
221
222 bool Run(Node* node)
223 {

Callers

nothing calls this directly

Calls 1

vexpq10_f32Function · 0.70

Tested by

no test coverage detected