Sequentiel sur Core I7: Chaque bench est lancé 1000 fois (boucle for dans le code ocaml)
Bench | OCaml | oc4mc |
---|---|---|
fft | 25.94 | 31.11 |
Kb | 22.26 | 42.65 |
Nucleic | 13.78 | 21.77 |
Sieve | 5.39 | 6.27 |
i7 (4 Cores)
Bench | OCaml | Oc4mc | Coef | F# | F# para | Coeff F# | C | C-OMP | Coeff C |
---|---|---|---|---|---|---|---|---|---|
Matmul 1000 | 13.29 | 3.26 | 4.07 | 9.28 | 2.411 | 3.85 | 9.20 | 2.27 | 4.05 |
Matmul 2000 | 133.03 | 36.39 | 3.62 | 87.28 | 24.9 | 3.62 | 82.59 | 19.80 | 4.17 |
Total | 146.32 | 39.65 | 3.69 | 96.56 | 28.661 | 3.37 |
Octo (7 Cores)
Bench | OCaml | Oc4mc | Coef | F# | F# para | Coeff F# | C | C-OMP | Coeff C |
---|---|---|---|---|---|---|---|---|---|
Matmul 1000 | 14.05 | 1.98 | 7.10 | 18.56 | 3.18 | 5.83 | 7.42 | 1.18 | |
Matmul 2000 | 122.21 | 20.47 | 5.97 | 141.34 | 26.25 | 5.38 | 65.63 | 10.89 | |
Total | 136.26 | 22.45 | 6.07 | 159.9 | 29.43 | 5.43 |
let rec intervalle r a b = if a > b then r else intervalle2 (a::r) (a+1) b and intervalle2 r a b = if a > b then [] else intervalle (a::r) (a+1) b let intervalle a b = intervalle [] a b let _ = print_endline "Create 2 threads"; let t = Thread.create (fun () -> for i = 0 to 10_000 do Printf.printf "<T1 %d>" i; flush stdout; intervalle 0 (10_000 + (i*i) mod 10_000) done; print_endline "END OF T1" ) () in List.iter Thread.join [ t; Thread.create (fun () -> for i = 0 to 10_000 do Printf.printf "<T2 %d>" i; flush stdout; intervalle 0 (10_000 + (i*i) mod 10_000) done; print_endline "END OF T2" ) () ]; print_endline "intervalle 0 1000 : start"; for i = 0 to 100_000 do ignore(intervalle 0 1000); done; print_endline "intervalle 0 1000 : end"; print_endline "Exit !"
open Unix let mkmatrix rows cols = let count = ref 1.0 and last_col = cols - 1 and m = Array.make_matrix rows cols 42. in m let t1 = ref (Unix.times ()) let t2 = ref (Unix.times ()) let m = ref (Mutex.create () ) let size = ref 0 let process_line n m1 m2 m3= for x = 0 to !size-1 do for y = 0 to !size-1 do m3.(n|>).(x|>) <- m3.(n|>).(x|>) +. m1.(n|>).(y|>) *. m2.(y|>).(x|>) done; done let rec worker m1 m2 m3 max= let th = (Thread.id (Thread.self())) in let n_min = (th-1) *(Array.length m1/max) and n_max = (th) *(Array.length m1/max) in begin for n=n_min to n_max-1 do (process_line n m1 m2 m3); done end let _ = size := int_of_string Sys.argv.(|>1) ; let m1 = mkmatrix !size !size and m2 = mkmatrix !size !size and m3 = Array.make_matrix !size !size 0. in ( t1 := Unix.times (); let ta = Unix.gettimeofday () in ( let threads = Array.init (int_of_string Sys.argv.(|>2)) (fun _ -> (Thread.create (worker m1 m2 m3) (int_of_string Sys.argv.(|>2))) ) in Array.iter Thread.join threads; t2 := Unix.times (); let tb = Unix.gettimeofday () in Printf.printf "Temp de calcul: utime %f, stime %f, rtime %f\n" (!t2.tms_utime -. !t1.tms_utime) (!t2.tms_stime-. !t1.tms_stime) (tb -. ta); ); try ( if Sys.argv.(|>3) = "p" then ( for i =0 to !size-1 do for j = 0 to !size-1 do Printf.printf "%f " m3.(i|>).(j|>) done; Printf.printf "\n" done ); ) with e ->() )