2017-02-25 15 views
2
import Data.List 

genkstrings :: Int -> [String] -> [String] 
genkstrings k [] = [] 
genkstrings 1 (s:ss) = [ [c] | c <- s ] ++ genkstrings 1 ss 
genkstrings k (s:ss) 
    | length (s:ss) < k = [] 
    | otherwise = concat [kStartWith k c ss | c <- s ] 
       ++ 
       genkstrings k ss 

kStartWith k c ss = 
map (c :) $ genkstringsNogap (k-1) ss 

genkstringsNogap 0 _ = [] 
genkstringsNogap 1 (s:ss) = [ [c] | c <- s ] 
genkstringsNogap k (s:ss) = concat $ [kStartWithNoGap k c ss | c <- s ] 

kStartWithNoGap k c ss = map (c:) (genkstringsNogap (k-1) ss) 

入力:genkstrings 2 ["sds","ghghg"]Haskellの並列プログラミング

出力:

["sg","sh","sg","sh","sg","dg","dh","dg","dh","dg","sg","sh","sg","sh","sg"] 

私はHaskellのを学んでいると私は、私は私のコードを並列実行することができました。私が読んでいる本にいくつかの例がありますが、どのように並列プログラミングを適用することができるのか分かりません。

私が正しいだ場合、私は、私はそれをどのように行うことができます

| otherwise = concat [kStartWith k c ss | c <- s ] 
        ++ 
        genkstrings k ss 

このライン上でそれを適用する必要がありますか?

+2

私はこの機能を並列化することで多くの勝利を得ることはできません。ここで興味深い計算はあまりありません。パフォーマンスは、これらすべてのリストのキャッシュパフォーマンスに非常に大きく左右されます。特別なものを検討する前に少なくとも['Text'](http://hackage.haskell.org/package/text)または[' Bytestring'](http://hackage.haskell.org/package/bytestring)に切り替えてください最適化。 – leftaroundabout

答えて

0

あなたの投稿を見ました。並列計算を行う方法はたくさんあります。

あなたはこの3つのライブラリ読むことができる:

right `par` 
left `pseq` 
left ++ right 

:私は2つの方法で使用するために使用する、そして、(モナド用)

Control.Parallel

Control.Parallel.Strategies

Control.Monad.Par

をおよび

ここ
result `using` strategy 
    where 
    result = losort ++ (x:hisort) 
    losort = quicksortP1 [y|y <- xs, y < x] 
    hisort = quicksortP1 [y|y <- xs, y >= x] 
    strategy = parList rseq 

いくつかの結果:

-- parList rpar  -- 2m42s N=4 
-- parList rseq  -- 38.3s N=4 
-- parList r0  -- 57.3s N=4 
-- parList rdeepseq -- 2m40s N=4 
-- r0    -- 48.5s N=4 

、あなたが深い取得したい場合:)

Nは、私が使用するプロセッサの数である
result = losort ++ (x:hisort) 
    (losort,hisort) = 
     (quicksortP2 [y|y <- xs, y < x] 
     , quicksortP2 [y|y <- xs, y >= x] 
    ) `using` strategy 
    strategy = 
      parTuple2 rdeepseq rdeepseq -- 17.9s N=4 
--    parTuple2 rdeepseq rseq -- 18.0s N=4    
--    parTuple2 rdeepseq r0 -- 42s N=4 
--    parTuple2 rseq  rseq -- 23.8s N=4 
--    parTuple2 rpar  rpar -- 26.9s N=4 
--    parTuple2 r0  r0 -- 47.6s N=4 
--    r0      -- 46.2s N=4 

だから、それを知って、簡単にそれを適応させることができます。

そしてコンパイルするための

> ghc MyProg.hs -threaded -rtsopts 
> ./MyProg +RTS -N4 -s 

は、私は私が誰かを助けることができると思います。

関連する問題