From 03a58fc9816fbd5df44adb9d77afdbf9944cc120 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 7 Oct 2009 12:50:31 +0000 Subject: [PATCH] Retry pulling from our own spark pool if there was a collision --- rts/Capability.c | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/rts/Capability.c b/rts/Capability.c index 0e4d5a6..8cfcba0 100644 --- a/rts/Capability.c +++ b/rts/Capability.c @@ -84,30 +84,33 @@ findSpark (Capability *cap) return 0; } - // first try to get a spark from our own pool. - // We should be using reclaimSpark(), because it works without - // needing any atomic instructions: - // spark = reclaimSpark(cap->sparks); - // However, measurements show that this makes at least one benchmark - // slower (prsa) and doesn't affect the others. - spark = tryStealSpark(cap); - if (spark != NULL) { - cap->sparks_converted++; - - // Post event for running a spark from capability's own pool. - traceSchedEvent(cap, EVENT_RUN_SPARK, cap->r.rCurrentTSO, 0); - - return spark; - } + do { + retry = rtsFalse; - if (n_capabilities == 1) { return NULL; } // makes no sense... + // first try to get a spark from our own pool. + // We should be using reclaimSpark(), because it works without + // needing any atomic instructions: + // spark = reclaimSpark(cap->sparks); + // However, measurements show that this makes at least one benchmark + // slower (prsa) and doesn't affect the others. + spark = tryStealSpark(cap); + if (spark != NULL) { + cap->sparks_converted++; - debugTrace(DEBUG_sched, - "cap %d: Trying to steal work from other capabilities", - cap->no); + // Post event for running a spark from capability's own pool. + traceSchedEvent(cap, EVENT_RUN_SPARK, cap->r.rCurrentTSO, 0); - do { - retry = rtsFalse; + return spark; + } + if (!emptySparkPoolCap(cap)) { + retry = rtsTrue; + } + + if (n_capabilities == 1) { return NULL; } // makes no sense... + + debugTrace(DEBUG_sched, + "cap %d: Trying to steal work from other capabilities", + cap->no); /* visit cap.s 0..n-1 in sequence until a theft succeeds. We could start at a random place instead of 0 as well. */ -- 1.7.10.4