#include "fusion-phases.h"
module Data.Array.Parallel.Unlifted.Parallel.Basics (
lengthUP, nullUP, indexedUP,
replicateUP, repeatUP, interleaveUP
) where
import Data.Array.Parallel.Unlifted.Sequential.Vector as Seq
import Data.Array.Parallel.Unlifted.Distributed
import Data.Array.Parallel.Unlifted.Parallel.Combinators ( mapUP )
import Data.Array.Parallel.Unlifted.Parallel.Enum ( enumFromToUP )
import Data.Array.Parallel.Unlifted.Parallel.Permute ( bpermuteUP )
import GHC.Base ( remInt )
nullUP :: Unbox e => Vector e -> Bool
nullUP = (== 0) . Seq.length
emptyUP :: Unbox e => Vector e
emptyUP = Seq.new 0 (const $ return ())
lengthUP :: Unbox e => Vector e -> Int
lengthUP = Seq.length
replicateUP :: Unbox e => Int -> e -> Vector e
replicateUP n !e = joinD theGang balanced
. mapD theGang (\n ->Seq.replicate n e)
$ splitLenD theGang n
repeatUP :: Unbox e => Int -> Vector e -> Vector e
repeatUP n es = seq m
. bpermuteUP es
. mapUP (\i -> i `remInt` m)
$ enumFromToUP 0 (m*n1)
where
m = Seq.length es
interleaveUP :: Unbox e => Vector e -> Vector e -> Vector e
interleaveUP xs ys = joinD theGang unbalanced
(zipWithD theGang Seq.interleave
(splitD theGang balanced xs)
(splitD theGang balanced ys))
indexedUP :: (DT e, Unbox e) => Vector e -> Vector (Int,e)
indexedUP = splitJoinD theGang indexedFn
where
sizes arr = fst $ scanD theGang (+) 0 $ lengthD arr
indexedFn = \arr -> (zipWithD theGang (\o -> Seq.map (\(x,y) -> (x + o, y))) (sizes arr) $
mapD theGang Seq.indexed arr)