diff --git a/benchmark/make.sh b/benchmark/make.sh index 8c2a7e23389d7d9240079cbffec6e52c45d73648..003868a7f5cf8eb088c494e0e65a4886861b7cdf 100755 --- a/benchmark/make.sh +++ b/benchmark/make.sh @@ -660,20 +660,34 @@ plot_reach () { # The get benchmark. -run_rbget () { +run_rbget1 () { benchmark=rbget make src/$benchmark run_prologue prun -prog $prog \ -n 10$K,20$K,40$K,80$K,160$K,320$K,640$K,2$M,8$M \ -k 100$K \ - -seq NumeriChunk,StackVectorNoFunctor \ + -seq Array,StackVectorNoFunctor,ESek_get,PSek_get,PSek_reach,FmlibRbtrees,NumeriChunk,PdarrayNarytree5,PdarrayNarytree8 \ -runs 3 \ -distance -1 \ -output $result run_postlogue } -# ESek_get,Array + +run_rbget () { + benchmark=rbget + make src/$benchmark + run_prologue + prun -prog $prog \ + -n 10$K,20$K,40$K,80$K,160$K,320$K,640$K,2$M,8$M \ + -k 100$K \ + -seq FmlibRbtrees,NumeriChunk,PdarrayNarytree8 \ + -runs 1 \ + -distance -1 \ + -output $result + run_postlogue +} +# ,Array # ,FmlibRbtrees,PSek_get # -runs 3 \ diff --git a/benchmark/src/darray.ml b/benchmark/src/darray.ml index c412249e5ef437238f647003b32299b0d0593972..caa4618a98840352ddfd3dfcf24a031f02112e49 100644 --- a/benchmark/src/darray.ml +++ b/benchmark/src/darray.ml @@ -231,7 +231,7 @@ let to_array_with_transfer (t : 'a t) : 'a array = else get_fresh_array t -(*------------------------------------------*) +(*------------------------------------------ let measure_time (f : unit -> 'a) : 'a * int = let t0 = Unix.gettimeofday () in @@ -261,7 +261,7 @@ let _testperf = r := set !r (i mod nb) i; done; ) - +*) (*------------------------------------------*) (* diff --git a/benchmark/src/pdarray_narytree.ml b/benchmark/src/pdarray_narytree.ml index 64cd7f64c6e3d54ae1c605df2ec228816aee486f..6bfdab830ac6d5b9f2c44077dbb1a19f8a9a82ba 100644 --- a/benchmark/src/pdarray_narytree.ml +++ b/benchmark/src/pdarray_narytree.ml @@ -38,6 +38,90 @@ let length (s : 'a t) : int = let get (s : 'a t) (i : int) : 'a = (* assert (0 <= i && i < length s) *) let b, d = params s in + (* optimizations *) + if d = 0 then begin + Darray.get s (2 + i) + end else if d = 1 then begin + + let i1 = i in + let s1 = s in + + let w1 = b in + let id1 = i1 lsr w1 in + let i0 = i1 - id1 * (1 lsl w1) in + let s0 = Darray.get (cast s1) (2 + id1) in + + Darray.get s0 i0 + + end else if d = 2 then begin + + let i2 = i in + let s2 = s in + + let w2 = 2*b in + let id2 = i2 lsr w2 in + let i1 = i2 - id2 * (1 lsl w2) in + let s1 = Darray.get (cast s2) (2 + id2) in + + let w1 = b in + let id1 = i1 lsr w1 in + let i0 = i1 - id1 * (1 lsl w1) in + let s0 = Darray.get (cast s1) id1 in + + Darray.get s0 i0 + + end else if d = 3 then begin + + let i3 = i in + let s3 = s in + + let w3 = 3*b in + let id3 = i3 lsr w3 in + let i2 = i3 - id3 * (1 lsl w3) in + let s2 = Darray.get (cast s3) (2 + id3) in + + let w2 = 2*b in + let id2 = i2 lsr w2 in + let i1 = i2 - id2 * (1 lsl w2) in + let s1 = Darray.get (cast s2) id2 in + + let w1 = b in + let id1 = i1 lsr w1 in + let i0 = i1 - id1 * (1 lsl w1) in + let s0 = Darray.get (cast s1) id1 in + + Darray.get s0 i0 + + end else if d = 4 then begin + + let i4 = i in + let s4 = s in + + let w4 = 4*b in + let id4 = i4 lsr w4 in + let i3 = i4 - id4 * (1 lsl w4) in + let s3 = Darray.get (cast s4) (2 + id4) in + + let w3 = 3*b in + let id3 = i3 lsr w3 in + let i2 = i3 - id3 * (1 lsl w3) in + let s2 = Darray.get (cast s3) id3 in + + let w2 = 2*b in + let id2 = i2 lsr w2 in + let i1 = i2 - id2 * (1 lsl w2) in + let s1 = Darray.get (cast s2) id2 in + + let w1 = b in + let id1 = i1 lsr w1 in + let i0 = i1 - id1 * (1 lsl w1) in + let s0 = Darray.get (cast s1) id1 in + + Darray.get s0 i0 + + + end else + (* general case *) let rec aux : 'a. ?offset:int -> int -> 'a t -> int -> 'a = fun (type a) ?(offset:int=0) (d:int) (s:a t) (i:int) : a -> (* Printf.printf "aux offset=%d depth=%d i=%d\n" offset d i; *) @@ -51,6 +135,7 @@ let get (s : 'a t) (i : int) : 'a = end in aux ~offset:2 d s i + (** [set s i v] updates the element at index [i] with [v]. Requires [0 <= i < length t]. *) let set (s : 'a t) (i : int) (v : 'a) : 'a t = diff --git a/benchmark/src/reach/Main.ml b/benchmark/src/reach/Main.ml index a723a4418a908b32dad4f71ea003c25986887990..88a99758208bd9498a55afb7d779e7bb45043a44 100644 --- a/benchmark/src/reach/Main.ml +++ b/benchmark/src/reach/Main.ml @@ -140,7 +140,7 @@ let benchmark = sum := !sum + x done; sink !sum - end else if seq = "ParrayNarytree" then begin + end else if seq = "ParrayNarytree5" then begin let s = Parray_narytree.init n (fun i -> i) in fun () -> (* This is the timed section. *) @@ -152,8 +152,20 @@ let benchmark = sum := !sum + x done; sink !sum - end else if seq = "PdarrayNarytree" then begin - let s = Pdarray_narytree.init n (fun i -> i) in + end else if seq = "PdarrayNarytree5" then begin + let s = Pdarray_narytree.init ~base:5 n (fun i -> i) in + fun () -> + (* This is the timed section. *) + (* Calls to [get i] for each target index. *) + let sum = ref 0 in + for index = 0 to k - 1 do + let j = a.(index) in + let x = Pdarray_narytree.get s j in + sum := !sum + x + done; + sink !sum + end else if seq = "PdarrayNarytree8" then begin + let s = Pdarray_narytree.init ~base:8 n (fun i -> i) in fun () -> (* This is the timed section. *) (* Calls to [get i] for each target index. *)