aboutsummaryrefslogtreecommitdiff
path: root/hardinfo2
diff options
context:
space:
mode:
Diffstat (limited to 'hardinfo2')
-rw-r--r--hardinfo2/arch/common/raytrace.h24
-rw-r--r--hardinfo2/arch/common/zlib.h54
-rw-r--r--hardinfo2/benchmark.c72
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)