Benchmarks

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

Memory allocation

intervalle.ml

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 !"

Matrix multiplication

matmul.ml

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 ->()
  )
 
benchmarks.txt · Last modified: 2009/05/07 16:09 by mathias