diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-02-08 01:05:53 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-02-08 01:06:16 -0800 |
| commit | 7c8d128e1fd6a5ebeae962ff4a656fe18461ebbd (patch) | |
| tree | b582aad4149b0ad80535ed7294c4409b89be65bb /src | |
| parent | 708f7b927c0c98d60bf1c8c55eefd09c9da56239 (diff) | |
| download | rust-7c8d128e1fd6a5ebeae962ff4a656fe18461ebbd.tar.gz rust-7c8d128e1fd6a5ebeae962ff4a656fe18461ebbd.zip | |
bench: Add shootout-spectralnorm
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/bench/shootout-spectralnorm.rs | 70 |
1 files changed, 70 insertions, 0 deletions
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))); +} |
