dph-prim-par: add replicated for UPVSegd
authorBen Lippmeier <benl@ouroborus.net>
Fri, 16 Dec 2011 08:06:30 +0000 (19:06 +1100)
committerBen Lippmeier <benl@ouroborus.net>
Fri, 16 Dec 2011 08:06:30 +0000 (19:06 +1100)
dph-prim-par/Data/Array/Parallel/Unlifted.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Parallel/UPVSegd.hs

index 42bac50..9362d0e 100644 (file)
@@ -290,10 +290,11 @@ appendSSegd                     = UPSSegd.appendWith
 type VSegd                      = UPVSegd.UPVSegd
 mkVSegd                         = UPVSegd.mkUPVSegd
 validVSegd                      = UPVSegd.valid
-promoteSegdToVSegd              = UPVSegd.fromUPSegd
-promoteSSegdToVSegd             = UPVSegd.fromUPSSegd
 emptyVSegd                      = UPVSegd.empty
 singletonVSegd                  = UPVSegd.singleton
+replicatedVSegd                 = UPVSegd.replicated
+promoteSegdToVSegd              = UPVSegd.fromUPSegd
+promoteSSegdToVSegd             = UPVSegd.fromUPSSegd
 isManifestVSegd                 = UPVSegd.isManifest
 isContiguousVSegd               = UPVSegd.isContiguous
 lengthOfVSegd                   = UPVSegd.length
index c977c6e..a4fee89 100644 (file)
@@ -16,6 +16,7 @@ module Data.Array.Parallel.Unlifted.Parallel.UPVSegd (
         fromUPSSegd,
         empty,
         singleton,
+        replicated,
         
         -- * Predicates
         isManifest,
@@ -180,6 +181,26 @@ singleton n
 {-# INLINE_UP singleton #-}
 
 
+-- | O(1). Construct a `UPVSegd` that describes an array created by replicating
+--   a single segment several times.
+---
+--   NOTE: This is a helpful target for rewrite rules, because when we 
+--   see a 'replicated' we know that all segments in the virtual array
+--   point to the same data.
+replicated 
+        :: Int          -- ^ Length of segment.
+        -> Int          -- ^ Number of times replicated.
+        -> UPVSegd
+
+replicated len reps
+ = let  -- We have a single physical segment.
+        ssegd   = UPSSegd.singleton len
+
+        -- All virtual segments point to the same physical segment.
+   in   mkUPVSegd (US.replicate reps 0) ssegd                           -- TODO: use parallel replicate
+{-# INLINE_U replicated #-}
+
+
 -- Predicates -----------------------------------------------------------------
 -- | O(1). Checks whether all the segments are manifest (unshared / non-virtual).
 --   If this is the case, then the vsegids field will be [0..len-1].