aboutsummaryrefslogtreecommitdiff
path: root/examples/common.cpp
diff options
context:
space:
mode:
authorzrm <trustiosity.zrm@gmail.com>2023-05-14 22:25:42 -0400
committerGitHub <noreply@github.com>2023-05-15 04:25:42 +0200
commit63d20469b85467c5729cc9a97bd44cc3da63423f (patch)
tree47abe8b5d3945e328262991589a253edb369a6d6 /examples/common.cpp
parentb5c9295eef2b56e307393b35b3a923e3518d226e (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>
Diffstat (limited to 'examples/common.cpp')
-rw-r--r--examples/common.cpp29
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;