From 4af25e1a72f2d0f1f523fe5b13c71f1b3dc7a5a5 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 23 Oct 2008 08:07:49 +0000 Subject: [PATCH] Pad Capabilities and Tasks to 64 bytes This is just good practice to avoid placing two structures heavily accessed by different CPUs on the same cache line --- rts/Capability.h | 6 ++++-- rts/Task.c | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rts/Capability.h b/rts/Capability.h index 89b813f..dc0a28e 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -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) diff --git a/rts/Task.c b/rts/Task.c index 0ec60f7..7120436 100644 --- a/rts/Task.c +++ b/rts/Task.c @@ -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; -- 1.7.10.4