[Haskell-cafe] Multiprocessor compiling.
Alastair Reid
alastair at reid-consulting-uk.ltd.uk
Sat Jul 31 16:45:38 EDT 2004
On Saturday 31 July 2004 09:11, Matthew Roberts wrote:
> tell us the fundamental reason it is hard to compile Haskell
> for multiple processor machines - in broad strokes.
Unpredictability, heavy use of heap and overly fine granularity of inherent
parallelism.
Unpredictability: Haskell's laziness (also being higher order, overloaded and
polymorphic) makes it harder to predict what is related to what: if I start
to evaluate X, will I certainly/maybe evaluate Y; if X raises an exception,
is it ok for Y to raise an exception too; does X contain a pointer to Y; etc.
You can tackle this using a static analysis (e.g., strictness analysis) or
using a dynamic mechanism (e.g., revertible grey holes). Your analysis will
have to be good enough to cope with very heavy use of higher order functions
and overloading in typical Haskell code - though inlining and optimization of
overloading will eliminate a lot of these features for you.
Heavy use of heap means that any locking required to implement memory
allocation can easily be a significant overhead. In single-processor
systems, the cost of heap allocation might be 3 instructions: register add,
register compare, branch. In multi-processor systems, you probably need to
have a separate allocation arena for each processor to get close to this cost
since a single allocation arena would require locking.
Fine granularity of inherent parallelism is a problem because you really don't
want to fork 3 threads to compute "a*b + c*d" because it would probably take
10s of instructions (very optimistic minimum) to fork each thread but only 3
instructions to do the actual work. What you want to do is recognise that
the three are strongly related and do them all in the same thread.
Hope this helps,
--
Alastair Reid
More information about the Haskell-Cafe
mailing list