From 6a9f6819ae661f64c3c042d48f74d6419f63580e Mon Sep 17 00:00:00 2001 From: Burt P Date: Sat, 23 Dec 2017 08:22:46 -0600 Subject: Fix benchmark_parallel_for() to use correct number of threads If (end - start) / threads left a remainder, benchmark_parallel_for() would start an extra thread for the leftover elements. Now, it has the last thread process the few extra elements. Added a note: benchmark_parallel_for(): element [start] included, but [end] is excluded. callback(): expected to processes elements [start] through [end] inclusive. Signed-off-by: Burt P --- includes/benchmark.h | 4 ++++ modules/benchmark.c | 21 ++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/includes/benchmark.h b/includes/benchmark.h index fa4ad0cf..277f0c07 100644 --- a/includes/benchmark.h +++ b/includes/benchmark.h @@ -38,6 +38,10 @@ typedef struct { char *bench_value_to_str(bench_value r); bench_value bench_value_from_str(const char* str); +/* Note: + * benchmark_parallel_for(): element [start] included, but [end] is excluded. + * callback(): expected to processes elements [start] through [end] inclusive. + */ bench_value benchmark_parallel_for(gint n_threads, guint start, guint end, gpointer callback, gpointer callback_data); diff --git a/modules/benchmark.c b/modules/benchmark.c index b5491ebd..26de9557 100644 --- a/modules/benchmark.c +++ b/modules/benchmark.c @@ -185,6 +185,10 @@ bench_value benchmark_parallel(gint n_threads, gpointer callback, gpointer callb return benchmark_parallel_for(n_threads, 0, n_threads, callback, callback_data); } +/* Note: + * benchmark_parallel_for(): element [start] included, but [end] is excluded. + * callback(): expected to processes elements [start] through [end] inclusive. + */ bench_value benchmark_parallel_for(gint n_threads, guint start, guint end, gpointer callback, gpointer callback_data) { gchar *temp; @@ -221,21 +225,24 @@ bench_value benchmark_parallel_for(gint n_threads, guint start, guint end, ret.threads_used, cpu_threads, (end - start), iter_per_thread); g_timer_start(timer); - for (iter = start; iter < end; iter += iter_per_thread) { + for (iter = start; iter < end; ) { ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); GThread *thread; - DEBUG("launching thread %d", 1 + (iter / iter_per_thread)); + guint ts = iter, te = iter + iter_per_thread; + /* add the remainder of items/iter_per_thread to the last thread */ + if (end - te < iter_per_thread) + te = end; + iter = te; + + DEBUG("launching thread %d", 1 + thread_number); pbt->thread_number = thread_number++; - pbt->start = iter == 0 ? 0 : iter; - pbt->end = iter + iter_per_thread - 1; + pbt->start = ts; + pbt->end = te - 1; pbt->data = callback_data; pbt->callback = callback; - if (pbt->end > end) - pbt->end = end; - thread = g_thread_new("dispatcher", (GThreadFunc)benchmark_parallel_for_dispatcher, pbt); threads = g_slist_prepend(threads, thread); -- cgit v1.2.3