diff options
author | Simon Marlow <marlowsd@gmail.com> | 2016-04-23 21:14:49 +0100 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2016-06-10 21:25:54 +0100 |
commit | 9e5ea67e268be2659cd30ebaed7044d298198ab0 (patch) | |
tree | c395e74ee772ae0d59c852b3cbde743784b08d09 /testsuite/config | |
parent | b9fa72a24ba2cc3120912e6afedc9280d28d2077 (diff) | |
download | haskell-9e5ea67e268be2659cd30ebaed7044d298198ab0.tar.gz |
NUMA support
Summary:
The aim here is to reduce the number of remote memory accesses on
systems with a NUMA memory architecture, typically multi-socket servers.
Linux provides a NUMA API for doing two things:
* Allocating memory local to a particular node
* Binding a thread to a particular node
When given the +RTS --numa flag, the runtime will
* Determine the number of NUMA nodes (N) by querying the OS
* Assign capabilities to nodes, so cap C is on node C%N
* Bind worker threads on a capability to the correct node
* Keep a separate free lists in the block layer for each node
* Allocate the nursery for a capability from node-local memory
* Allocate blocks in the GC from node-local memory
For example, using nofib/parallel/queens on a 24-core 2-socket machine:
```
$ ./Main 15 +RTS -N24 -s -A64m
Total time 173.960s ( 7.467s elapsed)
$ ./Main 15 +RTS -N24 -s -A64m --numa
Total time 150.836s ( 6.423s elapsed)
```
The biggest win here is expected to be allocating from node-local
memory, so that means programs using a large -A value (as here).
According to perf, on this program the number of remote memory accesses
were reduced by more than 50% by using `--numa`.
Test Plan:
* validate
* There's a new flag --debug-numa=<n> that pretends to do NUMA without
actually making the OS calls, which is useful for testing the code
on non-NUMA systems.
* TODO: I need to add some unit tests
Reviewers: erikd, austin, rwbarton, ezyang, bgamari, hvr, niteria
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D2199
Diffstat (limited to 'testsuite/config')
-rw-r--r-- | testsuite/config/ghc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/testsuite/config/ghc b/testsuite/config/ghc index 355535153c..678cc56bc5 100644 --- a/testsuite/config/ghc +++ b/testsuite/config/ghc @@ -26,7 +26,7 @@ config.run_ways = ['normal', 'hpc'] config.other_ways = ['prof', 'normal_h', 'prof_hc_hb','prof_hb', 'prof_hd','prof_hy','prof_hr', - 'threaded1_ls', 'threaded2_hT', + 'threaded1_ls', 'threaded2_hT', 'debug_numa', 'llvm', 'debugllvm', 'profllvm', 'profoptllvm', 'profthreadedllvm', 'debug', @@ -87,6 +87,8 @@ config.way_flags = lambda name : { 'normal' : [], 'normal_h' : [], 'g1' : [], + 'nursery_chunks' : [], + 'debug_numa' : ['-threaded', '-debug'], 'optasm' : ['-O', '-fasm'], 'llvm' : ['-fllvm'], 'optllvm' : ['-O', '-fllvm'], @@ -119,6 +121,8 @@ config.way_rts_flags = { 'normal' : [], 'normal_h' : ['-h'], # works without -prof 'g1' : ['-G1'], + 'nursery_chunks' : ['-n32k'], + 'debug_numa' : ['-N2', '--debug-numa=2'], 'optasm' : [], 'llvm' : [], 'optllvm' : [], |