open Printf open Mpi (* comm_size, comm_rank *) let size = comm_size comm_world let myrank = comm_rank comm_world let _ = printf "%d: comm_size = %d" myrank size; print_newline() let _ = printf "b\n" let output_int o i = output_string o (string_of_int i) let output_float o f = output_string o (string_of_float f) let output_array fn o a = output_string o "[ "; for i = 0 to Array.length a - 1 do fn o a.(i); output_char o ' ' done; output_string o "]" let output_int_array = output_array output_int let output_float_array = output_array output_float let _ = printf "a\n" let _ = let a = scatter [|1 ; 2 ; 3|] myrank comm_world in printf "rank:%d [|%d|]\n" myrank a let _ = barrier comm_world let _ = let a = scatter_int [|4 ; 5 ; 6|] myrank comm_world in printf "rank:%d [|%d|]\n" myrank a let _ = let a = scatter_float [|1.2 ; 2.4 ; 3.4|] myrank comm_world in printf "rank:%d [|%f]\n" myrank a let _ = let a = Array.make 2 0 in let b = scatter_int_array [|1;2;3;4;5;6|] a myrank comm_world in printf "rank:%d [|%d;%d|]\n" myrank a.(0) a.(1) let _ = let a = Array.make 2 0.0 in let b = scatter_float_array [|1.0;2.0;3.0;4.0;5.0;6.0|] a myrank comm_world in printf "rank:%d [|%f;%f]\n" myrank a.(0) a.(1) (* Barrier *) let _ = barrier comm_world (* (* Scatter *) let test_scatter scatterfun printfun1 printfun2 data = if myrank = 0 then begin printf "0: scattering %a" printfun1 data; print_newline() end; printf "my rand is %d\n" myrank; let res = scatterfun data 0 comm_world in printf "%d: received %a" myrank printfun2 res; print_newline(); barrier comm_world let _ = printf "prescatte:my rank is %d\n" myrank let _ = printf "my rank is %d\n" myrank; test_scatter scatter (output_array output_string) output_string [| "Six"; "scies"; "scient"; "six"; "cigares" |]; test_scatter scatter_int output_int_array output_int [| 12; 34; 56; 78; 90 |]; test_scatter scatter_float output_float_array output_float [| 1.2; 3.4; 5.6; 7.8; 9.1 |]; let ia = Array.make 3 0 in let fa = Array.make 3 0.0 in test_scatter (fun d r c -> scatter_int_array d ia r c; ia) output_int_array output_int_array [| 10;11;12; 20;21;22; 30;31;32; 40;41;42; 50;51;52 |]; test_scatter (fun d r c -> scatter_float_array d fa r c; fa) output_float_array output_float_array [| 1.0;1.1;1.2; 2.0;2.1;2.2; 3.0;3.1;3.2; 4.0;4.1;4.2; 5.0;5.1;5.2 |] *)