From 5a5794b3a893f6f6cefd6d386722fad0f50af311 Mon Sep 17 00:00:00 2001 From: HappyAngel Date: Fri, 25 Sep 2020 18:11:56 +0800 Subject: [PATCH] [cherry-pick] fix xiaodu run kernnel in a53 problem. test=develop (#4445) * fix xiaodu run kernnel in a53 problem. test=develop * fix Mac build. test=develop --- lite/backends/arm/math/packed_sgemm.cc | 2 +- lite/core/context.h | 1 + lite/core/device_info.cc | 14 ++++++++++++++ lite/core/device_info.h | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lite/backends/arm/math/packed_sgemm.cc b/lite/backends/arm/math/packed_sgemm.cc index c431c5651d..20f9b12cce 100644 --- a/lite/backends/arm/math/packed_sgemm.cc +++ b/lite/backends/arm/math/packed_sgemm.cc @@ -355,7 +355,7 @@ void sgemm_prepack(bool is_transB, (has_act == false) || (has_act == true && act_type == lite_api::ActivationType::kRelu); bool has_beta = fabsf(beta) > 1e-8f ? true : false; - bool a53_sgemm = act_flag && !has_beta; + bool a53_sgemm = act_flag && !has_beta && ctx->has_a53_valid(); if (a53_sgemm) { sgemm_prepacked_6x8_a53(is_transB, M, diff --git a/lite/core/context.h b/lite/core/context.h index 84742bf478..f140e7575b 100644 --- a/lite/core/context.h +++ b/lite/core/context.h @@ -217,6 +217,7 @@ class Context { int llc_size() const { return DeviceInfo::Global().llc_size(); } bool has_dot() const { return DeviceInfo::Global().has_dot(); } bool has_fp16() const { return DeviceInfo::Global().has_fp16(); } + bool has_a53_valid() const { return DeviceInfo::Global().set_a53_valid(); } template T* workspace_data() { diff --git a/lite/core/device_info.cc b/lite/core/device_info.cc index cd135f85b3..3d07d65c2e 100644 --- a/lite/core/device_info.cc +++ b/lite/core/device_info.cc @@ -1009,6 +1009,20 @@ void DeviceInfo::RequestPowerRandLowMode(int shift_num, int thread_num) { } } +bool DeviceInfo::set_a53_valid() { + std::string dev_name = "null"; +#ifdef LITE_WITH_LINUX + dev_name = get_cpu_name(); +#endif + // xiaodu device_name + if (dev_name.find("MT8765WA") != std::string::npos || + dev_name.find("MT8167S") != std::string::npos) { + return false; + } else { + return true; + } +} + int DeviceInfo::Setup() { core_num_ = get_cpu_num(); mem_size_ = get_mem_size(); diff --git a/lite/core/device_info.h b/lite/core/device_info.h index 53d22ef90e..82f686ba11 100644 --- a/lite/core/device_info.h +++ b/lite/core/device_info.h @@ -56,7 +56,7 @@ class DeviceInfo { } int Setup(); - + bool set_a53_valid(); void SetRunMode(lite_api::PowerMode mode, int thread_num); void SetCache(int l1size, int l2size, int l3size); void SetArch(ARMArch arch) { arch_ = arch; } -- GitLab