module SASUM where
import Random
import System.Random.MWC
import Data.Array.Unboxed
import Data.Array.Accelerate as Acc
-- Sum of absolute values
-- ----------------------
sasumAcc :: Vector Float -> Acc (Scalar Float)
sasumAcc xs
= Acc.fold (+) 0 . Acc.map abs $ Acc.use xs
sasumRef :: UArray Int Float -> UArray () Float
sasumRef xs
= listArray ((), ()) [Prelude.sum . Prelude.map abs $ elems xs]
-- Main
-- ----
run :: Int -> IO (() -> UArray () Float, () -> Acc (Scalar Float))
run n = withSystemRandom $ \gen -> do
vec <- randomUArrayR (-1,1) gen n
vec' <- convertUArray vec
--
return (run_ref vec, run_acc vec')
where
{-# NOINLINE run_ref #-}
run_ref xs () = sasumRef xs
run_acc xs () = sasumAcc xs