[libcxx-commits] [libcxx] [libc++] Fixed get count threads multi-CPU system with NUMA architecture (#72267) (PR #72270)
via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Nov 15 11:22:12 PST 2023
================
@@ -81,9 +81,58 @@ thread::hardware_concurrency() noexcept
return 0;
return static_cast<unsigned>(result);
#elif defined(_LIBCPP_WIN32API)
- SYSTEM_INFO info;
- GetSystemInfo(&info);
- return info.dwNumberOfProcessors;
+ // This implementation supports both conventional single-cpu PC configurations
+ // and multi-cpu system on NUMA (Non-uniform_memory_access) architecture
+ DWORD length = 0;
+ unsigned concurrency = 0;
+ const auto validConcurrency = [&concurrency]() noexcept -> unsigned
+ {
+ if (concurrency == 0)
+ {
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ return info.dwNumberOfProcessors;
+ }
+ else
+ {
+ return concurrency;
+ }
+ };
+ if (GetLogicalProcessorInformationEx(RelationAll, nullptr, &length) != FALSE)
+ {
+ return validConcurrency();
+ }
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ return validConcurrency();
+ }
+ std::unique_ptr<void, void (*)(void*)> buffer(std::malloc(length), std::free);
----------------
huixie90 wrote:
I'd be surprised that calling `hardware_concurrency` would result in memory allocator
https://github.com/llvm/llvm-project/pull/72270
More information about the libcxx-commits
mailing list