From b1496e6a1074c90fba64633ec92fa202f5f7d1d8 Mon Sep 17 00:00:00 2001 From: Pablo Marquez Tello Date: Fri, 25 Jun 2021 14:49:37 +0100 Subject: Add code to detect Mali(TM) G31 * Fixed a problem which made the library choose the Valhall path instead of Bifrost * Set block sizes to 4 for u8 on G31 * Resolves MLCE-463 Change-Id: I577f57ec96f740db15d6640e34172318a82c5778 Signed-off-by: Pablo Marquez Tello Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/5858 Reviewed-by: Georgios Pinitas Reviewed-by: Gian Marco Iodice Tested-by: Arm Jenkins Comments-Addressed: Georgios Pinitas --- arm_compute/core/GPUTarget.h | 3 +- src/core/GPUTarget.cpp | 4 +++ .../ClGemmDefaultConfigReshapedRhsOnlyBifrost.cpp | 33 ++++++++++++++++++++-- .../ClGemmDefaultConfigReshapedRhsOnlyBifrost.h | 1 + utils/TypePrinter.h | 3 ++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/arm_compute/core/GPUTarget.h b/arm_compute/core/GPUTarget.h index d9994b6cf0..04d2250d9d 100644 --- a/arm_compute/core/GPUTarget.h +++ b/arm_compute/core/GPUTarget.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 Arm Limited. + * Copyright (c) 2018-2021 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -48,6 +48,7 @@ enum class GPUTarget G51LIT = 0x232, G52 = 0x240, G52LIT = 0x241, + G31 = 0x242, G76 = 0x250, G77 = 0x310, G78 = 0x320, diff --git a/src/core/GPUTarget.cpp b/src/core/GPUTarget.cpp index 14264cb883..b4bd2ddf40 100644 --- a/src/core/GPUTarget.cpp +++ b/src/core/GPUTarget.cpp @@ -83,6 +83,10 @@ arm_compute::GPUTarget get_bifrost_target(const std::string &version) { return arm_compute::GPUTarget::G76; } + else if(version.find("G31") != std::string::npos) + { + return arm_compute::GPUTarget::G31; + } else { return arm_compute::GPUTarget::UNKNOWN; diff --git a/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.cpp b/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.cpp index 7ed6b39f3e..417d540468 100644 --- a/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.cpp +++ b/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.cpp @@ -30,7 +30,6 @@ #include "arm_compute/core/TensorShape.h" #include "arm_compute/core/utils/misc/ShapeCalculator.h" #include "src/core/gpu/cl/kernels/gemm/ClGemmHelpers.h" - #include namespace arm_compute @@ -61,6 +60,10 @@ std::pair ClGemmDefaultConfigReshapedRhsOn &ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G52_f16, &ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G7x_u8); + CLGEMMConfigArray configs_G31(&ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G7x_f32, + &ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G7x_f16, + &ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G31_u8); + CLGEMMConfigArray configs_G76(&ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G76_f32, &ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G76_f16, &ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G76_u8); @@ -70,7 +73,6 @@ std::pair ClGemmDefaultConfigReshapedRhsOn &ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G7x_u8); ConfigurationFunctionExecutorPtr func = nullptr; - switch(_target) { case GPUTarget::G76: @@ -82,6 +84,9 @@ std::pair ClGemmDefaultConfigReshapedRhsOn case GPUTarget::G52: func = configs_G52.get_function(data_type); break; + case GPUTarget::G31: + func = configs_G31.get_function(data_type); + break; default: func = configs_G7x.get_function(data_type); break; @@ -113,6 +118,30 @@ std::pair ClGemmDefaultConfigReshapedRhsOn } } +std::pair ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G31_u8(unsigned int m, unsigned int n, unsigned int k, unsigned int b) +{ + ARM_COMPUTE_UNUSED(k); + ARM_COMPUTE_UNUSED(b); + + if(m == 1) + { + const unsigned int h0 = std::max(n / 2, 1U); + return configure_lhs_rhs_info(m, n, 1, 4, 16, 1, h0, 0, 1, 0, 1); + } + else + { + const int h0 = std::max(std::min(static_cast(n / 4), static_cast(256)), static_cast(1)); + if(m >= 28) + { + return configure_lhs_rhs_info(m, n, 4, 4, 4, 1, h0, 0, 1, 0, 1); + } + else + { + return configure_lhs_rhs_info(m, n, 4, 4, 4, 1, h0, 0, 1, 0, 1); + } + } +} + std::pair ClGemmDefaultConfigReshapedRhsOnlyBifrost::configure_G76_f32(unsigned int m, unsigned int n, unsigned int k, unsigned int b) { ARM_COMPUTE_UNUSED(k); diff --git a/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.h b/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.h index 7b1a1fb04d..98c8e53569 100644 --- a/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.h +++ b/src/core/gpu/cl/kernels/gemm/reshaped_only_rhs/ClGemmDefaultConfigReshapedRhsOnlyBifrost.h @@ -59,6 +59,7 @@ private: std::pair configure_G7x_u8(unsigned int m, unsigned int n, unsigned int k, unsigned int b); std::pair configure_G76_u8(unsigned int m, unsigned int n, unsigned int k, unsigned int b); std::pair configure_G51_u8(unsigned int m, unsigned int n, unsigned int k, unsigned int b); + std::pair configure_G31_u8(unsigned int m, unsigned int n, unsigned int k, unsigned int b); }; } // namespace gemm } // namespace kernels diff --git a/utils/TypePrinter.h b/utils/TypePrinter.h index e8cb6e85b7..e30bdc4157 100644 --- a/utils/TypePrinter.h +++ b/utils/TypePrinter.h @@ -1841,6 +1841,9 @@ inline ::std::ostream &operator<<(::std::ostream &os, const GPUTarget &gpu_targe case GPUTarget::G78: os << "G78"; break; + case GPUTarget::G31: + os << "G31"; + break; case GPUTarget::TODX: os << "TODX"; break; -- cgit v1.2.1