diff options
-rw-r--r-- | includes/benchmark.h | 4 | ||||
-rw-r--r-- | 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); |