diff options
Diffstat (limited to 'hardinfo2')
| -rw-r--r-- | hardinfo2/arch/common/raytrace.h | 24 | ||||
| -rw-r--r-- | hardinfo2/arch/common/zlib.h | 54 | ||||
| -rw-r--r-- | hardinfo2/benchmark.c | 72 | 
3 files changed, 117 insertions, 33 deletions
| diff --git a/hardinfo2/arch/common/raytrace.h b/hardinfo2/arch/common/raytrace.h index 16cba7b6..c02cb910 100644 --- a/hardinfo2/arch/common/raytrace.h +++ b/hardinfo2/arch/common/raytrace.h @@ -18,6 +18,16 @@  void fbench();	/* fbench.c */ +static gpointer +parallel_raytrace(unsigned int start, unsigned int end, gpointer data) +{ +    for (i = start; i <= end; i++) {  +        fbench(); +    } +     +    return NULL; +} +  static void  benchmark_raytrace(void)  { @@ -28,17 +38,11 @@ benchmark_raytrace(void)      shell_view_set_enabled(FALSE);      shell_status_update("Performing John Walker's FBENCH..."); -    for (i = 0; i <= 1000; i++) {  -        g_timer_start(timer); -         -        fbench(); -         -        g_timer_stop(timer); -        elapsed += g_timer_elapsed(timer, NULL); -         -        shell_status_set_percentage(i/10); -    } +    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);      bench_results[BENCHMARK_RAYTRACE] = elapsed; diff --git a/hardinfo2/arch/common/zlib.h b/hardinfo2/arch/common/zlib.h index c334c083..f79678b3 100644 --- a/hardinfo2/arch/common/zlib.h +++ b/hardinfo2/arch/common/zlib.h @@ -16,10 +16,13 @@   *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA   */ -static void -benchmark_zlib(void) +static gpointer +parallel_zlib(unsigned int start, unsigned int end, void *data)  {      GModule *libz; +    gint i; +    glong srclen = 65536; +          static gulong (*compressBound) (glong srclen) = NULL;      static gint (*compress) (gchar *dst, glong *dstlen,                               const gchar *src, glong srclen) = NULL; @@ -30,7 +33,7 @@ benchmark_zlib(void)              libz = g_module_open("/usr/lib/libz.so", G_MODULE_BIND_LAZY);              if (!libz) {                  g_warning("Cannot load ZLib: %s", g_module_error()); -                return; +                return NULL;              }  	} @@ -38,19 +41,33 @@ benchmark_zlib(void)  	    || !g_module_symbol(libz, "compressBound", (gpointer) & compressBound)) {              g_module_close(libz); -	    return; +	    return NULL;  	}      } -    shell_view_set_enabled(FALSE); +    for (i = start; i <= end; i++) { +        gchar *dst; +        glong dstlen = compressBound(srclen); +         +        dst = g_new0(gchar, dstlen); +        compress(dst, &dstlen, data, srclen); +        g_free(dst); +    } +     +    return NULL; +} + -    int i; +static void +benchmark_zlib(void) +{      GTimer *timer = g_timer_new();      gdouble elapsed = 0; -    gchar src[65536], *tmpsrc; -    glong srclen = 65536; +    gchar *tmpsrc;      gchar *bdata_path; +    shell_view_set_enabled(FALSE); +      bdata_path = g_build_filename(params.path_data, "benchmark.data", NULL);      if (!g_file_get_contents(bdata_path, &tmpsrc, NULL, NULL)) {          g_free(bdata_path); @@ -59,24 +76,15 @@ benchmark_zlib(void)      shell_status_update("Compressing 64MB with default options..."); -    for (i = 0; i <= 1000; i++) {  -        g_timer_start(timer); -         -        gchar *dst; -        glong dstlen = compressBound(srclen); -         -        dst = g_new0(gchar, dstlen); -        compress(dst, &dstlen, src, srclen); - -        g_timer_stop(timer); -        elapsed += g_timer_elapsed(timer, NULL); -        g_free(dst); -         -        shell_status_set_percentage(i/10); -    } +    g_timer_start(timer); +    benchmark_parallel_for(0, 1000, parallel_zlib, tmpsrc); +    g_timer_stop(timer); +     +    elapsed = g_timer_elapsed(timer, NULL);      g_timer_destroy(timer);      g_free(bdata_path); +    g_free(tmpsrc);      bench_results[BENCHMARK_ZLIB] = 65536.0 / elapsed;  } diff --git a/hardinfo2/benchmark.c b/hardinfo2/benchmark.c index 32e0844d..8d36a832 100644 --- a/hardinfo2/benchmark.c +++ b/hardinfo2/benchmark.c @@ -59,6 +59,78 @@ static ModuleEntry entries[] = {      {NULL}  }; +typedef struct _ParallelBenchTask ParallelBenchTask; + +struct _ParallelBenchTask { +    unsigned int start, end; +    gpointer data, callback; +}; + +gpointer benchmark_parallel_for_dispatcher(gpointer data) +{ +    ParallelBenchTask 	*pbt = (ParallelBenchTask *)data; +    gpointer 		(*callback)(unsigned int start, unsigned int end, void *data); +    gpointer		return_value; +     +    if ((callback = pbt->callback)) { +        DEBUG("this is thread %p; items %d -> %d, data %p", g_thread_self(), +              pbt->start, pbt->end, pbt->data); +        return_value = callback(pbt->start, pbt->end, pbt->data); +        DEBUG("this is thread %p; return value is %p", g_thread_self(), return_value); +    } else { +        DEBUG("this is thread %p; callback is NULL and it should't be!", g_thread_self()); +    } +     +    g_free(pbt); +     +    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; +     +    temp = module_call_method("devices::getProcessorCount"); +    n_cores = temp ? 1 : atoi(temp); +    g_free(temp); +     +    iter_per_core = (end - start) / n_cores; +     +    DEBUG("processor has %d cores; processing %d elements (%d per core)", +          n_cores, (end - start), iter_per_core); +     +    for (iter = start; iter < end; iter += iter_per_core) { +        ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); +         +        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->data     = callback_data; +        pbt->callback = callback; +         +        threads = g_slist_prepend(threads, +                                  g_thread_create((GThreadFunc) benchmark_parallel_for_dispatcher, +                                                  pbt, TRUE, NULL)); +         +        DEBUG("thread %d launched as context %p", 1 + (iter / iter_per_core), threads->data); +    } +     +    DEBUG("waiting for all threads to finish"); +    for (t = threads; t; t = t->next) { +        DEBUG("waiting for thread with context %p", t->data); +        g_thread_join((GThread *)t->data); +    } +     +    g_slist_free(threads); +     +    DEBUG("finishing"); +} +  static gchar *__benchmark_include_results(gdouble result,  					  const gchar * benchmark,  					  ShellOrderType order_type) | 
