| 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 | { |
nothing calls this directly
no test coverage detected