88 lines
2.2 KiB
Text
Executable file
88 lines
2.2 KiB
Text
Executable file
#!/usr/bin/newlisp
|
|
|
|
; note that run fibonacci with Cilk is not a good idea
|
|
; in the real world, but it tests well the integrity
|
|
; of the interface when applying Cilk calls recursively
|
|
; because each call to (fibo x) branches into two other
|
|
; calls and each caller maintains it's own list
|
|
; of spawned processes, which it has to finish with sync
|
|
|
|
; n fibo(n) processes
|
|
; 4 5 9
|
|
; 5 8 15
|
|
; 6 13 25
|
|
; 7 21 41
|
|
; 8 34 67
|
|
; 9 55 109
|
|
;10 89 177
|
|
|
|
|
|
(when (find ostype '("Windows"))
|
|
(exit))
|
|
|
|
(println)
|
|
(println "Testing Cilk API")
|
|
|
|
(define (fibo n)
|
|
(local (f1 f2)
|
|
(if(< n 2) 1
|
|
(begin
|
|
(spawn 'f1 (fibo (- n 1)))
|
|
(spawn 'f2 (fibo (- n 2)))
|
|
(println "wait/sync up to 20 secs")
|
|
(sync 20000)
|
|
(+ f1 f2)))))
|
|
|
|
(if (not fork) ; does not have fork
|
|
(if (= (fibo 7) 21)
|
|
(println ">>>>> CILK API TESTED SUCCESSFUL ---")
|
|
(println ">>>>> PROBLEM with Cilk API")
|
|
))
|
|
|
|
(if (not fork) (exit))
|
|
|
|
; spawn 10 processes than abort them all one by one
|
|
(time (spawn 'x (sleep 100)) 10)
|
|
|
|
(set 'result0 (map abort (sync)))
|
|
|
|
; create 10 processes then abort all at once
|
|
(time (spawn 'x (sleep 100)) 10)
|
|
(println "(abort) -> " (set 'result1 (abort)))
|
|
(println "(sync) -> " (set 'result2 (sync)))
|
|
|
|
; create 10 processes then wait for them to finish
|
|
(time (spawn 'x (sleep 100)) 10)
|
|
(println "(sync) -> " (sync))
|
|
(println "N of processes -> " (set 'result3 (length (sync))))
|
|
(println "waiting to sync -> " (set 'result4 (sync 5000)))
|
|
|
|
(println "fibo(5) -> (needs 15 processes) => " (set 'result5 (fibo 5)))
|
|
|
|
; check inlet function
|
|
(define (inlet pid)
|
|
(println "inlet pid: " pid " " (lookup pid plist) ":" (eval (lookup pid plist)))
|
|
(push (list (lookup pid plist) (eval (lookup pid plist))) result6 -1)
|
|
)
|
|
|
|
(push (list (spawn 'p1 (sleep 400)) 'p1) plist)
|
|
(push (list (spawn 'p2 (sleep 500)) 'p2) plist)
|
|
|
|
(println (sync 5000 inlet))
|
|
(println)
|
|
|
|
(if (and
|
|
(apply and result0)
|
|
(= 10 (length result0))
|
|
(true? result1)
|
|
(empty? result2)
|
|
(= 10 result3)
|
|
(true? result4)
|
|
(= result5 8)
|
|
(= result6 '((p1 400) (p2 500))))
|
|
(println ">>>>> The Cilk API tested SUCCESSFUL")
|
|
(println ">>>>> PROBLEM with Cilk API")
|
|
)
|
|
(println)
|
|
(exit)
|
|
|