【问题标题】:Implementing efficient parallel map and reduce in Haskell在 Haskell 中实现高效的并行 map 和 reduce
【发布时间】:2016-02-13 22:08:44
【问题描述】:

鉴于以下 Python 示例,我想知道如何在 Haskell 中实现高效且并行的等效代码。

Python 中的第一个示例:函数映射

f = lambda x: 2*x
print map(f, [1,2,3,4])

Python 中的第二个示例:函数式归约

g = lambda x,y: x*y
print reduce(g, [1,2,3,4], 1)

我希望 Haskell 中的并行代码能够有效地利用多核处理器。

注意:这些只是玩具示例,我不打算对这些玩具示例进行加速。它们只是为了说明如何与 Haskell 并行实现运算符 map 和 reduce。

【问题讨论】:

  • 尝试阅读wiki.haskell.org/Applications_and_libraries/… 另外,Control.Parallel.Strategies 中的parMap 可以解决第一个问题,尽管对于上面这些非常简单的功能,它也会使性能变差。
  • 欢迎来到 stackoverflow,请告诉我们您的尝试,并向我们展示您的努力。你已经知道多少haskell。使用多核通常不是初学者的问题。您可能会在Simon Marlowe's excellent book 中找到一些信息。同样在并行之前 - 只需检查简单的单核解决方案是否足够快。

标签: haskell parallel-processing


【解决方案1】:

对于功能映射,Haskell 中的等效顺序版本是:

f x = 2*x
dxs = map f [1,2,3,4]
main = print dxs

Haskell 中的并行版本是:

import Control.Parallel.Strategies
import Control.Parallel

f x = 2*x
dxs = parMap rpar f [1,2,3,4]
main = print(dxs)

【讨论】:

  • 我想这是与 Haskell 并行实现 map 运算符的最有效方式。让我知道是否有更有效的方法。
【解决方案2】:

另一种方法是

import Control.Parallel

newtype PMonoid a = PM {unPM :: a}

instance Monoid a => Monoid (PMonoid a) where
    mempty = PM mempty
    (PM a) <> (PM b) = PM (a `par` b `pseq` a <> b)

这将使foldMap 并行。 (尤其是 map 操作由于惰性而获得了并行性。)

你们很多人都想加入deepseq,但这不是必须的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2011-12-02
    • 1970-01-01
    • 2022-06-15
    • 2021-07-17
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多