#include "fusion-phases.h"
module Data.Array.Parallel.Unlifted.Parallel.Enum (
enumFromToUP, enumFromThenToUP, enumFromStepLenUP, enumFromStepLenEachUP
) where
import Data.Array.Parallel.Unlifted.Sequential.Vector as Seq
import Data.Array.Parallel.Unlifted.Distributed (
mapD, scanD, zipD, splitLenIdxD, joinD, splitD, balanced, unbalanced,
theGang)
import Data.Array.Parallel.Unlifted.Parallel.Combinators (
mapUP)
import GHC.Base ( divInt )
delay_inline :: a -> a
delay_inline x = x
enumFromToUP :: (Unbox a, Enum a) => a -> a -> Vector a
enumFromToUP start end = mapUP toEnum (enumFromStepLenUP start' 1 len)
where
start' = fromEnum start
end' = fromEnum end
len = delay_inline max (end' start' + 1) 0
enumFromThenToUP :: (Unbox a, Enum a) => a -> a -> a -> Vector a
enumFromThenToUP start next end =
mapUP toEnum (enumFromStepLenUP start' delta len)
where
start' = fromEnum start
next' = fromEnum next
end' = fromEnum end
delta = next' start'
dist = (end' start' + delta) `divInt` delta
len = max dist 0
enumFromStepLenUP :: Int -> Int -> Int -> Vector Int
enumFromStepLenUP start delta len =
joinD theGang balanced
(mapD theGang gen
(splitLenIdxD theGang len))
where
gen (n,i) = Seq.enumFromStepLen (i * delta + start) delta n
enumFromStepLenEachUP :: Int -> Vector Int -> Vector Int -> Vector Int -> Vector Int
enumFromStepLenEachUP n starts steps lens
= joinD theGang unbalanced
$ mapD theGang enum
$ splitD theGang unbalanced (Seq.zip (Seq.zip starts steps) lens)
where
enum ps = let (qs, llens) = Seq.unzip ps
(lstarts, lsteps) = Seq.unzip qs
in Seq.enumFromStepLenEach (Seq.sum llens) lstarts lsteps llens