spectral-norm OCaml #2 program
source code
(* The Computer Language Benchmarks Game
* https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
*
* Contributed by Sebastien Loisel
* Cleanup by Troestler Christophe
* Modified by Mauricio Fernandez
*)
let eval_A i j = 1. /. float((i+j)*(i+j+1)/2+i+1)
let eval_A_times_u u v =
let n = Array.length v - 1 in
for i = 0 to n do
let vi = ref 0. in
for j = 0 to n do vi := !vi +. eval_A i j *. u.(j) done;
v.(i) <- !vi
done
let eval_At_times_u u v =
let n = Array.length v -1 in
for i = 0 to n do
let vi = ref 0. in
for j = 0 to n do vi := !vi +. eval_A j i *. u.(j) done;
v.(i) <- !vi
done
let eval_AtA_times_u u v =
let w = Array.make (Array.length u) 0.0 in
eval_A_times_u u w; eval_At_times_u w v
let () =
let n = try int_of_string(Array.get Sys.argv 1) with _ -> 2000 in
let u = Array.make n 1.0 and v = Array.make n 0.0 in
for i = 0 to 9 do
eval_AtA_times_u u v; eval_AtA_times_u v u
done;
let vv = ref 0.0 and vBv = ref 0.0 in
for i=0 to n-1 do
vv := !vv +. v.(i) *. v.(i);
vBv := !vBv +. u.(i) *. v.(i)
done;
Printf.printf "%0.9f\n" (sqrt(!vBv /. !vv))
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
The OCaml native-code compiler, version 4.10.0
Tue, 05 May 2020 23:21:53 GMT
MAKE:
mv spectralnorm.ocaml-2.ocaml spectralnorm.ocaml-2.ml
/opt/src/ocaml-4.10.0/bin/ocamlopt -noassert -unsafe -fPIC -nodynlink -inline 100 -O3 unix.cmxa bigarray.cmxa -ccopt -march=core2 spectralnorm.ocaml-2.ml -o spectralnorm.ocaml-2.ocaml_run
rm spectralnorm.ocaml-2.ml
2.80s to complete and log all make actions
COMMAND LINE:
./spectralnorm.ocaml-2.ocaml_run 5500
PROGRAM OUTPUT:
1.274224153