import SMVM
import Matrix
import Config
import ParseArgs
import Monitoring
import Prelude as P
import Data.Label ( get )
import Criterion.Main ( defaultMainWith, bench, whnf )
import System.Random.MWC
import System.Exit
import System.Environment
import Data.Array.Accelerate as A
import qualified Data.Vector.Unboxed as V
main :: IO ()
main = withSystemRandom $ \gen -> do
beginMonitoring
argv <- getArgs
(conf, cconf, nops) <- parseArgs configHelp configBackend options defaults header footer argv
fileIn <- case nops of
(i:_) -> return i
_ -> parseArgs configHelp configBackend options defaults [] [] ("--help":argv)
>> exitSuccess
-- Read in the matrix file, and generate a random vector to multiply against
--
(segd', svec', cols) <- readCSRMatrix gen fileIn
vec' <- uniformVector gen cols
-- Convert to Accelerate arrays
--
let vec = fromFunction (Z :. V.length vec') (\(Z:.i) -> vec' V.! i)
segd = fromFunction (Z :. V.length segd') (\(Z:.i) -> segd' V.! i)
svec = fromFunction (Z :. V.length svec') (\(Z:.i) -> svec' V.! i)
smat = lift (use segd, svec)
backend = get configBackend conf
putStrLn $ "Reading matrix: " P.++ fileIn
putStrLn $ " with shape: " P.++ shows (V.length segd') " x " P.++ shows cols " and "
P.++ shows (V.length svec') " entries\n"
-- Benchmark
--
withArgs (P.tail nops) $ defaultMainWith cconf (return ())
[ bench "smvm" $ whnf (run1 backend (smvm smat)) vec ]