dph-prim-par-0.6.0.1: Data/Array/Parallel/Unlifted/Distributed/Scalars.hs
{-# OPTIONS -Wall -fno-warn-orphans -fno-warn-missing-signatures #-}
-- | Operations on distributed scalars.
-- With a distributed value like (Dist Int), each thread has its own integer,
-- which may or may not have the same values as the ones on other threads.
module Data.Array.Parallel.Unlifted.Distributed.Scalars
( scalarD
, orD, andD
, sumD)
where
import Data.Array.Parallel.Unlifted.Distributed.Gang
import Data.Array.Parallel.Unlifted.Distributed.Types
import Data.Array.Parallel.Unlifted.Distributed.Combinators
-- | Distribute a scalar.
-- Each thread gets its own copy of the same value.
-- Example: scalarD theGangN4 10 = [10, 10, 10, 10]
scalarD :: DT a => Gang -> a -> Dist a
scalarD g x = mapD g (const x) (unitD g)
-- | OR together all instances of a distributed 'Bool'.
orD :: Gang -> Dist Bool -> Bool
orD g = foldD g (||)
-- | AND together all instances of a distributed 'Bool'.
andD :: Gang -> Dist Bool -> Bool
andD g = foldD g (&&)
-- | Sum all instances of a distributed number.
sumD :: (Num a, DT a) => Gang -> Dist a -> a
sumD g = foldD g (+)