open Printf open Mpi (* comm_size, comm_rank *) let size = comm_size comm_world let myrank = comm_rank comm_world let print_array array = printf "myrank is %d:\n" myrank; for i=1 to (Array.length array) do print_int array.(i-1);print_string ";" done; print_newline () let print_farray array = printf "myrank is %d:\n" myrank; for i=1 to (Array.length array) do print_float array.(i-1);print_string ";" done; print_newline () type record_example = { re:int; im:int } (* record *) type variant_example1 = Positive | Negative (* simple variant *) type variant_example2 = Data1 of int * int * int | Data2 of float * float * float (* variant with value *) let fun1 arg = arg+1 class point(x_init,y_init) = object val mutable x = x_init; val mutable y = y_init; method get_x = x; method get_y = y; method incr_x = x <- x+1; method incr_y = y <- y+1; end exception Exception let _ = if myrank=0 then send 1 1 0 comm_world; if myrank=1 then begin print_int (receive 0 0 comm_world);print_newline() end; if myrank=0 then send 1.3 1 0 comm_world; if myrank=1 then begin print_float (receive 0 0 comm_world);print_newline() end; if myrank=0 then send {re=1;im=2} 1 0 comm_world; if myrank=1 then begin let a = receive 0 0 comm_world in printf "re:%d , im:%d\n" a.re a.im end; if myrank=0 then send Positive 1 0 comm_world; if myrank=1 then if (receive 0 0 comm_world)=Positive then print_endline "True"; if myrank=0 then send (Data1(3,2,1)) 1 0 comm_world; if myrank=1 then begin let a = receive 0 0 comm_world in match a with Data1(x,y,z) -> printf "Data1:%d,%d,%d\n" x y z | Data2(x,y,z) -> printf "Data2:%f,%f,%f\n" x y z end; if myrank=0 then send fun1 1 0 comm_world; if myrank=1 then begin let a = receive 0 0 comm_world in print_int (a 1);print_newline(); end; if myrank=0 then send (new point (2,4)) 1 0 comm_world; if myrank=1 then begin let a = receive 0 0 comm_world in printf "object x:%d,y:%d\n" a#get_x a#get_y; a#incr_x; a#incr_x; a#incr_y; printf "object x:%d,y:%d\n" a#get_x a#get_y; end; if myrank=0 then print_newline(); if myrank=0 then send_int 1 1 0 comm_world; if myrank=1 then begin print_int (receive_int 0 0 comm_world);print_newline() end; if myrank=0 then send_float 1.2 1 0 comm_world; if myrank=1 then begin print_float (receive_float 0 0 comm_world);print_newline() end; if myrank=0 then send_int_array [|1;2;2;4|] 1 0 comm_world; if myrank=1 then begin let a = Array.make 4 0 in receive_int_array a 0 0 comm_world; print_array a end; if myrank=0 then send_float_array [|1.3;3.4;5.6|] 1 0 comm_world; if myrank=1 then begin let a = Array.make 3 0.0 in receive_float_array a 0 0 comm_world; print_farray a end; if myrank=0 then print_newline(); if myrank=0 then send 1 1 0 comm_world; if myrank=1 then begin print_int (receive any_source any_tag comm_world);print_newline() end; printf "rank:%d, time is %f\n" myrank (wtime())