haskell中的并行映射

Cla*_*bel 33 parallel-processing haskell multicore combinators

是否有一些替代品map并行评估列表?我不需要它懒惰.

类似的东西:pmap :: (a -> b) -> [a] -> [b]让我pmap expensive_function big_list拥有100%的核心.

Tho*_*son 38

是的,请参阅并行包:

ls `using` parList rdeepseq
Run Code Online (Sandbox Code Playgroud)

将通过rdeepseq策略并行评估列表中的每个元素.请注意,parListChunk如果您的元素太便宜而无法并行评估每个元素,那么使用具有良好块值的方法可能会提供更好的性能(因为它可以节省每个元素的火花).

编辑:基于你的问题,我觉得我应该解释为什么这是一个答案.这是因为Haskell很懒惰!考虑一下这句话

let bs = map expensiveFunction as
Run Code Online (Sandbox Code Playgroud)

没有评估任何东西.你刚刚创建了一个映射的thunk expensiveFunction.那么我们如何并行评估呢?

let bs = map expensiveFunction as
    cs = bs `using` parList rdeepseq
Run Code Online (Sandbox Code Playgroud)

现在不要bs在将来的计算中使用该cs列表,而是使用该列表.IOW,你不需要一个平行地图,你可以使用常规(懒惰)地图和一个并行的评估策略.

编辑:如果你环顾四周,你会看到parMap函数,它执行我在这里展示但包装成一个辅助函数.

在回复您的评论时,以下代码不适合您吗?这个对我有用.

import Control.Parallel.Strategies

func as =
        let bs = map (+1) as
            cs = bs `using` parList rdeepseq
        in cs
Run Code Online (Sandbox Code Playgroud)

  • @clark 您是否使用线程编译(`ghc -O2 -threaded blah.hs --make`)并使用正确的 RTS 选项(`./blah +RTS -Nx`),其中 `x` 是您想要的内核数使用,例如`2`?请注意,在 GHC 7 上,您应该能够输入 `ghc -O2 -threaded -with-rtsopts=-N blah.hs` 并运行 `./blah`。 (3认同)

Don*_*art 18

除了像Tom所描述的那样自己使用显式策略,并行也会导出parMap:

 parMap :: Strategy b -> (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

战略论证的地方就像rdeepseq.

而且还有parMappar-monad包(你走出纯Haskell,进入并行monad):

 parMap :: NFData b => (a -> b) -> [a] -> Par [b]
Run Code Online (Sandbox Code Playgroud)

在PAR-单子包记录在这里.

  • 这里有一个小警告。parMap 使用的是严格的 mapM。这意味着在计算开始之前完全评估列表脊椎 - 如果列表很长,例如您正在解析从(巨大)文件读取的记录,这可能不是您想要的。也许这对于惰性 parMap 或通过循环分配元素会更好。 (3认同)