]> mj.ucw.cz Git - libucw.git/commitdiff
Made radix-sorting threshold configurable and let radix-tune-bits
authorMartin Mares <mj@ucw.cz>
Mon, 10 Sep 2007 17:31:00 +0000 (19:31 +0200)
committerMartin Mares <mj@ucw.cz>
Mon, 10 Sep 2007 17:31:00 +0000 (19:31 +0200)
help find the optimum.

debug/sorter/radix-tune-bits.sh
lib/sorter/array.c
lib/sorter/common.h
lib/sorter/config.c

index baab6df85768addbd1b171c541a7636f6a09808b..65098382f34e742682540810634989ec05e21860 100644 (file)
@@ -20,7 +20,10 @@ SIZE=$(($SORTBUF/2 - 8192))
 log "Decided to benchmark sorting of $SIZE byte data"
 
 # Which bit widths we try
-WIDTHS="6 7 8 9 10 11 12 13 14"
+WIDTHS="0 6 7 8 9 10 11 12 13 14"
+
+# Which RadixThresholds we try
+THRS="100 500 1000 2500 5000"
 
 # Which sort-test tests we try
 TESTS="2,5,8,15"
@@ -28,18 +31,33 @@ TESTS="2,5,8,15"
 # Check various bit widths of the radix sorter
 rm -f tmp/radix-*
 for W in $WIDTHS ; do
-       log "Compiling with $W-bit radix splits"
        rm -f $BUILD/obj/lib/sorter/sort-test{,.o}
-       ( cd $BUILD && make CEXTRA="-DFORCE_RADIX_BITS=$W" obj/lib/sorter/sort-test )
-       log "Running the tests"
-       $BUILD/obj/lib/sorter/sort-test -s$SIZE -t$TESTS -v 2>&1 | tee tmp/radix-$W
+       if [ $W = 0 ] ; then
+               log "Compiling with no radix splits"
+               ( cd $BUILD && make obj/lib/sorter/sort-test )
+               OPT="-d32"
+       else
+               log "Compiling with $W-bit radix splits"
+               ( cd $BUILD && make CEXTRA="-DFORCE_RADIX_BITS=$W" obj/lib/sorter/sort-test )
+               OPT=
+       fi
+       for THR in $THRS ; do
+               log "Testing with RadixThreshold=$THR"
+               $BUILD/obj/lib/sorter/sort-test -SSorter.RadixThreshold=$THR -s$SIZE -t$TESTS $OPT -v 2>&1 | tee -a tmp/radix-$W
+       done
 done
 
-log "Trying with radix-sort switched off"
-$BUILD/obj/lib/sorter/sort-test -s$SIZE -t$TESTS -v -d32 2>&1 | tee tmp/radix-0
+echo "thresh" >tmp/radix-thrs
+echo "test#" >tmp/radix-tests
+for THR in $THRS ; do
+       for TEST in `echo $TESTS | tr ',' ' '` ; do
+               echo $THR >>tmp/radix-thrs
+               echo $TEST >>tmp/radix-tests
+       done
+done
 
-FILES=""
-for W in $WIDTHS ; do
+FILES="tmp/radix-thrs tmp/radix-tests"
+for W in $WIDTHS ; do
        a=tmp/radix-$W
        echo >$a.out "$W bits"
        sed 's/.* \([0-9.]\+\)s internal sorting.*/\1/;t;d' <$a >>$a.out
@@ -47,5 +65,4 @@ for W in 0 $WIDTHS ; do
 done
 
 log "These are the results:"
-echo "test#,$TESTS" | tr , '\n' >tmp/radix-tests
-paste tmp/radix-tests $FILES
+paste $FILES
index 838ad98c61eff7c4335122e76e35d0eb661dc767..26b4a1b53048e1f11de89a653c36bcbdb513b292 100644 (file)
@@ -15,7 +15,6 @@
 #include <string.h>
 #include <alloca.h>
 
-#define ASORT_MIN_RADIX 5000           // FIXME: var?
 #define ASORT_MIN_SHIFT 2
 
 static void
@@ -49,7 +48,7 @@ asort_radix(struct asort_context *ctx, void *array, void *buffer, uns num_elts,
   for (uns i=0; i<buckets; i++)
     {
       uns n = cnt[i] - pos;
-      if (n < ASORT_MIN_RADIX || shift < ASORT_MIN_SHIFT)
+      if (n < sorter_radix_threshold || shift < ASORT_MIN_SHIFT)
        {
          ctx->quicksort(buffer, n);
          if (!swapped_output)
@@ -216,7 +215,7 @@ rs_finish(struct worker_thread *thr UNUSED, struct work *ww)
   struct rs_work *w = (struct rs_work *) ww;
 
   DBG("Thread %d: Finishing %d items, shift=%d", thr->id, w->num_elts, w->shift);
-  if (w->shift < ASORT_MIN_SHIFT || w->num_elts < ASORT_MIN_RADIX)
+  if (w->shift < ASORT_MIN_SHIFT || w->num_elts < sorter_radix_threshold)
     {
       w->ctx->quicksort(w->in, w->num_elts);
       if (w->swap_output)
@@ -373,7 +372,7 @@ asort_run(struct asort_context *ctx)
                              ctx->num_elts * ctx->elt_size >= sorter_thread_threshold &&
                              !(sorter_debug & SORT_DEBUG_ASORT_NO_THREADS));
 
-  if (ctx->num_elts < ASORT_MIN_RADIX ||
+  if (ctx->num_elts < sorter_radix_threshold ||
       ctx->hash_bits <= ASORT_MIN_SHIFT ||
       !ctx->radix_split ||
       (sorter_debug & SORT_DEBUG_ASORT_NO_RADIX))
index deee9e0449578a6189ba61fc7d4ffab99a530934..f67f9bf9a1522c26fd9ff84db872d83ac61ade27 100644 (file)
@@ -16,7 +16,7 @@
 extern uns sorter_trace, sorter_stream_bufsize;
 extern uns sorter_debug, sorter_min_radix_bits, sorter_max_radix_bits;
 extern uns sorter_min_multiway_bits, sorter_max_multiway_bits;
-extern uns sorter_threads, sorter_thread_threshold;
+extern uns sorter_threads, sorter_thread_threshold, sorter_radix_threshold;
 extern u64 sorter_bufsize;
 extern struct fb_params sorter_fb_params;
 
index 178b190437fd05360c0f9c5b26840907d2c0168f..75d8fa49030876a8b4f3add48906c1a57b11426b 100644 (file)
@@ -22,6 +22,7 @@ uns sorter_min_multiway_bits;
 uns sorter_max_multiway_bits;
 uns sorter_threads;
 uns sorter_thread_threshold;
+uns sorter_radix_threshold = 4096;
 struct fb_params sorter_fb_params;
 
 static struct cf_section sorter_config = {
@@ -37,6 +38,7 @@ static struct cf_section sorter_config = {
     CF_UNS("MaxMultiwayBits", &sorter_max_multiway_bits),
     CF_UNS("Threads", &sorter_threads),
     CF_UNS("ThreadThreshold", &sorter_thread_threshold),
+    CF_UNS("RadixThreshold", &sorter_radix_threshold),
     CF_END
   }
 };