diff options
author | Georgios Pinitas <georgios.pinitas@arm.com> | 2018-09-10 15:07:45 +0100 |
---|---|---|
committer | Anthony Barbier <anthony.barbier@arm.com> | 2018-11-02 16:54:54 +0000 |
commit | cbf39c63a6eb89a2c80b2338afc374081803d79d (patch) | |
tree | afe1c55d5e3bbf0e111ec0dce9a564304844a55f /tests/validation/reference/ArithmeticAddition.cpp | |
parent | d7647d4ebd0f0b5253b7f31ffcd48a851ba62947 (diff) | |
download | ComputeLibrary-cbf39c63a6eb89a2c80b2338afc374081803d79d.tar.gz |
COMPMID-1566: Add broadcast to CLArithmeticSubtraction
Change-Id: I05d21f9a92013ecfd1128d12cf1561cfd6e5c5e9
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/147983
Tested-by: bsgcomp <bsgcomp@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Diffstat (limited to 'tests/validation/reference/ArithmeticAddition.cpp')
-rw-r--r-- | tests/validation/reference/ArithmeticAddition.cpp | 147 |
1 files changed, 0 insertions, 147 deletions
diff --git a/tests/validation/reference/ArithmeticAddition.cpp b/tests/validation/reference/ArithmeticAddition.cpp deleted file mode 100644 index c68c6d4ed6..0000000000 --- a/tests/validation/reference/ArithmeticAddition.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2017-2018 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#include "ArithmeticAddition.h" - -#include "arm_compute/core/Types.h" -#include "tests/validation/Helpers.h" - -namespace arm_compute -{ -namespace test -{ -namespace validation -{ -namespace reference -{ -namespace -{ -template <typename T> -T add(T src1, T src2, ConvertPolicy convert_policy) -{ - using intermediate_type = typename common_promoted_signed_type<T>::intermediate_type; - - intermediate_type val = static_cast<intermediate_type>(src1) + static_cast<intermediate_type>(src2); - - T result = (convert_policy == ConvertPolicy::SATURATE) ? saturate_cast<T>(val) : static_cast<T>(val); - - return result; -} - -template <size_t dim> -struct BroadcastUnroll -{ - template <typename T> - static void unroll(const SimpleTensor<T> &src1, const SimpleTensor<T> &src2, SimpleTensor<T> &dst, - ConvertPolicy convert_policy, Coordinates &id_src1, Coordinates &id_src2, Coordinates &id_dst) - { - const bool src1_is_broadcast = (src1.shape()[dim - 1] != dst.shape()[dim - 1]); - const bool src2_is_broadcast = (src2.shape()[dim - 1] != dst.shape()[dim - 1]); - - id_src1.set(dim - 1, 0); - id_src2.set(dim - 1, 0); - id_dst.set(dim - 1, 0); - - for(size_t i = 0; i < dst.shape()[dim - 1]; ++i, ++id_dst[dim - 1]) - { - BroadcastUnroll < dim - 1 >::unroll(src1, src2, dst, convert_policy, id_src1, id_src2, id_dst); - - id_src1[dim - 1] += !src1_is_broadcast; - id_src2[dim - 1] += !src2_is_broadcast; - } - } -}; - -template <> -struct BroadcastUnroll<0> -{ - template <typename T> - static void unroll(const SimpleTensor<T> &src1, const SimpleTensor<T> &src2, SimpleTensor<T> &dst, - ConvertPolicy convert_policy, Coordinates &id_src1, Coordinates &id_src2, Coordinates &id_dst) - { - dst[coord2index(dst.shape(), id_dst)] = add(src1[coord2index(src1.shape(), id_src1)], src2[coord2index(src2.shape(), id_src2)], convert_policy); - } -}; -} // namespace - -template <typename T> -SimpleTensor<T> arithmetic_addition(const SimpleTensor<T> &src1, const SimpleTensor<T> &src2, SimpleTensor<T> &dst, ConvertPolicy convert_policy) -{ - Coordinates id_src1, id_src2, id_dst; - - BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1, src2, dst, convert_policy, id_src1, id_src2, id_dst); - - return dst; -} - -template <> -SimpleTensor<uint8_t> arithmetic_addition(const SimpleTensor<uint8_t> &src1, const SimpleTensor<uint8_t> &src2, SimpleTensor<uint8_t> &dst, ConvertPolicy convert_policy) -{ - if(dst.data_type() == DataType::QASYMM8) - { - SimpleTensor<float> src1_tmp = convert_from_asymmetric(src1); - SimpleTensor<float> src2_tmp = convert_from_asymmetric(src2); - SimpleTensor<float> dst_tmp(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dst.data_type()); - - Coordinates id_src1, id_src2, id_dst; - - BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1_tmp, src2_tmp, dst_tmp, convert_policy, id_src1, id_src2, id_dst); - - dst = convert_to_asymmetric(dst_tmp, dst.quantization_info()); - return dst; - } - else - { - // DataType::U8 - Coordinates id_src1, id_src2, id_dst; - - BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1, src2, dst, convert_policy, id_src1, id_src2, id_dst); - - return dst; - } -} - -template SimpleTensor<int16_t> arithmetic_addition(const SimpleTensor<int16_t> &src1, const SimpleTensor<int16_t> &src2, SimpleTensor<int16_t> &dst, ConvertPolicy convert_policy); -template SimpleTensor<int8_t> arithmetic_addition(const SimpleTensor<int8_t> &src1, const SimpleTensor<int8_t> &src2, SimpleTensor<int8_t> &dst, ConvertPolicy convert_policy); -template SimpleTensor<half> arithmetic_addition(const SimpleTensor<half> &src1, const SimpleTensor<half> &src2, SimpleTensor<half> &dst, ConvertPolicy convert_policy); -template SimpleTensor<float> arithmetic_addition(const SimpleTensor<float> &src1, const SimpleTensor<float> &src2, SimpleTensor<float> &dst, ConvertPolicy convert_policy); - -template <typename T> -SimpleTensor<T> arithmetic_addition(const SimpleTensor<T> &src1, const SimpleTensor<T> &src2, DataType dst_data_type, ConvertPolicy convert_policy) -{ - ARM_COMPUTE_ERROR_ON_MSG(dst_data_type == DataType::QASYMM8, "For QASYMM8, the quantized output tensor should be passed directly."); - - SimpleTensor<T> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dst_data_type); - arithmetic_addition<T>(src1, src2, dst, convert_policy); - return dst; -} - -template SimpleTensor<int16_t> arithmetic_addition(const SimpleTensor<int16_t> &src1, const SimpleTensor<int16_t> &src2, DataType dst_data_type, ConvertPolicy convert_policy); -template SimpleTensor<int8_t> arithmetic_addition(const SimpleTensor<int8_t> &src1, const SimpleTensor<int8_t> &src2, DataType dst_data_type, ConvertPolicy convert_policy); -template SimpleTensor<half> arithmetic_addition(const SimpleTensor<half> &src1, const SimpleTensor<half> &src2, DataType dst_data_type, ConvertPolicy convert_policy); -template SimpleTensor<float> arithmetic_addition(const SimpleTensor<float> &src1, const SimpleTensor<float> &src2, DataType dst_data_type, ConvertPolicy convert_policy); - -} // namespace reference -} // namespace validation -} // namespace test -} // namespace arm_compute |