summaryrefslogtreecommitdiff
path: root/rts/sm/GCThread.h
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-03-13 13:51:16 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-03-13 13:51:16 +0000
commit4e3542263207ae49963811aeb84927027e7bb61d (patch)
tree90814c02010977694748704fc96bf4347bf2104f /rts/sm/GCThread.h
parent8fda9784f1eff82aa243073fd31b181080be3109 (diff)
downloadhaskell-4e3542263207ae49963811aeb84927027e7bb61d.tar.gz
Use work-stealing for load-balancing in the GC
New flag: "+RTS -qb" disables load-balancing in the parallel GC (though this is subject to change, I think we will probably want to do something more automatic before releasing this). To get the "PARGC3" configuration described in the "Runtime support for Multicore Haskell" paper, use "+RTS -qg0 -qb -RTS". The main advantage of this is that it allows us to easily disable load-balancing altogether, which turns out to be important in parallel programs. Maintaining locality is sometimes more important that spreading the work out in parallel GC. There is a side benefit in that the parallel GC should have improved locality even when load-balancing, because each processor prefers to take work from its own queue before stealing from others.
Diffstat (limited to 'rts/sm/GCThread.h')
-rw-r--r--rts/sm/GCThread.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/rts/sm/GCThread.h b/rts/sm/GCThread.h
index 3ee2757f19..aacef82cbc 100644
--- a/rts/sm/GCThread.h
+++ b/rts/sm/GCThread.h
@@ -15,6 +15,7 @@
#define GCTHREAD_H
#include "OSThreads.h"
+#include "WSDeque.h"
/* -----------------------------------------------------------------------------
General scheme
@@ -81,13 +82,14 @@ typedef struct step_workspace_ {
StgPtr todo_free; // free ptr for todo_bd
StgPtr todo_lim; // lim for todo_bd
- bdescr * buffer_todo_bd; // buffer to reduce contention
- // on the step's todos list
+ WSDeque * todo_q;
+ bdescr * todo_overflow;
+ nat n_todo_overflow;
// where large objects to be scavenged go
bdescr * todo_large_objects;
- // Objects that have already been, scavenged.
+ // Objects that have already been scavenged.
bdescr * scavd_list;
nat n_scavd_blocks; // count of blocks in this list
@@ -95,7 +97,7 @@ typedef struct step_workspace_ {
bdescr * part_list;
unsigned int n_part_blocks; // count of above
- StgWord pad[5];
+ StgWord pad[3];
} step_workspace ATTRIBUTE_ALIGNED(64);
// align so that computing gct->steps[n] is a shift, not a multiply