From 456183871914364214a6f1640fe98a1a0cddcba9 Mon Sep 17 00:00:00 2001 From: zrm Date: Sat, 13 May 2023 15:04:55 -0400 Subject: [PATCH 1/2] fix get_num_physical_cores() had been broken on complex topologies because "cpu cores" in /proc/cpuinfo is per-"physical id" --- examples/common.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/examples/common.cpp b/examples/common.cpp index 86c1eef41b475..bedbebb28a625 100644 --- a/examples/common.cpp +++ b/examples/common.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #if defined(__APPLE__) && defined(__MACH__) #include @@ -28,21 +29,21 @@ int32_t get_num_physical_cores() { #ifdef __linux__ - std::ifstream cpuinfo("/proc/cpuinfo"); - std::string line; - while (std::getline(cpuinfo, line)) { - std::size_t pos = line.find("cpu cores"); - if (pos != std::string::npos) { - pos = line.find(": ", pos); - if (pos != std::string::npos) { - try { - // Extract the number and return it - return static_cast(std::stoul(line.substr(pos + 2))); - } catch (const std::invalid_argument &) { - // Ignore if we could not parse - } - } + // enumerate the set of thread siblings, num entries is num cores + std::unordered_set siblings; + for(uint32_t cpu=0; cpu < UINT32_MAX; ++cpu) { + std::ifstream thread_siblings("/sys/devices/system/cpu" + + std::to_string(cpu) + "/topology/thread_siblings"); + if(!thread_siblings.is_open()) { + break; // no more cpus } + std::string line; + if(std::getline(thread_siblings, line)) { + siblings.insert(line); + } + } + if(siblings.size() > 0) { + return static_cast(siblings.size()); } #elif defined(__APPLE__) && defined(__MACH__) int32_t num_physical_cores; From 19f538c550f55c5154b768a26764e61d9925354f Mon Sep 17 00:00:00 2001 From: slaren Date: Mon, 15 May 2023 04:24:26 +0200 Subject: [PATCH 2/2] Add spaces to maintain consistent formatting --- examples/common.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/common.cpp b/examples/common.cpp index bedbebb28a625..259880a7cc64f 100644 --- a/examples/common.cpp +++ b/examples/common.cpp @@ -31,18 +31,18 @@ int32_t get_num_physical_cores() { #ifdef __linux__ // enumerate the set of thread siblings, num entries is num cores std::unordered_set siblings; - for(uint32_t cpu=0; cpu < UINT32_MAX; ++cpu) { + for (uint32_t cpu=0; cpu < UINT32_MAX; ++cpu) { std::ifstream thread_siblings("/sys/devices/system/cpu" + std::to_string(cpu) + "/topology/thread_siblings"); - if(!thread_siblings.is_open()) { + if (!thread_siblings.is_open()) { break; // no more cpus } std::string line; - if(std::getline(thread_siblings, line)) { + if (std::getline(thread_siblings, line)) { siblings.insert(line); } } - if(siblings.size() > 0) { + if (siblings.size() > 0) { return static_cast(siblings.size()); } #elif defined(__APPLE__) && defined(__MACH__)