diff options
author | Leandro Pereira <leandro@daileon.acd.puc-campinas.edu.br> | 2008-10-27 16:14:18 -0200 |
---|---|---|
committer | Leandro Pereira <leandro@daileon.acd.puc-campinas.edu.br> | 2008-10-27 16:14:18 -0200 |
commit | f42a25ffd22c96fa5578b4117e78ccf8677aa595 (patch) | |
tree | ac530cd973200c77dbf711cf655eddd304b1a0b3 | |
parent | e68688d89d367a7cf829962e09f90e4ed2a5c211 (diff) |
More work on parallel benchmarks
-rw-r--r-- | hardinfo2/arch/common/raytrace.h | 11 | ||||
-rw-r--r-- | hardinfo2/arch/common/zlib.h | 10 | ||||
-rw-r--r-- | hardinfo2/benchmark.c | 45 |
3 files changed, 33 insertions, 33 deletions
diff --git a/hardinfo2/arch/common/raytrace.h b/hardinfo2/arch/common/raytrace.h index c02cb910..7fdc5e21 100644 --- a/hardinfo2/arch/common/raytrace.h +++ b/hardinfo2/arch/common/raytrace.h @@ -21,6 +21,8 @@ void fbench(); /* fbench.c */ static gpointer parallel_raytrace(unsigned int start, unsigned int end, gpointer data) { + unsigned int i; + for (i = start; i <= end; i++) { fbench(); } @@ -31,19 +33,12 @@ parallel_raytrace(unsigned int start, unsigned int end, gpointer data) static void benchmark_raytrace(void) { - int i; - GTimer *timer = g_timer_new(); gdouble elapsed = 0; shell_view_set_enabled(FALSE); shell_status_update("Performing John Walker's FBENCH..."); - g_timer_start(timer); - benchmark_parallel_for(0, 1000, parallel_raytrace, NULL); - g_timer_stop(timer); - - elapsed = g_timer_elapsed(timer, NULL); - g_timer_destroy(timer); + elapsed = benchmark_parallel_for(0, 1000, parallel_raytrace, NULL); bench_results[BENCHMARK_RAYTRACE] = elapsed; } diff --git a/hardinfo2/arch/common/zlib.h b/hardinfo2/arch/common/zlib.h index f79678b3..9a24c62f 100644 --- a/hardinfo2/arch/common/zlib.h +++ b/hardinfo2/arch/common/zlib.h @@ -17,7 +17,7 @@ */ static gpointer -parallel_zlib(unsigned int start, unsigned int end, void *data) +parallel_zlib(unsigned int start, unsigned int end, void *data, GTimer *timer) { GModule *libz; gint i; @@ -61,7 +61,6 @@ parallel_zlib(unsigned int start, unsigned int end, void *data) static void benchmark_zlib(void) { - GTimer *timer = g_timer_new(); gdouble elapsed = 0; gchar *tmpsrc; gchar *bdata_path; @@ -76,13 +75,8 @@ benchmark_zlib(void) shell_status_update("Compressing 64MB with default options..."); - g_timer_start(timer); - benchmark_parallel_for(0, 1000, parallel_zlib, tmpsrc); - g_timer_stop(timer); + elapsed = benchmark_parallel_for(0, 1000, parallel_zlib, tmpsrc); - elapsed = g_timer_elapsed(timer, NULL); - - g_timer_destroy(timer); g_free(bdata_path); g_free(tmpsrc); diff --git a/hardinfo2/benchmark.c b/hardinfo2/benchmark.c index 8d36a832..c0928305 100644 --- a/hardinfo2/benchmark.c +++ b/hardinfo2/benchmark.c @@ -62,8 +62,8 @@ static ModuleEntry entries[] = { typedef struct _ParallelBenchTask ParallelBenchTask; struct _ParallelBenchTask { - unsigned int start, end; - gpointer data, callback; + guint start, end; + gpointer data, callback; }; gpointer benchmark_parallel_for_dispatcher(gpointer data) @@ -86,13 +86,15 @@ gpointer benchmark_parallel_for_dispatcher(gpointer data) return return_value; } -void benchmark_parallel_for(unsigned int start, - unsigned int end, - void *callback, - void *callback_data) { - char *temp; - unsigned int n_cores, iter_per_core, iter; - GSList *threads = NULL, *t; +gdouble benchmark_parallel_for(guint start, guint end, + gpointer callback, gpointer callback_data) { + gchar *temp; + guint n_cores, iter_per_core, iter; + GSList *threads = NULL, *t; + GTimer *timer; + gdouble elapsed_time; + + timer = g_timer_new(); temp = module_call_method("devices::getProcessorCount"); n_cores = temp ? 1 : atoi(temp); @@ -102,20 +104,25 @@ void benchmark_parallel_for(unsigned int start, DEBUG("processor has %d cores; processing %d elements (%d per core)", n_cores, (end - start), iter_per_core); - + + g_timer_start(timer); for (iter = start; iter < end; iter += iter_per_core) { ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); + GThread *thread; DEBUG("launching thread %d", 1 + (iter / iter_per_core)); pbt->start = iter == 0 ? 0 : iter + 1; - pbt->end = (iter + iter_per_core) % (start - end); + pbt->end = iter + iter_per_core; pbt->data = callback_data; pbt->callback = callback; - threads = g_slist_prepend(threads, - g_thread_create((GThreadFunc) benchmark_parallel_for_dispatcher, - pbt, TRUE, NULL)); + if (pbt->end > end) + pbt->end = end; + + thread = g_thread_create((GThreadFunc) benchmark_parallel_for_dispatcher, + pbt, TRUE, NULL); + threads = g_slist_prepend(threads, thread); DEBUG("thread %d launched as context %p", 1 + (iter / iter_per_core), threads->data); } @@ -126,9 +133,15 @@ void benchmark_parallel_for(unsigned int start, g_thread_join((GThread *)t->data); } + g_timer_stop(timer); + elapsed_time = g_timer_elapsed(timer, NULL); + g_slist_free(threads); + g_timer_destroy(timer); DEBUG("finishing"); + + return elapsed_time; } static gchar *__benchmark_include_results(gdouble result, @@ -142,9 +155,7 @@ static gchar *__benchmark_include_results(gdouble result, conf = g_key_file_new(); - path = - g_build_filename(g_get_home_dir(), ".hardinfo", "benchmark.conf", - NULL); + path = g_build_filename(g_get_home_dir(), ".hardinfo", "benchmark.conf", NULL); if (!g_file_test(path, G_FILE_TEST_EXISTS)) { DEBUG("local benchmark.conf not found, trying system-wide"); g_free(path); |