As a learning exercise in parallel computing, I would like to parallel compute
the classic definition of the Fibonacci sequence. I realize there are many fast
ways to compute the Fibonacci sequence, but I would like to use the classical
definition as an exercise.
If I try
import threadpool
{.experimental: "parallel".}
proc fib(n:int) : int =
if n < 2: n
else: fib(n-1) + fib(n-2)
proc fib2(n:int) : int =
var n1,n2: int
if n > 20:
parallel:
n1 = spawn fib(n-1)
n2 = spawn fib(n-2)
n1 + n2
else:
fib(n)
proc main() =
echo "fib(47) = ", fib2(47)
main()
Run
then I run 2 threads and reduce the elapsed time about half. If I try more
threads:
n1 = spawn fib2(n-1)
n2 = spawn fib2(n-2)
Run
then I get incorrect answers or endless loops.
OCaml 5.0.0 user manual: "Domainslib provides an async/await mechanism for
spawning parallel tasks and awaiting their results". In the OCaml user manual
there is a Fibonacci parallel example that on my 6 core system provides a speed
up of 7 times using 12 threads.
Is there some similar in nim 1.6 or 2.0 RC 1?