<div dir="ltr">Hi,<div>    I am combining these patches into a single patch along with some updates, so please ignore these patches. On top of this I will update <span name="Mateusz" class="" style="font-size:12.8px">Mateusz</span><span style="font-size:12.8px"> patch (CLI: new logic for '--pools <int>' option ) to avoid merge conflicts. Thanks. </span></div><div><span style="font-size:12.8px"><br></span></div><table cellpadding="0" class="" style="font-size:12.8px"><tbody><tr class=""><td colspan="2" class="" style="padding:6px 0px"><br></td></tr></tbody></table><div>.</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr">Regards,<div>Praveen</div></div></div></div>
<br><div class="gmail_quote">On Fri, May 20, 2016 at 4:31 PM,  <span dir="ltr"><<a href="mailto:praveen@multicorewareinc.com" target="_blank">praveen@multicorewareinc.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"># HG changeset patch<br>
# User Praveen Tiwari <<a href="mailto:praveen@multicorewareinc.com">praveen@multicorewareinc.com</a>><br>
# Date 1463655478 -19800<br>
#      Thu May 19 16:27:58 2016 +0530<br>
# Node ID 9a6ab28b736e1167ac26977d7da8ab2d23cc296f<br>
# Parent  aca781339b4c8dae94ff7da73f18cd4439757e87<br>
threadpool.cpp: get correct CPU count for multisocket machines -> windows system fix<br>
<br>
diff -r aca781339b4c -r 9a6ab28b736e source/common/threadpool.cpp<br>
--- a/source/common/threadpool.cpp      Tue May 10 15:33:17 2016 +0530<br>
+++ b/source/common/threadpool.cpp      Thu May 19 16:27:58 2016 +0530<br>
@@ -64,6 +64,19 @@<br>
 # define strcasecmp _stricmp<br>
 #endif<br>
<br>
+const uint64_t m1 = 0x5555555555555555; //binary: 0101...<br>
+const uint64_t m2 = 0x3333333333333333; //binary: 00110011..<br>
+const uint64_t m3 = 0x0f0f0f0f0f0f0f0f; //binary:  4 zeros,  4 ones ...<br>
+const uint64_t h01 = 0x0101010101010101; //the sum of 256 to the power of 0,1,2,3...<br>
+<br>
+int popCount(uint64_t x)<br>
+{<br>
+    x -= (x >> 1) & m1;<br>
+    x = (x & m2) + ((x >> 2) & m2);<br>
+    x = (x + (x >> 4)) & m3;<br>
+    return (x * h01) >> 56;<br>
+}<br>
+<br>
 namespace X265_NS {<br>
 // x265 private namespace<br>
<br>
@@ -525,9 +538,17 @@<br>
 int ThreadPool::getCpuCount()<br>
 {<br>
 #if _WIN32<br>
-    SYSTEM_INFO sysinfo;<br>
-    GetSystemInfo(&sysinfo);<br>
-    return sysinfo.dwNumberOfProcessors;<br>
+    enum { MAX_NODE_NUM = 127 };<br>
+    int cpus = 0;<br>
+    int numNumaNodes = X265_MIN(getNumaNodeCount(), MAX_NODE_NUM);<br>
+    PGROUP_AFFINITY groupAffinityPointer = new GROUP_AFFINITY;<br>
+    for (int i = 0; i < numNumaNodes; i++)<br>
+    {<br>
+        GetNumaNodeProcessorMaskEx((UCHAR)i, groupAffinityPointer);<br>
+        cpus += popCount(groupAffinityPointer->Mask);<br>
+    }<br>
+    delete groupAffinityPointer;<br>
+    return cpus;<br>
 #elif __unix__ && X265_ARCH_ARM<br>
     /* Return the number of processors configured by OS. Because, most embedded linux distributions<br>
      * uses only one processor as the scheduler doesn't have enough work to utilize all processors */<br>
</blockquote></div><br></div>