diff options
| author | Leandro A. F. Pereira <leandro@hardinfo.org> | 2010-05-03 09:27:26 -0300 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2010-05-03 21:08:06 -0300 | 
| commit | 9273c075a2f993c5154614b70233d8f74515c851 (patch) | |
| tree | eb72a8c58e6bc8f4ca3b739d28fbecc269c0052d /hardinfo2/modules/benchmark/fftbench.c | |
| parent | 9a50155ec3e27aa6cedf3f118196f1947c769a29 (diff) | |
Move files from hardinfo2 to root.
Diffstat (limited to 'hardinfo2/modules/benchmark/fftbench.c')
| -rw-r--r-- | hardinfo2/modules/benchmark/fftbench.c | 211 | 
1 files changed, 0 insertions, 211 deletions
diff --git a/hardinfo2/modules/benchmark/fftbench.c b/hardinfo2/modules/benchmark/fftbench.c deleted file mode 100644 index dc25dfd6..00000000 --- a/hardinfo2/modules/benchmark/fftbench.c +++ /dev/null @@ -1,211 +0,0 @@ -/* -    fftbench.c - -    Written by Scott Robert Ladd (scott@coyotegulch.com) -    No rights reserved. This is public domain software, for use by anyone. - -    A number-crunching benchmark using LUP-decomposition to solve a large -    linear equation. - -    The code herein is design for the purpose of testing computational -    performance; error handling is minimal. -     -    In fact, this is a weak implementation of the FFT; unfortunately, all -    of my really nifty FFTs are in commercial code, and I haven't had time -    to write a new FFT routine for this benchmark. I may add a Hartley -    transform to the seat, too. - -    Actual benchmark results can be found at: -            http://www.coyotegulch.com - -    Please do not use this information or algorithm in any way that might -    upset the balance of the universe or otherwise cause a disturbance in -    the space-time continuum. -*/ - -#include <time.h> -#include <string.h> -#include <stdlib.h> -#include <math.h> -#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; -static const long IM = 2147483647; -static const double AM = 4.65661287525E-10; -static const long IQ = 127773; -static const long IR = 2836; -static const long MASK = 123459876; - -static double random_double() -{ -    long k; -    double result; - -    seed ^= MASK; -    k = seed / IQ; -    seed = IA * (seed - k * IQ) - IR * k; - -    if (seed < 0) -	seed += IM; - -    result = AM * seed; -    seed ^= MASK; - -    return result; -} - -static const int N = 800; -static const int NM1 = 799;	// N - 1 -static const int NP1 = 801;	// N + 1 - -static void lup_decompose(FFTBench *fftbench) -{ -    int i, j, k, k2, t; -    double p, temp, **a; - -    int *perm = (int *) malloc(sizeof(double) * N); -     -    fftbench->p = perm; -    a = fftbench->a; -     -    for (i = 0; i < N; ++i) -	perm[i] = i; - -    for (k = 0; k < NM1; ++k) { -	p = 0.0; - -	for (i = k; i < N; ++i) { -	    temp = fabs(a[i][k]); - -	    if (temp > p) { -		p = temp; -		k2 = i; -	    } -	} - -	// check for invalid a -	if (p == 0.0) -	    return; - -	// exchange rows -	t = perm[k]; -	perm[k] = perm[k2]; -	perm[k2] = t; - -	for (i = 0; i < N; ++i) { -	    temp = a[k][i]; -	    a[k][i] = a[k2][i]; -	    a[k2][i] = temp; -	} - -	for (i = k + 1; i < N; ++i) { -	    a[i][k] /= a[k][k]; - -	    for (j = k + 1; j < N; ++j) -		a[i][j] -= a[i][k] * a[k][j]; -	} -    } -} - -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; -	x[i] = 0.0; -    } - -    for (i = 0; i < N; ++i) { -	sum = 0.0; -	j2 = 0; - -	for (j = 1; j <= i; ++j) { -	    sum += a[i][j2] * y[j2]; -	    ++j2; -	} - -	y[i] = b[perm[i]] - sum; -    } - -    i = NM1; - -    while (1) { -	sum = 0.0; -	u = a[i][i]; - -	for (j = i + 1; j < N; ++j) -	    sum += a[i][j] * x[j]; - -	x[i] = (y[i] - sum) / u; - -	if (i == 0) -	    break; - -	--i; -    } - -    free(y); - -    return x; -} - -FFTBench *fft_bench_new(void) -{ -    FFTBench *fftbench; -    int i, j; -     -    fftbench = g_new0(FFTBench, 1); - -    // generate test data             -    fftbench->a = (double **) malloc(sizeof(double *) * N); - -    for (i = 0; i < N; ++i) { -	fftbench->a[i] = (double *) malloc(sizeof(double) * N); - -	for (j = 0; j < N; ++j) -	    fftbench->a[i][j] = random_double(); -    } - -    fftbench->b = (double *) malloc(sizeof(double) * N); - -    for (i = 0; i < N; ++i) -	fftbench->b[i] = random_double(); - -    return fftbench; -} - -void fft_bench_run(FFTBench *fftbench) -{ -    lup_decompose(fftbench); -    lup_solve(fftbench); -} - -void fft_bench_free(FFTBench *fftbench) -{ -    int i; -     -    // clean up -    for (i = 0; i < N; ++i) -	free(fftbench->a[i]); - -    free(fftbench->a); -    free(fftbench->b); -    free(fftbench->p); -    free(fftbench->r); -     -    g_free(fftbench); -}  | 
