(bind-func main
(lambda ()
;; Initialize the MPI environment. The two arguments to MPI Init are not
;; currently used by MPI implementations, but are there in case future
;; implementations might need the arguments.
(MPI_Init null null)
;; Get the number of processes
(letz ((world_size_ptr:i32* (zalloc))
(world_rank_ptr:i32* (zalloc))
(number:i32* (zalloc)))
(MPI_Comm_size MPI_COMM_WORLD world_size_ptr)
(MPI_Comm_rank MPI_COMM_WORLD world_rank_ptr)
(if (< (pref world_size_ptr 0) 2)
(begin
(println "World size must be greater than 1")
(MPI_Abort MPI_COMM_WORLD 1)))
(if (= (pref world_rank_ptr 0) 0)
;; If we are rank 0, set the number to -1 and send it to process 1
(begin
(pset! number 0 -1)
(MPI_Send (convert number) 1 MPI_INT 1 0 MPI_COMM_WORLD))
(if (= (pref world_rank_ptr 0) 1)
(begin
(MPI_Recv (convert number) 1 MPI_INT 0 0 MPI_COMM_WORLD MPI_STATUS_IGNORE)
(printf "Process 1 received number %d from process 0\n" (pref number 0)))))
;; Finalize the MPI environment. No more MPI calls can be made after this
(MPI_Finalize))))