dph-prim-par: cleanup API for distributed Segds
authorBen Lippmeier <benl@ouroborus.net>
Mon, 23 Jul 2012 04:25:14 +0000 (14:25 +1000)
committerBen Lippmeier <benl@ouroborus.net>
Mon, 30 Jul 2012 03:48:35 +0000 (13:48 +1000)
14 files changed:
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Combinators.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd/Base.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd/DT.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd/Split.hs [moved from dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/USSegd.hs with 98% similarity]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/Base.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/DT.hs [new file with mode: 0644]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/Split.hs [moved from dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/USegd.hs with 97% similarity]
dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Primitive/DT.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Parallel/UPSSegd.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Parallel/UPSegd.hs
dph-prim-par/dph-prim-par.cabal

index 31815b9..b47ac78 100644 (file)
@@ -40,7 +40,6 @@ module Data.Array.Parallel.Unlifted.Distributed
         , joinD
         , splitJoinD
         , joinDM
-        , glueSegdD
         , carryD
 
         , Distribution
@@ -59,7 +58,6 @@ where
 import Data.Array.Parallel.Unlifted.Distributed.Combinators
 import Data.Array.Parallel.Unlifted.Distributed.Scalars
 import Data.Array.Parallel.Unlifted.Distributed.Arrays
-import Data.Array.Parallel.Unlifted.Distributed.USegd
 import Data.Array.Parallel.Unlifted.Distributed.Basics
 import Data.Array.Parallel.Unlifted.Distributed.Primitive
 
index 4d7f448..a43c416 100644 (file)
@@ -19,7 +19,7 @@ import Data.Array.Parallel.Unlifted.Distributed.Primitive
 import Data.Array.Parallel.Unlifted.Distributed.Data.Tuple
 import Data.Array.Parallel.Unlifted.Distributed.Data.Maybe      ()
 import Data.Array.Parallel.Unlifted.Distributed.What
-import Debug.Trace
+
 
 here s = "Data.Array.Parallel.Unlifted.Distributed.Combinators." ++ s
 
index c7662fb..f149221 100644 (file)
@@ -10,121 +10,9 @@ module Data.Array.Parallel.Unlifted.Distributed.Data.USSegd
         , takeElementsD
         , takeStartsD
         , takeSourcesD
-        , takeUSegdD)
+        , takeUSegdD
+        , splitSSegdOnElemsD)
 where
-import Data.Array.Parallel.Unlifted.Distributed.Primitive.DT
-import Data.Array.Parallel.Unlifted.Sequential.USSegd                   (USSegd)
-import Data.Array.Parallel.Unlifted.Sequential.USegd                    (USegd)
-import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector)
-import Data.Array.Parallel.Pretty
-import Control.Monad
-import Prelude                                                          as P
-import qualified Data.Array.Parallel.Unlifted.Distributed.Data.USegd   as DUSegd
-import qualified Data.Array.Parallel.Unlifted.Distributed.Data.Vector  as DV
-import qualified Data.Array.Parallel.Unlifted.Sequential.USSegd         as USSegd
-
-
-instance DT USSegd where
-  data Dist USSegd   
-        = DUSSegd  !(Dist (Vector Int))         -- segment starts
-                   !(Dist (Vector Int))         -- segment sources
-                   !(Dist USegd)                -- distributed usegd
-
-  data MDist USSegd s 
-        = MDUSSegd !(MDist (Vector Int) s)      -- segment starts
-                   !(MDist (Vector Int) s)      -- segment sources
-                   !(MDist USegd        s)      -- distributed usegd
-
-  indexD str (DUSSegd starts sources usegds) i
-   = USSegd.mkUSSegd
-        (indexD (str ++ "/indexD[USSegd]") starts i)
-        (indexD (str ++ "/indexD[USSegd]") sources i)
-        (indexD (str ++ "/indexD[USSegd]") usegds i)
-
-  newMD g
-   = liftM3 MDUSSegd (newMD g) (newMD g) (newMD g)
-
-  readMD (MDUSSegd starts sources usegds) i
-   = liftM3 USSegd.mkUSSegd (readMD starts i) (readMD sources i) (readMD usegds i)
-
-  writeMD (MDUSSegd starts sources usegds) i ussegd
-   = do writeMD starts  i (USSegd.takeStarts  ussegd)
-        writeMD sources i (USSegd.takeSources ussegd)
-        writeMD usegds  i (USSegd.takeUSegd   ussegd)
-
-  unsafeFreezeMD (MDUSSegd starts sources usegds)
-   = liftM3 DUSSegd (unsafeFreezeMD starts)
-                    (unsafeFreezeMD sources)
-                    (unsafeFreezeMD usegds)
-
-  deepSeqD ussegd z
-   = deepSeqD (USSegd.takeStarts  ussegd)
-   $ deepSeqD (USSegd.takeSources ussegd)
-   $ deepSeqD (USSegd.takeUSegd   ussegd) z
-
-  sizeD  (DUSSegd  _ _ usegd) = sizeD usegd
-  sizeMD (MDUSSegd _ _ usegd) = sizeMD usegd
-
-  measureD ussegd 
-   = "USSegd "  P.++ show (USSegd.takeStarts    ussegd)
-   P.++ " "     P.++ show (USSegd.takeSources   ussegd)
-   P.++ " "     P.++ measureD (USSegd.takeUSegd ussegd)
-
-
-instance PprPhysical (Dist USSegd) where
- pprp (DUSSegd starts sources usegds)
-  =  text "DUSSegd"
-  $$ (nest 7 $ vcat
-        [ text "starts:  " <+> pprp starts
-        , text "sources: " <+> pprp sources
-        , text "usegds:  " <+> pprp usegds])
-
-
--- | O(1). Yield the overall number of segments.
-lengthD :: Dist USSegd -> Dist Int
-lengthD (DUSSegd starts _ _) 
-        = DV.lengthD starts
-{-# INLINE_DIST lengthD #-}
-
-
--- | O(1). Yield the lengths of the individual segments.
-takeLengthsD :: Dist USSegd -> Dist (Vector Int)
-takeLengthsD (DUSSegd _ _ usegds)
-        = DUSegd.takeLengthsD usegds
-{-# INLINE_DIST takeLengthsD #-}
-
-
--- | O(1). Yield the segment indices.
-takeIndicesD :: Dist USSegd -> Dist (Vector Int)
-takeIndicesD (DUSSegd _ _ usegds)
-        = DUSegd.takeIndicesD usegds
-{-# INLINE_DIST takeIndicesD #-}
-
-
--- | O(1). Yield the number of data elements.
-takeElementsD :: Dist USSegd -> Dist Int
-takeElementsD (DUSSegd _ _ usegds)
-        = DUSegd.takeElementsD usegds
-{-# INLINE_DIST takeElementsD #-}
-
-
--- | O(1). Yield the starting indices.
-takeStartsD :: Dist USSegd -> Dist (Vector Int)
-takeStartsD (DUSSegd starts _ _)
-        = starts
-{-# INLINE_DIST takeStartsD #-}
-        
-
--- | O(1). Yield the source ids
-takeSourcesD :: Dist USSegd -> Dist (Vector Int)
-takeSourcesD (DUSSegd _ sources _)
-        = sources
-{-# INLINE_DIST takeSourcesD #-}
-
-
--- | O(1). Yield the USegd
-takeUSegdD :: Dist USSegd -> Dist USegd
-takeUSegdD (DUSSegd _ _ usegd)
-        = usegd
-{-# INLINE_DIST takeUSegdD #-}
-
+import Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.DT          ()
+import Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.Base
+import Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.Split
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd/Base.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd/Base.hs
new file mode 100644 (file)
index 0000000..f5fa908
--- /dev/null
@@ -0,0 +1,71 @@
+{-# OPTIONS -Wall -fno-warn-orphans -fno-warn-missing-signatures #-}
+{-# LANGUAGE CPP #-}
+#include "fusion-phases.h"
+
+-- | Distribution of Segment Descriptors
+module Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.Base
+        ( lengthD
+        , takeLengthsD
+        , takeIndicesD
+        , takeElementsD
+        , takeStartsD
+        , takeSourcesD
+        , takeUSegdD)
+where
+import Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.DT
+import Data.Array.Parallel.Unlifted.Distributed.Primitive.DT
+import Data.Array.Parallel.Unlifted.Sequential.USSegd                   (USSegd)
+import Data.Array.Parallel.Unlifted.Sequential.USegd                    (USegd)
+import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector)
+import Prelude                                                          as P
+import qualified Data.Array.Parallel.Unlifted.Distributed.Data.USegd    as DUSegd
+import qualified Data.Array.Parallel.Unlifted.Distributed.Data.Vector   as DV
+
+
+-- | O(1). Yield the overall number of segments.
+lengthD :: Dist USSegd -> Dist Int
+lengthD (DUSSegd starts _ _) 
+        = DV.lengthD starts
+{-# INLINE_DIST lengthD #-}
+
+
+-- | O(1). Yield the lengths of the individual segments.
+takeLengthsD :: Dist USSegd -> Dist (Vector Int)
+takeLengthsD (DUSSegd _ _ usegds)
+        = DUSegd.takeLengthsD usegds
+{-# INLINE_DIST takeLengthsD #-}
+
+
+-- | O(1). Yield the segment indices.
+takeIndicesD :: Dist USSegd -> Dist (Vector Int)
+takeIndicesD (DUSSegd _ _ usegds)
+        = DUSegd.takeIndicesD usegds
+{-# INLINE_DIST takeIndicesD #-}
+
+
+-- | O(1). Yield the number of data elements.
+takeElementsD :: Dist USSegd -> Dist Int
+takeElementsD (DUSSegd _ _ usegds)
+        = DUSegd.takeElementsD usegds
+{-# INLINE_DIST takeElementsD #-}
+
+
+-- | O(1). Yield the starting indices.
+takeStartsD :: Dist USSegd -> Dist (Vector Int)
+takeStartsD (DUSSegd starts _ _)
+        = starts
+{-# INLINE_DIST takeStartsD #-}
+        
+
+-- | O(1). Yield the source ids
+takeSourcesD :: Dist USSegd -> Dist (Vector Int)
+takeSourcesD (DUSSegd _ sources _)
+        = sources
+{-# INLINE_DIST takeSourcesD #-}
+
+
+-- | O(1). Yield the USegd
+takeUSegdD :: Dist USSegd -> Dist USegd
+takeUSegdD (DUSSegd _ _ usegd)
+        = usegd
+{-# INLINE_DIST takeUSegdD #-}
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd/DT.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USSegd/DT.hs
new file mode 100644 (file)
index 0000000..484fc76
--- /dev/null
@@ -0,0 +1,68 @@
+-- | Distribution of Segment Descriptors
+module Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.DT
+where
+import Data.Array.Parallel.Unlifted.Distributed.Data.USegd              ()
+import Data.Array.Parallel.Unlifted.Distributed.Data.Vector             ()
+import Data.Array.Parallel.Unlifted.Distributed.Primitive.DT
+import Data.Array.Parallel.Unlifted.Sequential.USSegd                   (USSegd)
+import Data.Array.Parallel.Unlifted.Sequential.USegd                    (USegd)
+import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector)
+import Data.Array.Parallel.Pretty
+import Control.Monad
+import Prelude                                                          as P
+import qualified Data.Array.Parallel.Unlifted.Sequential.USSegd         as USSegd
+
+instance DT USSegd where
+  data Dist USSegd   
+        = DUSSegd  !(Dist (Vector Int))         -- segment starts
+                   !(Dist (Vector Int))         -- segment sources
+                   !(Dist USegd)                -- distributed usegd
+
+  data MDist USSegd s 
+        = MDUSSegd !(MDist (Vector Int) s)      -- segment starts
+                   !(MDist (Vector Int) s)      -- segment sources
+                   !(MDist USegd        s)      -- distributed usegd
+
+  indexD str (DUSSegd starts sources usegds) i
+   = USSegd.mkUSSegd
+        (indexD (str ++ "/indexD[USSegd]") starts i)
+        (indexD (str ++ "/indexD[USSegd]") sources i)
+        (indexD (str ++ "/indexD[USSegd]") usegds i)
+
+  newMD g
+   = liftM3 MDUSSegd (newMD g) (newMD g) (newMD g)
+
+  readMD (MDUSSegd starts sources usegds) i
+   = liftM3 USSegd.mkUSSegd (readMD starts i) (readMD sources i) (readMD usegds i)
+
+  writeMD (MDUSSegd starts sources usegds) i ussegd
+   = do writeMD starts  i (USSegd.takeStarts  ussegd)
+        writeMD sources i (USSegd.takeSources ussegd)
+        writeMD usegds  i (USSegd.takeUSegd   ussegd)
+
+  unsafeFreezeMD (MDUSSegd starts sources usegds)
+   = liftM3 DUSSegd (unsafeFreezeMD starts)
+                    (unsafeFreezeMD sources)
+                    (unsafeFreezeMD usegds)
+
+  deepSeqD ussegd z
+   = deepSeqD (USSegd.takeStarts  ussegd)
+   $ deepSeqD (USSegd.takeSources ussegd)
+   $ deepSeqD (USSegd.takeUSegd   ussegd) z
+
+  sizeD  (DUSSegd  _ _ usegd) = sizeD usegd
+  sizeMD (MDUSSegd _ _ usegd) = sizeMD usegd
+
+  measureD ussegd 
+   = "USSegd "  P.++ show (USSegd.takeStarts    ussegd)
+   P.++ " "     P.++ show (USSegd.takeSources   ussegd)
+   P.++ " "     P.++ measureD (USSegd.takeUSegd ussegd)
+
+
+instance PprPhysical (Dist USSegd) where
+ pprp (DUSSegd starts sources usegds)
+  =  text "DUSSegd"
+  $$ (nest 7 $ vcat
+        [ text "starts:  " <+> pprp starts
+        , text "sources: " <+> pprp sources
+        , text "usegds:  " <+> pprp usegds])
@@ -3,7 +3,7 @@
 #include "fusion-phases.h"
 
 -- | Operations on Distributed Segment Descriptors
-module Data.Array.Parallel.Unlifted.Distributed.USSegd 
+module Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.Split 
         (splitSSegdOnElemsD)
 where
 import Data.Array.Parallel.Unlifted.Distributed.Arrays
@@ -14,7 +14,7 @@ import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector)
 import Data.Array.Parallel.Base
 import Data.Bits                                                        (shiftR)
 import Control.Monad                                                    (when)
-import Data.Array.Parallel.Unlifted.Distributed.Data.USSegd            ()
+import Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.DT          ()
 import qualified Data.Array.Parallel.Unlifted.Sequential.USegd          as USegd
 import qualified Data.Array.Parallel.Unlifted.Sequential.USSegd         as USSegd
 import qualified Data.Array.Parallel.Unlifted.Sequential.Vector         as Seq
index 139899d..99752e8 100644 (file)
 
 -- | Distribution of Segment Descriptors
 module Data.Array.Parallel.Unlifted.Distributed.Data.USegd 
-        ( mkDUSegd
+        ( mkDUSegdD
         , lengthD
         , takeLengthsD
         , takeIndicesD
-        , takeElementsD)
+        , takeElementsD
+        , splitSegdOnSegsD
+        , splitSegdOnElemsD
+        , splitSD
+        , joinSegdD
+        , glueSegdD)
 where
-import Data.Array.Parallel.Unlifted.Distributed.Primitive
-import Data.Array.Parallel.Unlifted.Sequential.USegd                    (USegd)
-import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector)
-import Data.Array.Parallel.Pretty
-import Control.Monad
-import qualified Data.Array.Parallel.Unlifted.Distributed.Data.Vector  as DV
-import qualified Data.Array.Parallel.Unlifted.Sequential.USegd          as USegd
-import Prelude                                                          as P
-
-
-instance DT USegd where
-  data Dist  USegd   
-        = DUSegd  !(Dist (Vector Int))          -- segment lengths
-                  !(Dist (Vector Int))          -- segment indices
-                  !(Dist Int)                   -- number of elements in this chunk
-
-  data MDist USegd s 
-        = MDUSegd !(MDist (Vector Int) s)       -- segment lengths
-                  !(MDist (Vector Int) s)       -- segment indices
-                  !(MDist Int        s)         -- number of elements in this chunk
-
-  indexD str (DUSegd lens idxs eles) i
-   = USegd.mkUSegd
-        (indexD (str ++ "/indexD[USegd]") lens i)
-        (indexD (str ++ "/indexD[USegd]") idxs i)
-        (indexD (str ++ "/indexD[USegd]") eles i)
-
-  newMD g
-   = liftM3 MDUSegd (newMD g) (newMD g) (newMD g)
-
-  readMD (MDUSegd lens idxs eles) i
-   = liftM3 USegd.mkUSegd (readMD lens i) (readMD idxs i) (readMD eles i)
-
-  writeMD (MDUSegd lens idxs eles) i segd
-   = do writeMD lens i (USegd.takeLengths  segd)
-        writeMD idxs i (USegd.takeIndices  segd)
-        writeMD eles i (USegd.takeElements segd)
-
-  unsafeFreezeMD (MDUSegd lens idxs eles)
-   = liftM3 DUSegd (unsafeFreezeMD lens)
-                   (unsafeFreezeMD idxs)
-                   (unsafeFreezeMD eles)
-
-  deepSeqD segd z
-   = deepSeqD (USegd.takeLengths  segd)
-   $ deepSeqD (USegd.takeIndices  segd)
-   $ deepSeqD (USegd.takeElements segd) z
-
-  sizeD  (DUSegd  _ _ eles) = sizeD eles
-  sizeMD (MDUSegd _ _ eles) = sizeMD eles
-
-  measureD segd 
-   = "Segd " P.++ show (USegd.length segd)
-   P.++ " "  P.++ show (USegd.takeElements segd)
-
-
-instance PprPhysical (Dist USegd) where
- pprp (DUSegd lens indices elements)
-  =  text "DUSegd"
-  $$ (nest 7 $ vcat
-        [ text "lengths: " <+> pprp lens
-        , text "indices: " <+> pprp indices
-        , text "elements:" <+> pprp elements])
-
-
--- | O(1). Construct a distributed segment descriptor
-mkDUSegd 
-        :: Dist (Vector Int)    -- ^ segment lengths
-        -> Dist (Vector Int)    -- ^ segment indices
-        -> Dist Int             -- ^ number of elements in each chunk
-        -> Dist USegd
-
-mkDUSegd = DUSegd
-
-
--- | O(1). Yield the overall number of segments.
-lengthD :: Dist USegd -> Dist Int
-lengthD (DUSegd lens _ _) 
-        = DV.lengthD lens
-{-# INLINE_DIST lengthD #-}
-
-
--- | O(1). Yield the lengths of the individual segments.
-takeLengthsD :: Dist USegd -> Dist (Vector Int)
-takeLengthsD (DUSegd lens _ _ )
-        = lens
-{-# INLINE_DIST takeLengthsD #-}
-
-
--- | O(1). Yield the segment indices of a segment descriptor.
-takeIndicesD :: Dist USegd -> Dist (Vector Int)
-takeIndicesD (DUSegd _ idxs _)
-        = idxs
-{-# INLINE_DIST takeIndicesD #-}
-
-
--- | O(1). Yield the number of data elements.
-takeElementsD :: Dist USegd -> Dist Int
-takeElementsD (DUSegd _ _ dns)
-        = dns
-{-# INLINE_DIST takeElementsD #-}
+import Data.Array.Parallel.Unlifted.Distributed.Data.USegd.DT           ()
+import Data.Array.Parallel.Unlifted.Distributed.Data.USegd.Base
+import Data.Array.Parallel.Unlifted.Distributed.Data.USegd.Split
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/Base.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/Base.hs
new file mode 100644 (file)
index 0000000..9a17113
--- /dev/null
@@ -0,0 +1,55 @@
+{-# OPTIONS -Wall -fno-warn-orphans -fno-warn-missing-signatures #-}
+{-# LANGUAGE CPP #-}
+#include "fusion-phases.h"
+
+-- | Distribution of Segment Descriptors
+module Data.Array.Parallel.Unlifted.Distributed.Data.USegd.Base
+        ( mkDUSegdD
+        , lengthD
+        , takeLengthsD
+        , takeIndicesD
+        , takeElementsD)
+where
+import Data.Array.Parallel.Unlifted.Distributed.Data.USegd.DT
+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.Distributed.Data.Vector  as DV
+
+
+-- | O(1). Construct a distributed segment descriptor
+mkDUSegdD 
+        :: Dist (Vector Int)    -- ^ segment lengths
+        -> Dist (Vector Int)    -- ^ segment indices
+        -> Dist Int             -- ^ number of elements in each chunk
+        -> Dist USegd
+
+mkDUSegdD = DUSegd
+
+
+-- | O(1). Yield the overall number of segments.
+lengthD :: Dist USegd -> Dist Int
+lengthD (DUSegd lens _ _) 
+        = DV.lengthD lens
+{-# INLINE_DIST lengthD #-}
+
+
+-- | O(1). Yield the lengths of the individual segments.
+takeLengthsD :: Dist USegd -> Dist (Vector Int)
+takeLengthsD (DUSegd lens _ _ )
+        = lens
+{-# INLINE_DIST takeLengthsD #-}
+
+
+-- | O(1). Yield the segment indices of a segment descriptor.
+takeIndicesD :: Dist USegd -> Dist (Vector Int)
+takeIndicesD (DUSegd _ idxs _)
+        = idxs
+{-# INLINE_DIST takeIndicesD #-}
+
+
+-- | O(1). Yield the number of data elements.
+takeElementsD :: Dist USegd -> Dist Int
+takeElementsD (DUSegd _ _ dns)
+        = dns
+{-# INLINE_DIST takeElementsD #-}
diff --git a/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/DT.hs b/dph-prim-par/Data/Array/Parallel/Unlifted/Distributed/Data/USegd/DT.hs
new file mode 100644 (file)
index 0000000..145d1a1
--- /dev/null
@@ -0,0 +1,65 @@
+-- | Distribution of Segment Descriptors
+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.Sequential.USegd                    (USegd)
+import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector)
+import qualified Data.Array.Parallel.Unlifted.Sequential.USegd          as USegd
+import Prelude                                                          as P
+import Data.Array.Parallel.Pretty
+import Control.Monad
+
+instance DT USegd where
+  data Dist  USegd   
+        = DUSegd  !(Dist (Vector Int))          -- segment lengths
+                  !(Dist (Vector Int))          -- segment indices
+                  !(Dist Int)                   -- number of elements in this chunk
+
+  data MDist USegd s 
+        = MDUSegd !(MDist (Vector Int) s)       -- segment lengths
+                  !(MDist (Vector Int) s)       -- segment indices
+                  !(MDist Int        s)         -- number of elements in this chunk
+
+  indexD str (DUSegd lens idxs eles) i
+   = USegd.mkUSegd
+        (indexD (str ++ "/indexD[USegd]") lens i)
+        (indexD (str ++ "/indexD[USegd]") idxs i)
+        (indexD (str ++ "/indexD[USegd]") eles i)
+
+  newMD g
+   = liftM3 MDUSegd (newMD g) (newMD g) (newMD g)
+
+  readMD (MDUSegd lens idxs eles) i
+   = liftM3 USegd.mkUSegd (readMD lens i) (readMD idxs i) (readMD eles i)
+
+  writeMD (MDUSegd lens idxs eles) i segd
+   = do writeMD lens i (USegd.takeLengths  segd)
+        writeMD idxs i (USegd.takeIndices  segd)
+        writeMD eles i (USegd.takeElements segd)
+
+  unsafeFreezeMD (MDUSegd lens idxs eles)
+   = liftM3 DUSegd (unsafeFreezeMD lens)
+                   (unsafeFreezeMD idxs)
+                   (unsafeFreezeMD eles)
+
+  deepSeqD segd z
+   = deepSeqD (USegd.takeLengths  segd)
+   $ deepSeqD (USegd.takeIndices  segd)
+   $ deepSeqD (USegd.takeElements segd) z
+
+  sizeD  (DUSegd  _ _ eles) = sizeD eles
+  sizeMD (MDUSegd _ _ eles) = sizeMD eles
+
+  measureD segd 
+   = "Segd " P.++ show (USegd.length segd)
+   P.++ " "  P.++ show (USegd.takeElements segd)
+
+
+instance PprPhysical (Dist USegd) where
+ pprp (DUSegd lens indices elements)
+  =  text "DUSegd"
+  $$ (nest 7 $ vcat
+        [ text "lengths: " <+> pprp lens
+        , text "indices: " <+> pprp indices
+        , text "elements:" <+> pprp elements])
@@ -3,13 +3,14 @@
 #include "fusion-phases.h"
 
 -- | Operations on Distributed Segment Descriptors
-module Data.Array.Parallel.Unlifted.Distributed.USegd 
+module Data.Array.Parallel.Unlifted.Distributed.Data.USegd.Split
         ( splitSegdOnSegsD
         , splitSegdOnElemsD
         , splitSD
         , joinSegdD
         , glueSegdD)
 where
+import Data.Array.Parallel.Unlifted.Distributed.Data.USegd.Base
 import Data.Array.Parallel.Unlifted.Distributed.Arrays
 import Data.Array.Parallel.Unlifted.Distributed.Combinators
 import Data.Array.Parallel.Unlifted.Distributed.Primitive
@@ -18,7 +19,6 @@ import Data.Array.Parallel.Unlifted.Sequential.Vector                   (Vector,
 import Data.Array.Parallel.Base
 import Data.Bits                                                        (shiftR)
 import Control.Monad                                                    (when)
-import qualified Data.Array.Parallel.Unlifted.Distributed.Data.USegd   as DUSegd
 import qualified Data.Array.Parallel.Unlifted.Sequential.USegd          as USegd
 import qualified Data.Array.Parallel.Unlifted.Sequential.Vector         as Seq
 
@@ -312,7 +312,7 @@ joinSegdD gang
 glueSegdD :: Gang -> Dist ((USegd, Int), Int)  -> Dist USegd
 glueSegdD gang bundle
  = let  !usegd           = fstD $ fstD $ bundle
-        !lengths         = DUSegd.takeLengthsD usegd
+        !lengths         = takeLengthsD usegd
                 
         !firstSegOffsets = sndD bundle
 
@@ -332,10 +332,12 @@ glueSegdD gang bundle
 {-# INLINE_DIST glueSegdD #-}
 
 
--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+-- TODO: Shift this into a separate Fusion.hs module
+
 splitSD :: Unbox a => Gang -> Dist USegd -> Vector a -> Dist (Vector a)
 splitSD g dsegd xs
-        = splitAsD g (DUSegd.takeElementsD dsegd) xs
+        = splitAsD g (takeElementsD dsegd) xs
 {-# INLINE_DIST splitSD #-}
 
 {-# RULES
index eba71bb..69a0ba5 100644 (file)
@@ -15,10 +15,9 @@ where
 import Data.Array.Parallel.Unlifted.Distributed.Primitive.Gang
 import Data.Array.Parallel.Base
 import Data.List
-import Control.Monad.ST
 
 here :: String -> String
-here s = "Data.Array.Parallel.Unlifted.Distributed.Types.Base." ++ s
+here s = "Data.Array.Parallel.Unlifted.Distributed.Primitive.DT" ++ s
 
 
 -- Distributed Types ----------------------------------------------------------
index 68434ce..ddb21ef 100644 (file)
@@ -44,7 +44,7 @@ import Data.Array.Parallel.Unlifted.Sequential.USSegd             (USSegd)
 import Data.Array.Parallel.Unlifted.Sequential.Vector             (Vector,  MVector, Unbox)
 import Data.Array.Parallel.Unlifted.Vectors                       (Vectors, Unboxes)
 import qualified Data.Array.Parallel.Unlifted.Parallel.UPSegd     as UPSegd
-import qualified Data.Array.Parallel.Unlifted.Distributed.USSegd  as DUSSegd
+import qualified Data.Array.Parallel.Unlifted.Distributed.Data.USSegd  as DUSSegd
 import qualified Data.Array.Parallel.Unlifted.Sequential.USSegd   as USSegd
 import qualified Data.Array.Parallel.Unlifted.Sequential.Vector   as US
 import qualified Data.Array.Parallel.Unlifted.Sequential          as Seq
index 7e771f8..275d70c 100644 (file)
@@ -36,8 +36,8 @@ module Data.Array.Parallel.Unlifted.Parallel.UPSegd
 where
 import Data.Array.Parallel.Unlifted.Distributed
 import Data.Array.Parallel.Unlifted.Distributed.What
-import Data.Array.Parallel.Unlifted.Sequential.USegd             (USegd)
-import qualified Data.Array.Parallel.Unlifted.Distributed.USegd  as USegd
+import Data.Array.Parallel.Unlifted.Sequential.USegd                    (USegd)
+import qualified Data.Array.Parallel.Unlifted.Distributed.Data.USegd  as USegd
 import qualified Data.Array.Parallel.Unlifted.Sequential         as Seq
 import qualified Data.Array.Parallel.Unlifted.Sequential.Vector  as US
 import qualified Data.Array.Parallel.Unlifted.Sequential.USegd   as USegd
index 26d3bef..b3d9756 100644 (file)
@@ -25,7 +25,13 @@ Library
         Data.Array.Parallel.Unlifted.Distributed.Data.Prim
         Data.Array.Parallel.Unlifted.Distributed.Data.Tuple
         Data.Array.Parallel.Unlifted.Distributed.Data.Unit
+        Data.Array.Parallel.Unlifted.Distributed.Data.USegd.DT
+        Data.Array.Parallel.Unlifted.Distributed.Data.USegd.Base
+        Data.Array.Parallel.Unlifted.Distributed.Data.USegd.Split
         Data.Array.Parallel.Unlifted.Distributed.Data.USegd
+        Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.DT
+        Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.Base
+        Data.Array.Parallel.Unlifted.Distributed.Data.USSegd.Split
         Data.Array.Parallel.Unlifted.Distributed.Data.USSegd
         Data.Array.Parallel.Unlifted.Distributed.Data.UVSegd
         Data.Array.Parallel.Unlifted.Distributed.Data.Vector
@@ -34,8 +40,6 @@ Library
         Data.Array.Parallel.Unlifted.Distributed.Basics
         Data.Array.Parallel.Unlifted.Distributed.Combinators
         Data.Array.Parallel.Unlifted.Distributed.Scalars
-        Data.Array.Parallel.Unlifted.Distributed.USegd
-        Data.Array.Parallel.Unlifted.Distributed.USSegd
         Data.Array.Parallel.Unlifted.Distributed.What
         Data.Array.Parallel.Unlifted.Distributed