diff options
Diffstat (limited to 'hardinfo2')
| -rw-r--r-- | hardinfo2/arch/common/blowfish.h | 2 | ||||
| -rw-r--r-- | hardinfo2/arch/common/cryptohash.h | 4 | ||||
| -rw-r--r-- | hardinfo2/arch/common/fft.h | 32 | ||||
| -rw-r--r-- | hardinfo2/arch/common/nqueens.h | 2 | ||||
| -rw-r--r-- | hardinfo2/arch/common/raytrace.h | 2 | ||||
| -rw-r--r-- | hardinfo2/benchmark.c | 10 | ||||
| -rw-r--r-- | hardinfo2/fftbench.c | 59 | ||||
| -rw-r--r-- | 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 <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__ */  | 
