[x265] [PATCH] Fix for threadpooling to use all available threads on windows, and build fix

pradeep at multicorewareinc.com pradeep at multicorewareinc.com
Tue Sep 8 08:20:31 CEST 2015


# HG changeset patch
# User Pradeep Ramachandran <pradeep at multicorewareinc.com>
# Date 1441692185 -19800
#      Tue Sep 08 11:33:05 2015 +0530
# Node ID 48b00cc32bc5cd77970db4776637a127a6e5d848
# Parent  e1adac00dce8e5641cbe9aec3d50a72261c308d9
Fix for threadpooling to use all available threads on windows, and build fix
to remove warning for windows machines older than Win7 and linux machines
without NUMA support

diff -r e1adac00dce8 -r 48b00cc32bc5 source/common/threadpool.cpp
--- a/source/common/threadpool.cpp	Thu Sep 03 14:41:06 2015 +0530
+++ b/source/common/threadpool.cpp	Tue Sep 08 11:33:05 2015 +0530
@@ -378,8 +378,15 @@
     X265_CHECK(numThreads <= MAX_POOL_THREADS, "a single thread pool cannot have more than MAX_POOL_THREADS threads\n");
 
 #if defined(_WIN32_WINNT) && _WIN32_WINNT >= _WIN32_WINNT_WIN7 
-    m_winNodemask = nodeMask & ~(0x1 << getNumaNodeCount());
-    m_numaNodeMask = &m_winNodemask;
+    int numaNode = -1;
+    GROUP_AFFINITY groupAffinity;
+    for (int i = 0; i < getNumaNodeCount(); i++)
+    {
+        numaNode = (nodeMask & (0x1 << i)) - 1;
+        if (GetNumaNodeProcessorMaskEx((USHORT)numaNode, &groupAffinity))
+            m_winCpuMask |= groupAffinity.Mask;
+    }
+    m_numaMask = &m_winCpuMask;
 #elif HAVE_LIBNUMA
     if (numa_available() >= 0)
     {
@@ -387,11 +394,13 @@
         if (nodemask)
         {
             *(nodemask->maskp) = nodeMask;
-            m_numaNodeMask = nodemask;
+            m_numaMask = nodemask;
         }
         else
             x265_log(NULL, X265_LOG_ERROR, "unable to get NUMA node mask for %lx\n", nodeMask);
     }
+#else
+    (void)nodeMask;
 #endif
 
     m_numWorkers = numThreads;
@@ -449,33 +458,35 @@
     X265_FREE(m_jpTable);
 
 #if HAVE_LIBNUMA
-    if(m_numaNodeMask)
-        numa_free_nodemask((struct bitmask*)m_numaNodeMask);
+    if(m_numaMask)
+        numa_free_nodemask((struct bitmask*)m_numaMask);
 #endif
 }
 
 void ThreadPool::setCurrentThreadAffinity()
 {
-    setThreadNodeAffinity(m_numaNodeMask);
+    setThreadNodeAffinity(m_numaMask);
 }
 
 /* static */
-void ThreadPool::setThreadNodeAffinity(void *numaNodeMask)
+void ThreadPool::setThreadNodeAffinity(void *numaMask)
 {
 #if defined(_WIN32_WINNT) && _WIN32_WINNT >= _WIN32_WINNT_WIN7 
-    if (SetThreadAffinityMask(GetCurrentThread(), (DWORD_PTR)(*((DWORD*)numaNodeMask))))
+    if (SetThreadAffinityMask(GetCurrentThread(), (DWORD_PTR)(*((DWORD*)numaMask))))
         return;
     else
         x265_log(NULL, X265_LOG_ERROR, "unable to set thread affinity for NUMA node mask\n");
 #elif HAVE_LIBNUMA
     if (numa_available() >= 0)
     {
-        numa_run_on_node_mask((struct bitmask*)numaNodeMask);
-        numa_set_interleave_mask((struct bitmask*)numaNodeMask);
+        numa_run_on_node_mask((struct bitmask*)numaMask);
+        numa_set_interleave_mask((struct bitmask*)numaMask);
         numa_set_localalloc();
         return;
     }
     x265_log(NULL, X265_LOG_ERROR, "unable to set thread affinity for NUMA node mask\n");
+#else
+    (void)numaMask;
 #endif
     return;
 }
diff -r e1adac00dce8 -r 48b00cc32bc5 source/common/threadpool.h
--- a/source/common/threadpool.h	Thu Sep 03 14:41:06 2015 +0530
+++ b/source/common/threadpool.h	Tue Sep 08 11:33:05 2015 +0530
@@ -83,9 +83,9 @@
     sleepbitmap_t m_sleepBitmap;
     int           m_numProviders;
     int           m_numWorkers;
-    void*         m_numaNodeMask;
+    void*         m_numaMask; // node mask in linux, cpu mask in windows
 #if defined(_WIN32_WINNT) && _WIN32_WINNT >= _WIN32_WINNT_WIN7 
-    DWORD         m_winNodemask;
+    DWORD         m_winCpuMask;
 #endif
     bool          m_isActive;
 
@@ -106,7 +106,7 @@
 
     static int  getCpuCount();
     static int  getNumaNodeCount();
-    static void setThreadNodeAffinity(void *numaNodeMask);
+    static void setThreadNodeAffinity(void *numaMask);
 };
 
 /* Any worker thread may enlist the help of idle worker threads from the same


More information about the x265-devel mailing list