From 6aeb2170d18824135acef2d5c16fb93c4488c1fe Mon Sep 17 00:00:00 2001 From: Giorgio Arena Date: Tue, 15 Dec 2020 15:45:43 +0000 Subject: Fix fill() for FP data type in fixtures - Part 1 Resolves: COMPMID-4050 Signed-off-by: Giorgio Arena Change-Id: I182548bf4b944c499a7134ac005b137877e61baf Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/4700 Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio Comments-Addressed: Arm Jenkins --- support/Random.h | 12 +++++++----- tests/AssetsLibrary.h | 9 +++++---- tests/validation/fixtures/ArgMinMaxFixture.h | 9 +++++++-- .../fixtures/ConvertFullyConnectedWeightsFixture.h | 11 ++++++++--- .../validation/fixtures/ConvolutionLayerFixture.h | 7 ++++++- .../fixtures/DeconvolutionLayerFixture.h | 7 ++++++- .../fixtures/DepthwiseConvolutionLayerFixture.h | 13 +++++++++---- .../fixtures/DirectConvolutionLayerFixture.h | 7 ++++++- .../DirectConvolutionLayerTensorShiftFixture.h | 9 +++++++-- .../validation/fixtures/ElementWiseUnaryFixture.h | 9 +++++++-- tests/validation/fixtures/FFTFixture.h | 6 ++---- tests/validation/fixtures/GEMMFixture.h | 7 ++++++- .../validation/fixtures/GEMMInterleave4x4Fixture.h | 9 +++++++-- tests/validation/fixtures/GEMMLowpFixture.h | 8 ++++++-- .../validation/fixtures/GEMMTranspose1xWFixture.h | 9 +++++++-- .../fixtures/WinogradConvolutionLayerFixture.h | 11 ++++++++--- utils/Utils.h | 22 ++++++++-------------- 17 files changed, 112 insertions(+), 53 deletions(-) diff --git a/support/Random.h b/support/Random.h index c8b767e505..d5d372dc82 100644 --- a/support/Random.h +++ b/support/Random.h @@ -25,6 +25,7 @@ #define ARM_COMPUTE_MISC_RANDOM_H #include "arm_compute/core/Error.h" +#include "utils/Utils.h" #include #include @@ -43,13 +44,14 @@ template class RangedUniformDistribution { public: - using DT = typename std::conditional::value, - std::uniform_int_distribution, - std::uniform_real_distribution>::type; + static constexpr bool is_half = std::is_same::value; + static constexpr bool is_integral = std::is_integral::value && !is_half; + + using fp_dist = typename std::conditional>::type; + using DT = typename std::conditional, fp_dist>::type; using result_type = T; using range_pair = std::pair; -public: /** Constructor * * @param[in] low lowest value in the range (inclusive) @@ -62,7 +64,7 @@ public: result_type clow = low; for(const auto &erange : exclude_ranges) { - result_type epsilon = std::is_integral::value ? 1 : static_cast(std::numeric_limits::epsilon()); + result_type epsilon = is_integral ? result_type(1) : result_type(std::numeric_limits::epsilon()); ARM_COMPUTE_ERROR_ON(clow > erange.first || clow >= erange.second); diff --git a/tests/AssetsLibrary.h b/tests/AssetsLibrary.h index 28a51d6ae9..fdb05691ea 100644 --- a/tests/AssetsLibrary.h +++ b/tests/AssetsLibrary.h @@ -36,6 +36,7 @@ #include "tests/TensorCache.h" #include "tests/Utils.h" #include "tests/framework/Exceptions.h" +#include "utils/Utils.h" #include #include @@ -782,7 +783,7 @@ void AssetsLibrary::fill_tensor_uniform(T &&tensor, std::random_device::result_t case DataType::F16: { // It doesn't make sense to check [-inf, inf], so hard code it to a big number - std::uniform_real_distribution distribution_f16(-100.f, 100.f); + arm_compute::utils::uniform_real_distribution_fp16 distribution_f16{ half(-100.f), half(100.f) }; fill(tensor, distribution_f16, seed_offset); break; } @@ -888,8 +889,8 @@ void AssetsLibrary::fill_tensor_uniform_ranged(T case DataType::F16: { // It doesn't make sense to check [-inf, inf], so hard code it to a big number - const auto converted_pairs = detail::convert_range_pair(excluded_range_pairs); - RangedUniformDistribution distribution_f16(-100.f, 100.f, converted_pairs); + const auto converted_pairs = detail::convert_range_pair(excluded_range_pairs); + RangedUniformDistribution distribution_f16(half(-100.f), half(100.f), converted_pairs); fill(tensor, distribution_f16, seed_offset); break; } @@ -979,7 +980,7 @@ void AssetsLibrary::fill_tensor_uniform(T &&tensor, std::random_device::result_t } case DataType::F16: { - std::uniform_real_distribution distribution_f16(low, high); + arm_compute::utils::uniform_real_distribution_fp16 distribution_f16{ half(low), half(high) }; fill(tensor, distribution_f16, seed_offset); break; } diff --git a/tests/validation/fixtures/ArgMinMaxFixture.h b/tests/validation/fixtures/ArgMinMaxFixture.h index cf34bcc00e..044e253d92 100644 --- a/tests/validation/fixtures/ArgMinMaxFixture.h +++ b/tests/validation/fixtures/ArgMinMaxFixture.h @@ -59,10 +59,15 @@ protected: { switch(tensor.data_type()) { - case DataType::F32: case DataType::F16: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, 0); + break; + } + case DataType::F32: + { + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, 0); break; } diff --git a/tests/validation/fixtures/ConvertFullyConnectedWeightsFixture.h b/tests/validation/fixtures/ConvertFullyConnectedWeightsFixture.h index c90409f3a4..f1eeff7872 100644 --- a/tests/validation/fixtures/ConvertFullyConnectedWeightsFixture.h +++ b/tests/validation/fixtures/ConvertFullyConnectedWeightsFixture.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Arm Limited. + * Copyright (c) 2018-2020 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -65,10 +65,15 @@ protected: library->fill(tensor, distribution, i); break; } - case DataType::F32: case DataType::F16: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } + case DataType::F32: + { + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/ConvolutionLayerFixture.h b/tests/validation/fixtures/ConvolutionLayerFixture.h index e1452f5dfc..94fbc53d65 100644 --- a/tests/validation/fixtures/ConvolutionLayerFixture.h +++ b/tests/validation/fixtures/ConvolutionLayerFixture.h @@ -142,9 +142,14 @@ protected: } case DataType::BFLOAT16: case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/DeconvolutionLayerFixture.h b/tests/validation/fixtures/DeconvolutionLayerFixture.h index 7c7f32bffd..d56a9337e9 100644 --- a/tests/validation/fixtures/DeconvolutionLayerFixture.h +++ b/tests/validation/fixtures/DeconvolutionLayerFixture.h @@ -90,9 +90,14 @@ protected: break; } case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h b/tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h index af3838f438..9cd60cc1fb 100644 --- a/tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h +++ b/tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h @@ -97,10 +97,15 @@ protected: library->fill(tensor, distribution, i); break; } - case DataType::F32: case DataType::F16: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } + case DataType::F32: + { + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } @@ -343,13 +348,13 @@ protected: { case DataType::F32: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } case DataType::F16: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/DirectConvolutionLayerFixture.h b/tests/validation/fixtures/DirectConvolutionLayerFixture.h index e37063e2e5..7faea5518f 100644 --- a/tests/validation/fixtures/DirectConvolutionLayerFixture.h +++ b/tests/validation/fixtures/DirectConvolutionLayerFixture.h @@ -108,9 +108,14 @@ protected: break; } case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(-1.f, 1.f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/DirectConvolutionLayerTensorShiftFixture.h b/tests/validation/fixtures/DirectConvolutionLayerTensorShiftFixture.h index b313c8490d..be43853e0b 100644 --- a/tests/validation/fixtures/DirectConvolutionLayerTensorShiftFixture.h +++ b/tests/validation/fixtures/DirectConvolutionLayerTensorShiftFixture.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 Arm Limited. + * Copyright (c) 2017-2020 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -93,9 +93,14 @@ protected: break; } case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/ElementWiseUnaryFixture.h b/tests/validation/fixtures/ElementWiseUnaryFixture.h index f04463d466..b1d54fd940 100644 --- a/tests/validation/fixtures/ElementWiseUnaryFixture.h +++ b/tests/validation/fixtures/ElementWiseUnaryFixture.h @@ -74,10 +74,15 @@ protected: { switch(data_type) { - case DataType::F32: case DataType::F16: { - std::uniform_real_distribution<> distribution(-2.0f, 2.0f); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-2.0f), half(2.0f) }; + library->fill(tensor, distribution, i); + break; + } + case DataType::F32: + { + std::uniform_real_distribution distribution(-2.0f, 2.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/FFTFixture.h b/tests/validation/fixtures/FFTFixture.h index 564098497b..ae5b226954 100644 --- a/tests/validation/fixtures/FFTFixture.h +++ b/tests/validation/fixtures/FFTFixture.h @@ -35,8 +35,6 @@ #include "tests/validation/reference/ConvolutionLayer.h" #include "tests/validation/reference/DFT.h" -#include "utils/Utils.h" - #include namespace arm_compute @@ -65,7 +63,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution(half(-5.0f), half(5.0f)); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-5.0f), half(5.0f) }; library->fill(tensor, distribution, 0); break; } @@ -153,7 +151,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution(half(-1.0f), half(1.0f)); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/GEMMFixture.h b/tests/validation/fixtures/GEMMFixture.h index 358056ad65..7e775887b6 100644 --- a/tests/validation/fixtures/GEMMFixture.h +++ b/tests/validation/fixtures/GEMMFixture.h @@ -63,9 +63,14 @@ protected: switch(tensor.data_type()) { case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(lo), half(hi) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(lo, hi); + std::uniform_real_distribution distribution(lo, hi); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/GEMMInterleave4x4Fixture.h b/tests/validation/fixtures/GEMMInterleave4x4Fixture.h index fb04a08755..3b153a85dc 100644 --- a/tests/validation/fixtures/GEMMInterleave4x4Fixture.h +++ b/tests/validation/fixtures/GEMMInterleave4x4Fixture.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 Arm Limited. + * Copyright (c) 2017-2020 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -63,9 +63,14 @@ protected: switch(tensor.data_type()) { case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(-1.f, 1.f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/GEMMLowpFixture.h b/tests/validation/fixtures/GEMMLowpFixture.h index 94b25e2243..338cf01138 100644 --- a/tests/validation/fixtures/GEMMLowpFixture.h +++ b/tests/validation/fixtures/GEMMLowpFixture.h @@ -78,10 +78,14 @@ void fill(U &&tensor, int i) break; } case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - // Between 1 and 254 in order to avoid having -128 and 128 for the DOT product path - std::uniform_real_distribution<> distribution(-1.0f, 1.0f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/GEMMTranspose1xWFixture.h b/tests/validation/fixtures/GEMMTranspose1xWFixture.h index 9619a667e9..6edb78fe22 100644 --- a/tests/validation/fixtures/GEMMTranspose1xWFixture.h +++ b/tests/validation/fixtures/GEMMTranspose1xWFixture.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Arm Limited. + * Copyright (c) 2017-2020 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -64,9 +64,14 @@ protected: switch(tensor.data_type()) { case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(-1.0f), half(1.0f) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(-1.f, 1.f); + std::uniform_real_distribution distribution(-1.0f, 1.0f); library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/WinogradConvolutionLayerFixture.h b/tests/validation/fixtures/WinogradConvolutionLayerFixture.h index 410c2a544e..4e26a5ef95 100644 --- a/tests/validation/fixtures/WinogradConvolutionLayerFixture.h +++ b/tests/validation/fixtures/WinogradConvolutionLayerFixture.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2019 Arm Limited. + * Copyright (c) 2018-2020 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -177,7 +177,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution((half)min, (half)max); + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(min), half(max) }; library->fill(tensor, distribution, i); break; } @@ -499,9 +499,14 @@ protected: switch(tensor.data_type()) { case DataType::F16: + { + arm_compute::utils::uniform_real_distribution_fp16 distribution{ half(min), half(max) }; + library->fill(tensor, distribution, i); + break; + } case DataType::F32: { - std::uniform_real_distribution<> distribution(min, max); + std::uniform_real_distribution distribution(min, max); library->fill(tensor, distribution, i); break; } diff --git a/utils/Utils.h b/utils/Utils.h index b10d18aca2..7eeeae5419 100644 --- a/utils/Utils.h +++ b/utils/Utils.h @@ -296,20 +296,15 @@ inline void unmap(GCTensor &tensor) */ class uniform_real_distribution_fp16 { - half min{ 0.0f }, max{ 0.0f }; - std::uniform_real_distribution neg{ min, -0.3f }; - std::uniform_real_distribution pos{ 0.3f, max }; - std::uniform_int_distribution sign_picker{ 0, 1 }; - public: using result_type = half; /** Constructor * - * @param[in] a Minimum value of the distribution - * @param[in] b Maximum value of the distribution + * @param[in] min Minimum value of the distribution + * @param[in] max Maximum value of the distribution */ - explicit uniform_real_distribution_fp16(half a = half(0.0), half b = half(1.0)) - : min(a), max(b) + explicit uniform_real_distribution_fp16(half min = half(0.0), half max = half(1.0)) + : dist(min, max) { } @@ -319,12 +314,11 @@ public: */ half operator()(std::mt19937 &gen) { - if(sign_picker(gen)) - { - return (half)neg(gen); - } - return (half)pos(gen); + return half(dist(gen)); } + +private: + std::uniform_real_distribution dist; }; /** Numpy data loader */ -- cgit v1.2.1