[Haskell-cafe] Go parallel

Andrew Coppin andrewcoppin at btinternet.com
Mon Nov 5 15:46:45 EST 2007


Jonathan Cast wrote:
> On Mon, 2007-11-05 at 20:12 +0000, Andrew Coppin wrote:
>   
>> Hi folks.
>>
>> Take a look at this:
>>
>>   render :: IOArray Point Colour -> (Point -> Colour) -> IO ()
>>   render framebuffer fn = mapM_ (\p -> writeArray framebuffer p (fn p)) 
>> all_points
>>
>> How do I alter this to compute fn in multiple threads in parallel? (As 
>> you can see from the type signature, the calculation is independent for 
>> each pixel.)
>>     
>
> You can spark a thread for each computation of fn, like such:
>
> writeArray framebuffer p `parApp` fn p
> where
>   parApp f x = x `par` f x
>   

Hmm, that may be a little *too* fine-grained. (But then, just because I 
spark 175,862 threads doesn't mean it will actually *run* that many at 
once, right?) I guess I'll try it and see...

> Or, alternatively, since I believe IOArray is lazy, you could grab a
> list and hand it to parListChunk (from Parallel.Strategies) or there
> abouts:
>
> xn <- getElems framebuffer
> evaluate $ parListChunk 100 rwhnf
>
> or something (evaluate is from Control.Exception; rwhnf is also from
> Parallel.Strategies).
>   

Yes, IOArray is lazy. The *real* array type I'm using is unboxed and 
therefore strict - however, the order in which pixels are written is of 
no interest to me. I will sit and have a think about this one too.

Thanks.



More information about the Haskell-Cafe mailing list