import SMVM import Matrix import Config import Data.Array.Accelerate as A import Data.Array.Accelerate.Examples.Internal as A import Data.Array.Accelerate.IO as A import Data.Label ( get ) import Data.Matrix.MatrixMarket ( readMatrix ) import System.Environment import System.Exit import System.Random.MWC import Text.Printf import Prelude as P import qualified Data.Vector.Storable as S main :: IO () main = do beginMonitoring (_, opts, rest) <- parseArgs options defaults header footer fileIn <- case rest of (i:_) -> return i _ -> withArgs ["--help"] $ parseArgs options defaults [] [] >> exitSuccess -- Read in the matrix file, and generate a random vector to multiply against -- matrix <- readMatrix fileIn csr <- withSystemRandom $ \gen -> matrixToCSR gen matrix xs <- withSystemRandom $ \gen -> uniformVector gen (rows csr) :: IO (S.Vector Double) -- Convert to Accelerate arrays -- let vec = fromVectors (Z :. S.length xs) xs segd = fromVectors (Z :. S.length (csr_segd_length csr)) (csr_segd_length csr) svec = fromVectors (Z :. nnz csr) (((), csr_indices csr), csr_values csr) smat = use (segd, svec) :: Acc (SparseMatrix Double) backend = get optBackend opts printf "input matrix: %s\n" fileIn printf " size: %d x %d\n" (rows csr) (columns csr) printf " non-zeros: %d\n\n" (nnz csr) -- Benchmark -- runBenchmarks opts (P.tail rest) [ bench "smvm" $ whnf (run1 backend (smvm smat)) vec ]