{-# LANGUAGE ParallelListComp #-} module SAXPY where import Random import System.Random.MWC import Data.Array.Unboxed import Data.Array.Accelerate as Acc -- SAXPY -- ----- saxpyAcc :: Float -> Vector Float -> Vector Float -> Acc (Vector Float) saxpyAcc alpha xs ys = let xs' = use xs ys' = use ys in Acc.zipWith (\x y -> constant alpha * x + y) xs' ys' saxpyRef :: Float -> UArray Int Float -> UArray Int Float -> UArray Int Float saxpyRef alpha xs ys = listArray (bounds xs) [alpha * x + y | x <- elems xs | y <- elems ys] -- Main -- ---- run :: Int -> IO (() -> UArray Int Float, () -> Acc (Vector Float)) run nelements = withSystemRandom $ \gen -> do v1 <- randomUArrayR (-1,1) gen nelements v2 <- randomUArrayR (-1,1) gen nelements v1' <- convertUArray v1 v2' <- convertUArray v2 alpha <- uniform gen -- return (run_ref alpha v1 v2, run_acc alpha v1' v2') where {-# NOINLINE run_ref #-} run_ref alpha xs ys () = saxpyRef alpha xs ys run_acc alpha xs ys () = saxpyAcc alpha xs ys