#include "fusion-phases.h"
module Data.Array.Parallel.Unlifted.Parallel.Basics
( emptyUP
, replicateUP
, repeatUP
, lengthUP
, nullUP
, interleaveUP
, indexedUP)
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)
emptyUP :: Unbox e => Vector e
emptyUP = Seq.new 0 (const $ return ())
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
lengthUP :: Unbox e => Vector e -> Int
lengthUP = Seq.length
nullUP :: Unbox e => Vector e -> Bool
nullUP = (== 0) . Seq.length
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