aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeandro Pereira <leandro@daileon.acd.puc-campinas.edu.br>2008-10-27 16:14:18 -0200
committerLeandro Pereira <leandro@daileon.acd.puc-campinas.edu.br>2008-10-27 16:14:18 -0200
commitf42a25ffd22c96fa5578b4117e78ccf8677aa595 (patch)
treeac530cd973200c77dbf711cf655eddd304b1a0b3
parente68688d89d367a7cf829962e09f90e4ed2a5c211 (diff)
More work on parallel benchmarks
-rw-r--r--hardinfo2/arch/common/raytrace.h11
-rw-r--r--hardinfo2/arch/common/zlib.h10
-rw-r--r--hardinfo2/benchmark.c45
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);