packages feed

dph-examples-0.5.1.1: spectral/SMVM/dph/SMVMVectorised.hs

{-# LANGUAGE ParallelArrays #-}
{-# OPTIONS -fvectorise #-}
module SMVMVectorised (smvmPA) where

import Data.Array.Parallel
import Data.Array.Parallel.Prelude.Double as D
import Data.Array.Parallel.Prelude.Int    as I

import qualified Prelude as P

smvmPA :: PArray (PArray (Int, Double)) -> PArray Double -> PArray Double
{-# NOINLINE smvmPA #-}
smvmPA m v = toPArrayP (smvm (fromNestedPArrayP m) (fromPArrayP v))

smvm :: [:[: (Int, Double) :]:] -> [:Double:] -> [:Double:]
smvm m v = [: D.sumP [: x D.* (v !: i) | (i,x) <- row :] | row <- m :]