【问题标题】:haskell parallel programminghaskell 并行编程
【发布时间】:2017-07-16 16:46:11
【问题描述】:
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"]

输出:

["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

我该怎么做?

【问题讨论】:

  • 我怀疑你可以通过并行化这个函数来赢得很多。这里没有太多有趣的计算,性能在很大程度上受所有这些列表的缓存性能的限制。在考虑任何更特殊的优化之前,至少切换到 TextBytestring

标签: haskell functional-programming


【解决方案1】:

我现在看到了你的帖子。有很多方法可以进行并行计算。

你可以阅读这三个库:

Control.Parallel

Control.Parallel.Strategies

Control.Monad.Par(用于单子)

那么,我习惯使用两种方式:

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

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

如果你想深入:)

    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

N 是我使用的处理器数量。

因此,了解它,您可以轻松适应它。

对于编译:

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

我希望我能帮助别人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多