diff options
author | zrm <trustiosity.zrm@gmail.com> | 2023-05-14 22:25:42 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-15 04:25:42 +0200 |
commit | 63d20469b85467c5729cc9a97bd44cc3da63423f (patch) | |
tree | 47abe8b5d3945e328262991589a253edb369a6d6 | |
parent | b5c9295eef2b56e307393b35b3a923e3518d226e (diff) |
fix get_num_physical_cores() (#1436)
* fix get_num_physical_cores()
had been broken on complex topologies because "cpu cores" in /proc/cpuinfo is per-"physical id"
* Add spaces to maintain consistent formatting
---------
Co-authored-by: slaren <ddevesa@gmail.com>
-rw-r--r-- | examples/common.cpp | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/examples/common.cpp b/examples/common.cpp index 86c1eef..259880a 100644 --- a/examples/common.cpp +++ b/examples/common.cpp @@ -8,6 +8,7 @@ #include <iterator> #include <algorithm> #include <sstream> +#include <unordered_set> #if defined(__APPLE__) && defined(__MACH__) #include <sys/types.h> @@ -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<int32_t>(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<std::string> 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<int32_t>(siblings.size()); } #elif defined(__APPLE__) && defined(__MACH__) int32_t num_physical_cores; |