From 7c8d128e1fd6a5ebeae962ff4a656fe18461ebbd Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 8 Feb 2012 01:05:53 -0800 Subject: bench: Add shootout-spectralnorm --- src/test/bench/shootout-spectralnorm.rs | 70 +++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/test/bench/shootout-spectralnorm.rs (limited to 'src') diff --git a/src/test/bench/shootout-spectralnorm.rs b/src/test/bench/shootout-spectralnorm.rs new file mode 100644 index 00000000000..44f550968e1 --- /dev/null +++ b/src/test/bench/shootout-spectralnorm.rs @@ -0,0 +1,70 @@ +// Based on spectalnorm.gcc by Sebastien Loisel + +use std; + +fn eval_A(i: uint, j: uint) -> float { + 1.0/(((i+j)*(i+j+1u)/2u+i+1u) as float) +} + +fn eval_A_times_u(u: [const float], Au: [mutable float]) { + let N = vec::len(u); + let i = 0u; + while i < N { + Au[i] = 0.0; + let j = 0u; + while j < N { + Au[i] += eval_A(i, j) * u[j]; + j += 1u; + } + i += 1u; + } +} + +fn eval_At_times_u(u: [const float], Au: [mutable float]) { + let N = vec::len(u); + let i = 0u; + while i < N { + Au[i] = 0.0; + let j = 0u; + while j < N { + Au[i] += eval_A(j, i) * u[j]; + j += 1u; + } + i += 1u; + } +} + +fn eval_AtA_times_u(u: [const float], AtAu: [mutable float]) { + let v = vec::init_elt_mut(vec::len(u), 0.0); + eval_A_times_u(u, v); + eval_At_times_u(v, AtAu); +} + +fn main(args: [str]) { + + let N = if vec::len(args) == 2u { + uint::from_str(args[1]) + } else { + 1000u + }; + + let u = vec::init_elt_mut(N, 1.0); + let v = vec::init_elt_mut(N, 0.0); + let i = 0u; + while i < 10u { + eval_AtA_times_u(u, v); + eval_AtA_times_u(v, u); + i += 1u; + } + + let vBv = 0.0; + let vv = 0.0; + let i = 0u; + while i < N { + vBv += u[i] * v[i]; + vv += v[i] * v[i]; + i += 1u; + } + + std::io::println(#fmt("%0.9f\n", float::sqrt(vBv / vv))); +} -- cgit 1.4.1-3-g733a5