【问题标题】:A parallel monad map in Haskell? Something like parMapM?Haskell中的并行单子映射?像 parMapM 这样的东西?
【发布时间】:2013-04-04 17:11:00
【问题描述】:

我正在寻找一种在 ST-Monad 中并行运行两个计算的方法。我正在构建一个相当大的数组(使用 STUArray),我想并行进行。

到目前为止,我在 stackoverflow 上找到了 thisthis 问答,但是第一个不适用于我的情况,因为它只处理纯代码,第二个处理 IO monad - 但我是在状态线程中。

我还找到了monad-parallel 包,但它要求我有一个 ST 的“MonadParallel”实例。 monad-par 包也只支持纯计算或 IO monad。

有没有办法在 ST 中进行并行一元计算?

【问题讨论】:

  • 并行构建一个大型数组听起来最好用纯代码而不是 ST 完成。我不认为你可以提供更多关于你想在每个单元格中放入什么以及为什么要使用 ST 的信息?可能存在问题,例如,如果您在 ST monad 中为每个单元运行单独的操作,那么这真的不能很容易地并行化,因为(与 IO 不同)ST 并没有真正为线程之间的通信提供原语。

标签: haskell parallel-processing monads state-monad


【解决方案1】:

首先,你的问题只有两个词:并行和数组 - 我必须建议你看看repa。您还应该查看Data Parallel Haskell,因为它有望成为Haskell 道路上的下一个重要里程碑,并且该项目有some great people involved

关于您的具体问题,有些库能够完全按照您的要求进行操作,只需使用 IO monad、已命名的 monad-parallelasync with mapConcurrently。你有没有考虑用stToIO逃到IO

还有一个lifted-async 库,它扩展了标准版本以使用MonadBaseControl,它有一个ST 的实例,所以你可以使用它的mapConcurrently 版本,或者至少将它用作实现自己的灵感。

【讨论】:

    【解决方案2】:

    我不确定您是否可以安全地并行化 ST monad,或者这是否有意义,因为通常,状态 monad 中的计算取决于状态,这是先前计算的结果。

    但是,您可以做的是从列表创建数组,并且列表创建很容易并行,例如通过parallel 包中的parMap 之类的东西。

    向我们提供有关如何创建数组数据的更多详细信息可能有助于为您提供更好的答案。

    【讨论】:

    • 你当然可以并行化它,你只需要程序员自己处理非确定性
    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2011-08-02
    • 2023-03-06
    • 2013-07-30
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多