Go backward to 2.1 A First Example Go up to 2 Examples Go forward to 2.3 Distributed Factorization (Divide and Conquer) |
The following program demonstrates how to compute the factorizations of a list of integers using the features of Distributed Maple. We may use this program in the context of a session as follows:
deneb!1> maple |\^/| Maple V Release 4 (Johannes Kepler University Linz) ._|\| |/|_. Copyright (c) 1981-1996 by Waterloo Maple Inc. All rights \ MAPLE / reserved. Maple and Maple V are registered trademarks of <____ ____> Waterloo Maple Inc. | Type ? for help. > read `dist.maple`; Distributed Maple V1.0 (c) 1998 Wolfgang Schreiner (RISC-Linz) See http://www.risc.uni-linz.ac.at/software/distmaple > dist[initialize]([[deneb,solaris], [iris,irix]]): connecting deneb... connecting iris... > main(20,2^90): > dist[terminate](): > quit:
The program itself is shown below:
# ----------------------------------------------------------------------- # # distributed Maple # distributed integer factorizations # # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # return a list of `length` elements each of which is a pair [i, f] where # `i` <= `size` is a random integer and `f` is the factorization of `i` # ----------------------------------------------------------------------- main := proc(length, size) local numbers, results, ti; # let machines load factorization library dist[all](`readlib(ifactors);`); # generate list of numbers numbers := rands(length, size); # compute result results := dfactors(numbers); # return list of argument/result pairs RETURN ([seq([numbers[i], results[i]], i = 1..length)]); end: # ----------------------------------------------------------------------- # return list of facorizations of `numbers` list # ----------------------------------------------------------------------- dfactors := proc(numbers) local length, tasks, results, i, t, r; # length of list length := nops(numbers); # generate list of tasks tasks := []; for i from 1 to length do t := dist[start](ifactors, numbers[i]); tasks := [op(tasks), t]; od; # wait for result values results := []; for i from 1 to length do r := dist[wait](tasks[i]); results := [op(results), r]; od; # return results RETURN(results); end: # ----------------------------------------------------------------------- # return a list of `length` random numbers less than `size` # ----------------------------------------------------------------------- rands := proc(length, size) local r, i, n, numbers; # random number generator r := rand(size); # generate list numbers := []; for i from 1 to length do n := r(); numbers := [op(numbers), n]; od; # return list RETURN (numbers); end:
The main
function of this program executes the procedure
dist[all]
which evaluates its argument string (denoting a command)
on each Maple kernel connected to the session; thus on each kernel the Maple
library ifactors is loaded. The core function dfactors
creates a
list of tasks each of which computes
ifactors(numbers[i])
for some i. The program then traverses the
list waiting for each result in turn and constructs a corresponding list of
results.
Above example demonstrates the simple strategy of data parallelism where each element of a central input data structure is processed in parallel and the task results are joined to form the desired output structure. Above example only uses one-level parallelism where each task computes a sequential function; however, as shown in the following section, a task may itself create other tasks.