packages feed

cl3-3.0.0.0: benchmarks/WeighStorableCl3.hs

import Weigh
import Data.Vector.Storable as V
import Data.Massiv.Array as A
import Algebra.Geometric.Cl3
import Foreign.Ptr (Ptr(), plusPtr)
import Foreign.Storable (Storable(..))
import Foreign.Marshal.Alloc (mallocBytes)

main :: IO ()
main = mainWith $ do func' "Cl3.R in Vector" apsR unitR
                     func' "Cl3.Cl3_R in Vector" compactR unitR
                     func' "Cl3.R in Massiv Vector" apsRMassiv unitR
                     func' "Cl3.Cl3_R in Massiv Vector" compactRMassiv unitR
                     action "malloc Storable Cl3_R by (1024*1024)" $ mallocR unitR

apsR :: Cl3 -> V.Vector Cl3
apsR cl3 = V.replicate (1024*1204) cl3

compactR :: Cl3 -> V.Vector Cl3_R
compactR cl3 = V.replicate (1024*1204) (toCl3_R cl3)

apsRMassiv :: Cl3 -> A.Array A.S A.Ix1 Cl3
apsRMassiv cl3 = A.makeVectorR A.S A.Seq (A.Sz1 (1024*1204)) (const cl3)

compactRMassiv :: Cl3 -> A.Array A.S A.Ix1 Cl3_R
compactRMassiv cl3 = A.makeVectorR A.S A.Seq (A.Sz1 (1024*1204)) (const $ toCl3_R cl3)

mallocR :: Cl3 -> IO (Ptr Cl3_R)
mallocR cl3 = do
  pa <- mallocBytes ((1024*1204) * sizeOf (undefined :: Cl3_R))
  let fill idx | idx < (1024*1204) = do
        poke (pa `plusPtr` (idx * sizeOf (undefined :: Cl3_R))) cl3
        fill (idx+1)
      fill _ | otherwise = return ()
  fill 0
  peekElemOff pa (1024*1204)

unitR :: Cl3
unitR = R 1