aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/benchmark.c21
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);