dph-prim-par: cleanup Distributed scalar instances
authorBen Lippmeier <benl@ouroborus.net>
Mon, 23 Jul 2012 05:16:07 +0000 (15:16 +1000)
committerBen Lippmeier <benl@ouroborus.net>
Mon, 30 Jul 2012 03:48:35 +0000 (13:48 +1000)
13 files changed:
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Arrays.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Basics.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Bool.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Maybe.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Ordering.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Prim.hs [deleted file]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Scalar.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Scalar/Base.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/DT.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Vector.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Primitive/DPrim.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Scalars.hs [deleted file]

index b47ac78..95fb762 100644 (file)
@@ -56,7 +56,8 @@ module Data.Array.Parallel.Unlifted.Distributed
         , fromD, toD, debugD)
 where
 import Data.Array.Parallel.Unlifted.Distributed.Combinators
-import Data.Array.Parallel.Unlifted.Distributed.Scalars
+import Data.Array.Parallel.Unlifted.Distributed.Data.Bool
+import Data.Array.Parallel.Unlifted.Distributed.Data.Scalar
 import Data.Array.Parallel.Unlifted.Distributed.Arrays
 import Data.Array.Parallel.Unlifted.Distributed.Basics
 import Data.Array.Parallel.Unlifted.Distributed.Primitive
index 49180b2..408e780 100644 (file)
@@ -23,13 +23,13 @@ module Data.Array.Parallel.Unlifted.Distributed.Arrays
           -- * Carry
         , carryD)
  where
-import Data.Array.Parallel.Base (ST, runST)
-import Data.Array.Parallel.Unlifted.Distributed.Primitive
-import Data.Array.Parallel.Unlifted.Distributed.Primitive.DistST
+import Data.Array.Parallel.Unlifted.Distributed.Data.Scalar
 import Data.Array.Parallel.Unlifted.Distributed.Data.Vector
+import Data.Array.Parallel.Unlifted.Distributed.Primitive.DistST
+import Data.Array.Parallel.Unlifted.Distributed.Primitive
 import Data.Array.Parallel.Unlifted.Distributed.Combinators
-import Data.Array.Parallel.Unlifted.Distributed.Scalars
 import Data.Array.Parallel.Unlifted.Sequential.Vector   (Vector, MVector, Unbox)
+import Data.Array.Parallel.Base (ST, runST)
 import qualified Data.Array.Parallel.Unlifted.Sequential.Vector as Seq
 import GHC.Base      ( quotInt, remInt )
 import Control.Monad
index 83b4416..9e168ac 100644 (file)
@@ -6,7 +6,8 @@ module Data.Array.Parallel.Unlifted.Distributed.Basics
 where
 import Data.Array.Parallel.Unlifted.Distributed.Primitive
 import Data.Array.Parallel.Unlifted.Distributed.Combinators 
-import Data.Array.Parallel.Unlifted.Distributed.Scalars
+import Data.Array.Parallel.Unlifted.Distributed.Data.Bool
+import Data.Array.Parallel.Unlifted.Distributed.Data.Scalar
 import Control.Monad ( zipWithM_ )
 
 here :: String -> String
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Bool.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Bool.hs
new file mode 100644 (file)
index 0000000..6f8cf71
--- /dev/null
@@ -0,0 +1,46 @@
+
+{-# OPTIONS -Wall -fno-warn-orphans -fno-warn-missing-signatures #-}
+module Data.Array.Parallel.Unlifted.Distributed.Data.Bool
+        ( orD
+        , andD)
+where
+import Data.Array.Parallel.Unlifted.Distributed.Data.Scalar.Base        ()
+import Data.Array.Parallel.Unlifted.Distributed.Primitive.DPrim
+import Data.Array.Parallel.Unlifted.Distributed.Primitive
+import qualified Data.Array.Parallel.Unlifted.Sequential.Vector as V
+import qualified Data.Vector.Unboxed.Mutable                    as MV
+import Prelude as P
+
+
+instance DPrim Bool where
+  mkDPrim           = DBool
+  unDPrim (DBool a) = a
+
+  mkMDPrim            = MDBool
+  unMDPrim (MDBool a) = a
+
+
+instance DT Bool where
+  data Dist  Bool   = DBool  !(V.Vector    Bool)
+  data MDist Bool s = MDBool !(MV.STVector s Bool)
+
+  indexD         = primIndexD
+  newMD          = primNewMD
+  readMD         = primReadMD
+  writeMD        = primWriteMD
+  unsafeFreezeMD = primUnsafeFreezeMD
+  sizeD          = primSizeD
+  sizeMD         = primSizeMD
+
+
+
+-- | 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 (&&)
+
+
index 7728dcd..3b9305e 100644 (file)
@@ -1,8 +1,10 @@
 {-# OPTIONS -Wall -fno-warn-orphans -fno-warn-missing-signatures #-}
 
 -- | Distribution of Maybes.
-module Data.Array.Parallel.Unlifted.Distributed.Data.Maybe where
-import Data.Array.Parallel.Unlifted.Distributed.Data.Prim      ()
+module Data.Array.Parallel.Unlifted.Distributed.Data.Maybe 
+where
+import Data.Array.Parallel.Unlifted.Distributed.Data.Bool
+import Data.Array.Parallel.Unlifted.Distributed.Primitive.DPrim
 import Data.Array.Parallel.Unlifted.Distributed.Primitive.DT
 import Control.Monad
 
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Ordering.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Ordering.hs
new file mode 100644 (file)
index 0000000..0a0db6d
--- /dev/null
@@ -0,0 +1,30 @@
+
+-- | Distribution of values of primitive types.
+module Data.Array.Parallel.Unlifted.Distributed.Data.Ordering
+where
+import Data.Array.Parallel.Unlifted.Distributed.Primitive.DPrim
+import Data.Array.Parallel.Unlifted.Distributed.Primitive
+import qualified Data.Array.Parallel.Unlifted.Sequential.Vector as V
+import qualified Data.Vector.Unboxed.Mutable                    as MV
+import Prelude as P
+
+
+instance DPrim Ordering where
+  mkDPrim               = DOrdering
+  unDPrim (DOrdering a) = a
+
+  mkMDPrim                = MDOrdering
+  unMDPrim (MDOrdering a) = a
+
+
+instance DT Ordering where
+  data Dist  Ordering   = DOrdering  !(V.Vector    Ordering)
+  data MDist Ordering s = MDOrdering !(MV.STVector s Ordering)
+
+  indexD         = primIndexD
+  newMD          = primNewMD
+  readMD         = primReadMD
+  writeMD        = primWriteMD
+  unsafeFreezeMD = primUnsafeFreezeMD
+  sizeD          = primSizeD
+  sizeMD         = primSizeMD
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Prim.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Prim.hs
deleted file mode 100644 (file)
index 7124863..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-{-# OPTIONS -Wall -fno-warn-orphans -fno-warn-missing-signatures #-}
-
--- | Distribution of values of primitive types.
-module Data.Array.Parallel.Unlifted.Distributed.Data.Prim 
-        ( DPrim (..)
-        , DT    (..)
-        , Dist  (..))
-where
-import Data.Array.Parallel.Unlifted.Distributed.Primitive
-import Data.Array.Parallel.Unlifted.Sequential.Vector
-import Data.Array.Parallel.Base
-import Data.Array.Parallel.Pretty
-import Data.Word
-import Control.Monad
-import qualified Data.Array.Parallel.Unlifted.Sequential.Vector as V
-import qualified Data.Vector.Unboxed.Mutable                    as MV
-import Prelude as P
-
--- DPrim ----------------------------------------------------------------------
--- | For distributed primitive values, we can just store all the members in
---   a vector. The vector has the same length as the number of threads in the gang.
---
-class Unbox e => DPrim e where
-
-  -- | Make an immutable distributed value.
-  mkDPrim :: V.Vector e -> Dist  e
-
-  -- | Unpack an immutable distributed value back into a vector.
-  unDPrim :: Dist  e -> V.Vector e
-
-  -- | Make a mutable distributed value.
-  mkMDPrim :: MV.STVector s e -> MDist  e s
-
-  -- | Unpack a mutable distributed value back into a vector.
-  unMDPrim :: MDist  e s -> MV.STVector s e
-
-
--- | Get the member corresponding to a thread index.
-primIndexD :: DPrim a => String -> Dist a -> Int -> a
-primIndexD str = (V.index (str P.++ "/primIndexD")) . unDPrim
-{-# INLINE primIndexD #-}
-
-
--- | Create a new distributed value, having as many members as threads
---   in the given 'Gang'.
-primNewMD :: DPrim a => Gang -> ST s (MDist a s)
-primNewMD = liftM mkMDPrim . MV.new . gangSize
-{-# INLINE primNewMD #-}
-
-
--- | Read the member of a distributed value corresponding to the given thread index.
-primReadMD :: DPrim a => MDist a s -> Int -> ST s a
-primReadMD = MV.read . unMDPrim
-{-# INLINE primReadMD #-}
-
-
--- | Write the member of a distributed value corresponding to the given thread index.
-primWriteMD :: DPrim a => MDist a s -> Int -> a -> ST s ()
-primWriteMD = MV.write . unMDPrim
-{-# INLINE primWriteMD #-}
-
-
--- | Freeze a mutable distributed value to an immutable one.
---   You promise not to update the mutable one any further.
-primUnsafeFreezeMD :: DPrim a => MDist a s -> ST s (Dist a)
-primUnsafeFreezeMD = liftM mkDPrim . V.unsafeFreeze . unMDPrim
-{-# INLINE primUnsafeFreezeMD #-}
-
-
--- | Get the size of a distributed value, that is, the number of threads
---   in the gang that it was created for.
-primSizeD :: DPrim a => Dist a -> Int
-primSizeD = V.length . unDPrim
-{-# INLINE primSizeD #-}
-
-
--- | Get the size of a distributed mutable value, that is, the number of threads
---   in the gang it was created for.
-primSizeMD :: DPrim a => MDist a s -> Int
-primSizeMD = MV.length . unMDPrim
-{-# INLINE primSizeMD #-}
-
-
--- Bool -----------------------------------------------------------------------
-instance DPrim Bool where
-  mkDPrim           = DBool
-  unDPrim (DBool a) = a
-
-  mkMDPrim            = MDBool
-  unMDPrim (MDBool a) = a
-
-
-instance DT Bool where
-  data Dist  Bool   = DBool  !(V.Vector    Bool)
-  data MDist Bool s = MDBool !(MV.STVector s Bool)
-
-  indexD         = primIndexD
-  newMD          = primNewMD
-  readMD         = primReadMD
-  writeMD        = primWriteMD
-  unsafeFreezeMD = primUnsafeFreezeMD
-  sizeD          = primSizeD
-  sizeMD         = primSizeMD
-
-
--- Ordering -----------------------------------------------------------------------
-instance DPrim Ordering where
-  mkDPrim               = DOrdering
-  unDPrim (DOrdering a) = a
-
-  mkMDPrim                = MDOrdering
-  unMDPrim (MDOrdering a) = a
-
-
-instance DT Ordering where
-  data Dist  Ordering   = DOrdering  !(V.Vector    Ordering)
-  data MDist Ordering s = MDOrdering !(MV.STVector s Ordering)
-
-  indexD         = primIndexD
-  newMD          = primNewMD
-  readMD         = primReadMD
-  writeMD        = primWriteMD
-  unsafeFreezeMD = primUnsafeFreezeMD
-  sizeD          = primSizeD
-  sizeMD         = primSizeMD
-
-
--- Integer -----------------------------------------------------------------------
--- FIXME: fake instances
-instance DPrim Integer
-instance DT Integer
-
-
--- Char -----------------------------------------------------------------------
-instance DPrim Char where
-  mkDPrim           = DChar
-  unDPrim (DChar a) = a
-
-  mkMDPrim            = MDChar
-  unMDPrim (MDChar a) = a
-
-
-instance DT Char where
-  data Dist  Char   = DChar  !(V.Vector    Char)
-  data MDist Char s = MDChar !(MV.STVector s Char)
-
-  indexD         = primIndexD
-  newMD          = primNewMD
-  readMD         = primReadMD
-  writeMD        = primWriteMD
-  unsafeFreezeMD = primUnsafeFreezeMD
-  sizeD          = primSizeD
-  sizeMD         = primSizeMD
-
-
--- Int ------------------------------------------------------------------------
-instance DPrim Int where
-  mkDPrim          = DInt
-  unDPrim (DInt a) = a
-
-  mkMDPrim            = MDInt
-  unMDPrim (MDInt a) = a
-
-
-instance DT Int where
-  data Dist  Int   = DInt  !(V.Vector    Int)
-  data MDist Int s = MDInt !(MV.STVector s Int)
-
-  indexD         = primIndexD
-  newMD          = primNewMD
-  readMD         = primReadMD
-  writeMD        = primWriteMD
-  unsafeFreezeMD = primUnsafeFreezeMD
-  sizeD          = primSizeD
-  sizeMD         = primSizeMD
-
-  measureD n = "Int " P.++ show n
-
-instance PprPhysical (Dist Int) where
- pprp (DInt xs)
-  =  text "DInt" <+> text (show $ V.toList xs)
-
-
--- Word8 ----------------------------------------------------------------------
-instance DPrim Word8 where
-  mkDPrim            = DWord8
-  unDPrim (DWord8 a) = a
-
-  mkMDPrim             = MDWord8
-  unMDPrim (MDWord8 a) = a
-
-
-instance DT Word8 where
-  data Dist  Word8   = DWord8  !(V.Vector    Word8)
-  data MDist Word8 s = MDWord8 !(MV.STVector s Word8)
-
-  indexD         = primIndexD
-  newMD          = primNewMD
-  readMD         = primReadMD
-  writeMD        = primWriteMD
-  unsafeFreezeMD = primUnsafeFreezeMD
-  sizeD          = primSizeD
-  sizeMD         = primSizeMD
-
-
--- Float ----------------------------------------------------------------------
-instance DPrim Float where
-  mkDPrim            = DFloat
-  unDPrim (DFloat a) = a
-
-  mkMDPrim             = MDFloat
-  unMDPrim (MDFloat a) = a
-
-
-instance DT Float where
-  data Dist  Float   = DFloat  !(V.Vector    Float)
-  data MDist Float s = MDFloat !(MV.STVector s Float)
-
-  indexD         = primIndexD
-  newMD          = primNewMD
-  readMD         = primReadMD
-  writeMD        = primWriteMD
-  unsafeFreezeMD = primUnsafeFreezeMD
-  sizeD          = primSizeD
-  sizeMD         = primSizeMD
-
-
--- Double ---------------------------------------------------------------------
-instance DPrim Double where
-  mkDPrim             = DDouble
-  unDPrim (DDouble a) = a
-
-  mkMDPrim              = MDDouble
-  unMDPrim (MDDouble a) = a
-
-
-instance DT Double where
-  data Dist  Double   = DDouble  !(V.Vector    Double)
-  data MDist Double s = MDDouble !(MV.STVector s Double)
-
-  indexD         = primIndexD
-  newMD          = primNewMD
-  readMD         = primReadMD
-  writeMD        = primWriteMD
-  unsafeFreezeMD = primUnsafeFreezeMD
-  sizeD          = primSizeD
-  sizeMD         = primSizeMD
-
-
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Scalar.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Scalar.hs
new file mode 100644 (file)
index 0000000..679f1c5
--- /dev/null
@@ -0,0 +1,23 @@
+-- | Distribution of values of primitive types.
+module Data.Array.Parallel.Unlifted.Distributed.Data.Scalar
+        ( DT(..), Dist(..)
+        , scalarD
+        , sumD)
+where
+import Data.Array.Parallel.Unlifted.Distributed.Data.Scalar.Base
+import Data.Array.Parallel.Unlifted.Distributed.Data.Unit
+import Data.Array.Parallel.Unlifted.Distributed.Combinators
+import Data.Array.Parallel.Unlifted.Distributed.Primitive
+import Prelude as P
+
+-- | 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 gang x 
+        = mapD WhatScalar gang (const x) (unitD gang)
+
+
+-- | Sum all instances of a distributed number.
+sumD :: (Num a, DT a) => Gang -> Dist a -> a
+sumD g  = foldD g (+)
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Scalar/Base.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/Scalar/Base.hs
new file mode 100644 (file)
index 0000000..39d4e54
--- /dev/null
@@ -0,0 +1,136 @@
+{-# OPTIONS -fno-warn-orphans #-}
+module Data.Array.Parallel.Unlifted.Distributed.Data.Scalar.Base
+where
+import Data.Array.Parallel.Unlifted.Distributed.Primitive.DPrim
+import Data.Array.Parallel.Unlifted.Distributed.Primitive
+import Data.Array.Parallel.Unlifted.Sequential.Vector
+import Data.Array.Parallel.Base
+import Data.Array.Parallel.Pretty
+import Data.Word
+import Control.Monad
+import qualified Data.Array.Parallel.Unlifted.Sequential.Vector as V
+import qualified Data.Vector.Unboxed.Mutable                    as MV
+import Prelude as P
+
+
+-- Integer -----------------------------------------------------------------------
+-- FIXME: fake instances
+instance DPrim Integer
+instance DT Integer
+
+
+-- Char -----------------------------------------------------------------------
+instance DPrim Char where
+  mkDPrim           = DChar
+  unDPrim (DChar a) = a
+
+  mkMDPrim            = MDChar
+  unMDPrim (MDChar a) = a
+
+
+instance DT Char where
+  data Dist  Char   = DChar  !(V.Vector    Char)
+  data MDist Char s = MDChar !(MV.STVector s Char)
+
+  indexD         = primIndexD
+  newMD          = primNewMD
+  readMD         = primReadMD
+  writeMD        = primWriteMD
+  unsafeFreezeMD = primUnsafeFreezeMD
+  sizeD          = primSizeD
+  sizeMD         = primSizeMD
+
+
+-- Int ------------------------------------------------------------------------
+instance DPrim Int where
+  mkDPrim          = DInt
+  unDPrim (DInt a) = a
+
+  mkMDPrim            = MDInt
+  unMDPrim (MDInt a) = a
+
+
+instance DT Int where
+  data Dist  Int   = DInt  !(V.Vector    Int)
+  data MDist Int s = MDInt !(MV.STVector s Int)
+
+  indexD         = primIndexD
+  newMD          = primNewMD
+  readMD         = primReadMD
+  writeMD        = primWriteMD
+  unsafeFreezeMD = primUnsafeFreezeMD
+  sizeD          = primSizeD
+  sizeMD         = primSizeMD
+
+  measureD n = "Int " P.++ show n
+
+instance PprPhysical (Dist Int) where
+ pprp (DInt xs)
+  =  text "DInt" <+> text (show $ V.toList xs)
+
+
+-- Word8 ----------------------------------------------------------------------
+instance DPrim Word8 where
+  mkDPrim            = DWord8
+  unDPrim (DWord8 a) = a
+
+  mkMDPrim             = MDWord8
+  unMDPrim (MDWord8 a) = a
+
+
+instance DT Word8 where
+  data Dist  Word8   = DWord8  !(V.Vector    Word8)
+  data MDist Word8 s = MDWord8 !(MV.STVector s Word8)
+
+  indexD         = primIndexD
+  newMD          = primNewMD
+  readMD         = primReadMD
+  writeMD        = primWriteMD
+  unsafeFreezeMD = primUnsafeFreezeMD
+  sizeD          = primSizeD
+  sizeMD         = primSizeMD
+
+
+-- Float ----------------------------------------------------------------------
+instance DPrim Float where
+  mkDPrim            = DFloat
+  unDPrim (DFloat a) = a
+
+  mkMDPrim             = MDFloat
+  unMDPrim (MDFloat a) = a
+
+
+instance DT Float where
+  data Dist  Float   = DFloat  !(V.Vector    Float)
+  data MDist Float s = MDFloat !(MV.STVector s Float)
+
+  indexD         = primIndexD
+  newMD          = primNewMD
+  readMD         = primReadMD
+  writeMD        = primWriteMD
+  unsafeFreezeMD = primUnsafeFreezeMD
+  sizeD          = primSizeD
+  sizeMD         = primSizeMD
+
+
+-- Double ---------------------------------------------------------------------
+instance DPrim Double where
+  mkDPrim             = DDouble
+  unDPrim (DDouble a) = a
+
+  mkMDPrim              = MDDouble
+  unMDPrim (MDDouble a) = a
+
+
+instance DT Double where
+  data Dist  Double   = DDouble  !(V.Vector    Double)
+  data MDist Double s = MDDouble !(MV.STVector s Double)
+
+  indexD         = primIndexD
+  newMD          = primNewMD
+  readMD         = primReadMD
+  writeMD        = primWriteMD
+  unsafeFreezeMD = primUnsafeFreezeMD
+  sizeD          = primSizeD
+  sizeMD         = primSizeMD
+
index 145d1a1..e6d2299 100644 (file)
@@ -2,7 +2,7 @@
 module Data.Array.Parallel.Unlifted.Distributed.Data.USegd.DT
 where
 import Data.Array.Parallel.Unlifted.Distributed.Data.Vector             ()
-import Data.Array.Parallel.Unlifted.Distributed.Data.Prim
+import Data.Array.Parallel.Unlifted.Distributed.Primitive
 import Data.Array.Parallel.Unlifted.Sequential.USegd                    (USegd)
 import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector)
 import qualified Data.Array.Parallel.Unlifted.Sequential.USegd          as USegd
index e8457e6..21b9db7 100644 (file)
@@ -4,13 +4,13 @@
 module Data.Array.Parallel.Unlifted.Distributed.Data.Vector
         (lengthD)
 where
-import qualified Data.Array.Parallel.Base               as B
-import Data.Array.Parallel.Unlifted.Distributed.Data.Prim
+import Data.Array.Parallel.Unlifted.Distributed.Data.Scalar
 import Data.Array.Parallel.Unlifted.Distributed.Primitive
 import Data.Array.Parallel.Pretty
 import Data.Array.Parallel.Unlifted.Sequential.Vector   as V
 import qualified Data.Vector                            as BV
 import qualified Data.Vector.Mutable                    as MBV
+import qualified Data.Array.Parallel.Base               as B
 import Prelude                                          as P
 import Control.Monad
 
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Primitive/DPrim.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Primitive/DPrim.hs
new file mode 100644 (file)
index 0000000..330d931
--- /dev/null
@@ -0,0 +1,95 @@
+{-# OPTIONS -Wall -fno-warn-orphans -fno-warn-missing-signatures #-}
+
+-- | Distribution of values of primitive types.
+module Data.Array.Parallel.Unlifted.Distributed.Primitive.DPrim 
+        ( DPrim (..)
+        , primIndexD
+        , primNewMD
+        , primReadMD
+        , primWriteMD
+        , primUnsafeFreezeMD
+        , primSizeD
+        , primSizeMD)
+        
+where
+import Data.Array.Parallel.Unlifted.Distributed.Primitive
+import Data.Array.Parallel.Unlifted.Sequential.Vector
+import Data.Array.Parallel.Base
+import Data.Array.Parallel.Pretty
+import Data.Word
+import Control.Monad
+import qualified Data.Array.Parallel.Unlifted.Sequential.Vector as V
+import qualified Data.Vector.Unboxed.Mutable                    as MV
+import Prelude as P
+
+-- DPrim ----------------------------------------------------------------------
+-- | For distributed primitive values, we can just store all the members in
+--   a vector. The vector has the same length as the number of threads in the gang.
+--
+class Unbox e => DPrim e where
+
+  -- | Make an immutable distributed value.
+  mkDPrim :: V.Vector e -> Dist  e
+
+  -- | Unpack an immutable distributed value back into a vector.
+  unDPrim :: Dist  e -> V.Vector e
+
+  -- | Make a mutable distributed value.
+  mkMDPrim :: MV.STVector s e -> MDist  e s
+
+  -- | Unpack a mutable distributed value back into a vector.
+  unMDPrim :: MDist  e s -> MV.STVector s e
+
+
+-- | Get the member corresponding to a thread index.
+primIndexD :: DPrim a => String -> Dist a -> Int -> a
+primIndexD str = (V.index (str P.++ "/primIndexD")) . unDPrim
+{-# INLINE primIndexD #-}
+
+
+-- | Create a new distributed value, having as many members as threads
+--   in the given 'Gang'.
+primNewMD :: DPrim a => Gang -> ST s (MDist a s)
+primNewMD = liftM mkMDPrim . MV.new . gangSize
+{-# INLINE primNewMD #-}
+
+
+-- | Read the member of a distributed value corresponding to the given thread index.
+primReadMD :: DPrim a => MDist a s -> Int -> ST s a
+primReadMD = MV.read . unMDPrim
+{-# INLINE primReadMD #-}
+
+
+-- | Write the member of a distributed value corresponding to the given thread index.
+primWriteMD :: DPrim a => MDist a s -> Int -> a -> ST s ()
+primWriteMD = MV.write . unMDPrim
+{-# INLINE primWriteMD #-}
+
+
+-- | Freeze a mutable distributed value to an immutable one.
+--   You promise not to update the mutable one any further.
+primUnsafeFreezeMD :: DPrim a => MDist a s -> ST s (Dist a)
+primUnsafeFreezeMD = liftM mkDPrim . V.unsafeFreeze . unMDPrim
+{-# INLINE primUnsafeFreezeMD #-}
+
+
+-- | Get the size of a distributed value, that is, the number of threads
+--   in the gang that it was created for.
+primSizeD :: DPrim a => Dist a -> Int
+primSizeD = V.length . unDPrim
+{-# INLINE primSizeD #-}
+
+
+-- | Get the size of a distributed mutable value, that is, the number of threads
+--   in the gang it was created for.
+primSizeMD :: DPrim a => MDist a s -> Int
+primSizeMD = MV.length . unMDPrim
+{-# INLINE primSizeMD #-}
+
+
+
+
+
+
+
+
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Scalars.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Scalars.hs
deleted file mode 100644 (file)
index 3baf5d9..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-{-# 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.Data.Unit
-import Data.Array.Parallel.Unlifted.Distributed.Data.Prim
-import Data.Array.Parallel.Unlifted.Distributed.Combinators
-import Data.Array.Parallel.Unlifted.Distributed.Primitive
-
-
--- | 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 gang x 
-        = mapD WhatScalar gang (const x) (unitD gang)
-
-
--- | 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 (+)
-
-