Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : master
http://hackage.haskell.org/trac/ghc/changeset/fa8d20e6d85212290b633159b6ef2d77fb1c4021 >--------------------------------------------------------------- commit fa8d20e6d85212290b633159b6ef2d77fb1c4021 Author: Duncan Coutts <[email protected]> Date: Wed Jun 1 19:48:15 2011 +0100 Classify overflowed sparks separately When you use `par` to make a spark, if the spark pool on the current capability is full then the spark is discarded. This represents a loss of potential parallelism and it also means there are simply a lot of sparks around. Both are things that might be of concern to a programmer when tuning a parallel program that uses par. The "+RTS -s" stats command now reports overflowed sparks, e.g. SPARKS: 100001 (15521 converted, 84480 overflowed, 0 dud, 0 GC'd, 0 fizzled) >--------------------------------------------------------------- rts/Capability.c | 1 + rts/Sparks.c | 8 ++++++-- rts/Sparks.h | 1 + rts/Stats.c | 9 +++++---- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/rts/Capability.c b/rts/Capability.c index e12bf99..d93c9c1 100644 --- a/rts/Capability.c +++ b/rts/Capability.c @@ -234,6 +234,7 @@ initCapability( Capability *cap, nat i ) cap->inbox = (Message*)END_TSO_QUEUE; cap->spark_stats.created = 0; cap->spark_stats.dud = 0; + cap->spark_stats.overflowed = 0; cap->spark_stats.converted = 0; cap->spark_stats.gcd = 0; cap->spark_stats.fizzled = 0; diff --git a/rts/Sparks.c b/rts/Sparks.c index d358ae6..26b8199 100644 --- a/rts/Sparks.c +++ b/rts/Sparks.c @@ -64,8 +64,12 @@ newSpark (StgRegTable *reg, StgClosure *p) SparkPool *pool = cap->sparks; if (!fizzledSpark(p)) { - pushWSDeque(pool,p); - cap->spark_stats.created++; + if (pushWSDeque(pool,p)) { + cap->spark_stats.created++; + } else { + /* overflowing the spark pool */ + cap->spark_stats.overflowed++; + } } else { cap->spark_stats.dud++; } diff --git a/rts/Sparks.h b/rts/Sparks.h index c987a94..ea7d356 100644 --- a/rts/Sparks.h +++ b/rts/Sparks.h @@ -19,6 +19,7 @@ typedef struct { StgWord created; StgWord dud; + StgWord overflowed; StgWord converted; StgWord gcd; StgWord fizzled; diff --git a/rts/Stats.c b/rts/Stats.c index 04b091c..7c02b5a 100644 --- a/rts/Stats.c +++ b/rts/Stats.c @@ -629,18 +629,19 @@ stat_exit(int alloc) { nat i; - SparkCounters sparks = { 0, 0, 0, 0, 0}; + SparkCounters sparks = { 0, 0, 0, 0, 0, 0}; for (i = 0; i < n_capabilities; i++) { sparks.created += capabilities[i].spark_stats.created; sparks.dud += capabilities[i].spark_stats.dud; + sparks.overflowed+= capabilities[i].spark_stats.overflowed; sparks.converted += capabilities[i].spark_stats.converted; sparks.gcd += capabilities[i].spark_stats.gcd; sparks.fizzled += capabilities[i].spark_stats.fizzled; } - statsPrintf(" SPARKS: %ld (%ld converted, %ld dud, %ld GC'd, %ld fizzled)\n\n", - sparks.created + sparks.dud, - sparks.converted, sparks.dud, + statsPrintf(" SPARKS: %ld (%ld converted, %ld overflowed, %ld dud, %ld GC'd, %ld fizzled)\n\n", + sparks.created + sparks.dud + sparks.overflowed, + sparks.converted, sparks.overflowed, sparks.dud, sparks.gcd, sparks.fizzled); } #endif _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
