From 2da739da63cf45355893b313fba2c4500f69f47d Mon Sep 17 00:00:00 2001 From: HappyAngel Date: Fri, 25 Sep 2020 17:34:43 +0800 Subject: [PATCH] [arm] fix xiaodu a53 crash problem (#4437) * set a53 use or no_use, test=develop * fix xiaodu a53 crash . test=develop * fix Mac OS build error. test=develop * fix build error. 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, 18 insertions(+), 1 deletion(-) diff --git a/lite/backends/arm/math/packed_sgemm.cc b/lite/backends/arm/math/packed_sgemm.cc index c431c5651d..20f9b12cce 100755 --- 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 0cf13ab699..6d263f9cf8 100644 --- a/lite/core/device_info.cc +++ b/lite/core/device_info.cc @@ -1026,6 +1026,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 bc82245c8d..9af0fd358f 100644 --- a/lite/core/device_info.h +++ b/lite/core/device_info.h @@ -58,6 +58,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); @@ -69,6 +70,7 @@ class DeviceInfo { int l1_cache_size() const { return L1_cache_[active_ids_[0]]; } int l2_cache_size() const { return L2_cache_[active_ids_[0]]; } int l3_cache_size() const { return L3_cache_[active_ids_[0]]; } + // Methods for allocating L3Cache on Arm platform // Enum class L3CacheSetMethod is declared in `lite/api/paddle_api.h` void SetArmL3CacheSize( -- GitLab