| 1 | import Control.Monad |
|---|
| 2 | import Control.Parallel |
|---|
| 3 | import Control.Parallel.Strategies |
|---|
| 4 | import Data.Array.Unboxed |
|---|
| 5 | import Data.Char |
|---|
| 6 | import qualified Data.ByteString.Char8 as SS |
|---|
| 7 | import Data.List |
|---|
| 8 | import System.Environment |
|---|
| 9 | import System.IO |
|---|
| 10 | import Data.Array.Parallel.Unlifted |
|---|
| 11 | import Data.Array.Parallel.Unlifted.Distributed |
|---|
| 12 | |
|---|
| 13 | main = do |
|---|
| 14 | [_, pstr, infile, outfile] <- getArgs |
|---|
| 15 | let p = read pstr :: Int |
|---|
| 16 | setGang p |
|---|
| 17 | iH <- openFile infile ReadMode |
|---|
| 18 | cs <- SS.hGetContents iH |
|---|
| 19 | let Just (n, cs') = readInt cs |
|---|
| 20 | (vals1,vals2) = splitAt (n * n) (unfoldr readDouble cs') |
|---|
| 21 | inmat1 = map toU . fst $ segm n vals1 |
|---|
| 22 | inmat2 = map toU . snd $ segm n vals2 |
|---|
| 23 | outmat = inmat1 `par` inmat2 `par` |
|---|
| 24 | ndp_matmult n inmat1 inmat2 |
|---|
| 25 | hClose iH |
|---|
| 26 | oH <- openFile outfile WriteMode |
|---|
| 27 | hPrint oH n |
|---|
| 28 | forM_ [0 .. n-1] $ \ i -> do |
|---|
| 29 | forM_ [0 .. n-1] $ \ j -> do |
|---|
| 30 | hPutStr oH $ show (outmat!(i,j)) |
|---|
| 31 | hPutStr oH " " |
|---|
| 32 | hPutStr oH "\n" |
|---|
| 33 | hClose oH |
|---|
| 34 | return () |
|---|
| 35 | |
|---|
| 36 | ndp_matmult :: Int -> [UArr Double] -> [UArr Double] -> UArray (Int, Int) Double |
|---|
| 37 | ndp_matmult n inmat1 inmat2 = listArray ((0, 0), (n - 1, n - 1)) |
|---|
| 38 | -- . map dotP $ sequence [inmat1, inmat2] |
|---|
| 39 | $ parFlatMap (parList rwhnf) |
|---|
| 40 | (\ x -> map (dotP x) inmat2) inmat1 |
|---|
| 41 | |
|---|
| 42 | |
|---|
| 43 | -- dotP [a, b] = sumU (zipWithU (*) a b) :: Double |
|---|
| 44 | dotP a b = sumU (zipWithU (*) a b) :: Double |
|---|
| 45 | |
|---|
| 46 | |
|---|
| 47 | readInt cs = SS.readInt cs >>= (\ (i, cs') -> return (i, snd (SS.span isSpace cs'))) |
|---|
| 48 | readDouble cs = do |
|---|
| 49 | let (s, cs') = SS.break isSpace cs |
|---|
| 50 | case reads (SS.unpack s) of |
|---|
| 51 | [] -> Nothing |
|---|
| 52 | [(d, _)] -> Just (d :: Double, snd $ SS.span isSpace cs') |
|---|
| 53 | |
|---|
| 54 | segm n [] = ([], replicate n []) |
|---|
| 55 | segm n ds = (row:rows, cols') |
|---|
| 56 | where |
|---|
| 57 | (row, ds') = splitAt n ds |
|---|
| 58 | (rows, cols) = segm n ds' |
|---|
| 59 | cols' = zipWith (:) row cols |
|---|