Modify and export regular folds
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 2 Mar 2010 12:52:48 +0000 (12:52 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 2 Mar 2010 12:52:48 +0000 (12:52 +0000)
dph-base/Data/Array/Parallel/Stream/Segmented.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
dph-prim-seq/Data/Array/Parallel/Unlifted/Sequential.hs
dph-prim-seq/Data/Array/Parallel/Unlifted/Sequential/Segmented/Combinators.hs
dph-prim-seq/Data/Array/Parallel/Unlifted/Sequential/Segmented/Sums.hs

index ce47fea..c68df59 100644 (file)
@@ -159,10 +159,10 @@ appendSS (Stream nexts1 ss1 ns1 c1) (Stream nextv1 sv1 nv1 cv1)
                                          :*: ss1 :*: sv1 :*: ss2 :*: sv2')
 
 
-foldValuesR :: Rebox a => (a -> b -> a) -> a -> Int -> Int -> Stream b -> Stream a
+foldValuesR :: Rebox a => (a -> b -> a) -> a -> Int -> Stream b -> Stream a
 {-# INLINE_STREAM foldValuesR #-}
-foldValuesR f z noOfSegs segSize (Stream nextv vs nv c) =
-  Stream next (segSize :*: z :*: vs) noOfSegs ("foldValuesR" `sArgs` c)
+foldValuesR f z segSize (Stream nextv vs nv c) =
+  Stream next (segSize :*: z :*: vs) (nv `div` segSize) ("foldValuesR" `sArgs` c)
   where
     {-# INLINE next #-}  
     next (0 :*: x :*: vs) =
index a07ff7f..20c254b 100644 (file)
@@ -105,7 +105,8 @@ append_s xd xs yd ys = P.concat (P.zipWith (P.++) (nest xd xs) (nest yd ys))
 
 fold_s  f z segd xs = P.map (P.foldr f z) (nest segd xs)
 fold1_s f   segd xs = P.map (P.foldr1 f)  (nest segd xs)
-sum_r _ segSize xs = P.error "FIXME GABI PLEASE PLEASE PLEASE" 
+fold_r  f z segSize xs = P.error "FIXME GABI PLEASE PLEASE PLEASE"
+sum_r segSize xs = P.error "FIXME GABI PLEASE PLEASE PLEASE" 
 
 lengthSegd = length . lengthsSegd
 lengthsSegd = segd_lengths
index f6bdf65..a745654 100644 (file)
@@ -19,7 +19,7 @@ module Data.Array.Parallel.Unlifted (
 
   repeat_c,
 
-  fold_s, fold1_s, sum_s, indices_s, sum_r,
+  fold_s, fold1_s, fold_r, sum_s, indices_s, sum_r,
   lengthSegd, lengthsSegd, indicesSegd, elementsSegd, lengthsToSegd, mkSegd,
 
   selectorToIndices2, packByTag, pick, count, count_s,
index cdd8341..683576f 100644 (file)
@@ -169,11 +169,14 @@ fold_s :: Elt a => (a -> a -> a) -> a -> Segd -> Array a -> Array a
 fold1_s :: Elt a => (a -> a -> a) -> Segd -> Array a -> Array a
 {-# INLINE_BACKEND fold1_s #-}
 
+fold_r :: Elt a => (a -> a -> a) -> a -> Int -> Array a -> Array a
+{-# INLINE_BACKEND fold_r #-}
+
 sum_s :: (Num a, Elt a) => Segd -> Array a -> Array a
 {-# INLINE sum_s #-}
 sum_s = fold_s (Prelude.+) 0
 
-sum_r :: (Num a, Elt a) => Int -> Int ->Array a -> Array a
+sum_r :: (Num a, Elt a) => Int ->Array a -> Array a
 {-# INLINE_BACKEND sum_r #-}
 
 indices_s :: Int    -- ^ number of segments
index f6fdbaa..f0a66c6 100644 (file)
@@ -58,6 +58,7 @@ replicate_rs = replicateRSUP
 append_s = U.appendSU
 fold_s = foldSUP
 fold1_s = fold1SU
+fold_r = foldlRU
 sum_r = sumRUP
 
 lengthSegd = lengthUSegd
index e71333a..5632e01 100644 (file)
@@ -23,7 +23,7 @@ module Data.Array.Parallel.Unlifted.Parallel (
 
   andUP, sumUP,
   
-  replicateSUP, replicateRSUP, foldSUP, sumSUP, sumRUP,
+  replicateSUP, replicateRSUP, foldSUP, foldRUP, sumSUP, sumRUP,
 
   indexedUP, replicateUP, repeatUP,
 
index 6dc0d1e..b5de04f 100644 (file)
@@ -18,7 +18,7 @@
 #include "fusion-phases.h"
 
 module Data.Array.Parallel.Unlifted.Parallel.Segmented (
-  replicateSUP, replicateRSUP, foldlSUP, foldSUP, sumSUP, sumRUP
+  replicateSUP, replicateRSUP, foldlSUP, foldSUP, foldRUP, sumSUP, sumRUP
 ) where
 
 import Data.Array.Parallel.Unlifted.Sequential
@@ -88,18 +88,18 @@ sumSUP = foldSUP (+) 0
 
 
 
-sumRUP :: (Num e, UA e) => Int ->  Int -> UArr e -> UArr e
+sumRUP :: (Num e, UA e) => Int -> UArr e -> UArr e
 {-# INLINE sumRUP #-}
 sumRUP = foldRUP (+) 0
 
 
-foldRUP :: (UA a, UA b) => (b -> a -> b) -> b -> Int -> Int -> UArr a -> UArr b
+foldRUP :: (UA a, UA b) => (b -> a -> b) -> b -> Int -> UArr a -> UArr b
 {-# INLINE foldRUP #-}
-foldRUP f z  noOfSegs segSize xs = 
+foldRUP f z !segSize xs = 
    joinD theGang unbalanced
-    (zipWithD theGang 
-              (\noS -> \xss -> foldlRU f z noS segSize xss)
-      (splitLenD theGang noOfSegs)
-      (splitAsD theGang 
-                (mapD theGang (*segSize) (splitLenD theGang noOfSegs))
-                xs))
+    (mapD theGang 
+      (foldlRU f z segSize)
+      (splitAsD theGang (mapD theGang (*segSize) dlen) xs))
+  where
+    noOfSegs = lengthU xs `div` segSize
+    dlen = splitLenD theGang noOfSegs
index 9986586..95fa4b8 100644 (file)
@@ -56,6 +56,7 @@ replicate_rs = replicateRSU
 append_s = appendSU
 fold_s = foldSU
 fold1_s = fold1SU
+fold_r = foldlRU
 sum_r = sumRU
 
 lengthSegd = lengthUSegd
index 59dcb5b..bc78137 100644 (file)
@@ -91,7 +91,7 @@ module Data.Array.Parallel.Unlifted.Sequential (
   {-repeatCU,-} replicateSU, replicateRSU, appendSU,
 
   -- * Higher-order operations (segmented)
-  foldlSU, foldSU, fold1SU,
+  foldlSU, foldSU, fold1SU, foldlRU,
   {-scanSU, scan1SU,-}
 
   -- * Higher-order operations (regular)
index 6124dec..0bb1af3 100644 (file)
@@ -96,7 +96,7 @@ packCU flags xssArr = segmentArrU newLengths flatData
 -- | Regular arrar reduction 
 --
 
-foldlRU :: (UA a, UA b) => (b -> a -> b) -> b -> Int -> Int -> UArr a -> UArr b
+foldlRU :: (UA a, UA b) => (b -> a -> b) -> b -> Int -> UArr a -> UArr b
 {-# INLINE_U foldlRU #-}
-foldlRU f z noOfSegs segSize = unstreamU . foldValuesR f z noOfSegs segSize . streamU
+foldlRU f z segSize = unstreamU . foldValuesR f z segSize . streamU
 
index 0e11688..a3e6287 100644 (file)
@@ -63,6 +63,6 @@ minimumSU = fold1SU min
 
 -- |Compute the segmented sum of an array of numerals
 --
-sumRU :: (Num e, UA e) => Int -> Int ->UArr e -> UArr e
+sumRU :: (Num e, UA e) => Int ->UArr e -> UArr e
 {-# INLINE sumRU #-}
 sumRU = foldlRU (+) 0