packages feed

accelerate-examples-0.2.0.0: tests/primitives/ZipWith.hs

{-# 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