aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/Threading.cpp
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2022-11-25 14:11:56 +0000
committerFlorian Hahn <flo@fhahn.com>2022-11-25 14:11:56 +0000
commit07ca9cc04bc2d57730507ad5ab444a1fd56cae11 (patch)
tree4a038be25d66891a1bc1cf842caa72db4cdd68be /llvm/lib/Support/Threading.cpp
parentbe1ff1fe58b0315ac4985010c59e78d4ba353467 (diff)
downloadllvm-07ca9cc04bc2d57730507ad5ab444a1fd56cae11.zip
llvm-07ca9cc04bc2d57730507ad5ab444a1fd56cae11.tar.gz
llvm-07ca9cc04bc2d57730507ad5ab444a1fd56cae11.tar.bz2
Revert "[Support] Move getHostNumPhysicalCores to Threading.h"
This reverts commit 5577207d6d3e0642ea047a8dfbfcf3ad372a7f25. This breaks building LLVM on recent macOS. Error messages below: llvm/lib/Support/Threading.cpp:190:3: error: use of undeclared identifier 'sysctlbyname' sysctlbyname("hw.physicalcpu", &count, &len, NULL, 0); ^ llvm/lib/Support/Threading.cpp:193:13: error: use of undeclared identifier 'CTL_HW' nm[0] = CTL_HW; ^ llvm/lib/Support/Threading.cpp:194:13: error: use of undeclared identifier 'HW_AVAILCPU' nm[1] = HW_AVAILCPU; ^ llvm/lib/Support/Threading.cpp:195:5: error: use of undeclared identifier 'sysctl' sysctl(nm, 2, &count, &len, NULL, 0); ^
Diffstat (limited to 'llvm/lib/Support/Threading.cpp')
-rw-r--r--llvm/lib/Support/Threading.cpp132
1 files changed, 3 insertions, 129 deletions
diff --git a/llvm/lib/Support/Threading.cpp b/llvm/lib/Support/Threading.cpp
index 6c2ff11..bd954fd 100644
--- a/llvm/lib/Support/Threading.cpp
+++ b/llvm/lib/Support/Threading.cpp
@@ -13,12 +13,8 @@
#include "llvm/Support/Threading.h"
#include "llvm/ADT/Optional.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringRef.h"
#include "llvm/Config/config.h"
-#include "llvm/Config/llvm-config.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Host.h"
#include <cassert>
#include <errno.h>
@@ -54,8 +50,8 @@ unsigned llvm::ThreadPoolStrategy::compute_thread_count() const {
static int computeHostNumHardwareThreads();
unsigned llvm::ThreadPoolStrategy::compute_thread_count() const {
- int MaxThreadCount =
- UseHyperThreads ? computeHostNumHardwareThreads() : get_physical_cores();
+ int MaxThreadCount = UseHyperThreads ? computeHostNumHardwareThreads()
+ : sys::getHostNumPhysicalCores();
if (MaxThreadCount <= 0)
MaxThreadCount = 1;
if (ThreadsRequested == 0)
@@ -110,125 +106,3 @@ llvm::get_threadpool_strategy(StringRef Num, ThreadPoolStrategy Default) {
S.ThreadsRequested = V;
return S;
}
-
-#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__))
-// On Linux, the number of physical cores can be computed from /proc/cpuinfo,
-// using the number of unique physical/core id pairs. The following
-// implementation reads the /proc/cpuinfo format on an x86_64 system.
-static int computeHostNumPhysicalCores() {
- // Enabled represents the number of physical id/core id pairs with at least
- // one processor id enabled by the CPU affinity mask.
- cpu_set_t Affinity, Enabled;
- if (sched_getaffinity(0, sizeof(Affinity), &Affinity) != 0)
- return -1;
- CPU_ZERO(&Enabled);
-
- // Read /proc/cpuinfo as a stream (until EOF reached). It cannot be
- // mmapped because it appears to have 0 size.
- llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
- llvm::MemoryBuffer::getFileAsStream("/proc/cpuinfo");
- if (std::error_code EC = Text.getError()) {
- llvm::errs() << "Can't read "
- << "/proc/cpuinfo: " << EC.message() << "\n";
- return -1;
- }
- SmallVector<StringRef, 8> strs;
- (*Text)->getBuffer().split(strs, "\n", /*MaxSplit=*/-1,
- /*KeepEmpty=*/false);
- int CurProcessor = -1;
- int CurPhysicalId = -1;
- int CurSiblings = -1;
- int CurCoreId = -1;
- for (StringRef Line : strs) {
- std::pair<StringRef, StringRef> Data = Line.split(':');
- auto Name = Data.first.trim();
- auto Val = Data.second.trim();
- // These fields are available if the kernel is configured with CONFIG_SMP.
- if (Name == "processor")
- Val.getAsInteger(10, CurProcessor);
- else if (Name == "physical id")
- Val.getAsInteger(10, CurPhysicalId);
- else if (Name == "siblings")
- Val.getAsInteger(10, CurSiblings);
- else if (Name == "core id") {
- Val.getAsInteger(10, CurCoreId);
- // The processor id corresponds to an index into cpu_set_t.
- if (CPU_ISSET(CurProcessor, &Affinity))
- CPU_SET(CurPhysicalId * CurSiblings + CurCoreId, &Enabled);
- }
- }
- return CPU_COUNT(&Enabled);
-}
-#elif defined(__linux__) && defined(__s390x__)
-static int computeHostNumPhysicalCores() {
- return sysconf(_SC_NPROCESSORS_ONLN);
-}
-#elif defined(__linux__) && !defined(__ANDROID__)
-static int computeHostNumPhysicalCores() {
- cpu_set_t Affinity;
- if (sched_getaffinity(0, sizeof(Affinity), &Affinity) == 0)
- return CPU_COUNT(&Affinity);
-
- // The call to sched_getaffinity() may have failed because the Affinity
- // mask is too small for the number of CPU's on the system (i.e. the
- // system has more than 1024 CPUs). Allocate a mask large enough for
- // twice as many CPUs.
- cpu_set_t *DynAffinity;
- DynAffinity = CPU_ALLOC(2048);
- if (sched_getaffinity(0, CPU_ALLOC_SIZE(2048), DynAffinity) == 0) {
- int NumCPUs = CPU_COUNT(DynAffinity);
- CPU_FREE(DynAffinity);
- return NumCPUs;
- }
- return -1;
-}
-#elif defined(__APPLE__)
-// Gets the number of *physical cores* on the machine.
-static int computeHostNumPhysicalCores() {
- uint32_t count;
- size_t len = sizeof(count);
- sysctlbyname("hw.physicalcpu", &count, &len, NULL, 0);
- if (count < 1) {
- int nm[2];
- nm[0] = CTL_HW;
- nm[1] = HW_AVAILCPU;
- sysctl(nm, 2, &count, &len, NULL, 0);
- if (count < 1)
- return -1;
- }
- return count;
-}
-#elif defined(__MVS__)
-static int computeHostNumPhysicalCores() {
- enum {
- // Byte offset of the pointer to the Communications Vector Table (CVT) in
- // the Prefixed Save Area (PSA). The table entry is a 31-bit pointer and
- // will be zero-extended to uintptr_t.
- FLCCVT = 16,
- // Byte offset of the pointer to the Common System Data Area (CSD) in the
- // CVT. The table entry is a 31-bit pointer and will be zero-extended to
- // uintptr_t.
- CVTCSD = 660,
- // Byte offset to the number of live CPs in the LPAR, stored as a signed
- // 32-bit value in the table.
- CSD_NUMBER_ONLINE_STANDARD_CPS = 264,
- };
- char *PSA = 0;
- char *CVT = reinterpret_cast<char *>(
- static_cast<uintptr_t>(reinterpret_cast<unsigned int &>(PSA[FLCCVT])));
- char *CSD = reinterpret_cast<char *>(
- static_cast<uintptr_t>(reinterpret_cast<unsigned int &>(CVT[CVTCSD])));
- return reinterpret_cast<int &>(CSD[CSD_NUMBER_ONLINE_STANDARD_CPS]);
-}
-#elif defined(_WIN32) && LLVM_ENABLE_THREADS != 0
-// Defined in llvm/lib/Support/Windows/Threading.inc
-int computeHostNumPhysicalCores();
-#else
-// On other systems, return -1 to indicate unknown.
-static int computeHostNumPhysicalCores() { return -1; }
-#endif
-
-int llvm::get_physical_cores() {
- static int NumCores = computeHostNumPhysicalCores();
- return NumCores;
-}