GHC vs. GCC on raw vector addition
Simon Marlow
simonmarhaskell at gmail.com
Wed Jan 18 09:31:25 EST 2006
Bulat Ziganshin wrote:
> Wednesday, January 18, 2006, 3:33:40 PM, you wrote:
>
> SMH> and gets a runtime for the GHC-compiled binary that's about 10x as long
> SMH> as for GCC. Simon M. tells me this should be much better. Here are the
>
> attached version is only 5 times slower :) please note that
>
> 1) unsafeRead/Write indexes from 0 and don't checks bounds (just C-like :)
> 2) generating random values takes about 1.5-2 seconds by itself.
> Haskell's RNG is very different from C's one
I squeezed a bit more out (see attached). I think the main bottleneck
is now the random number generator, in particular it is supplying boxed
Doubles which have to be unboxed again before storing in the array.
Cheers,
Simon
-------------- next part --------------
import Data.Array.IO
import Data.Array.Base
import System.Environment (getArgs)
import System.Random
type Vector = IOUArray Int Double
main = do (n:f:m:_) <- getArgs
let (nelems,niterations) = case f of
"elements" -> (read n, read m)
"iterations" -> (read m, read n)
x <- newArray (0,nelems-1) 0 :: IO Vector
v <- newArray_ (0,nelems-1) :: IO Vector
x `seq` v `seq` return ()
for 0 nelems $ \i ->
do r <- randomRIO (-1,1)
unsafeWrite v i r
for 0 niterations $ \_ ->
for 0 nelems $ \i ->
do xi <- unsafeRead x i
vi <- unsafeRead v i
unsafeWrite x i (xi+vi)
--for 0 nelems $ \i ->
-- do xi <- unsafeRead x i
-- putStr (show xi)
-- putChar ' '
--putChar '\n'
for :: Int -> Int -> (Int -> IO a) -> IO ()
-- Faster equivalent of "mapM_ action [from..to-1]"
for from to action | from `seq` to `seq` False = undefined
for from to action = go from
where
go i | i>=to = return ()
| otherwise = do action i
go $! (i+1)
More information about the Glasgow-haskell-users
mailing list