LiKai Liu wrote:
> Is it possible to use the "future" in Alice ML to speed up computation on 
> an SMP or multicore machine? So far my little experiment below does not 
> seem to use the CPU above 100% (as indicated in "top").
>   

No, unfortunately, the SEAM VM underlying the Alice system does not 
currently support multiple native threads. We cannot say if and when 
this will change.

However, you can employ Alice ML's distribution layer to spawn several 
Alice processes and have them communicate via proxies:

  http://www.ps.uni-sb.de/alice/manual/distribution.html

See the worker example at the bottom of that page for the basic setup. 
To (potentially) utilize the 8 cores of your machine, it should suffice 
to simply define hosts as

  val hosts = List.tabulate (8, fn _ => "localhost")

Obviously, this approach does not make much sense in your specific 
example, because starting another Alice VM is much too expensive here 
(in fact, even multi-threading is not useful for such heavy recursion). 
But just to demonstrate the pattern, here is how you could express it 
(caveat: didn't have time to test it):

import structure Remote from "x-alice:/lib/distribution/Remote"
import signature REMOTE from "x-alice:/lib/distribution/REMOTE-sig"

fun fib' myrun n if (n <= 1) = n
  | fib' myrun n =
    let
       fun dist n' =
           comp
               import structure Remote : REMOTE from 
"x-alice:/lib/distribution/Remote"
           in
               val it : int
           with
               val it = fib' Remote.run n'
           end
       structure X = spawn unpack myrun ("localhost", dist (n - 1)) : 
(val it : int)
       structure Y = spawn unpack myrun ("localhost", dist (n - 2)) : 
(val it : int)
    in
       X.it + Y.it
    end

val fib = fib' Remote.run

What this does is the following: in every recursion it dynamically 
creates two components computing the respective fibs (note that the 
component closes over the local argument n'), that are then run in 
different processes on the same host. A complication is that the 
Remote.run function is sited, hence it has to be imported locally in 
every process. Factoring it out as an additional parameter (myrun) makes 
the pattern a bit more elegant.

Hope this helps,
- Andreas


_______________________________________________
alice-users mailing list
alice-users@ps.uni-sb.de
http://www.ps.uni-sb.de/mailman/listinfo/alice-users

Reply via email to