packages feed

uvector-0.1: examples/dotp/dotp.hs

import qualified DotPSeq
import qualified DotPPar
import qualified DotPVect

import Control.Exception (evaluate)
import System.Console.GetOpt
import System.Random

import Data.Array.Parallel.Prelude (fromUArrPA')
import Data.Array.Parallel.Unlifted
import Data.Array.Parallel.Unlifted.Distributed

import Bench.Benchmark
import Bench.Options

algs = [("par", DotPPar.dotp)
       ,("seq", DotPSeq.dotp)
       ,("list", dotp_list)
       ,("vect", dotp_vect)]

type Vector = UArr Double

dotp_vect :: Vector -> Vector -> Double
dotp_vect xs ys = DotPVect.dotp (fromUArrPA' xs) (fromUArrPA' ys)


dotp_list:: Vector -> Vector -> Double
dotp_list xs ys = sum $ zipWith (*) (fromU xs) (fromU ys)
-- generates a random vector of the given length in NF
--
generateVector :: Int -> IO Vector
generateVector n =
  do
    rg <- newStdGen
    let fs  = take n $ randomRs (-100, 100) rg
	vec = toU fs
    evaluate vec
    return vec

generateVectors :: Int -> IO (Point (Vector, Vector))
generateVectors n =
  do
    v <- generateVector n
    w <- generateVector n
    return $ ("N = " ++ show n) `mkPoint` (v,w)


main = ndpMain "Dot product"
               "[OPTION] ... SIZES ..."
               run [Option ['a'] ["algo"] (ReqArg const "ALGORITHM")
                      "use the specified algorithm"]
                   "par"

run opts alg sizes =
  case lookup alg algs of
    Nothing -> failWith ["Unknown algorithm"]
    Just f -> case map read sizes of
                []  -> failWith ["No sizes specified"]
                szs -> do
                         benchmark opts (uncurry f)
                            (map generateVectors szs)
                            show
                         return ()