about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-08 01:05:53 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-08 01:06:16 -0800
commit7c8d128e1fd6a5ebeae962ff4a656fe18461ebbd (patch)
treeb582aad4149b0ad80535ed7294c4409b89be65bb /src
parent708f7b927c0c98d60bf1c8c55eefd09c9da56239 (diff)
downloadrust-7c8d128e1fd6a5ebeae962ff4a656fe18461ebbd.tar.gz
rust-7c8d128e1fd6a5ebeae962ff4a656fe18461ebbd.zip
bench: Add shootout-spectralnorm
Diffstat (limited to 'src')
-rw-r--r--src/test/bench/shootout-spectralnorm.rs70
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)));
+}