File: run.ml

package info (click to toggle)
ocaml 5.3.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 43,124 kB
  • sloc: ml: 355,439; ansic: 51,636; sh: 25,098; asm: 5,413; makefile: 3,673; python: 919; javascript: 273; awk: 253; perl: 59; fortran: 21; cs: 9
file content (75 lines) | stat: -rw-r--r-- 1,810 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
(****************)
(* Run one test *)
(****************)

module type Test = sig

  module Key : Hist.Key

  module Env : Shared.S

  type out0
  val code0 : Env.in_t -> out0

  type out1
  val code1 : Env.in_t -> out1

  val out2key : Env.in_t -> out0 -> out1 -> Key.t
end


module Make(C:Opt.Config)(T:Test) =
  struct

    module Hist = Hist.Make(C)(T.Key)

    module Instance(_:sig end) = struct (* Applicative .. *)

      let env = T.Env.make C.size
      and barrier = Barrier.make C.size

      let mkf id code () =
        Array.init C.size
          (fun i ->
            Barrier.wait barrier id i ;
            code (T.Env.env2in env i))

      let f0 = mkf 0 T.code0
      and f1 = mkf 1 T.code1

      let zyva () =

        let rec run_rec hist j =
          if j >= C.nruns then hist
          else begin
            (* Initialise memory and barrier *)
            T.Env.reinit env ;
            Barrier.reinit barrier ;
            (* Perform on test round *)
            let d0 = Domain.spawn f0 in
            let d1 = Domain.spawn f1 in
            let t0 = Domain.join d0 in
            let t1 = Domain.join d1 in
            (* Collect outcome *)
            let rec hist_rec hist i =
              if i >= C.size then hist
              else
                let k = T.out2key (T.Env.env2in env i) t0.(i) t1.(i) in
                hist_rec (Hist.see k hist) (i+1) in
            let hist = hist_rec hist 0 in
            run_rec hist (j+1)
          end in
        run_rec Hist.empty 0
    end

    let  ninstances = max 1 (C.navail / 2)

    let zyva () =
      List.init ninstances
        (fun _ ->
          let module I = Instance(struct end) in
          Domain.spawn I.zyva)
      |> List.map Domain.join
      |> List.fold_left Hist.union Hist.empty
      |> Hist.pp stdout
  end