Commit d15cb49d authored by Simon Marlow's avatar Simon Marlow
Browse files

re-instate counting of sparks converted

lost in patch "Run sparks in batches"
parent a650cec6
...@@ -55,7 +55,7 @@ globalWorkToDo (void) ...@@ -55,7 +55,7 @@ globalWorkToDo (void)
#if defined(THREADED_RTS) #if defined(THREADED_RTS)
StgClosure * StgClosure *
stealWork (Capability *cap) findSpark (Capability *cap)
{ {
/* use the normal Sparks.h interface (internally modified to enable /* use the normal Sparks.h interface (internally modified to enable
concurrent stealing) concurrent stealing)
...@@ -66,12 +66,24 @@ stealWork (Capability *cap) ...@@ -66,12 +66,24 @@ stealWork (Capability *cap)
rtsBool retry; rtsBool retry;
nat i = 0; nat i = 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++;
return spark;
}
if (n_capabilities == 1) { return NULL; } // makes no sense...
debugTrace(DEBUG_sched, debugTrace(DEBUG_sched,
"cap %d: Trying to steal work from other capabilities", "cap %d: Trying to steal work from other capabilities",
cap->no); cap->no);
if (n_capabilities == 1) { return NULL; } // makes no sense...
do { do {
retry = rtsFalse; retry = rtsFalse;
...@@ -96,6 +108,7 @@ stealWork (Capability *cap) ...@@ -96,6 +108,7 @@ stealWork (Capability *cap)
debugTrace(DEBUG_sched, debugTrace(DEBUG_sched,
"cap %d: Stole a spark from capability %d", "cap %d: Stole a spark from capability %d",
cap->no, robbed->no); cap->no, robbed->no);
cap->sparks_converted++;
return spark; return spark;
} }
// otherwise: no success, try next one // otherwise: no success, try next one
......
...@@ -245,9 +245,9 @@ void shutdownCapability (Capability *cap, Task *task, rtsBool wait_foreign); ...@@ -245,9 +245,9 @@ void shutdownCapability (Capability *cap, Task *task, rtsBool wait_foreign);
// //
rtsBool tryGrabCapability (Capability *cap, Task *task); rtsBool tryGrabCapability (Capability *cap, Task *task);
// Try to steal a spark from other Capabilities // Try to find a spark to run
// //
StgClosure *stealWork (Capability *cap); StgClosure *findSpark (Capability *cap);
// True if any capabilities have sparks // True if any capabilities have sparks
// //
......
...@@ -2295,17 +2295,11 @@ getSparkzh_fast ...@@ -2295,17 +2295,11 @@ getSparkzh_fast
#ifndef THREADED_RTS #ifndef THREADED_RTS
RET_NP(0,ghczmprim_GHCziBool_False_closure); RET_NP(0,ghczmprim_GHCziBool_False_closure);
#else #else
(spark) = foreign "C" tryStealSpark(MyCapability()); (spark) = foreign "C" findSpark(MyCapability());
if (spark != 0) { if (spark != 0) {
RET_NP(1,spark); RET_NP(1,spark);
} else { } else {
(spark) = foreign "C" stealWork (MyCapability()); RET_NP(0,ghczmprim_GHCziBool_False_closure);
if (spark != 0) {
RET_NP(1,spark);
} else {
RET_NP(0,ghczmprim_GHCziBool_False_closure);
}
} }
#endif #endif
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment