packages feed

accelerate-examples-0.2.0.0: tests/simple/DotP.hs

{-# LANGUAGE ParallelListComp #-}

module DotP where

import Random

import System.Random.MWC
import Data.Array.Unboxed
import Data.Array.Accelerate as Acc


-- Dot product
-- -----------
dotpAcc :: Vector Float -> Vector Float -> Acc (Scalar Float)
dotpAcc xs ys
  = let
      xs' = use xs
      ys' = use ys
    in
    Acc.fold (+) 0 (Acc.zipWith (*) xs' ys')

dotpRef :: UArray Int Float
        -> UArray Int Float
        -> UArray ()  Float
dotpRef xs ys
  = listArray ((), ()) [sum [x * y | x <- elems xs | y <- elems ys]]


-- Main
-- ----

run :: Int -> IO (() -> UArray () Float, () -> Acc (Scalar Float))
run n = withSystemRandom $ \gen -> do
  v1  <- randomUArrayR (-1,1) gen n
  v2  <- randomUArrayR (-1,1) gen n
  v1' <- convertUArray v1
  v2' <- convertUArray v2
  --
  return (run_ref v1 v2, run_acc v1' v2')
  where
    {-# NOINLINE run_ref #-}
    run_ref xs ys () = dotpRef xs ys
    run_acc xs ys () = dotpAcc xs ys