From a8e2aeb7d2d46a7ab0e9523de145af9920fc1fa3 Mon Sep 17 00:00:00 2001 From: Giorgio Arena Date: Wed, 6 Jan 2021 11:34:57 +0000 Subject: Generalize custom uniform generator for floating point data types with 16 bits - Change name of uniform_real_distribution_fp16 to uniform_real_distribution_16bit, and make it also accept bfloat16 data type Resolves: COMPMID-4057 Signed-off-by: Giorgio Arena Change-Id: Id2f1a84b9c9f09cb260a0785add4fc5954d5853a Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/4768 Reviewed-by: Michele Di Giorgio Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins --- support/Random.h | 8 ++++---- tests/AssetsLibrary.h | 12 ++++++------ tests/validation/fixtures/ArgMinMaxFixture.h | 2 +- .../fixtures/ConvertFullyConnectedWeightsFixture.h | 2 +- tests/validation/fixtures/ConvolutionLayerFixture.h | 7 ++++++- tests/validation/fixtures/DeconvolutionLayerFixture.h | 2 +- .../fixtures/DepthwiseConvolutionLayerFixture.h | 4 ++-- .../fixtures/DirectConvolutionLayerFixture.h | 2 +- .../DirectConvolutionLayerTensorShiftFixture.h | 2 +- tests/validation/fixtures/ElementWiseUnaryFixture.h | 2 +- tests/validation/fixtures/FFTFixture.h | 4 ++-- tests/validation/fixtures/GEMMFixture.h | 2 +- tests/validation/fixtures/GEMMInterleave4x4Fixture.h | 2 +- tests/validation/fixtures/GEMMLowpFixture.h | 2 +- tests/validation/fixtures/GEMMTranspose1xWFixture.h | 2 +- .../fixtures/WinogradConvolutionLayerFixture.h | 4 ++-- utils/Utils.h | 19 +++++++++++-------- 17 files changed, 43 insertions(+), 35 deletions(-) diff --git a/support/Random.h b/support/Random.h index d5d372dc82..7658e6d529 100644 --- a/support/Random.h +++ b/support/Random.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020 Arm Limited. + * Copyright (c) 2019-2021 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -44,10 +44,10 @@ template class RangedUniformDistribution { public: - static constexpr bool is_half = std::is_same::value; - static constexpr bool is_integral = std::is_integral::value && !is_half; + static constexpr bool is_fp_16bit = std::is_same::value || std::is_same::value; + static constexpr bool is_integral = std::is_integral::value && !is_fp_16bit; - using fp_dist = typename std::conditional>::type; + using fp_dist = typename std::conditional, std::uniform_real_distribution>::type; using DT = typename std::conditional, fp_dist>::type; using result_type = T; using range_pair = std::pair; diff --git a/tests/AssetsLibrary.h b/tests/AssetsLibrary.h index f44c554635..8230a93fbd 100644 --- a/tests/AssetsLibrary.h +++ b/tests/AssetsLibrary.h @@ -776,14 +776,14 @@ void AssetsLibrary::fill_tensor_uniform(T &&tensor, std::random_device::result_t case DataType::BFLOAT16: { // It doesn't make sense to check [-inf, inf], so hard code it to a big number - std::uniform_real_distribution distribution_bf16(-1000.f, 1000.f); + arm_compute::utils::uniform_real_distribution_16bit distribution_bf16(-1000.f, 1000.f); fill(tensor, distribution_bf16, seed_offset); break; } case DataType::F16: { // It doesn't make sense to check [-inf, inf], so hard code it to a big number - arm_compute::utils::uniform_real_distribution_fp16 distribution_f16{ -100.f, 100.f }; + arm_compute::utils::uniform_real_distribution_16bit distribution_f16{ -100.f, 100.f }; fill(tensor, distribution_f16, seed_offset); break; } @@ -881,8 +881,8 @@ void AssetsLibrary::fill_tensor_uniform_ranged(T case DataType::BFLOAT16: { // 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_bf16(-1000.f, 1000.f, converted_pairs); + const auto converted_pairs = detail::convert_range_pair(excluded_range_pairs); + RangedUniformDistribution distribution_bf16(bfloat16(-1000.f), bfloat16(1000.f), converted_pairs); fill(tensor, distribution_bf16, seed_offset); break; } @@ -974,13 +974,13 @@ void AssetsLibrary::fill_tensor_uniform(T &&tensor, std::random_device::result_t } case DataType::BFLOAT16: { - std::uniform_real_distribution distribution_bf16(low, high); + arm_compute::utils::uniform_real_distribution_16bit distribution_bf16(low, high); fill(tensor, distribution_bf16, seed_offset); break; } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution_f16{ float(low), float(high) }; + arm_compute::utils::uniform_real_distribution_16bit distribution_f16{ float(low), float(high) }; fill(tensor, distribution_f16, seed_offset); break; } diff --git a/tests/validation/fixtures/ArgMinMaxFixture.h b/tests/validation/fixtures/ArgMinMaxFixture.h index fdf9ac4e5b..f140c9846b 100644 --- a/tests/validation/fixtures/ArgMinMaxFixture.h +++ b/tests/validation/fixtures/ArgMinMaxFixture.h @@ -61,7 +61,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 a4705b1250..d7984830f5 100644 --- a/tests/validation/fixtures/ConvertFullyConnectedWeightsFixture.h +++ b/tests/validation/fixtures/ConvertFullyConnectedWeightsFixture.h @@ -67,7 +67,7 @@ protected: } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 210afbef5b..006c5eb705 100644 --- a/tests/validation/fixtures/ConvolutionLayerFixture.h +++ b/tests/validation/fixtures/ConvolutionLayerFixture.h @@ -141,9 +141,14 @@ protected: break; } case DataType::BFLOAT16: + { + arm_compute::utils::uniform_real_distribution_16bit distribution{ -1.0f, 1.0f }; + library->fill(tensor, distribution, i); + break; + } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 6394caf457..6ea2335ae9 100644 --- a/tests/validation/fixtures/DeconvolutionLayerFixture.h +++ b/tests/validation/fixtures/DeconvolutionLayerFixture.h @@ -91,7 +91,7 @@ protected: } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 09f8cb4c06..bb1c105555 100644 --- a/tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h +++ b/tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h @@ -99,7 +99,7 @@ protected: } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ -1.0f, 1.0f }; library->fill(tensor, distribution, i); break; } @@ -354,7 +354,7 @@ protected: } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ -1.0f, 1.0f }; library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/DirectConvolutionLayerFixture.h b/tests/validation/fixtures/DirectConvolutionLayerFixture.h index 1967e8dc4d..8e4de77535 100644 --- a/tests/validation/fixtures/DirectConvolutionLayerFixture.h +++ b/tests/validation/fixtures/DirectConvolutionLayerFixture.h @@ -109,7 +109,7 @@ protected: } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 7e891fe682..f39595f0de 100644 --- a/tests/validation/fixtures/DirectConvolutionLayerTensorShiftFixture.h +++ b/tests/validation/fixtures/DirectConvolutionLayerTensorShiftFixture.h @@ -94,7 +94,7 @@ protected: } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ float(-1.0f), float(1.0f) }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ float(-1.0f), float(1.0f) }; library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/ElementWiseUnaryFixture.h b/tests/validation/fixtures/ElementWiseUnaryFixture.h index 26484be2fa..f414daf8f7 100644 --- a/tests/validation/fixtures/ElementWiseUnaryFixture.h +++ b/tests/validation/fixtures/ElementWiseUnaryFixture.h @@ -76,7 +76,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -2.0f, 2.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 37c2f2faec..86a97272a0 100644 --- a/tests/validation/fixtures/FFTFixture.h +++ b/tests/validation/fixtures/FFTFixture.h @@ -63,7 +63,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -5.0f, 5.0f }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ -5.0f, 5.0f }; library->fill(tensor, distribution, 0); break; } @@ -151,7 +151,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ -1.0f, 1.0f }; library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/GEMMFixture.h b/tests/validation/fixtures/GEMMFixture.h index 0c2f0a410e..192e77e5aa 100644 --- a/tests/validation/fixtures/GEMMFixture.h +++ b/tests/validation/fixtures/GEMMFixture.h @@ -64,7 +64,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ float(lo), float(hi) }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ float(lo), float(hi) }; library->fill(tensor, distribution, i); break; } diff --git a/tests/validation/fixtures/GEMMInterleave4x4Fixture.h b/tests/validation/fixtures/GEMMInterleave4x4Fixture.h index 30708e4e7d..1ce0eafead 100644 --- a/tests/validation/fixtures/GEMMInterleave4x4Fixture.h +++ b/tests/validation/fixtures/GEMMInterleave4x4Fixture.h @@ -64,7 +64,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 b9140ebd3e..24c1a24d40 100644 --- a/tests/validation/fixtures/GEMMLowpFixture.h +++ b/tests/validation/fixtures/GEMMLowpFixture.h @@ -79,7 +79,7 @@ void fill(U &&tensor, int i) } case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 3d6ac76681..2d2e70697a 100644 --- a/tests/validation/fixtures/GEMMTranspose1xWFixture.h +++ b/tests/validation/fixtures/GEMMTranspose1xWFixture.h @@ -65,7 +65,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ -1.0f, 1.0f }; + arm_compute::utils::uniform_real_distribution_16bit 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 5a40815a67..e1cc953375 100644 --- a/tests/validation/fixtures/WinogradConvolutionLayerFixture.h +++ b/tests/validation/fixtures/WinogradConvolutionLayerFixture.h @@ -177,7 +177,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ float(min), float(max) }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ float(min), float(max) }; library->fill(tensor, distribution, i); break; } @@ -500,7 +500,7 @@ protected: { case DataType::F16: { - arm_compute::utils::uniform_real_distribution_fp16 distribution{ float(min), float(max) }; + arm_compute::utils::uniform_real_distribution_16bit distribution{ float(min), float(max) }; library->fill(tensor, distribution, i); break; } diff --git a/utils/Utils.h b/utils/Utils.h index 9862514a9e..9c9026edc4 100644 --- a/utils/Utils.h +++ b/utils/Utils.h @@ -294,16 +294,19 @@ inline void unmap(GCTensor &tensor) * uniform_real_distribution generates values that get rounded off to zero, causing * differences between ACL and reference implementation */ -class uniform_real_distribution_fp16 +template +class uniform_real_distribution_16bit { + static_assert(std::is_same::value || std::is_same::value, "Only half and bfloat16 data types supported"); + public: - using result_type = half; + using result_type = T; /** Constructor * * @param[in] min Minimum value of the distribution * @param[in] max Maximum value of the distribution */ - explicit uniform_real_distribution_fp16(float min = 0.f, float max = 1.0) + explicit uniform_real_distribution_16bit(float min = 0.f, float max = 1.0) : dist(min, max) { } @@ -312,9 +315,9 @@ public: * * @param[in] gen an uniform random bit generator object */ - half operator()(std::mt19937 &gen) + T operator()(std::mt19937 &gen) { - return half(dist(gen)); + return T(dist(gen)); } private: @@ -770,10 +773,10 @@ void fill_tensor_vector(TensorType &tensor, std::vector vec) template void fill_random_tensor(TensorType &tensor, std::random_device::result_type seed, T lower_bound = std::numeric_limits::lowest(), T upper_bound = std::numeric_limits::max()) { - constexpr bool is_half = std::is_same::value; - constexpr bool is_integral = std::is_integral::value && !is_half; + constexpr bool is_fp_16bit = std::is_same::value || std::is_same::value; + constexpr bool is_integral = std::is_integral::value && !is_fp_16bit; - using fp_dist_type = typename std::conditional>::type; + using fp_dist_type = typename std::conditional, std::uniform_real_distribution>::type; using dist_type = typename std::conditional, fp_dist_type>::type; std::mt19937 gen(seed); -- cgit v1.2.1