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 --- utils/Utils.h | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'utils/Utils.h') 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