aboutsummaryrefslogtreecommitdiff
path: root/src/common/cpuinfo/CpuInfo.cpp
diff options
context:
space:
mode:
authorOmar Al Khatib <omar.alkhatib@arm.com>2024-05-09 16:06:23 +0100
committerOmar Al Khatib <omar.alkhatib@arm.com>2024-05-17 14:20:06 +0000
commitf5053f782daa942126bd61ac1bcfc0af627b7b31 (patch)
treeeb96c568d3c95021860e06f06271345f68969260 /src/common/cpuinfo/CpuInfo.cpp
parent8710385a9feb050f1b5a422ed57df691e8ba078f (diff)
downloadComputeLibrary-main.tar.gz
Update logic in the OpenMP scheduler to exclude LITTLE coresHEADmain
On systems with BIG/MID/LITTLE cores, we need to exclude the LITTLE cores. This is make changes to CPUInfo to detect number of LITTLE cores and set the num_threads to TOTAL_CORES-NUM_LITTLE cores Resolves [COMPMID-7014] Signed-off-by: Omar Al Khatib <omar.alkhatib@arm.com> Change-Id: I3e1772e5b64d1c45304860be43233b7e5dd8dba1 Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/11565 Reviewed-by: Pablo Marquez Tello <pablo.tello@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Benchmark: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/common/cpuinfo/CpuInfo.cpp')
-rw-r--r--src/common/cpuinfo/CpuInfo.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/common/cpuinfo/CpuInfo.cpp b/src/common/cpuinfo/CpuInfo.cpp
index 809ab3e2c3..92ba5223c9 100644
--- a/src/common/cpuinfo/CpuInfo.cpp
+++ b/src/common/cpuinfo/CpuInfo.cpp
@@ -29,6 +29,7 @@
#include "support/StringSupport.h"
#include "support/ToolchainSupport.h"
+#include <map>
#include <sstream>
#if !defined(BARE_METAL)
@@ -269,6 +270,87 @@ int get_max_cpus()
}
return max_cpus;
}
+
+const static std::map<std::string, std::vector<uint32_t>> known_configurations_with_little_cores = {
+ {"xiaomi14-pro", {379, 379, 923, 923, 923, 867, 867, 1024}}};
+
+const static std::map<std::string, uint32_t> number_of_cores_to_use = {{"xiaomi14-pro", 6}};
+
+#if defined(__ANDROID__)
+std::vector<uint32_t> get_cpu_capacities()
+{
+ std::vector<uint32_t> cpu_capacities;
+ for (int i = 0; i < get_max_cpus(); ++i)
+ {
+ std::stringstream str;
+ str << "/sys/devices/system/cpu/cpu" << i << "/cpu_capacity";
+ std::ifstream file(str.str(), std::ios::in);
+ if (file.is_open())
+ {
+ std::string line;
+ if (bool(getline(file, line)))
+ {
+ cpu_capacities.emplace_back(support::cpp11::stoul(line));
+ }
+ }
+ }
+
+ return cpu_capacities;
+}
+
+uint32_t not_little_num_cpus_internal()
+{
+ std::vector<uint32_t> cpus_all = get_cpu_capacities();
+ std::vector<uint32_t> cpus_not_little;
+
+ for (auto &it : known_configurations_with_little_cores)
+ {
+ if (it.second == cpus_all)
+ {
+ return number_of_cores_to_use.find(it.first)->second;
+ }
+ }
+
+ std::vector<uint32_t>::iterator result = std::max_element(cpus_all.begin(), cpus_all.end());
+ uint32_t max_capacity = *result;
+ uint32_t threshold = max_capacity / 2;
+ for (unsigned int i = 0; i < cpus_all.size(); i++)
+ {
+ if (!(cpus_all[i] < threshold))
+ {
+ cpus_not_little.emplace_back(cpus_all[i]);
+ }
+ }
+ return cpus_not_little.size();
+}
+
+bool has_little_mid_big_internal()
+{
+ std::vector<uint32_t> cpus_all = get_cpu_capacities();
+ std::vector<uint32_t> cpus_not_little;
+
+ for (auto &it : known_configurations_with_little_cores)
+ {
+ if (it.second == cpus_all)
+ {
+ return true;
+ }
+ }
+ std::sort(cpus_all.begin(), cpus_all.end());
+ std::vector<uint32_t>::iterator ip;
+ ip = std::unique(cpus_all.begin(), cpus_all.end());
+ cpus_all.resize(std::distance(cpus_all.begin(), ip));
+
+ if (cpus_all.size() == 3)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+#endif /* defined(__ANDROID__) */
#elif defined(__aarch64__) && \
defined(__APPLE__) /* !defined(BARE_METAL) && !defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) */
/** Query features through sysctlbyname
@@ -402,6 +484,24 @@ uint32_t CpuInfo::num_cpus() const
return _cpus.size();
}
+uint32_t CpuInfo::not_little_num_cpus() const
+{
+#if defined(__ANDROID__)
+ return not_little_num_cpus_internal();
+#else /* defined(__ANDROID__) */
+ return num_cpus();
+#endif /* defined(__ANDROID__) */
+}
+
+bool CpuInfo::has_little_mid_big() const
+{
+#if defined(__ANDROID__)
+ return has_little_mid_big_internal();
+#else /* defined(__ANDROID__) */
+ return false;
+#endif /* defined(__ANDROID__) */
+}
+
uint32_t num_threads_hint()
{
unsigned int num_threads_hint = 1;