Efficient UArray dot-product?

Jon Fairbairn Jon.Fairbairn@cl.cam.ac.uk
Mon, 03 Jun 2002 11:15:09 +0100


> =

> =

> Is it possible to write an dot-product function that GHC will compile
> to efficient code without using unsafeAt?  I've tried and can't.  I'm
> looking at generic IArray functions pragma-specialized to UArray Int
> Double.  With unsafeAt the -ddump-simpl output looks optimal to me
> (aside from not unrolling or pipelining**):
> =

>   loop i s | i > ubSI =3D s
>            | otherwise =3D let s' =3D s + (small `unsafeAt` i) * (big `=
unsafeAt` =

> (off + i))
>                          in seq s' $ loop (i + 1) s'


Isn't that rather the wrong question?  I'd be more
interested in "How do I get ghc to generate efficient code
for dotprod?"


   dotprod a b =3D sum (map e (indices a))
		 where e ix =3D a!ix * b!ix

Especially since ghc does a pretty damn good job for this version

   {-# SPECIALISE =

       dotprod :: UArray Int Double -> UArray Int Double -> Double
    #-}

   dotprod a b =3D foldr (+) 0 (map e (indices a))
		 where e ix =3D a!ix * b!ix

(It's a pity that it can only eliminate the list for foldr,
not the foldl used in sum).

I'm not at all familiar with the intermediate code, so I
don't know what in the output from the above is particularly
inefficient. It does seem to do a lot of deconstructing and
I've no idea how to get round that, but I'd much prefer to
see a definition like dotprod in the Haskell code and all
the mysteries and contortions done in ghc.

Cheers,
   J=F3n

PS It's a national holiday in the UK, so you might not hear
anything from the ghc guys for a bit.

-- =

J=F3n Fairbairn                                 Jon.Fairbairn@cl.cam.ac.u=
k
31 Chalmers Road                                         jf@cl.cam.ac.uk
Cambridge CB1 3SZ            +44 1223 570179 (after 14:00 only, please!)