diff options
author | Burt P <pburt0@gmail.com> | 2017-12-23 08:22:46 -0600 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2018-02-27 07:41:51 -0800 |
commit | 6a9f6819ae661f64c3c042d48f74d6419f63580e (patch) | |
tree | cf7e9a1dd37d260e20a4bbc10c8f21d6792bd195 /modules/benchmark.c | |
parent | e925b1b60e37040048c150e272dce181cdce8454 (diff) |
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 <pburt0@gmail.com>
Diffstat (limited to 'modules/benchmark.c')
-rw-r--r-- | modules/benchmark.c | 21 |
1 files changed, 14 insertions, 7 deletions
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); |