aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/benchmark.h4
-rw-r--r--modules/benchmark.c21
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);