[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