mirror of
https://github.com/opelly27/Stockfish.git
synced 2026-05-20 03:57:45 +00:00
Enable compilation on older Windows systems
Improve compatibility of the last NUMA patch when running under older versions of Windows, for instance Windows Server 2003. Reported by user "g3g6" in the following comments: https://github.com/official-stockfish/Stockfish/commit/7218ec4df9fef1146a451b71f0ed3bfd8123c9f9 Closes https://github.com/official-stockfish/Stockfish/pull/3821 No functional change
This commit is contained in:
committed by
Stéphane Nicolet
parent
e4a0c6c759
commit
ca3c1c5f3a
+16
-11
@@ -37,6 +37,7 @@ typedef bool(*fun1_t)(LOGICAL_PROCESSOR_RELATIONSHIP,
|
|||||||
typedef bool(*fun2_t)(USHORT, PGROUP_AFFINITY);
|
typedef bool(*fun2_t)(USHORT, PGROUP_AFFINITY);
|
||||||
typedef bool(*fun3_t)(HANDLE, CONST GROUP_AFFINITY*, PGROUP_AFFINITY);
|
typedef bool(*fun3_t)(HANDLE, CONST GROUP_AFFINITY*, PGROUP_AFFINITY);
|
||||||
typedef bool(*fun4_t)(USHORT, PGROUP_AFFINITY, USHORT, PUSHORT);
|
typedef bool(*fun4_t)(USHORT, PGROUP_AFFINITY, USHORT, PUSHORT);
|
||||||
|
typedef WORD(*fun5_t)();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -514,7 +515,8 @@ int best_node(size_t idx) {
|
|||||||
if (!fun1)
|
if (!fun1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// First call to get returnLength. We expect it to fail due to null buffer
|
// First call to GetLogicalProcessorInformationEx() to get returnLength.
|
||||||
|
// We expect the call to fail due to null buffer.
|
||||||
if (fun1(RelationAll, nullptr, &returnLength))
|
if (fun1(RelationAll, nullptr, &returnLength))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@@ -522,7 +524,7 @@ int best_node(size_t idx) {
|
|||||||
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *buffer, *ptr;
|
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *buffer, *ptr;
|
||||||
ptr = buffer = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)malloc(returnLength);
|
ptr = buffer = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)malloc(returnLength);
|
||||||
|
|
||||||
// Second call, now we expect to succeed
|
// Second call to GetLogicalProcessorInformationEx(), now we expect to succeed
|
||||||
if (!fun1(RelationAll, buffer, &returnLength))
|
if (!fun1(RelationAll, buffer, &returnLength))
|
||||||
{
|
{
|
||||||
free(buffer);
|
free(buffer);
|
||||||
@@ -582,23 +584,26 @@ void bindThisThread(size_t idx) {
|
|||||||
auto fun2 = (fun2_t)(void(*)())GetProcAddress(k32, "GetNumaNodeProcessorMaskEx");
|
auto fun2 = (fun2_t)(void(*)())GetProcAddress(k32, "GetNumaNodeProcessorMaskEx");
|
||||||
auto fun3 = (fun3_t)(void(*)())GetProcAddress(k32, "SetThreadGroupAffinity");
|
auto fun3 = (fun3_t)(void(*)())GetProcAddress(k32, "SetThreadGroupAffinity");
|
||||||
auto fun4 = (fun4_t)(void(*)())GetProcAddress(k32, "GetNumaNodeProcessorMask2");
|
auto fun4 = (fun4_t)(void(*)())GetProcAddress(k32, "GetNumaNodeProcessorMask2");
|
||||||
|
auto fun5 = (fun5_t)(void(*)())GetProcAddress(k32, "GetMaximumProcessorGroupCount");
|
||||||
|
|
||||||
if (!fun2 || !fun3)
|
if (!fun2 || !fun3)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!fun4) {
|
if (!fun4 || !fun5)
|
||||||
|
{
|
||||||
GROUP_AFFINITY affinity;
|
GROUP_AFFINITY affinity;
|
||||||
if (fun2(node, &affinity))
|
if (fun2(node, &affinity)) // GetNumaNodeProcessorMaskEx
|
||||||
fun3(GetCurrentThread(), &affinity, nullptr);
|
fun3(GetCurrentThread(), &affinity, nullptr); // SetThreadGroupAffinity
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// If a numa node has more than one processor group, we assume they are
|
// If a numa node has more than one processor group, we assume they are
|
||||||
// sized equal and we spread threads evenly across the groups.
|
// sized equal and we spread threads evenly across the groups.
|
||||||
USHORT elements, returnedElements;
|
USHORT elements, returnedElements;
|
||||||
elements = GetMaximumProcessorGroupCount();
|
elements = fun5(); // GetMaximumProcessorGroupCount
|
||||||
GROUP_AFFINITY *affinity = (GROUP_AFFINITY*)malloc(
|
GROUP_AFFINITY *affinity = (GROUP_AFFINITY*)malloc(elements * sizeof(GROUP_AFFINITY));
|
||||||
elements * sizeof(GROUP_AFFINITY));
|
if (fun4(node, affinity, elements, &returnedElements)) // GetNumaNodeProcessorMask2
|
||||||
if (fun4(node, affinity, elements, &returnedElements))
|
fun3(GetCurrentThread(), &affinity[idx % returnedElements], nullptr); // SetThreadGroupAffinity
|
||||||
fun3(GetCurrentThread(), &affinity[idx % returnedElements], nullptr);
|
|
||||||
free(affinity);
|
free(affinity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1063,7 +1063,7 @@ moves_loop: // When in check, search starts here
|
|||||||
&& history < -3000 * depth + 3000)
|
&& history < -3000 * depth + 3000)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
history += thisThread->mainHistory[us][from_to(move)];
|
history += thisThread->mainHistory[us][from_to(move)];
|
||||||
|
|
||||||
// Futility pruning: parent node (~5 Elo)
|
// Futility pruning: parent node (~5 Elo)
|
||||||
if ( !ss->inCheck
|
if ( !ss->inCheck
|
||||||
|
|||||||
Reference in New Issue
Block a user