/mobile Handheld Friendly website

 performance measurements

Each table row shows performance measurements for this ATS program with a particular command-line input value N.

 N  CPU secs Elapsed secs Memory KB Code B ≈ CPU Load
5000.180.18?1138  0% 0% 0% 94%
3,0006.166.163481138  0% 1% 100% 0%
5,50020.6820.696081138  0% 0% 100% 0%

Read the ↓ make, command line, and program output logs to see how this program was run.

Read spectral-norm benchmark to see what this program should do.

 notes

ATS/Anairiats version 0.2.8

 spectral-norm ATS program source code

(*
** The Computer Language Benchmarks Game
** http://benchmarksgame.alioth.debian.org/
**
** contributed by Hongwei Xi 
**
** compilation command:
**   atscc -O3 -msse2 spectralnorm.dats -o spectralnorm -lm
**
*)

staload M = "libc/SATS/math.sats"

%{^

static inline
ats_ptr_type
darray_make (ats_int_type n, ats_double_type f) {
  int i;
  ats_double_type *p0, *p ;

  p0 = malloc(n * sizeof(ats_double_type)) ;
  p = p0 ;

  for (i = 0; i < n; ++i) { *p = f; ++p; }
  return p0 ;
}

static inline
ats_void_type
darray_free (ats_ptr_type A) { free (A) ; return ; }

static inline
ats_double_type
darray_get (ats_ptr_type A, ats_int_type i) {
  return ((ats_double_type *)A)[i] ;
}

static inline
ats_void_type
darray_set (ats_ptr_type A, ats_int_type i, ats_double_type f) {
  ((ats_double_type *)A)[i] = f ; return ;
}

static inline
ats_double_type eval_A (ats_int_type i, ats_int_type j) { 
  return 1.0/((i+j)*(i+j+1)/2+i+1);
}

%}

absviewt@ype darray (n:int) // it is linear, so it cannot be leaked.

extern fun darray_make {n:nat}
  (n: int n, d: double): [l:addr] (darray n @ l | ptr l)
  = "darray_make"

extern fun darray_free
  {n:nat} {l:addr} (pf: darray n @ l | p: ptr l): void
  = "darray_free"

extern fun darray_get {n:nat}
  (A: &darray n, i: natLt n): double = "darray_get"

extern fun darray_set {n:nat}
  (A: &darray n, i: natLt n, d: double): void = "darray_set"

overload [] with darray_get
overload [] with darray_set

//

extern fun eval_A (i: int, j: int): double = "eval_A"

fn eval_A_times_u {N:nat}
  (N: int N, u: &darray N, Au: &darray N): void =
  let
     fun loop2 {i,j:nat | i < N; j <= N} .<N-j>.
       (u: &darray N, Au: &darray N, i: int i, j: int j):<cloptr1> void =
       if j < N then begin
         Au[i] := Au[i] + eval_A(i, j) * u[j]; loop2 (u, Au, i, j+1)
       end

     fun loop1 {i:nat | i <= N} .<N-i>.
       (u: &darray N, Au: &darray N, i: int i):<cloptr1> void =
       if i < N then begin
         Au[i] := 0.0; loop2 (u, Au, i, 0); loop1 (u, Au, i+1)
       end
  in
     loop1 (u, Au, 0)
  end

//

fn eval_At_times_u {N:nat}
  (N: int N, u: &darray N, Au: &darray N): void =
  let
     fun loop2 {i,j:nat | i < N; j <= N} .<N-j>.
       (u: &darray N, Au: &darray N, i: int i, j: int j):<cloptr1> void =
       if j < N then begin
         Au[i] := Au[i] + eval_A(j, i) * u[j]; loop2 (u, Au, i, j+1)
       end

     fun loop1 {i:nat | i <= N} .<N-i>.
       (u: &darray N, Au: &darray N, i: int i):<cloptr1> void =
       if i < N then begin
         Au[i] := 0.0; loop2 (u, Au, i, 0); loop1 (u, Au, i+1)
       end
  in
     loop1 (u, Au, 0)
  end

fn eval_AtA_times_u {N:nat}
  (N: int N, u: &darray N, AtAu: &darray N):<cloptr1> void =
  let
     val (pf | p_v) = darray_make (N, 0.0)
  in
     eval_A_times_u(N, u, !p_v);
     eval_At_times_u (N, !p_v, AtAu);
     darray_free (pf | p_v)
  end

//

#define TIMES 10

implement main (argc, argv) = let
  val () = assert_errmsg (argc = 2, "Exit: wrong command format!\n")
  val [N:int] N = int1_of_string argv.[1]
  val () = assert_errmsg (
    N >= 0, "The input integer needs to be a natural number.\n"
  )
  val (pf_u | p_u) = darray_make (N, 1.0)
  val (pf_v | p_v) = darray_make (N, 0.0)
  fun loop1 {i:nat | i <= TIMES} .<TIMES-i>.
    (u: &darray N, v: &darray N, i: int i):<cloptr1> void =
    if (i < TIMES) then begin
      eval_AtA_times_u(N, u, v); eval_AtA_times_u(N, v, u); loop1 (u, v, i+1)
    end
  val () = loop1 (!p_u, !p_v, 0)
  fun loop2 {i:nat| i <= N} .<N-i>.
    (u: &darray N, v: &darray N,
     vBv: double, vv: double, i: int i):<cloptr1> @(double, double) =
    if i < N then
      let val ui = u[i] and vi = v[i] in
        loop2 (u, v, vBv+ui*vi, vv+vi*vi, i+1)
      end
    else (vBv, vv)
  val (vBv, vv) = loop2 (!p_u, !p_v, 0.0, 0.0, 0)
  val () = (darray_free (pf_u | p_u); darray_free (pf_v | p_v))
in
  printf("%0.9f\n", @($M.sqrt (vBv/vv)))
end // end of [main]

(* ****** ****** *)

(* end of [spectral-norm.dats] *)

 make, command-line, and program output logs

Wed, 23 Jan 2013 05:36:35 GMT

MAKE:
/usr/local/src/ats-lang-anairiats-0.2.9/bin/atscc -pthread -D_GNU_SOURCE -D_ATS_MULTITHREAD -pipe -Wall -O3 -fomit-frame-pointer -march=native -mfpmath=sse -msse2 spectralnorm.dats -o spectralnorm.ats_run -lm
/usr/local/src/ats-lang-anairiats-0.2.9/bin/atsopt --output spectralnorm_dats.c --dynamic spectralnorm.dats
In file included from spectralnorm_dats.c:19:0:
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/basics.cats: In function ‘atspre_fprint_newline’:
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/basics.cats:271:11: warning: variable ‘n2’ set but not used [-Wunused-but-set-variable]
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/basics.cats:271:7: warning: variable ‘n1’ set but not used [-Wunused-but-set-variable]
spectralnorm_dats.c: In function ‘eval_A_times_u_0’:
spectralnorm_dats.c:293:1: warning: label ‘__ats_lab_eval_A_times_u_0’ defined but not used [-Wunused-label]
spectralnorm_dats.c: In function ‘eval_At_times_u_3’:
spectralnorm_dats.c:424:1: warning: label ‘__ats_lab_eval_At_times_u_3’ defined but not used [-Wunused-label]
spectralnorm_dats.c: In function ‘eval_AtA_times_u_6’:
spectralnorm_dats.c:442:1: warning: label ‘__ats_lab_eval_AtA_times_u_6’ defined but not used [-Wunused-label]
spectralnorm_dats.c: In function ‘mainats’:
spectralnorm_dats.c:621:1: warning: label ‘__ats_lab_mainats’ defined but not used [-Wunused-label]
In file included from spectralnorm_dats.c:29:0:
spectralnorm_dats.c: At top level:
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/pointer.cats:52:14: warning: ‘atspre_null_ptr’ defined but not used [-Wunused-variable]
In file included from spectralnorm_dats.c:30:0:
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/printf.cats:57:1: warning: ‘atspre_fprintf_err’ defined but not used [-Wunused-function]
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/printf.cats:69:1: warning: ‘atspre_fprintf_exn’ defined but not used [-Wunused-function]
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/printf.cats:105:1: warning: ‘atspre_prerrf_exn’ defined but not used [-Wunused-function]
In file included from spectralnorm_dats.c:33:0:
/usr/local/src/ats-lang-anairiats-0.2.9/prelude/CATS/string.cats:351:14: warning: ‘atspre_stropt_none’ defined but not used [-Wunused-variable]
spectralnorm_dats.c:224:1: warning: ‘loop2_1_closure_make’ defined but not used [-Wunused-function]
spectralnorm_dats.c:278:1: warning: ‘loop1_2_closure_make’ defined but not used [-Wunused-function]
spectralnorm_dats.c:355:1: warning: ‘loop2_4_closure_make’ defined but not used [-Wunused-function]
spectralnorm_dats.c:409:1: warning: ‘loop1_5_closure_make’ defined but not used [-Wunused-function]
spectralnorm_dats.c:468:1: warning: ‘eval_AtA_times_u_6_closure_make’ defined but not used [-Wunused-function]
spectralnorm_dats.c:522:1: warning: ‘loop1_8_closure_make’ defined but not used [-Wunused-function]
spectralnorm_dats.c:588:1: warning: ‘loop2_9_closure_make’ defined but not used [-Wunused-function]
gcc -I/usr/local/src/ats-lang-anairiats-0.2.9/ -I/usr/local/src/ats-lang-anairiats-0.2.9/ccomp/runtime/ -L/usr/local/src/ats-lang-anairiats-0.2.9/ccomp/lib/ /usr/local/src/ats-lang-anairiats-0.2.9/ccomp/runtime/ats_prelude.c -pthread -D_GNU_SOURCE -D_ATS_MULTITHREAD -pipe -Wall -O3 -fomit-frame-pointer -march=native -mfpmath=sse -msse2 spectralnorm_dats.c -o spectralnorm.ats_run -lm -lats_mt -lats 
rm spectralnorm.dats
0.38s to complete and log all make actions

COMMAND LINE:
./spectralnorm.ats_run 5500

PROGRAM OUTPUT:
1.274224153

Revised BSD license

  Home   Conclusions   License   Play