Author: sewardj
Date: 2007-10-05 12:24:28 +0100 (Fri, 05 Oct 2007)
New Revision: 6958

Log:
Allow the caches for each WordSetU to be set on a per-WordSetU basis,
to allow per-universe performance tuning.

Modified:
   branches/THRCHECK/thrcheck/tc_main.c
   branches/THRCHECK/thrcheck/tc_wordset.c
   branches/THRCHECK/thrcheck/tc_wordset.h


Modified: branches/THRCHECK/thrcheck/tc_main.c
===================================================================
--- branches/THRCHECK/thrcheck/tc_main.c        2007-10-05 10:08:46 UTC (rev 
6957)
+++ branches/THRCHECK/thrcheck/tc_main.c        2007-10-05 11:24:28 UTC (rev 
6958)
@@ -1038,15 +1038,15 @@
    TC_(addToFM)( map_locks, (Word)&__bus_lock, (Word)__bus_lock_Lock );
 
    tl_assert(univ_tsets == NULL);
-   univ_tsets = TC_(newWordSetU)( tc_zalloc, tc_free );
+   univ_tsets = TC_(newWordSetU)( tc_zalloc, tc_free, 8/*cacheSize*/ );
    tl_assert(univ_tsets != NULL);
 
    tl_assert(univ_lsets == NULL);
-   univ_lsets = TC_(newWordSetU)( tc_zalloc, tc_free );
+   univ_lsets = TC_(newWordSetU)( tc_zalloc, tc_free, 8/*cacheSize*/ );
    tl_assert(univ_lsets != NULL);
 
    tl_assert(univ_laog == NULL);
-   univ_laog = TC_(newWordSetU)( tc_zalloc, tc_free );
+   univ_laog = TC_(newWordSetU)( tc_zalloc, tc_free, 16/*cacheSize*/ );
    tl_assert(univ_laog != NULL);
 
    /* Set up entries for the root thread */

Modified: branches/THRCHECK/thrcheck/tc_wordset.c
===================================================================
--- branches/THRCHECK/thrcheck/tc_wordset.c     2007-10-05 10:08:46 UTC (rev 
6957)
+++ branches/THRCHECK/thrcheck/tc_wordset.c     2007-10-05 11:24:28 UTC (rev 
6958)
@@ -51,17 +51,28 @@
    struct { UWord arg1; UWord arg2; UWord res; }
    WCacheEnt;
 
-#define N_WORDCACHE 5
+/* Each cache is a fixed sized array of N_WCACHE_STAT_MAX entries.
+   However only the first .dynMax are used.  This is because at some
+   point, expanding the cache further overall gives a slowdown because
+   searching more entries more than negates any performance advantage
+   from caching those entries in the first place.  Hence use .dynMax
+   to allow the size of the cache(s) to be set differently for each
+   different WordSetU. */
+#define N_WCACHE_STAT_MAX 32
 typedef
    struct {
-      WCacheEnt ent[N_WORDCACHE];
-      Word      inUse; /* 0 .. N_WORDCACHE inclusive */
+      WCacheEnt ent[N_WCACHE_STAT_MAX];
+      Word      dynMax; /* 1 .. N_WCACHE_STAT_MAX inclusive */
+      Word      inUse;  /* 0 .. dynMax inclusive */
    }
    WCache;
 
-#define WCache_INIT(_zzcache) \
-   do { \
-      (_zzcache).inUse = 0; \
+#define WCache_INIT(_zzcache,_zzdynmax)                              \
+   do {                                                              \
+      tl_assert((_zzdynmax) >= 1);                                   \
+      tl_assert((_zzdynmax) <= N_WCACHE_STAT_MAX);                   \
+      (_zzcache).dynMax = (_zzdynmax);                               \
+      (_zzcache).inUse = 0;                                          \
    } while (0)
 
 #define WCache_LOOKUP_AND_RETURN(_retty,_zzcache,_zzarg1,_zzarg2)    \
@@ -70,7 +81,10 @@
       UWord   _arg1  = (UWord)(_zzarg1);                             \
       UWord   _arg2  = (UWord)(_zzarg2);                             \
       WCache* _cache = &(_zzcache);                                  \
-      tl_assert(_cache->inUse >= 0 && _cache->inUse <= N_WORDCACHE); \
+      tl_assert(_cache->dynMax >= 1);                                \
+      tl_assert(_cache->dynMax <= N_WCACHE_STAT_MAX);                \
+      tl_assert(_cache->inUse >= 0);                                 \
+      tl_assert(_cache->inUse <= _cache->dynMax);                    \
       if (_cache->inUse > 0) {                                       \
          if (_cache->ent[0].arg1 == _arg1                            \
              && _cache->ent[0].arg2 == _arg2)                        \
@@ -94,8 +108,11 @@
       UWord   _arg2  = (UWord)(_zzarg2);                             \
       UWord   _res   = (UWord)(_zzresult);                           \
       WCache* _cache = &(_zzcache);                                  \
-      tl_assert(_cache->inUse >= 0 && _cache->inUse <= N_WORDCACHE); \
-      if (_cache->inUse < N_WORDCACHE)                               \
+      tl_assert(_cache->dynMax >= 1);                                \
+      tl_assert(_cache->dynMax <= N_WCACHE_STAT_MAX);                \
+      tl_assert(_cache->inUse >= 0);                                 \
+      tl_assert(_cache->inUse <= _cache->dynMax);                    \
+      if (_cache->inUse < _cache->dynMax)                            \
          _cache->inUse++;                                            \
       for (_i = _cache->inUse-1; _i >= 1; _i--)                      \
          _cache->ent[_i] = _cache->ent[_i-1];                        \
@@ -242,11 +259,11 @@
       tl_assert(wsu->ix2vec);
    /* If this assertion fails, it may mean you supplied a 'ws'
       that does not come from the 'wsu' universe. */
-   tl_assert(ws < wsu->ix2vec_used);
+   tl_assert(ws < wsu->ix2vec_used); /* XXX */
    wv = wsu->ix2vec[ws];
    /* Make absolutely sure that 'ws' is a member of 'wsu'. */
    tl_assert(wv);
-   tl_assert(wv->owner == wsu);
+   tl_assert(wv->owner == wsu); /* YYY */
    return wv;
 }
 
@@ -288,7 +305,8 @@
 
 
 WordSetU* TC_(newWordSetU) ( void* (*alloc_nofail)( SizeT ),
-                             void  (*dealloc)(void*) )
+                             void  (*dealloc)(void*),
+                             Word  cacheSize )
 {
    WordSetU* wsu;
    WordVec*  empty;
@@ -301,10 +319,10 @@
    wsu->ix2vec_used = 0;
    wsu->ix2vec_size = 0;
    wsu->ix2vec      = NULL;
-   WCache_INIT(wsu->cache_addTo);
-   WCache_INIT(wsu->cache_delFrom);
-   WCache_INIT(wsu->cache_intersect);
-   WCache_INIT(wsu->cache_minus);
+   WCache_INIT(wsu->cache_addTo,     cacheSize);
+   WCache_INIT(wsu->cache_delFrom,   cacheSize);
+   WCache_INIT(wsu->cache_intersect, cacheSize);
+   WCache_INIT(wsu->cache_minus,     cacheSize);
    empty = new_WV_of_size( wsu, 0 );
    wsu->empty = add_or_dealloc_WordVec( wsu, empty );
 
@@ -508,7 +526,7 @@
    for (k = 0; k < wv->size; k++) {
       if (wv->words[k] == w) {
          result = ws;
-        goto out;
+         goto out;
       }
    }
    /* Ok, not present.  Build a new one ... */

Modified: branches/THRCHECK/thrcheck/tc_wordset.h
===================================================================
--- branches/THRCHECK/thrcheck/tc_wordset.h     2007-10-05 10:08:46 UTC (rev 
6957)
+++ branches/THRCHECK/thrcheck/tc_wordset.h     2007-10-05 11:24:28 UTC (rev 
6958)
@@ -48,7 +48,8 @@
 
 /* Allocate and initialise a WordSetU */
 WordSetU* TC_(newWordSetU) ( void* (*alloc_nofail)( SizeT ),
-                             void  (*dealloc)(void*) );
+                             void  (*dealloc)(void*),
+                             Word  cacheSize );
 
 /* Free up the WordSetU. */
 void TC_(deleteWordSetU) ( WordSetU* );


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to