diff options
author | Tamar Christina <tamar@zhox.com> | 2016-10-01 00:26:52 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2016-10-01 00:27:50 -0400 |
commit | 3c1790546953b6db90fe7676e53b626722df8c61 (patch) | |
tree | 6354fddc5d3e03d67b927622ac3a1229a2702b38 /rts/RtsStartup.c | |
parent | 59d7ee53906b9cee7f279c1f9567af7b930f8636 (diff) | |
download | haskell-3c1790546953b6db90fe7676e53b626722df8c61.tar.gz |
Support more than 64 logical processors on Windows
Windows support for more than 64 logical processors are implemented
using processor groups.
Essentially what it's doing is keeping the existing maximum of 64
processors and keeping the affinity mask a 64 bit value, but adds an
hierarchy above that.
This support was added to Windows 7 and so we need to at runtime detect
if the APIs are still there due to our minimum supported version being
Windows Vista.
The Maximum number of groups supported at this time is 4, so 256 logical
cores. The group indices are 0 based. One thread can have affinity with
multiple groups.
See
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684251.aspx
and particularly helpful is the whitepaper: 'Supporting Systems that
have more than 64 processors' at
https://msdn.microsoft.com/en-us/library/windows/hardware/dn653313.aspx
Processor groups are not guaranteed to be uniformly distributed nor
guaranteed to be filled before a next group is needed. The OS will
assign processors to groups based on physical proximity and will never
partially assign cores from one physical cpu to more than one group. If
one has two 48 core CPUs then you'd end up with two groups of 48 logical
cpus. Now add a 3rd CPU with 10 cores and the group it is assigned to
depends where the socket is on the board.
Test Plan:
./validate or make test -c . in the rts test folder.
This tests for regressions, to test this particular functionality
itself:
<program> +RTS -N -qa -RTS
Test is detailed in description.
Reviewers: bgamari, simonmar, austin, erikd
Reviewed By: simonmar
Subscribers: thomie, #ghc_windows_task_force
Differential Revision: https://phabricator.haskell.org/D2533
GHC Trac Issues: #11054
Diffstat (limited to 'rts/RtsStartup.c')
-rw-r--r-- | rts/RtsStartup.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index a2630b2f8f..7c2be0d7ef 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -434,6 +434,11 @@ hs_exit_(rtsBool wait_foreign) // Free the various argvs freeRtsArgs(); + +#ifndef CMINUSMINUS + // Free threading resources + freeThreadingResources(); +#endif } // Flush stdout and stderr. We do this during shutdown so that it |