GC: rearrange storage to reduce memory accesses in the inner loop
[ghc-hetmet.git] / rts / sm / GC.h
index d45efb9..f98e4a1 100644 (file)
@@ -82,17 +82,16 @@ typedef struct step_workspace_ {
 
     // where objects to be scavenged go
     bdescr *     todo_bd;
+    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
 
     // where large objects to be scavenged go
     bdescr *     todo_large_objects;
 
-    // Objects that need not be, or have already been, scavenged.  The
-    // block at the front of the list is special: objects that don't
-    // need to be scavenged are copied directly to this block.
-    // Completed scan blocks also go on this list; but we put them
-    // after the head block.
+    // Objects that need not be, or have already been, scavenged.
     bdescr *     scavd_list;
     lnat         n_scavd_blocks;     // count of blocks in this list
 
@@ -117,8 +116,6 @@ typedef struct gc_thread_ {
 #endif
     nat thread_index;              // a zero based index identifying the thread
 
-    step_workspace ** steps;      // 2-d array (gen,step) of workspaces
-
     bdescr * free_blocks;          // a buffer of free blocks for this thread
                                    //  during GC without accessing the block
                                    //   allocators spin lock. 
@@ -136,9 +133,9 @@ typedef struct gc_thread_ {
                                    // optimise it into a per-thread
                                    // variable).
 
-    rtsBool failed_to_evac;        // failue to evacuate an object typically 
-                                   //  causes it to be recorded in the mutable 
-                                   //  object list
+    rtsBool failed_to_evac;        // failure to evacuate an object typically 
+                                   // causes it to be recorded in the mutable 
+                                   // object list
 
     rtsBool eager_promotion;       // forces promotion to the evac gen
                                    // instead of the to-space
@@ -146,12 +143,25 @@ typedef struct gc_thread_ {
 
     lnat thunk_selector_depth;     // ummm.... not used as of now
 
+#ifdef USE_PAPI
+    int papi_events;
+#endif
+
+    // -------------------
+    // workspaces
+
+    // array of workspaces, indexed by stp->abs_no.  This is placed
+    // directly at the end of the gc_thread structure so that we can get from
+    // the gc_thread pointer to a workspace using only pointer
+    // arithmetic, no memory access.  This happens in the inner loop
+    // of the GC, see Evac.c:alloc_for_copy().
+    step_workspace steps[];
 } gc_thread;
 
 extern nat N;
 extern rtsBool major_gc;
 
-extern gc_thread *gc_threads;
+extern gc_thread **gc_threads;
 register gc_thread *gct __asm__("%rbx");
 // extern gc_thread *gct;  // this thread's gct TODO: make thread-local
 
@@ -168,7 +178,6 @@ extern bdescr *oldgen_scan_bd;
 extern StgPtr  oldgen_scan;
 
 extern long copied;
-extern long scavd_copied;
 
 #ifdef THREADED_RTS
 extern SpinLock static_objects_sync;