aboutsummaryrefslogtreecommitdiff
path: root/hardinfo2
diff options
context:
space:
mode:
authorLeandro Augusto Fogolin Pereira <leandro@zorg.(none)>2009-04-11 18:54:47 -0300
committerLeandro Augusto Fogolin Pereira <leandro@zorg.(none)>2009-04-11 18:54:47 -0300
commitf456e935f74f23ae76de31d5fb84906090c8e1aa (patch)
tree5a2f8764152a5e17b95cdfabaf022a350f435fd0 /hardinfo2
parent07ba0e3bf71c3c5ad7d98be58160e13069d9cf77 (diff)
Fit crash with FFT benchmark.
Diffstat (limited to 'hardinfo2')
-rw-r--r--hardinfo2/arch/common/blowfish.h2
-rw-r--r--hardinfo2/arch/common/cryptohash.h4
-rw-r--r--hardinfo2/arch/common/fft.h32
-rw-r--r--hardinfo2/arch/common/nqueens.h2
-rw-r--r--hardinfo2/arch/common/raytrace.h2
-rw-r--r--hardinfo2/benchmark.c10
-rw-r--r--hardinfo2/fftbench.c59
-rw-r--r--hardinfo2/fftbench.h15
8 files changed, 83 insertions, 43 deletions
diff --git a/hardinfo2/arch/common/blowfish.h b/hardinfo2/arch/common/blowfish.h
index 5fea2e22..333fb157 100644
--- a/hardinfo2/arch/common/blowfish.h
+++ b/hardinfo2/arch/common/blowfish.h
@@ -19,7 +19,7 @@
#include <blowfish.h>
static gpointer
-parallel_blowfish(unsigned int start, unsigned int end, void *data, GTimer *timer)
+parallel_blowfish(unsigned int start, unsigned int end, void *data, gint thread_number)
{
BLOWFISH_CTX ctx;
unsigned int i;
diff --git a/hardinfo2/arch/common/cryptohash.h b/hardinfo2/arch/common/cryptohash.h
index 9897bb6b..2c917c9b 100644
--- a/hardinfo2/arch/common/cryptohash.h
+++ b/hardinfo2/arch/common/cryptohash.h
@@ -39,12 +39,12 @@ static void inline sha1_step(char *data, glong srclen)
SHA1Final(checksum, &ctx);
}
-static gpointer cryptohash_for(unsigned int start, unsigned int end, void *data, GTimer *timer)
+static gpointer cryptohash_for(unsigned int start, unsigned int end, void *data, gint thread_number)
{
unsigned int i;
for (i = start; i <= end; i++) {
- if (i % 2 == 0) {
+ if (i & 1) {
md5_step(data, 65536);
} else {
sha1_step(data, 65536);
diff --git a/hardinfo2/arch/common/fft.h b/hardinfo2/arch/common/fft.h
index 62daa9fe..f1a0ced8 100644
--- a/hardinfo2/arch/common/fft.h
+++ b/hardinfo2/arch/common/fft.h
@@ -18,12 +18,14 @@
#include <fftbench.h>
-static gpointer fft_for(unsigned int start, unsigned int end, void *data, GTimer *timer)
+static gpointer fft_for(unsigned int start, unsigned int end, void *data, gint thread_number)
{
unsigned int i;
+ FFTBench **benches = (FFTBench **)data;
+ FFTBench *fftbench = (FFTBench *)(benches[thread_number]);
for (i = start; i <= end; i++) {
- fft_bench_start();
+ fft_bench_run(fftbench);
}
return NULL;
@@ -33,15 +35,31 @@ static void
benchmark_fft(void)
{
gdouble elapsed = 0;
+ int n_cores, i;
+ gchar *temp;
+ FFTBench **benches;
shell_view_set_enabled(FALSE);
shell_status_update("Running FFT benchmark...");
- fft_bench_init();
- elapsed = benchmark_parallel_for(0, 4, fft_for, NULL);
- fft_bench_finish();
+ /* Pre-allocate all benchmarks */
+ temp = module_call_method("devices::getProcessorCount");
+ n_cores = temp ? atoi(temp) : 1;
+ g_free(temp);
+ benches = g_new0(FFTBench *, n_cores);
+ for (i = 0; i < n_cores; i++) {
+ benches[i] = fft_bench_new();
+ }
+
+ /* Run the benchmark */
+ elapsed = benchmark_parallel_for(0, 4, fft_for, benches);
+
+ /* Free up the memory */
+ for (i = 0; i < n_cores; i++) {
+ fft_bench_free(benches[i]);
+ }
+ g_free(benches);
+
bench_results[BENCHMARK_FFT] = elapsed;
}
-
-
diff --git a/hardinfo2/arch/common/nqueens.h b/hardinfo2/arch/common/nqueens.h
index 2a233722..6ad5b4fd 100644
--- a/hardinfo2/arch/common/nqueens.h
+++ b/hardinfo2/arch/common/nqueens.h
@@ -18,7 +18,7 @@
#include <nqueens.h>
-static gpointer nqueens_for(unsigned int start, unsigned int end, void *data, GTimer *timer)
+static gpointer nqueens_for(unsigned int start, unsigned int end, void *data, gint thread_number)
{
unsigned int i;
diff --git a/hardinfo2/arch/common/raytrace.h b/hardinfo2/arch/common/raytrace.h
index 7fdc5e21..fe2fda91 100644
--- a/hardinfo2/arch/common/raytrace.h
+++ b/hardinfo2/arch/common/raytrace.h
@@ -19,7 +19,7 @@
void fbench(); /* fbench.c */
static gpointer
-parallel_raytrace(unsigned int start, unsigned int end, gpointer data)
+parallel_raytrace(unsigned int start, unsigned int end, gpointer data, gint thread_number)
{
unsigned int i;
diff --git a/hardinfo2/benchmark.c b/hardinfo2/benchmark.c
index e31d6b34..d91394bf 100644
--- a/hardinfo2/benchmark.c
+++ b/hardinfo2/benchmark.c
@@ -62,6 +62,7 @@ static ModuleEntry entries[] = {
typedef struct _ParallelBenchTask ParallelBenchTask;
struct _ParallelBenchTask {
+ gint thread_number;
guint start, end;
gpointer data, callback;
};
@@ -69,13 +70,13 @@ struct _ParallelBenchTask {
gpointer benchmark_parallel_for_dispatcher(gpointer data)
{
ParallelBenchTask *pbt = (ParallelBenchTask *)data;
- gpointer (*callback)(unsigned int start, unsigned int end, void *data);
+ gpointer (*callback)(unsigned int start, unsigned int end, void *data, gint thread_number);
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);
+ return_value = callback(pbt->start, pbt->end, pbt->data, pbt->thread_number);
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());
@@ -89,7 +90,7 @@ gpointer benchmark_parallel_for_dispatcher(gpointer data)
gdouble benchmark_parallel_for(guint start, guint end,
gpointer callback, gpointer callback_data) {
gchar *temp;
- guint n_cores, iter_per_core, iter;
+ guint n_cores, iter_per_core, iter, thread_number = 0;
gdouble elapsed_time;
GSList *threads = NULL, *t;
GTimer *timer;
@@ -121,7 +122,8 @@ gdouble benchmark_parallel_for(guint start, guint end,
DEBUG("launching thread %d", 1 + (iter / iter_per_core));
- pbt->start = iter == 0 ? 0 : iter + 1;
+ pbt->thread_number = thread_number++;
+ pbt->start = iter == 0 ? 0 : iter;
pbt->end = iter + iter_per_core - 1;
pbt->data = callback_data;
pbt->callback = callback;
diff --git a/hardinfo2/fftbench.c b/hardinfo2/fftbench.c
index 597c5693..d51dbb1d 100644
--- a/hardinfo2/fftbench.c
+++ b/hardinfo2/fftbench.c
@@ -30,6 +30,8 @@
#include <stdbool.h>
#include <stdio.h>
+#include "fftbench.h"
+
// embedded random number generator; ala Park and Miller
static long seed = 1325;
static const long IA = 16807;
@@ -61,13 +63,15 @@ static const int N = 800;
static const int NM1 = 799; // N - 1
static const int NP1 = 801; // N + 1
-static int *lup_decompose(double **a)
+static void lup_decompose(FFTBench *fftbench)
{
int i, j, k, k2, t;
- double p, temp;
+ double p, temp, **a;
int *perm = (int *) malloc(sizeof(double) * N);
-
+
+ a = fftbench->a;
+
for (i = 0; i < N; ++i)
perm[i] = i;
@@ -85,7 +89,7 @@ static int *lup_decompose(double **a)
// check for invalid a
if (p == 0.0)
- return NULL;
+ return;
// exchange rows
t = perm[k];
@@ -106,16 +110,20 @@ static int *lup_decompose(double **a)
}
}
- return perm;
+ fftbench->p = perm;
}
-static double *lup_solve(double **a, int *perm, double *b)
+static double *lup_solve(FFTBench *fftbench)
{
int i, j, j2;
double sum, u;
double *y = (double *) malloc(sizeof(double) * N);
double *x = (double *) malloc(sizeof(double) * N);
+
+ double **a = fftbench->a;
+ double *b = fftbench->b;
+ int *perm = fftbench->p;
for (i = 0; i < N; ++i) {
y[i] = 0.0;
@@ -156,46 +164,49 @@ static double *lup_solve(double **a, int *perm, double *b)
return x;
}
-static double **a, *b, *r;
-static int *p;
-
-void fft_bench_init(void)
+FFTBench *fft_bench_new(void)
{
+ FFTBench *fftbench;
int i, j;
+
+ fftbench = g_new0(FFTBench, 1);
// generate test data
- a = (double **) malloc(sizeof(double *) * N);
+ fftbench->a = (double **) malloc(sizeof(double *) * N);
for (i = 0; i < N; ++i) {
- a[i] = (double *) malloc(sizeof(double) * N);
+ fftbench->a[i] = (double *) malloc(sizeof(double) * N);
for (j = 0; j < N; ++j)
- a[i][j] = random_double();
+ fftbench->a[i][j] = random_double();
}
- b = (double *) malloc(sizeof(double) * N);
+ fftbench->b = (double *) malloc(sizeof(double) * N);
for (i = 0; i < N; ++i)
- b[i] = random_double();
+ fftbench->b[i] = random_double();
+ return fftbench;
}
-void fft_bench_start(void)
+void fft_bench_run(FFTBench *fftbench)
{
- p = lup_decompose(a);
- r = lup_solve(a, p, b);
+ lup_decompose(fftbench);
+ lup_solve(fftbench);
}
-void fft_bench_finish(void)
+void fft_bench_free(FFTBench *fftbench)
{
int i;
// clean up
for (i = 0; i < N; ++i)
- free(a[i]);
+ free(fftbench->a[i]);
- free(a);
- free(b);
- free(p);
- free(r);
+ free(fftbench->a);
+ free(fftbench->b);
+ free(fftbench->p);
+ free(fftbench->r);
+
+ g_free(fftbench);
}
diff --git a/hardinfo2/fftbench.h b/hardinfo2/fftbench.h
index 3598baf1..7c0afc3d 100644
--- a/hardinfo2/fftbench.h
+++ b/hardinfo2/fftbench.h
@@ -1,9 +1,18 @@
#ifndef __FFTBENCH_H__
#define __FFTBENCH_H__
-void fft_bench_init(void);
-void fft_bench_start(void);
-void fft_bench_finish(void);
+#include <glib.h>
+
+typedef struct _FFTBench FFTBench;
+
+struct _FFTBench {
+ double **a, *b, *r;
+ int *p;
+};
+
+FFTBench *fft_bench_new(void);
+void fft_bench_run(FFTBench *fftbench);
+void fft_bench_free(FFTBench *fftbench);
#endif /* __FFTBENCH_H__ */