Pad Capabilities and Tasks to 64 bytes
authorSimon Marlow <marlowsd@gmail.com>
Thu, 23 Oct 2008 08:07:49 +0000 (08:07 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 23 Oct 2008 08:07:49 +0000 (08:07 +0000)
This is just good practice to avoid placing two structures heavily
accessed by different CPUs on the same cache line

rts/Capability.h
rts/Task.c

index 89b813f..dc0a28e 100644 (file)
@@ -106,8 +106,10 @@ struct Capability_ {
     StgTRecChunk *free_trec_chunks;
     StgTRecHeader *free_trec_headers;
     nat transaction_tokens;
-
-}; // typedef Capability, defined in RtsAPI.h
+} // typedef Capability is defined in RtsAPI.h
+  // Capabilities are stored in an array, so make sure that adjacent
+  // Capabilities don't share any cache-lines:
+  ATTRIBUTE_ALIGNED(64);
 
 
 #if defined(THREADED_RTS)
index 0ec60f7..7120436 100644 (file)
@@ -114,7 +114,8 @@ newTask (void)
 #endif
     Task *task;
 
-    task = stgMallocBytes(sizeof(Task), "newTask");
+#define ROUND_TO_CACHE_LINE(x) ((((x)+63) / 64) * 64)
+    task = stgMallocBytes(ROUND_TO_CACHE_LINE(sizeof(Task)), "newTask");
     
     task->cap  = NULL;
     task->stopped = rtsFalse;