diff options
author | Pablo Tello <pablo.tello@arm.com> | 2019-10-21 14:25:41 +0100 |
---|---|---|
committer | Gian Marco Iodice <gianmarco.iodice@arm.com> | 2019-11-08 12:07:21 +0000 |
commit | 5264b7d5555ec980f9c52c719122479d0d676af8 (patch) | |
tree | 78260be4ee31d89d00705acbf1e0ed2361144bd4 /src/core/NEON/kernels/convolution/winograd/winograd_transforms/output_4_5_fp32_fp32_integers.cpp | |
parent | 68adf4449b1f92dd2362d88bb0fd565c2c06d22c (diff) | |
download | ComputeLibrary-5264b7d5555ec980f9c52c719122479d0d676af8.tar.gz |
COMPMID-2576: Fuse activation in Winograd output transform.
Change-Id: I26dd1307847adeaaefae0a7374b9858c07d71372
Signed-off-by: Pablo Tello <pablo.tello@arm.com>
Reviewed-on: https://review.mlplatform.org/c/2172
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Diffstat (limited to 'src/core/NEON/kernels/convolution/winograd/winograd_transforms/output_4_5_fp32_fp32_integers.cpp')
-rw-r--r-- | src/core/NEON/kernels/convolution/winograd/winograd_transforms/output_4_5_fp32_fp32_integers.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/core/NEON/kernels/convolution/winograd/winograd_transforms/output_4_5_fp32_fp32_integers.cpp b/src/core/NEON/kernels/convolution/winograd/winograd_transforms/output_4_5_fp32_fp32_integers.cpp index 7187ef2d20..49a3f41182 100644 --- a/src/core/NEON/kernels/convolution/winograd/winograd_transforms/output_4_5_fp32_fp32_integers.cpp +++ b/src/core/NEON/kernels/convolution/winograd/winograd_transforms/output_4_5_fp32_fp32_integers.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -36,7 +36,9 @@ void OutputTransform<1, 5, 1, 8, float, float, WinogradRoots::Integers>::transfo const float* bptr, float* const output, const int, // No need to stride across rows - const int output_col_stride + const int output_col_stride, + const float output_min, + const float output_max ) { // Construct a map to the output cells @@ -74,7 +76,10 @@ void OutputTransform<1, 5, 1, 8, float, float, WinogradRoots::Integers>::transfo } for (int j = 0; j < output_tile_cols; j++) { - vst1q_f32(outptrs[j], f[j] + b); + const auto y = + vmaxq_f32(vminq_f32(vaddq_f32(f[j], b), vdupq_n_f32(output_max)), + vdupq_n_f32(output_min)); + vst1q_f32(outptrs[j], y); outptrs[j] += 4; } } @@ -103,7 +108,10 @@ void OutputTransform<1, 5, 1, 8, float, float, WinogradRoots::Integers>::transfo } for (int j = 0; j < output_tile_cols; j++) { - vst1_f32(outptrs[j], f[j] + b); + const auto y = + vmax_f32(vmin_f32(vadd_f32(f[j], b), vdup_n_f32(output_max)), + vdup_n_f32(output_min)); + vst1_f32(outptrs[j], y); outptrs[j] += 2; } } @@ -132,7 +140,8 @@ void OutputTransform<1, 5, 1, 8, float, float, WinogradRoots::Integers>::transfo } for (int j = 0; j < output_tile_cols; j++) { - *(outptrs[j]++) = f[j] + b; + const auto y = std::max(std::min(f[j] + b, output_max), output_min); + *(outptrs[j]++) = y; } } } |