From f456e935f74f23ae76de31d5fb84906090c8e1aa Mon Sep 17 00:00:00 2001 From: Leandro Augusto Fogolin Pereira Date: Sat, 11 Apr 2009 18:54:47 -0300 Subject: Fit crash with FFT benchmark. --- hardinfo2/arch/common/blowfish.h | 2 +- hardinfo2/arch/common/cryptohash.h | 4 +-- hardinfo2/arch/common/fft.h | 32 ++++++++++++++++----- hardinfo2/arch/common/nqueens.h | 2 +- hardinfo2/arch/common/raytrace.h | 2 +- hardinfo2/benchmark.c | 10 ++++--- hardinfo2/fftbench.c | 59 ++++++++++++++++++++++---------------- hardinfo2/fftbench.h | 15 ++++++++-- 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 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 -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 -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 #include +#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 + +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__ */ -- cgit v1.2.3