dph-lifted-vseg: push indexvs into lifted library
authorBen Lippmeier <benl@ouroborus.net>
Tue, 6 Dec 2011 05:42:01 +0000 (16:42 +1100)
committerBen Lippmeier <benl@ouroborus.net>
Tue, 6 Dec 2011 05:42:01 +0000 (16:42 +1100)
18 files changed:
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Double.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Int.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Tuple2.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Tuple3.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Tuple4.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Tuple5.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Unit.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Void.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Word8.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PData/Wrap.hs
dph-lifted-vseg/Data/Array/Parallel/PArray/PRepr/Base.hs
dph-prim-interface/Data/Array/Parallel/Unlifted.hs
dph-prim-interface/interface/DPH_Header.h
dph-prim-interface/interface/DPH_Interface.h
dph-prim-par/Data/Array/Parallel/Unlifted.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Parallel.hs
dph-prim-par/Data/Array/Parallel/Unlifted/Parallel/Segmented.hs
dph-prim-seq/Data/Array/Parallel/Unlifted.hs

index 52c828f..b74962b 100644 (file)
@@ -85,6 +85,9 @@ instance PR Double where
   indexsPR (PDoubles pvecs) srcixs
    = PDouble $ U.map (\(src, ix) -> U.unsafeIndex2s pvecs src ix) srcixs
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PDoubles arrs) vsegd srcixs 
+   = PDouble $ U.unsafeIndexs_avs arrs vsegd srcixs
 
   {-# INLINE_PDATA extractPR #-}
   extractPR (PDouble arr) start len 
index 44e71a8..e475628 100644 (file)
@@ -73,6 +73,10 @@ instance PR Int where
   indexsPR (PInts pvecs) srcixs
    = PInt $ U.map (\(src, ix) -> U.unsafeIndex2s pvecs src ix) srcixs
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PInts arrs) vsegd srcixs 
+   = PInt $ U.unsafeIndexs_avs arrs vsegd srcixs
+
   {-# INLINE_PDATA extractPR #-}
   extractPR (PInt arr) start len 
         = PInt (U.extract arr start len)
index 2738c76..104a985 100644 (file)
@@ -103,6 +103,11 @@ instance (PR a, PR b) => PR (a, b) where
         = PTuple2 (indexsPR xs srcixs)
                   (indexsPR ys srcixs)
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PTuple2s xs ys) vsegd srcixs
+        = PTuple2 (indexvsPR xs vsegd srcixs)
+                  (indexvsPR ys vsegd srcixs)
+
   {-# INLINE_PDATA extractPR #-}
   extractPR (PTuple2 arr1 arr2) start len
         = PTuple2 (extractPR arr1 start len) 
index 32a9bb8..080e6a4 100644 (file)
@@ -113,6 +113,12 @@ instance (PR a, PR b, PR c) => PR (a, b, c) where
                   (indexsPR ys srcixs)
                   (indexsPR zs srcixs)
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PTuple3s xs ys zs) vsegd srcixs
+        = PTuple3 (indexvsPR xs vsegd srcixs)
+                  (indexvsPR ys vsegd srcixs)
+                  (indexvsPR zs vsegd srcixs)
+
   {-# INLINE_PDATA extractPR #-}
   extractPR (PTuple3 arr1 arr2 arr3) start len
         = PTuple3 (extractPR arr1 start len) 
index ccbef0d..09f3e32 100644 (file)
@@ -130,6 +130,13 @@ instance (PR a, PR b, PR c, PR d) => PR (a, b, c, d) where
                   (indexsPR zs srcixs)
                   (indexsPR ds srcixs)
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PTuple4s xs ys zs ds) vsegd srcixs
+        = PTuple4 (indexvsPR xs vsegd srcixs)
+                  (indexvsPR ys vsegd srcixs)
+                  (indexvsPR zs vsegd srcixs)
+                  (indexvsPR ds vsegd srcixs)
+
   {-# INLINE_PDATA extractPR #-}
   extractPR (PTuple4 arr1 arr2 arr3 arr4) start len
         = PTuple4 (extractPR arr1 start len) 
index ea34de6..f4adc1b 100644 (file)
@@ -140,6 +140,14 @@ instance (PR a, PR b, PR c, PR d, PR e) => PR (a, b, c, d, e) where
                   (indexsPR ds srcixs)
                   (indexsPR es srcixs)
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PTuple5s xs ys zs ds es) vsegd srcixs
+        = PTuple5 (indexvsPR xs vsegd srcixs)
+                  (indexvsPR ys vsegd srcixs)
+                  (indexvsPR zs vsegd srcixs)
+                  (indexvsPR ds vsegd srcixs)
+                  (indexvsPR es vsegd srcixs)
+
   {-# INLINE_PDATA extractPR #-}
   extractPR (PTuple5 arr1 arr2 arr3 arr4 arr5) start len
         = PTuple5 (extractPR arr1 start len) 
index ffbd037..1c9fa9d 100644 (file)
@@ -87,6 +87,10 @@ instance PR () where
   indexsPR _ srcixs
         = PUnit $ U.length srcixs
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR _ _ srcixs
+        = PUnit $ U.length srcixs
+
   {-# INLINE_PDATA extractPR #-}
   extractPR _ _ len
         = PUnit len
index 6a5681c..d4a17ce 100644 (file)
@@ -93,6 +93,9 @@ instance PR Void where
   {-# INLINE_PDATA indexsPR #-}
   indexsPR      = nope "indexs"
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR     = nope "indexvs"
+
   {-# INLINE_PDATA extractPR #-}
   extractPR     = nope "extractl"
 
index b49f03e..f0d9f7d 100644 (file)
@@ -82,6 +82,10 @@ instance PR Word8 where
   indexsPR (PWord8s pvecs) srcixs
    = PWord8 $ U.map (\(src, ix) -> U.unsafeIndex2s pvecs src ix) srcixs
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PWord8s arrs) vsegd srcixs 
+   = PWord8 $ U.unsafeIndexs_avs arrs vsegd srcixs
+
   {-# INLINE_PDATA extractPR #-}
   extractPR (PWord8 arr) start len 
         = PWord8 (U.extract arr start len)
index f4a152c..2ae7098 100644 (file)
@@ -79,6 +79,10 @@ instance PA a => PR (Wrap a) where
   indexsPR (PWraps pdatas) srcixs
         = PWrap $ indexsPA pdatas srcixs
 
+  {-# INLINE_PDATA indexvsPR #-}
+  indexvsPR (PWraps arrs) vsegd srcixs
+        = PWrap $ indexvsPA arrs vsegd srcixs
+
   {-# INLINE_PDATA extractPR #-}
   extractPR (PWrap xs) ix n
         = PWrap $ extractPA xs ix n
index 636bd53..1a93bcc 100644 (file)
@@ -25,7 +25,7 @@ module Data.Array.Parallel.PArray.PRepr.Base
 
         -- * Projections
         , lengthPA
-        , indexPA,      indexsPA
+        , indexPA,      indexsPA,     indexvsPA
         , bpermutePA
         , extractPA,    extractssPA,  extractvsPA
 
@@ -197,6 +197,13 @@ indexsPA pdatas srcixs
  $ indexsPR (toArrPReprs pdatas) srcixs
 
 
+{-# INLINE_PA indexvsPA #-}
+indexvsPA        :: PA a => PDatas a -> U.VSegd -> U.Array (Int, Int) -> PData a
+indexvsPA pdatas vsegd srcixs
+ = fromArrPRepr
+ $ indexvsPR (toArrPReprs pdatas) vsegd srcixs
+
+
 {-# INLINE_PDATA bpermutePA #-}
 bpermutePA      :: PA a => PData a -> U.Array Int -> PData a
 bpermutePA xs ixs
index 26aacaa..1ca5fa0 100644 (file)
@@ -85,14 +85,15 @@ enumFromStepLenEach size starts steps lens
 
 
 -- Projections ----------------------------------------------------------------
-length          = P.length
-(!:)            = (P.!!)
-unsafeIndex     = (P.!!)
-
-extract xs i n     = P.take n (P.drop i xs)
-unsafeExtracts_nss = notImplemented "unsafeExtract_nss"
-unsafeExtracts_ass = notImplemented "unsafeExtract_ass"
-unsafeExtracts_avs = notImplemented "unsafeExtract_avs"
+length                  = P.length
+(!:)                    = (P.!!)
+unsafeIndex             = (P.!!)
+unsafeIndexs_avs        = notImplemented "unsafeIndexs_avs"
+
+extract xs i n          = P.take n (P.drop i xs)
+unsafeExtracts_nss      = notImplemented "unsafeExtract_nss"
+unsafeExtracts_ass      = notImplemented "unsafeExtract_ass"
+unsafeExtracts_avs      = notImplemented "unsafeExtract_avs"
 
 drop            = P.drop
 
index 6da5338..423a53a 100644 (file)
@@ -21,6 +21,8 @@ module Data.Array.Parallel.Unlifted (
   -- * Projections
   length,
   (!:),     unsafeIndex,
+  unsafeIndexs_avs,
+
   extract,
   unsafeExtracts_nss,
   unsafeExtracts_ass,
index 9cf228e..b349d31 100644 (file)
@@ -205,6 +205,16 @@ unsafeIndex :: Elt a => Array a -> Int -> a
 {-# INLINE_BACKEND unsafeIndex #-}
 
 
+-- | O(n). Scattered indexing through a `VSegd`.
+unsafeIndexs_avs
+        :: (Elt a, Elts a)
+        => Arrays a
+        -> VSegd
+        -> Array (Int, Int)
+        -> Array a
+{-# INLINE_BACKEND unsafeIndexs_avs #-}
+
+
 -- | O(n). Extract a subrange of elements from an array.
 --  
 --   @extract [23, 42, 93, 50, 27] 1 3  = [42, 93, 50]@
index b5f4a7d..01c35f1 100644 (file)
@@ -105,9 +105,11 @@ enumFromStepLenEach n starts steps lens
 
 
 -- Projections ----------------------------------------------------------------
-length          = Seq.length
-(!:)            = (Seq.!)
-unsafeIndex     = Seq.unsafeIndex
+length                  = Seq.length
+(!:)                    = (Seq.!)
+
+unsafeIndex             = Seq.unsafeIndex
+unsafeIndexs_avs        = unsafeIndexsFromVectorsWithUPVSegd
 
 extract arr i n
         =  tracePrim (TraceExtract (Seq.length arr) i n)
index 248a9f5..465bd63 100644 (file)
@@ -45,6 +45,7 @@ module Data.Array.Parallel.Unlifted.Parallel
         , appendSUP
         , foldRUP
         , sumRUP
+        , unsafeIndexsFromVectorsWithUPVSegd
         , unsafeExtractsFromNestedWithUPSSegd
         , unsafeExtractsFromVectorsWithUPSSegd
         , unsafeExtractsFromVectorsWithUPVSegd
index b45eafc..b34245b 100644 (file)
@@ -8,6 +8,11 @@ module Data.Array.Parallel.Unlifted.Parallel.Segmented
         , appendSUP
         , foldRUP
         , sumRUP
+
+        -- * Scattered indexing.
+        , unsafeIndexsFromVectorsWithUPVSegd
+
+        -- * Scattered extracts.
         , unsafeExtractsFromNestedWithUPSSegd
         , unsafeExtractsFromVectorsWithUPSSegd
         , unsafeExtractsFromVectorsWithUPVSegd)
@@ -145,6 +150,29 @@ sumRUP :: (Num e, Unbox e) => Int -> Vector e -> Vector e
 sumRUP = foldRUP (+) 0
 
 
+-- Indexvs --------------------------------------------------------------------
+-- | Lookup elements from some `Vectors` through a `UPVSegd`.
+--
+--   TODO: make this parallel.
+--
+unsafeIndexsFromVectorsWithUPVSegd 
+        :: (Unbox a, US.Unboxes a)
+        => Vectors a -> UPVSegd -> Vector (Int, Int) -> Vector a
+
+unsafeIndexsFromVectorsWithUPVSegd vectors upvsegd vsrcixs
+ = let  -- Because we're just doing indexing here, we don't need the culled
+        -- vsegids or ussegd, and can just use the redundant version.
+        !vsegids  = UPVSegd.takeVSegidsRedundant upvsegd
+        !upssegd  = UPVSegd.takeUPSSegdRedundant upvsegd
+        !ussegd   = UPSSegd.takeUSSegd upssegd
+   in   Seq.unstream
+         $ US.unsafeStreamElemsFromVectors        vectors
+         $ US.unsafeStreamSrcIxsThroughUSSegd  ussegd
+         $ US.unsafeStreamSrcIxsThroughVSegids vsegids
+         $ Seq.stream vsrcixs
+{-# INLINE_U unsafeIndexsFromVectorsWithUPVSegd #-}
+
+
 -- Extracts -------------------------------------------------------------------
 -- | Copy segments from a nested vectors and concatenate them into a new array.
 unsafeExtractsFromNestedWithUPSSegd
index f7f3f16..ef997f1 100644 (file)
@@ -51,6 +51,8 @@ enumFromStepLenEach     = U.enumFromStepLenEach
 length                  = U.length
 (!:)                    = (U.!)
 unsafeIndex             = U.unsafeIndex
+unsafeIndexs_avs        = Prelude.error "dph-prim-seq: unsafeIndex_avs wrapper not defined"
+
 extract                 = U.extract
 unsafeExtracts_nss      = US.unsafeExtractsFromNestedWithUSSegd
 unsafeExtracts_ass      = US.unsafeExtractsFromVectorsWithUSSegd