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 /hardinfo2 | |
| parent | e68688d89d367a7cf829962e09f90e4ed2a5c211 (diff) | |
More work on parallel benchmarks
Diffstat (limited to 'hardinfo2')
| -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); | 
