{-# LANGUAGE ParallelListComp #-}
module ZipWith where
import Random
import System.Random.MWC
import Data.Array.Unboxed
import Data.Array.Accelerate as Acc hiding (min)
-- Tests
-- -----
plusAcc :: Vector Float -> Vector Float -> Acc (Vector Float)
plusAcc xs ys = Acc.zipWith (+) (use xs) (use ys)
plusRef :: UArray Int Float -> UArray Int Float -> UArray Int Float
plusRef = zipWithRef (+)
zipWithRef :: (IArray array a, IArray array b, IArray array c)
=> (a -> b -> c) -> array Int a -> array Int b -> array Int c
zipWithRef f xs ys =
let mn = bounds xs
uv = bounds ys
newSize = (0, (rangeSize mn `min` rangeSize uv) - 1)
in
listArray newSize [f x y | x <- elems xs | y <- elems ys]
-- Main
-- ----
run :: String -> Int -> IO (() -> UArray Int Float, () -> Acc (Vector Float))
run alg n = withSystemRandom $ \gen -> do
xs <- randomUArrayR (-1,1) gen n
ys <- randomUArrayR (-1,1) gen n
xs' <- convertUArray xs
ys' <- convertUArray ys
let go f g = return (\() -> f xs ys, \() -> g xs' ys')
case alg of
"plus" -> go plusRef plusAcc
_ -> error $ "unknown variant: " ++ alg