Fixed enumFromStepLenEach bug, added example
authorkeller@cse.unsw.edu.au <unknown>
Fri, 20 Mar 2009 13:33:05 +0000 (13:33 +0000)
committerkeller@cse.unsw.edu.au <unknown>
Fri, 20 Mar 2009 13:33:05 +0000 (13:33 +0000)
dph-base/Data/Array/Parallel/Stream/Flat/Enum.hs
dph-prim-interface/interface/DPH_Header.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/Enum.hs
dph-prim-seq/Data/Array/Parallel/Unlifted.hs
examples/matrix/Makefile [new file with mode: 0644]
examples/matrix/MatrixPrim.hs [new file with mode: 0644]
examples/matrix/MatrixPrimTest.hs [new file with mode: 0644]
examples/matrix/MatrixTest.hs [new file with mode: 0644]

index eba036e..733f79a 100644 (file)
@@ -99,7 +99,7 @@ enumFromStepLenEachS len (Stream next s n) = Stream next' (NothingS :*: s) len
           Skip            s' -> Skip (NothingS        :*: s')
           Done               -> Done
 
-    next' (JustS (from :*: step :*: 0) :*: s) = Done
+    next' (JustS (from :*: step :*: 0) :*: s) = Skip (NothingS :*: s)
     next' (JustS (from :*: step :*: n) :*: s) = Yield from (JustS (from+step :*: step :*: (n-1)) :*: s)
 
       
\ No newline at end of file
index 31910c0..895f434 100644 (file)
@@ -7,8 +7,8 @@ module Data.Array.Parallel.Unlifted (
   empty, replicate, replicateEach, repeat, (+:+),
   (!:), extract, drop, permute, bpermute, update,
   pack, combine,
-  enumFromTo, enumFromToEach, indexed,
-  
+  enumFromTo, enumFromThenTo, enumFromToEach, enumFromStepLen, enumFromStepLenEach,
+  indexed,
   zip, zip3, unzip, unzip3, fsts,
   map, zipWith, zipWith3,
   filter,
index 6c83168..452e169 100644 (file)
@@ -49,8 +49,7 @@ enumFromTo = enumFromToUP
 enumFromThenTo = enumFromThenToUP
 enumFromStepLen = enumFromStepLenUP
 enumFromToEach = enumFromToEachU
-randoms = randomU
-randomRs = randomRU
+enumFromStepLenEach =enumFromStepLenEachUP
 concat = concatSU
 (>:) = (U.>:)
 (^+:+^) = (U.^+:+^)
index 5bd26b5..114e75e 100644 (file)
@@ -16,7 +16,7 @@
 module Data.Array.Parallel.Unlifted.Parallel (
   bpermuteUP, updateUP,
 
-  enumFromToUP, enumFromThenToUP, enumFromStepLenUP,
+  enumFromToUP, enumFromThenToUP, enumFromStepLenUP, enumFromStepLenEachUP,
 
   mapUP, filterUP, packUP, combineUP, zipWithUP, foldUP, scanUP,
 
index 8b0f494..85a1395 100644 (file)
 #include "fusion-phases.h"
 
 module Data.Array.Parallel.Unlifted.Parallel.Enum (
-  enumFromToUP, enumFromThenToUP, enumFromStepLenUP, enumFromToEachUP    
+  enumFromToUP, enumFromThenToUP, enumFromStepLenUP, enumFromToEachUP, enumFromStepLenEachUP    
 ) where
 
 import Data.Array.Parallel.Base (
   (:*:)(..), fstS, uncurryS)
 import Data.Array.Parallel.Unlifted.Sequential (
-  UArr, UA, enumFromStepLenU, enumFromToEachU)
+  UArr, UA, enumFromStepLenU, enumFromToEachU, enumFromStepLenEachU)
 import Data.Array.Parallel.Unlifted.Distributed (
   mapD, scanD, zipD, splitLenD, joinD, splitD, balanced, unbalanced,
   theGang)
@@ -62,3 +62,8 @@ enumFromToEachUP n inds =
   joinD theGang unbalanced $ mapD theGang (uncurryS enumFromToEachU) $ 
     zipD  (splitLenD theGang n) (splitD theGang balanced inds)
 
+enumFromStepLenEachUP :: Int -> UArr (Int :*: Int :*: Int) -> UArr Int
+{-# INLINE enumFromStepLenEachUP #-}
+enumFromStepLenEachUP n inds =  
+  joinD theGang unbalanced $ mapD theGang (uncurryS enumFromStepLenEachU) $ 
+    zipD  (splitLenD theGang n) (splitD theGang balanced inds)
index ec48b3a..3b26aa0 100644 (file)
@@ -47,8 +47,7 @@ enumFromTo = enumFromToU
 enumFromThenTo = enumFromThenToU
 enumFromStepLen = enumFromStepLenU
 enumFromToEach = enumFromToEachU
-randoms = randomU
-randomRs = randomRU
+enumFromStepLenEach = enumFromStepLenEachU
 concat = concatSU
 (>:) = (U.>:)
 (^+:+^) = (U.^+:+^)
diff --git a/examples/matrix/Makefile b/examples/matrix/Makefile
new file mode 100644 (file)
index 0000000..803e1e2
--- /dev/null
@@ -0,0 +1,12 @@
+TOPDIR = ..
+BINARIES = matrixprim matrix
+
+matrixprim_DPH = matrixprim
+matrixprim_SOURCES =  MatrixPrimTest.hs MatrixPrim.hs
+
+matrix_DPH = matrix
+matrix_SOURCES =  MatrixTest.hs Matrix.hs
+
+
+include $(TOPDIR)/mk/test.mk
+
diff --git a/examples/matrix/MatrixPrim.hs b/examples/matrix/MatrixPrim.hs
new file mode 100644 (file)
index 0000000..5cf75d1
--- /dev/null
@@ -0,0 +1,23 @@
+module MatrixPrim
+where
+
+import Data.Array.Parallel.Unlifted as U
+
+
+mmMult  order m n =  sum_s ((toSegd (U.zip (enumFromStepLen 0 order (order*order)) (U.replicate (order*order) order))) >: 
+                             (U.zipWith (*) mExp nTExp))
+
+  where 
+    mExp = repeat_c (order * order * order) (U.replicate order order) 
+               (toSegd (U.zip (enumFromStepLen 0 order order) (U.replicate order order)))  m
+    nTExp = U.repeat  (order * order * order) order nT
+             
+    nT= transposeM order n 
+
+
+
+transposeM:: Int -> U.Array Double -> U.Array Double
+transposeM order m = U.bpermute m inds
+  where 
+    inds = U.enumFromStepLenEach (order*order) (U.zip3 (U.enumFromTo 0 (order-1)) (U.replicate order order) (U.replicate order order))
+  
diff --git a/examples/matrix/MatrixPrimTest.hs b/examples/matrix/MatrixPrimTest.hs
new file mode 100644 (file)
index 0000000..0dc49a9
--- /dev/null
@@ -0,0 +1,54 @@
+import MatrixPrim
+
+import Control.Exception (evaluate)
+import System.Console.GetOpt
+import qualified System.Random as R
+
+import qualified Data.Array.Parallel.Unlifted as U
+
+import Bench.Benchmark
+import Bench.Options
+
+import Debug.Trace
+
+algs = [(" vecMult", vecMult)]
+
+
+mmMult'':: (Int, U.Array Double, U.Array Double) -> U.Array Double
+mmMult'' (order, m, n) = let xs = enumtest order m n
+                     in -- trace (show xs) 
+                        xs
+
+
+generateVector :: Int -> IO (U.Array Double)
+generateVector n =
+  do
+    rg <- R.newStdGen
+    let vec = U.randomRs n (-100, 100) rg
+    evaluate vec
+    return vec
+
+generateVectors :: Int -> IO (Point (Int, U.Array Double, U.Array Double))
+generateVectors n =
+  do
+    v <- generateVector (n*n)
+    w <- generateVector (n*n)
+    return $ ("N = " ++ show n) `mkPoint` (n,v,w)
+
+
+
+
+main = ndpMain "Matrix Mult"
+               "[OPTION] ... SIZES ..."
+               run [] ()
+
+run opts () sizes =
+  case map read sizes of
+    []  -> failWith ["No sizes specified"]
+    szs -> do
+             benchmark opts  mmMult''
+                (map generateVectors szs)
+                (`seq` ()) show
+             return ()
+
+
diff --git a/examples/matrix/MatrixTest.hs b/examples/matrix/MatrixTest.hs
new file mode 100644 (file)
index 0000000..86929b3
--- /dev/null
@@ -0,0 +1,51 @@
+module Main where
+
+import Matrix
+
+import Control.Exception (evaluate)
+import System.Console.GetOpt
+import qualified System.Random as R
+
+import Data.Array.Parallel.PArray (PArray, randomRs, nf)
+
+import Bench.Benchmark
+import Bench.Options
+
+import Debug.Trace
+
+algs = [(" mmMult", mmMult'')]
+
+mmMult'' m n = let xs = mmMult m n
+               in trace (show xs) xs
+
+generateVector :: Int -> IO (PArray Double)
+generateVector n =
+  do
+    rg <- R.newStdGen
+    let vec = randomRs n (-100, 100) rg
+    evaluate (nf vec)
+    return vec
+
+generateVectors :: Int -> IO (Point (PArray Double, PArray Double))
+generateVectors n =
+  do
+    v <- generateVector n
+    w <- generateVector n
+    return $ ("N = " ++ show n) `mkPoint` (v,w)
+
+
+
+
+main = ndpMain "Matrix Mult"
+               "[OPTION] ... SIZES ..."
+               run [] ()
+
+run opts () sizes =
+  case map read sizes of
+    []  -> failWith ["No sizes specified"]
+    szs -> do
+             benchmark opts (uncurry mmMult'')
+                (map generateVectors szs)
+                (`seq` ()) show
+             return ()
+