[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