{
struct rs_work *w = (struct rs_work *) ww;
- DBG("Thread %d: Finishing %d items, shift=%d", thr->id, w->num_elts, w->shift);
+ if (thr)
+ DBG("Thread %d: Finishing %d items, shift=%d", thr->id, w->num_elts, w->shift);
if (w->shift < ASORT_MIN_SHIFT || w->num_elts < sorter_radix_threshold)
{
w->ctx->quicksort(w->in, w->num_elts);
}
else
asort_radix(w->ctx, w->in, w->out, w->num_elts, w->shift, w->swap_output);
- DBG("Thread %d: Finishing done", thr->id);
+ if (thr)
+ DBG("Thread %d: Finishing done", thr->id);
}
static void
for (uns i=0; i<buckets; i++)
{
uns n = cnt[i] - pos;
+ if (!n)
+ continue;
if (n * ctx->elt_size < sorter_thread_threshold)
{
struct rs_work *w = ep_alloc(ctx->eltpool);
w->num_elts = n;
w->shift = shift;
w->swap_output = !swapped_output;
- clist_add_tail(&ctx->rs_bits, &w->w.n);
- DBG("Scheduling block %d+%d", pos, n);
+ if (n * ctx->elt_size < sorter_thread_chunk)
+ {
+ DBG("Sorting block %d+%d inline", pos, n);
+ rs_finish(NULL, &w->w);
+ ep_free(ctx->eltpool, w);
+ }
+ else
+ {
+ clist_add_tail(&ctx->rs_bits, &w->w.n);
+ DBG("Scheduling block %d+%d", pos, n);
+ }
}
else
rs_radix(ctx, buffer, array, n, shift, !swapped_output);
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, sorter_radix_threshold;
+extern uns sorter_threads, sorter_thread_threshold, sorter_thread_chunk;
+extern uns sorter_radix_threshold;
extern u64 sorter_bufsize;
extern struct fb_params sorter_fb_params;
uns sorter_min_multiway_bits;
uns sorter_max_multiway_bits;
uns sorter_threads;
-uns sorter_thread_threshold;
+uns sorter_thread_threshold = 1048576;
+uns sorter_thread_chunk = 4096;
uns sorter_radix_threshold = 4096;
struct fb_params sorter_fb_params;
CF_UNS("MaxMultiwayBits", &sorter_max_multiway_bits),
CF_UNS("Threads", &sorter_threads),
CF_UNS("ThreadThreshold", &sorter_thread_threshold),
+ CF_UNS("ThreadChunk", &sorter_thread_chunk),
CF_UNS("RadixThreshold", &sorter_radix_threshold),
CF_END
}